diff --git a/examples/Example30_NEO-D9S/Example30_NEO-D9S.ino b/examples/Example30_NEO-D9S/Example30_NEO-D9S.ino
index 8a6fe891..c8022461 100644
--- a/examples/Example30_NEO-D9S/Example30_NEO-D9S.ino
+++ b/examples/Example30_NEO-D9S/Example30_NEO-D9S.ino
@@ -90,10 +90,10 @@ void setup()
   if (ok) ok = myLBand.setVal16(UBLOX_CFG_PMP_DESCRAMBLER_INIT,   26969);       // Default 23560
   if (ok) ok = myLBand.setVal8(UBLOX_CFG_PMP_USE_PRESCRAMBLING,   0);           // Default 0
   if (ok) ok = myLBand.setVal64(UBLOX_CFG_PMP_UNIQUE_WORD,        16238547128276412563ull); 
-  if (ok) ok = myLBand.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_I2C,   1); // Ensure UBX-RXM-PMP is enabled on the I2C port 
-  if (ok) ok = myLBand.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART1, 1); // Output UBX-RXM-PMP on UART1
-  if (ok) ok = myLBand.setVal(UBLOX_CFG_UART2OUTPROT_UBX, 1);         // Enable UBX output on UART2
-  if (ok) ok = myLBand.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART2, 1); // Output UBX-RXM-PMP on UART2
+  if (ok) ok = myLBand.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_I2C,   1); // Ensure UBX-RXM-PMP is enabled on the I2C port 
+  if (ok) ok = myLBand.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART1, 1); // Output UBX-RXM-PMP on UART1
+  if (ok) ok = myLBand.setVal8(UBLOX_CFG_UART2OUTPROT_UBX, 1);         // Enable UBX output on UART2
+  if (ok) ok = myLBand.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART2, 1); // Output UBX-RXM-PMP on UART2
   if (ok) ok = myLBand.setVal32(UBLOX_CFG_UART1_BAUDRATE,         38400); // match baudrate with ZED default
   if (ok) ok = myLBand.setVal32(UBLOX_CFG_UART2_BAUDRATE,         38400); // match baudrate with ZED default
 
diff --git a/examples/Example32_NEO-D9C/Example32_NEO-D9C.ino b/examples/Example32_NEO-D9C/Example32_NEO-D9C.ino
index 4d67387b..1c3266ce 100644
--- a/examples/Example32_NEO-D9C/Example32_NEO-D9C.ino
+++ b/examples/Example32_NEO-D9C/Example32_NEO-D9C.ino
@@ -106,19 +106,19 @@ void setup()
   }
   Serial.println(F("u-blox NEO-D9C connected"));
 
-  uint8_t ok = myQZSS.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_I2C,   1);     // Output QZSS-L6 message on the I2C port 
+  uint8_t ok = myQZSS.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_I2C,   1);    // Output QZSS-L6 message on the I2C port 
 
   Serial.print(F("QZSS-L6: I2C configuration "));
   Serial.println(OK(ok));
 
-  if (ok) ok = myQZSS.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_UART1, 1);     // Output QZSS-L6 message on UART1
+  if (ok) ok = myQZSS.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_UART1, 1);    // Output QZSS-L6 message on UART1
   if (ok) ok = myQZSS.setVal32(UBLOX_CFG_UART1_BAUDRATE,            38400); // Match UART1 baudrate with ZED
 
   Serial.print(F("QZSS-L6: UART1 configuration "));
   Serial.println(OK(ok));
 
-  if (ok) ok = myQZSS.setVal(UBLOX_CFG_UART2OUTPROT_UBX,            1);     // Enable UBX output on UART2
-  if (ok) ok = myQZSS.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_UART2, 1);     // Output QZSS-L6 message on UART2
+  if (ok) ok = myQZSS.setVal8(UBLOX_CFG_UART2OUTPROT_UBX,            1);    // Enable UBX output on UART2
+  if (ok) ok = myQZSS.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_UART2, 1);    // Output QZSS-L6 message on UART2
   if (ok) ok = myQZSS.setVal32(UBLOX_CFG_UART2_BAUDRATE,            38400); // Match UART2 baudrate with ZED
 
   Serial.print(F("QZSS-L6: UART2 configuration "));
diff --git a/examples/ZED-F9P/Example19_LBand_Corrections_with_NEO-D9S/Example19_LBand_Corrections_with_NEO-D9S.ino b/examples/ZED-F9P/Example19_LBand_Corrections_with_NEO-D9S/Example19_LBand_Corrections_with_NEO-D9S.ino
index e927177a..e031462c 100644
--- a/examples/ZED-F9P/Example19_LBand_Corrections_with_NEO-D9S/Example19_LBand_Corrections_with_NEO-D9S.ino
+++ b/examples/ZED-F9P/Example19_LBand_Corrections_with_NEO-D9S/Example19_LBand_Corrections_with_NEO-D9S.ino
@@ -10,13 +10,18 @@
 
   This is a proof of concept to show how the UBX-RXM-PMP corrections control the accuracy.
 
+  If you are using the SparkFun Combo Board (SPX-20167), the correction data is transferred from the NEO to the ZED via UART2.
+  You don't need to push it over I2C. Doing so just gives the ZED twice as many correction messages.
+  Uncomment the "#define noPush" below to disable the I2C push.
+
   You will need a Thingstream PointPerfect account to be able to access the SPARTN Credentials (L-Band or L-Band + IP Dynamic Keys).
   Copy and paste the Current Key and Next Key into secrets.h.
 
   Feel like supporting open source hardware?
   Buy a board from SparkFun!
   ZED-F9P RTK2: https://www.sparkfun.com/products/16481
-  NEO-D9S: Coming soon!
+  NEO-D9S:      https://www.sparkfun.com/products/19390
+  Combo Board:  https://www.sparkfun.com/products/20167
 
   Hardware Connections:
   Use Qwiic cables to connect the NEO-D9S and ZED-F9x GNSS to your board
@@ -24,6 +29,8 @@
   Open the serial monitor at 115200 baud to see the output
 */
 
+//#define noPush // Uncomment this line to disable pushing the correction data over I2C. Useful for the combo board which uses UART2 instead.
+
 #include "secrets.h" // <- Copy and paste the Current Key and Next Key into secrets.h
 
 #include <SparkFun_u-blox_GNSS_Arduino_Library.h> //http://librarymanager/All#SparkFun_u-blox_GNSS
@@ -41,21 +48,31 @@ const uint32_t myLBandFreq = 1556290000; // Uncomment this line to use the US SP
 // See u-blox_structs.h for the full definition of UBX_RXM_PMP_message_data_t
 //         _____  You can use any name you like for the callback. Use the same name when you call setRXMPMPmessageCallbackPtr
 //        /               _____  This _must_ be UBX_RXM_PMP_message_data_t
-//        |              /              _____ You can use any name you like for the struct
-//        |              |             /
-//        |              |             |
+//        |              /                      _____ You can use any name you like for the struct
+//        |              |                     /
+//        |              |                     |
 void pushRXMPMP(UBX_RXM_PMP_message_data_t *pmpData)
 {
   //Extract the raw message payload length
   uint16_t payloadLen = ((uint16_t)pmpData->lengthMSB << 8) | (uint16_t)pmpData->lengthLSB;
   Serial.print(F("New RXM-PMP data received. Message payload length is "));
   Serial.print(payloadLen);
+
+#ifndef noPush
+
   Serial.println(F(" Bytes. Pushing it to the GNSS..."));
   
   //Push the PMP data to the GNSS
   //The payload length could be variable, so we need to push the header and payload, then checksum
   myGNSS.pushRawData(&pmpData->sync1, (size_t)payloadLen + 6); // Push the sync chars, class, ID, length and payload
   myGNSS.pushRawData(&pmpData->checksumA, (size_t)2); // Push the checksum bytes
+
+#else
+
+  Serial.println(F(" Bytes."));
+
+#endif
+
 }
 
 //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@@ -202,7 +219,12 @@ void setup()
   Serial.println(F("u-blox GNSS module connected"));
 
   uint8_t ok = myGNSS.setI2COutput(COM_TYPE_UBX); //Turn off NMEA noise
+  
   if (ok) ok = myGNSS.setPortInput(COM_PORT_I2C, COM_TYPE_UBX | COM_TYPE_NMEA | COM_TYPE_SPARTN); //Be sure SPARTN input is enabled
+  
+  if (ok) ok = myGNSS.setPortInput(COM_PORT_UART1, COM_TYPE_UBX | COM_TYPE_NMEA | COM_TYPE_SPARTN); //Be sure SPARTN input is enabled
+
+  if (ok) ok = myGNSS.setPortInput(COM_PORT_UART2, COM_TYPE_UBX | COM_TYPE_RTCM3 | COM_TYPE_SPARTN); //Be sure SPARTN input is enabled
 
   if (ok) ok = myGNSS.setDGNSSConfiguration(SFE_UBLOX_DGNSS_MODE_FIXED); // Set the differential mode - ambiguities are fixed whenever possible
 
@@ -250,10 +272,10 @@ void setup()
   if (ok) ok = myLBand.setVal16(UBLOX_CFG_PMP_DESCRAMBLER_INIT,   26969);       // Default 23560
   if (ok) ok = myLBand.setVal8(UBLOX_CFG_PMP_USE_PRESCRAMBLING,   0);           // Default 0
   if (ok) ok = myLBand.setVal64(UBLOX_CFG_PMP_UNIQUE_WORD,        16238547128276412563ull); 
-  if (ok) ok = myLBand.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_I2C,   1); // Ensure UBX-RXM-PMP is enabled on the I2C port 
-  if (ok) ok = myLBand.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART1, 1); // Output UBX-RXM-PMP on UART1
-  if (ok) ok = myLBand.setVal(UBLOX_CFG_UART2OUTPROT_UBX, 1);         // Enable UBX output on UART2
-  if (ok) ok = myLBand.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART2, 1); // Output UBX-RXM-PMP on UART2
+  if (ok) ok = myLBand.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_I2C,   1); // Ensure UBX-RXM-PMP is enabled on the I2C port 
+  if (ok) ok = myLBand.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART1, 1); // Output UBX-RXM-PMP on UART1
+  if (ok) ok = myLBand.setVal8(UBLOX_CFG_UART2OUTPROT_UBX, 1);         // Enable UBX output on UART2
+  if (ok) ok = myLBand.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART2, 1); // Output UBX-RXM-PMP on UART2
   if (ok) ok = myLBand.setVal32(UBLOX_CFG_UART1_BAUDRATE,         38400); // match baudrate with ZED default
   if (ok) ok = myLBand.setVal32(UBLOX_CFG_UART2_BAUDRATE,         38400); // match baudrate with ZED default
   
diff --git a/examples/ZED-F9P/Example20_PMP_with_L-Band_Keys_via_MQTT/Example20_PMP_with_L-Band_Keys_via_MQTT.ino b/examples/ZED-F9P/Example20_PMP_with_L-Band_Keys_via_MQTT/Example20_PMP_with_L-Band_Keys_via_MQTT.ino
index 02358ed3..0cbaf10a 100644
--- a/examples/ZED-F9P/Example20_PMP_with_L-Band_Keys_via_MQTT/Example20_PMP_with_L-Band_Keys_via_MQTT.ino
+++ b/examples/ZED-F9P/Example20_PMP_with_L-Band_Keys_via_MQTT/Example20_PMP_with_L-Band_Keys_via_MQTT.ino
@@ -273,10 +273,10 @@ void setup()
   if (ok) ok = myLBand.setVal16(UBLOX_CFG_PMP_DESCRAMBLER_INIT,   26969);       // Default 23560
   if (ok) ok = myLBand.setVal8(UBLOX_CFG_PMP_USE_PRESCRAMBLING,   0);           // Default 0
   if (ok) ok = myLBand.setVal64(UBLOX_CFG_PMP_UNIQUE_WORD,        16238547128276412563ull); 
-  if (ok) ok = myLBand.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_I2C,   1); // Ensure UBX-RXM-PMP is enabled on the I2C port 
-  if (ok) ok = myLBand.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART1, 1); // Output UBX-RXM-PMP on UART1
-  if (ok) ok = myLBand.setVal(UBLOX_CFG_UART2OUTPROT_UBX, 1);         // Enable UBX output on UART2
-  if (ok) ok = myLBand.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART2, 1); // Output UBX-RXM-PMP on UART2
+  if (ok) ok = myLBand.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_I2C,   1); // Ensure UBX-RXM-PMP is enabled on the I2C port 
+  if (ok) ok = myLBand.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART1, 1); // Output UBX-RXM-PMP on UART1
+  if (ok) ok = myLBand.setVal8(UBLOX_CFG_UART2OUTPROT_UBX, 1);         // Enable UBX output on UART2
+  if (ok) ok = myLBand.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART2, 1); // Output UBX-RXM-PMP on UART2
   if (ok) ok = myLBand.setVal32(UBLOX_CFG_UART1_BAUDRATE,         38400); // match baudrate with ZED default
   if (ok) ok = myLBand.setVal32(UBLOX_CFG_UART2_BAUDRATE,         38400); // match baudrate with ZED default
   
diff --git a/examples/ZED-F9P/Example22_QZSSL6_Corrections_with_NEO-D9C/Example22_QZSSL6_Corrections_with_NEO-D9C.ino b/examples/ZED-F9P/Example22_QZSSL6_Corrections_with_NEO-D9C/Example22_QZSSL6_Corrections_with_NEO-D9C.ino
index 0a8fd26f..49948cc2 100644
--- a/examples/ZED-F9P/Example22_QZSSL6_Corrections_with_NEO-D9C/Example22_QZSSL6_Corrections_with_NEO-D9C.ino
+++ b/examples/ZED-F9P/Example22_QZSSL6_Corrections_with_NEO-D9C/Example22_QZSSL6_Corrections_with_NEO-D9C.ino
@@ -278,20 +278,20 @@ void setup()
   }
   Serial.println(F("u-blox NEO-D9C connected"));
 
-  ok = myQZSS.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_I2C,   1);     // Output QZSS-L6 message on the I2C port 
+  ok = myQZSS.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_I2C,   1);     // Output QZSS-L6 message on the I2C port 
 
   Serial.print(F("QZSS-L6: I2C configuration "));
   Serial.println(OK(ok));
 
-  if (ok) ok = myQZSS.setVal(UBLOX_CFG_UART1OUTPROT_UBX,            1);     // Enable UBX output on UART1
-  if (ok) ok = myQZSS.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_UART1, 1);     // Output QZSS-L6 message on UART1
+  if (ok) ok = myQZSS.setVal8(UBLOX_CFG_UART1OUTPROT_UBX,            1);     // Enable UBX output on UART1
+  if (ok) ok = myQZSS.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_UART1, 1);     // Output QZSS-L6 message on UART1
   if (ok) ok = myQZSS.setVal32(UBLOX_CFG_UART1_BAUDRATE,            38400); // Match UART1 baudrate with ZED
 
   Serial.print(F("QZSS-L6: UART1 configuration "));
   Serial.println(OK(ok));
 
-  if (ok) ok = myQZSS.setVal(UBLOX_CFG_UART2OUTPROT_UBX,            1);     // Enable UBX output on UART2
-  if (ok) ok = myQZSS.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_UART2, 1);     // Output QZSS-L6 message on UART2
+  if (ok) ok = myQZSS.setVal8(UBLOX_CFG_UART2OUTPROT_UBX,            1);     // Enable UBX output on UART2
+  if (ok) ok = myQZSS.setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_UART2, 1);     // Output QZSS-L6 message on UART2
   if (ok) ok = myQZSS.setVal32(UBLOX_CFG_UART2_BAUDRATE,            38400); // Match UART2 baudrate with ZED
 
   Serial.print(F("QZSS-L6: UART2 configuration "));
diff --git a/library.properties b/library.properties
index a6cc4fa3..987ab335 100644
--- a/library.properties
+++ b/library.properties
@@ -1,5 +1,5 @@
 name=SparkFun u-blox GNSS Arduino Library
-version=2.2.20
+version=2.2.21
 author=SparkFun Electronics <techsupport@sparkfun.com>
 maintainer=SparkFun Electronics <sparkfun.com>
 sentence=Library for I2C, Serial and SPI Communication with u-blox GNSS modules<br/><br/>