diff --git a/src/SparkFun_u-blox_SARA-R5_Arduino_Library.h b/src/SparkFun_u-blox_SARA-R5_Arduino_Library.h
index 0887158..eb9a620 100644
--- a/src/SparkFun_u-blox_SARA-R5_Arduino_Library.h
+++ b/src/SparkFun_u-blox_SARA-R5_Arduino_Library.h
@@ -21,6 +21,7 @@
 #define SPARKFUN_SARA_R5_ARDUINO_LIBRARY_H
 
 #include "sfe_sara_r5.h"
+#include "sfe_ublox_cellular.h"
 
 #define SARA_R5_POWER_PIN -1 // Default to no pin
 #define SARA_R5_RESET_PIN -1
@@ -42,125 +43,125 @@
 
 // ## Suported AT Commands
 // ### General
-const char SARA_R5_COMMAND_AT[] = "AT";           // AT "Test"
-const char SARA_R5_COMMAND_ECHO[] = "E";          // Local Echo
-const char SARA_R5_COMMAND_MANU_ID[] = "+CGMI";   // Manufacturer identification
-const char SARA_R5_COMMAND_MODEL_ID[] = "+CGMM";  // Model identification
-const char SARA_R5_COMMAND_FW_VER_ID[] = "+CGMR"; // Firmware version identification
-const char SARA_R5_COMMAND_SERIAL_NO[] = "+CGSN"; // Product serial number
-const char SARA_R5_COMMAND_IMEI[] = "+GSN";       // IMEI identification
-const char SARA_R5_COMMAND_IMSI[] = "+CIMI";      // IMSI identification
-const char SARA_R5_COMMAND_CCID[] = "+CCID";      // SIM CCID
-const char SARA_R5_COMMAND_REQ_CAP[] = "+GCAP";   // Request capabilities list
+#define SARA_R5_COMMAND_AT UBX_CELL_COMMAND_AT
+#define SARA_R5_COMMAND_ECHO UBX_CELL_COMMAND_ECHO
+#define SARA_R5_COMMAND_MANU_ID UBX_CELL_COMMAND_MANU_ID
+#define SARA_R5_COMMAND_MODEL_ID UBX_CELL_COMMAND_MODEL_ID
+#define SARA_R5_COMMAND_FW_VER_ID UBX_CELL_COMMAND_FW_VER_ID
+#define SARA_R5_COMMAND_SERIAL_NO UBX_CELL_COMMAND_SERIAL_NO
+#define SARA_R5_COMMAND_IMEI UBX_CELL_COMMAND_IMEI
+#define SARA_R5_COMMAND_IMSI UBX_CELL_COMMAND_IMSI
+#define SARA_R5_COMMAND_CCID UBX_CELL_COMMAND_CCID
+#define SARA_R5_COMMAND_REQ_CAP UBX_CELL_COMMAND_REQ_CAP
 // ### Control and status
-const char SARA_R5_COMMAND_POWER_OFF[] = "+CPWROFF"; // Module switch off
-const char SARA_R5_COMMAND_FUNC[] = "+CFUN";         // Functionality (reset, etc.)
-const char SARA_R5_COMMAND_CLOCK[] = "+CCLK";        // Real-time clock
-const char SARA_R5_COMMAND_AUTO_TZ[] = "+CTZU";      // Automatic time zone update
-const char SARA_R5_COMMAND_TZ_REPORT[] = "+CTZR";    // Time zone reporting
+#define SARA_R5_COMMAND_POWER_OFF UBX_CELL_COMMAND_POWER_OFF
+#define SARA_R5_COMMAND_FUNC UBX_CELL_COMMAND_FUNC
+#define SARA_R5_COMMAND_CLOCK UBX_CELL_COMMAND_CLOCK
+#define SARA_R5_COMMAND_AUTO_TZ UBX_CELL_COMMAND_AUTO_TZ
+#define SARA_R5_COMMAND_TZ_REPORT UBX_CELL_COMMAND_TZ_REPORT
 // ### Network service
-const char SARA_R5_COMMAND_CNUM[] = "+CNUM"; // Subscriber number
-const char SARA_R5_SIGNAL_QUALITY[] = "+CSQ";
-const char SARA_R5_EXT_SIGNAL_QUALITY[] = "+CESQ";
-const char SARA_R5_OPERATOR_SELECTION[] = "+COPS";
-const char SARA_R5_REGISTRATION_STATUS[] = "+CREG";
-const char SARA_R5_EPSREGISTRATION_STATUS[] = "+CEREG";
-const char SARA_R5_READ_OPERATOR_NAMES[] = "+COPN";
-const char SARA_R5_COMMAND_MNO[] = "+UMNOPROF"; // MNO (mobile network operator) Profile
+#define SARA_R5_COMMAND_CNUM UBX_CELL_COMMAND_CNUM
+#define SARA_R5_SIGNAL_QUALITY UBX_CELL_SIGNAL_QUALITY
+#define SARA_R5_EXT_SIGNAL_QUALITY UBX_CELL_EXT_SIGNAL_QUALITY
+#define SARA_R5_OPERATOR_SELECTION UBX_CELL_OPERATOR_SELECTION
+#define SARA_R5_REGISTRATION_STATUS UBX_CELL_REGISTRATION_STATUS
+#define SARA_R5_EPSREGISTRATION_STATUS UBX_CELL_EPSREGISTRATION_STATUS
+#define SARA_R5_READ_OPERATOR_NAMES UBX_CELL_READ_OPERATOR_NAMES
+#define SARA_R5_COMMAND_MNO UBX_CELL_COMMAND_MNO
 // ### SIM
-const char SARA_R5_SIM_STATE[] = "+USIMSTAT";
-const char SARA_R5_COMMAND_SIMPIN[] = "+CPIN";    // SIM PIN
+#define SARA_R5_SIM_STATE UBX_CELL_SIM_STATE
+#define SARA_R5_COMMAND_SIMPIN UBX_CELL_COMMAND_SIMPIN
 // ### SMS
-const char SARA_R5_MESSAGE_FORMAT[] = "+CMGF";     // Set SMS message format
-const char SARA_R5_SEND_TEXT[] = "+CMGS";          // Send SMS message
-const char SARA_R5_NEW_MESSAGE_IND[] = "+CNMI";    // New [SMS] message indication
-const char SARA_R5_PREF_MESSAGE_STORE[] = "+CPMS"; // Preferred message storage
-const char SARA_R5_READ_TEXT_MESSAGE[] = "+CMGR";  // Read message
-const char SARA_R5_DELETE_MESSAGE[] = "+CMGD";     // Delete message
+#define SARA_R5_MESSAGE_FORMAT UBX_CELL_MESSAGE_FORMAT
+#define SARA_R5_SEND_TEXT UBX_CELL_SEND_TEXT
+#define SARA_R5_NEW_MESSAGE_IND UBX_CELL_NEW_MESSAGE_IND
+#define SARA_R5_PREF_MESSAGE_STORE UBX_CELL_PREF_MESSAGE_STORE
+#define SARA_R5_READ_TEXT_MESSAGE UBX_CELL_READ_TEXT_MESSAGE
+#define SARA_R5_DELETE_MESSAGE UBX_CELL_DELETE_MESSAGE
 // V24 control and V25ter (UART interface)
-const char SARA_R5_FLOW_CONTROL[] = "&K";   // Flow control
-const char SARA_R5_COMMAND_BAUD[] = "+IPR"; // Baud rate
+#define SARA_R5_FLOW_CONTROL UBX_CELL_FLOW_CONTROL
+#define SARA_R5_COMMAND_BAUD UBX_CELL_COMMAND_BAUD
 // ### Packet switched data services
-const char SARA_R5_MESSAGE_PDP_DEF[] = "+CGDCONT";            // Packet switched Data Profile context definition
-const char SARA_R5_MESSAGE_PDP_CONFIG[] = "+UPSD";            // Packet switched Data Profile configuration
-const char SARA_R5_MESSAGE_PDP_ACTION[] = "+UPSDA";           // Perform the action for the specified PSD profile
-const char SARA_R5_MESSAGE_PDP_CONTEXT_ACTIVATE[] = "+CGACT"; // Activates or deactivates the specified PDP context
-const char SARA_R5_MESSAGE_ENTER_PPP[] = "D";
-const char SARA_R5_NETWORK_ASSIGNED_DATA[] = "+UPSND";        // Packet switched network-assigned data
+#define SARA_R5_MESSAGE_PDP_DEF UBX_CELL_MESSAGE_PDP_DEF
+#define SARA_R5_MESSAGE_PDP_CONFIG UBX_CELL_MESSAGE_PDP_CONFIG
+#define SARA_R5_MESSAGE_PDP_ACTION UBX_CELL_MESSAGE_PDP_ACTION
+#define SARA_R5_MESSAGE_PDP_CONTEXT_ACTIVATE UBX_CELL_MESSAGE_PDP_CONTEXT_ACTIVATE
+#define SARA_R5_MESSAGE_ENTER_PPP UBX_CELL_MESSAGE_ENTER_PPP
+#define SARA_R5_NETWORK_ASSIGNED_DATA UBX_CELL_NETWORK_ASSIGNED_DATA
 // ### GPIO
-const char SARA_R5_COMMAND_GPIO[] = "+UGPIOC"; // GPIO Configuration
+#define SARA_R5_COMMAND_GPIO UBX_CELL_COMMAND_GPIO
 // ### IP
-const char SARA_R5_CREATE_SOCKET[] = "+USOCR";      // Create a new socket
-const char SARA_R5_CLOSE_SOCKET[] = "+USOCL";       // Close a socket
-const char SARA_R5_CONNECT_SOCKET[] = "+USOCO";     // Connect to server on socket
-const char SARA_R5_WRITE_SOCKET[] = "+USOWR";       // Write data to a socket
-const char SARA_R5_WRITE_UDP_SOCKET[] = "+USOST";   // Write data to a UDP socket
-const char SARA_R5_READ_SOCKET[] = "+USORD";        // Read from a socket
-const char SARA_R5_READ_UDP_SOCKET[] = "+USORF";    // Read UDP data from a socket
-const char SARA_R5_LISTEN_SOCKET[] = "+USOLI";      // Listen for connection on socket
-const char SARA_R5_GET_ERROR[] = "+USOER";          // Get last socket error.
-const char SARA_R5_SOCKET_DIRECT_LINK[] = "+USODL"; // Set socket in Direct Link mode
-const char SARA_R5_SOCKET_CONTROL[] = "+USOCTL";    // Query the socket parameters
-const char SARA_R5_UD_CONFIGURATION[] = "+UDCONF";  // User Datagram Configuration
+#define SARA_R5_CREATE_SOCKET UBX_CELL_CREATE_SOCKET
+#define SARA_R5_CLOSE_SOCKET UBX_CELL_CLOSE_SOCKET
+#define SARA_R5_CONNECT_SOCKET UBX_CELL_CONNECT_SOCKET
+#define SARA_R5_WRITE_SOCKET UBX_CELL_WRITE_SOCKET
+#define SARA_R5_WRITE_UDP_SOCKET UBX_CELL_WRITE_UDP_SOCKET
+#define SARA_R5_READ_SOCKET UBX_CELL_READ_SOCKET
+#define SARA_R5_READ_UDP_SOCKET UBX_CELL_READ_UDP_SOCKET
+#define SARA_R5_LISTEN_SOCKET UBX_CELL_LISTEN_SOCKET
+#define SARA_R5_GET_ERROR UBX_CELL_GET_ERROR
+#define SARA_R5_SOCKET_DIRECT_LINK UBX_CELL_SOCKET_DIRECT_LINK
+#define SARA_R5_SOCKET_CONTROL UBX_CELL_SOCKET_CONTROL
+#define SARA_R5_UD_CONFIGURATION UBX_CELL_UD_CONFIGURATION
 // ### Ping
-const char SARA_R5_PING_COMMAND[] = "+UPING"; // Ping
+#define SARA_R5_PING_COMMAND UBX_CELL_PING_COMMAND
 // ### HTTP
-const char SARA_R5_HTTP_PROFILE[] = "+UHTTP";          // Configure the HTTP profile. Up to 4 different profiles can be defined
-const char SARA_R5_HTTP_COMMAND[] = "+UHTTPC";         // Trigger the specified HTTP command
-const char SARA_R5_HTTP_PROTOCOL_ERROR[] = "+UHTTPER"; // Retrieves the error class and code of the latest HTTP operation on the specified HTTP profile.
-
-const char SARA_R5_MQTT_NVM[] = "+UMQTTNV";
-const char SARA_R5_MQTT_PROFILE[] = "+UMQTT";
-const char SARA_R5_MQTT_COMMAND[] = "+UMQTTC";
-const char SARA_R5_MQTT_PROTOCOL_ERROR[] = "+UMQTTER";
+#define SARA_R5_HTTP_PROFILE UBX_CELL_HTTP_PROFILE
+#define SARA_R5_HTTP_COMMAND UBX_CELL_HTTP_COMMAND
+#define SARA_R5_HTTP_PROTOCOL_ERROR UBX_CELL_HTTP_PROTOCOL_ERROR
+
+#define SARA_R5_MQTT_NVM UBX_CELL_MQTT_NVM
+#define SARA_R5_MQTT_PROFILE UBX_CELL_MQTT_PROFILE
+#define SARA_R5_MQTT_COMMAND UBX_CELL_MQTT_COMMAND
+#define SARA_R5_MQTT_PROTOCOL_ERROR UBX_CELL_MQTT_PROTOCOL_ERROR
 // ### FTP
-const char SARA_R5_FTP_PROFILE[] = "+UFTP";
-const char SARA_R5_FTP_COMMAND[] = "+UFTPC";
-const char SARA_R5_FTP_PROTOCOL_ERROR[] = "+UFTPER";
+#define SARA_R5_FTP_PROFILE UBX_CELL_FTP_PROFILE
+#define SARA_R5_FTP_COMMAND UBX_CELL_FTP_COMMAND
+#define SARA_R5_FTP_PROTOCOL_ERROR UBX_CELL_FTP_PROTOCOL_ERROR
 // ### GNSS
-const char SARA_R5_GNSS_POWER[] = "+UGPS";                   // GNSS power management configuration
-const char SARA_R5_GNSS_ASSISTED_IND[] = "+UGIND";           // Assisted GNSS unsolicited indication
-const char SARA_R5_GNSS_REQUEST_LOCATION[] = "+ULOC";        // Ask for localization information
-const char SARA_R5_GNSS_GPRMC[] = "+UGRMC";                  // Ask for localization information
-const char SARA_R5_GNSS_REQUEST_TIME[] = "+UTIME";           // Ask for time information from cellular modem (CellTime)
-const char SARA_R5_GNSS_TIME_INDICATION[] = "+UTIMEIND";     // Time information request status unsolicited indication
-const char SARA_R5_GNSS_TIME_CONFIGURATION[] = "+UTIMECFG";  // Sets time configuration
-const char SARA_R5_GNSS_CONFIGURE_SENSOR[] = "+ULOCGNSS";    // Configure GNSS sensor
-const char SARA_R5_GNSS_CONFIGURE_LOCATION[] = "+ULOCCELL";  // Configure cellular location sensor (CellLocate®)
-const char SARA_R5_AIDING_SERVER_CONFIGURATION[] = "+UGSRV"; // Configure aiding server (CellLocate®)
+#define SARA_R5_GNSS_POWER UBX_CELL_GNSS_POWER
+#define SARA_R5_GNSS_ASSISTED_IND UBX_CELL_GNSS_ASSISTED_IND
+#define SARA_R5_GNSS_REQUEST_LOCATION UBX_CELL_GNSS_REQUEST_LOCATION
+#define SARA_R5_GNSS_GPRMC UBX_CELL_GNSS_GPRMC
+#define SARA_R5_GNSS_REQUEST_TIME UBX_CELL_GNSS_REQUEST_TIME
+#define SARA_R5_GNSS_TIME_INDICATION UBX_CELL_GNSS_TIME_INDICATION
+#define SARA_R5_GNSS_TIME_CONFIGURATION UBX_CELL_GNSS_TIME_CONFIGURATION
+#define SARA_R5_GNSS_CONFIGURE_SENSOR UBX_CELL_GNSS_CONFIGURE_SENSOR
+#define SARA_R5_GNSS_CONFIGURE_LOCATION UBX_CELL_GNSS_CONFIGURE_LOCATION
+#define SARA_R5_AIDING_SERVER_CONFIGURATION UBX_CELL_AIDING_SERVER_CONFIGURATION
 // ### File System
 // TO DO: Add support for file tags. Default tag to USER
-const char SARA_R5_FILE_SYSTEM_READ_FILE[] = "+URDFILE";      // Read a file
-const char SARA_R5_FILE_SYSTEM_READ_BLOCK[] = "+URDBLOCK";      // Read a block from a file
-const char SARA_R5_FILE_SYSTEM_DOWNLOAD_FILE[] = "+UDWNFILE";    // Download a file into the module
-const char SARA_R5_FILE_SYSTEM_LIST_FILES[] = "+ULSTFILE";    // List of files, size of file, etc.
-const char SARA_R5_FILE_SYSTEM_DELETE_FILE[] = "+UDELFILE";   // Delete a file
+#define SARA_R5_FILE_SYSTEM_READ_FILE UBX_CELL_FILE_SYSTEM_READ_FILE
+#define SARA_R5_FILE_SYSTEM_READ_BLOCK UBX_CELL_FILE_SYSTEM_READ_BLOCK
+#define SARA_R5_FILE_SYSTEM_DOWNLOAD_FILE UBX_CELL_FILE_SYSTEM_DOWNLOAD_FILE
+#define SARA_R5_FILE_SYSTEM_LIST_FILES UBX_CELL_FILE_SYSTEM_LIST_FILES
+#define SARA_R5_FILE_SYSTEM_DELETE_FILE UBX_CELL_FILE_SYSTEM_DELETE_FILE
 // ### File System
 // TO DO: Add support for file tags. Default tag to USER
-const char SARA_R5_SEC_PROFILE[] = "+USECPRF";
-const char SARA_R5_SEC_MANAGER[] = "+USECMNG";
+#define SARA_R5_SEC_PROFILE UBX_CELL_SEC_PROFILE
+#define SARA_R5_SEC_MANAGER UBX_CELL_SEC_MANAGER
 
 
 // ### URC strings
-const char SARA_R5_READ_SOCKET_URC[] = "+UUSORD:";
-const char SARA_R5_READ_UDP_SOCKET_URC[] = "+UUSORF:";
-const char SARA_R5_LISTEN_SOCKET_URC[] = "+UUSOLI:";
-const char SARA_R5_CLOSE_SOCKET_URC[] = "+UUSOCL:";
-const char SARA_R5_GNSS_REQUEST_LOCATION_URC[] = "+UULOC:";
-const char SARA_R5_SIM_STATE_URC[] = "+UUSIMSTAT:";
-const char SARA_R5_MESSAGE_PDP_ACTION_URC[] = "+UUPSDA:";
-const char SARA_R5_HTTP_COMMAND_URC[] = "+UUHTTPCR:";
-const char SARA_R5_MQTT_COMMAND_URC[] = "+UUMQTTC:";
-const char SARA_R5_PING_COMMAND_URC[] = "+UUPING:";
-const char SARA_R5_REGISTRATION_STATUS_URC[] = "+CREG:";
-const char SARA_R5_EPSREGISTRATION_STATUS_URC[] = "+CEREG:";
-const char SARA_R5_FTP_COMMAND_URC[] = "+UUFTPCR:";
+#define SARA_R5_READ_SOCKET_URC UBX_CELL_READ_SOCKET_URC
+#define SARA_R5_READ_UDP_SOCKET_URC UBX_CELL_READ_UDP_SOCKET_URC
+#define SARA_R5_LISTEN_SOCKET_URC UBX_CELL_LISTEN_SOCKET_URC
+#define SARA_R5_CLOSE_SOCKET_URC UBX_CELL_CLOSE_SOCKET_URC
+#define SARA_R5_GNSS_REQUEST_LOCATION_URC UBX_CELL_GNSS_REQUEST_LOCATION_URC
+#define SARA_R5_SIM_STATE_URC UBX_CELL_SIM_STATE_URC
+#define SARA_R5_MESSAGE_PDP_ACTION_URC UBX_CELL_MESSAGE_PDP_ACTION_URC
+#define SARA_R5_HTTP_COMMAND_URC UBX_CELL_HTTP_COMMAND_URC
+#define SARA_R5_MQTT_COMMAND_URC UBX_CELL_MQTT_COMMAND_URC
+#define SARA_R5_PING_COMMAND_URC UBX_CELL_PING_COMMAND_URC
+#define SARA_R5_REGISTRATION_STATUS_URC UBX_CELL_REGISTRATION_STATUS_URC
+#define SARA_R5_EPSREGISTRATION_STATUS_URC UBX_CELL_EPSREGISTRATION_STATUS_URC
+#define SARA_R5_FTP_COMMAND_URC UBX_CELL_FTP_COMMAND_URC
 
 // ### Response
-const char SARA_R5_RESPONSE_MORE[] = "\n>";
-const char SARA_R5_RESPONSE_OK[] = "\nOK\r\n";
-const char SARA_R5_RESPONSE_ERROR[] = "\nERROR\r\n";
-const char SARA_R5_RESPONSE_CONNECT[] = "\r\nCONNECT\r\n";
+#define SARA_R5_RESPONSE_MORE UBX_CELL_RESPONSE_MORE
+#define SARA_R5_RESPONSE_OK UBX_CELL_RESPONSE_OK
+#define SARA_R5_RESPONSE_ERROR UBX_CELL_RESPONSE_ERROR
+#define SARA_R5_RESPONSE_CONNECT UBX_CELL_RESPONSE_CONNECT
 #define SARA_R5_RESPONSE_OK_OR_ERROR nullptr
 
 #define SARA_R5_NUM_SOCKETS 6
diff --git a/src/sfe_sara_r5.cpp b/src/sfe_sara_r5.cpp
new file mode 100644
index 0000000..0e704b4
--- /dev/null
+++ b/src/sfe_sara_r5.cpp
@@ -0,0 +1,360 @@
+#include "sfe_sara_r5.h"
+
+UBX_CELL_error_t SARA_R5::setUtimeMode(UBX_CELL_utime_mode_t mode, UBX_CELL_utime_sensor_t sensor)
+{
+  UBX_CELL_error_t err;
+  char *command;
+
+  command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_REQUEST_TIME) + 16);
+  if (command == nullptr)
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+  if (mode == UBX_CELL_UTIME_MODE_STOP) // stop UTIME does not require a sensor
+    sprintf(command, "%s=%d", UBX_CELL_GNSS_REQUEST_TIME, mode);
+  else
+    sprintf(command, "%s=%d,%d", UBX_CELL_GNSS_REQUEST_TIME, mode, sensor);
+
+  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR,
+                                nullptr, UBX_CELL_10_SEC_TIMEOUT);
+  free(command);
+  return err;
+}
+
+UBX_CELL_error_t SARA_R5::getUtimeMode(UBX_CELL_utime_mode_t *mode, UBX_CELL_utime_sensor_t *sensor)
+{
+  UBX_CELL_error_t err;
+  char *command;
+  char *response;
+
+  UBX_CELL_utime_mode_t m;
+  UBX_CELL_utime_sensor_t s;
+
+  command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_REQUEST_TIME) + 2);
+  if (command == nullptr)
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+  sprintf(command, "%s?", UBX_CELL_GNSS_REQUEST_TIME);
+
+  response = ubx_cell_calloc_char(minimumResponseAllocation);
+  if (response == nullptr)
+  {
+    free(command);
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+  }
+
+  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR,
+                                response, UBX_CELL_10_SEC_TIMEOUT);
+
+  // Response format: \r\n+UTIME: <mode>[,<sensor>]\r\n\r\nOK\r\n
+  if (err == UBX_CELL_ERROR_SUCCESS)
+  {
+    int mStore, sStore, scanned = 0;
+    char *searchPtr = strstr(response, "+UTIME:");
+    if (searchPtr != nullptr)
+    {
+      searchPtr += strlen("+UTIME:"); // Move searchPtr to first character - probably a space
+      while (*searchPtr == ' ') searchPtr++; // skip spaces
+      scanned = sscanf(searchPtr, "%d,%d\r\n", &mStore, &sStore);
+    }
+    m = (UBX_CELL_utime_mode_t)mStore;
+    s = (UBX_CELL_utime_sensor_t)sStore;
+    if (scanned == 2)
+    {
+      *mode = m;
+      *sensor = s;
+    }
+    else if (scanned == 1)
+    {
+      *mode = m;
+      *sensor = UBX_CELL_UTIME_SENSOR_NONE;
+    }
+    else
+      err = UBX_CELL_ERROR_UNEXPECTED_RESPONSE;
+  }
+
+  free(command);
+  free(response);
+  return err;
+}
+
+UBX_CELL_error_t SARA_R5::setUtimeIndication(UBX_CELL_utime_urc_configuration_t config)
+{
+  UBX_CELL_error_t err;
+  char *command;
+
+  command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_INDICATION) + 16);
+  if (command == nullptr)
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+  sprintf(command, "%s=%d", UBX_CELL_GNSS_TIME_INDICATION, config);
+
+  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR,
+                                nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
+  free(command);
+  return err;
+}
+
+UBX_CELL_error_t SARA_R5::getUtimeIndication(UBX_CELL_utime_urc_configuration_t *config)
+{
+  UBX_CELL_error_t err;
+  char *command;
+  char *response;
+
+  UBX_CELL_utime_urc_configuration_t c;
+
+  command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_INDICATION) + 2);
+  if (command == nullptr)
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+  sprintf(command, "%s?", UBX_CELL_GNSS_TIME_INDICATION);
+
+  response = ubx_cell_calloc_char(minimumResponseAllocation);
+  if (response == nullptr)
+  {
+    free(command);
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+  }
+
+  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR,
+                                response, UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
+
+  // Response format: \r\n+UTIMEIND: <mode>\r\n\r\nOK\r\n
+  if (err == UBX_CELL_ERROR_SUCCESS)
+  {
+    int cStore, scanned = 0;
+    char *searchPtr = strstr(response, "+UTIMEIND:");
+    if (searchPtr != nullptr)
+    {
+      searchPtr += strlen("+UTIMEIND:"); //  Move searchPtr to first char
+      while (*searchPtr == ' ') searchPtr++; // skip spaces
+      scanned = sscanf(searchPtr, "%d\r\n", &cStore);
+    }
+    c = (UBX_CELL_utime_urc_configuration_t)cStore;
+    if (scanned == 1)
+    {
+      *config = c;
+    }
+    else
+      err = UBX_CELL_ERROR_UNEXPECTED_RESPONSE;
+  }
+
+  free(command);
+  free(response);
+  return err;
+}
+
+UBX_CELL_error_t SARA_R5::setUtimeConfiguration(int32_t offsetNanoseconds, int32_t offsetSeconds)
+{
+  UBX_CELL_error_t err;
+  char *command;
+
+  command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_CONFIGURATION) + 48);
+  if (command == nullptr)
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+#if defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_ESP8266)
+  sprintf(command, "%s=%d,%d", UBX_CELL_GNSS_TIME_CONFIGURATION, offsetNanoseconds, offsetSeconds);
+#else
+  sprintf(command, "%s=%ld,%ld", UBX_CELL_GNSS_TIME_CONFIGURATION, offsetNanoseconds, offsetSeconds);
+#endif
+
+  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR,
+                                nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
+  free(command);
+  return err;
+}
+
+UBX_CELL_error_t SARA_R5::getUtimeConfiguration(int32_t *offsetNanoseconds, int32_t *offsetSeconds)
+{
+  UBX_CELL_error_t err;
+  char *command;
+  char *response;
+
+  int32_t ons;
+  int32_t os;
+
+  command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_CONFIGURATION) + 2);
+  if (command == nullptr)
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+  sprintf(command, "%s?", UBX_CELL_GNSS_TIME_CONFIGURATION);
+
+  response = ubx_cell_calloc_char(minimumResponseAllocation);
+  if (response == nullptr)
+  {
+    free(command);
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+  }
+
+  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR,
+                                response, UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
+
+  // Response format: \r\n+UTIMECFG: <offset_nano>,<offset_sec>\r\n\r\nOK\r\n
+  if (err == UBX_CELL_ERROR_SUCCESS)
+  {
+    int scanned = 0;
+    char *searchPtr = strstr(response, "+UTIMECFG:");
+    if (searchPtr != nullptr)
+    {
+      searchPtr += strlen("+UTIMECFG:"); //  Move searchPtr to first char
+      while (*searchPtr == ' ') searchPtr++; // skip spaces
+#if defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_ESP8266)
+      scanned = sscanf(searchPtr, "%d,%d\r\n", &ons, &os);
+#else
+      scanned = sscanf(searchPtr, "%ld,%ld\r\n", &ons, &os);
+#endif
+    }
+    if (scanned == 2)
+    {
+      *offsetNanoseconds = ons;
+      *offsetSeconds = os;
+    }
+    else
+      err = UBX_CELL_ERROR_UNEXPECTED_RESPONSE;
+  }
+
+  free(command);
+  free(response);
+  return err;
+}
+
+UBX_CELL_error_t SARA_R5::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, int value)
+{
+  UBX_CELL_error_t err;
+  char *command;
+
+  if (profile >= UBX_CELL_NUM_PSD_PROFILES)
+    return UBX_CELL_ERROR_ERROR;
+
+  command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_CONFIG) + 24);
+  if (command == nullptr)
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+  sprintf(command, "%s=%d,%d,%d", UBX_CELL_MESSAGE_PDP_CONFIG, profile, parameter,
+          value);
+
+  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr,
+                                UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
+
+  free(command);
+  return err;
+}
+
+UBX_CELL_error_t SARA_R5::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, UBX_CELL_pdp_protocol_type_t value)
+{
+  return (setPDPconfiguration(profile, parameter, (int)value));
+}
+
+UBX_CELL_error_t SARA_R5::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, String value)
+{
+  UBX_CELL_error_t err;
+  char *command;
+
+  if (profile >= UBX_CELL_NUM_PSD_PROFILES)
+    return UBX_CELL_ERROR_ERROR;
+
+  command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_CONFIG) + 64);
+  if (command == nullptr)
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+  sprintf(command, "%s=%d,%d,\"%s\"", UBX_CELL_MESSAGE_PDP_CONFIG, profile, parameter,
+          value.c_str());
+
+  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr,
+                                UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
+
+  free(command);
+  return err;
+}
+
+UBX_CELL_error_t SARA_R5::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, IPAddress value)
+{
+  UBX_CELL_error_t err;
+  char *command;
+
+  if (profile >= UBX_CELL_NUM_PSD_PROFILES)
+    return UBX_CELL_ERROR_ERROR;
+
+  command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_CONFIG) + 64);
+  if (command == nullptr)
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+  sprintf(command, "%s=%d,%d,\"%d.%d.%d.%d\"", UBX_CELL_MESSAGE_PDP_CONFIG, profile, parameter,
+          value[0], value[1], value[2], value[3]);
+
+  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr,
+                                UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
+
+  free(command);
+  return err;
+}
+
+UBX_CELL_error_t SARA_R5::performPDPaction(int profile, UBX_CELL_pdp_actions_t action)
+{
+  UBX_CELL_error_t err;
+  char *command;
+
+  if (profile >= UBX_CELL_NUM_PSD_PROFILES)
+    return UBX_CELL_ERROR_ERROR;
+
+  command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_ACTION) + 32);
+  if (command == nullptr)
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+  sprintf(command, "%s=%d,%d", UBX_CELL_MESSAGE_PDP_ACTION, profile, action);
+
+  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr,
+                                UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
+
+  free(command);
+  return err;
+}
+
+UBX_CELL_error_t SARA_R5::getNetworkAssignedIPAddress(int profile, IPAddress *address)
+{
+  char *command;
+  char *response;
+  UBX_CELL_error_t err;
+  int scanNum = 0;
+  int profileStore = 0;
+  int paramTag = 0; // 0: IP address: dynamic IP address assigned during PDP context activation
+  int paramVals[4];
+
+  command = ubx_cell_calloc_char(strlen(UBX_CELL_NETWORK_ASSIGNED_DATA) + 16);
+  if (command == nullptr)
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+  sprintf(command, "%s=%d,%d", UBX_CELL_NETWORK_ASSIGNED_DATA, profile, paramTag);
+
+  response = ubx_cell_calloc_char(minimumResponseAllocation);
+  if (response == nullptr)
+  {
+    free(command);
+    return UBX_CELL_ERROR_OUT_OF_MEMORY;
+  }
+
+  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, response,
+                                UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
+
+  if (err == UBX_CELL_ERROR_SUCCESS)
+  {
+    char *searchPtr = strstr(response, "+UPSND:");
+    if (searchPtr != nullptr)
+    {
+      searchPtr += strlen("+UPSND:"); //  Move searchPtr to first char
+      while (*searchPtr == ' ') searchPtr++; // skip spaces
+      scanNum = sscanf(searchPtr, "%d,%d,\"%d.%d.%d.%d\"",
+                        &profileStore, &paramTag,
+                        &paramVals[0], &paramVals[1], &paramVals[2], &paramVals[3]);
+    }
+    if (scanNum != 6)
+    {
+      if (_printDebug == true)
+      {
+        _debugPort->print(F("getNetworkAssignedIPAddress: error: scanNum is "));
+        _debugPort->println(scanNum);
+      }
+      free(command);
+      free(response);
+      return UBX_CELL_ERROR_UNEXPECTED_RESPONSE;
+    }
+
+    IPAddress tempAddress = { (uint8_t)paramVals[0], (uint8_t)paramVals[1],
+                              (uint8_t)paramVals[2], (uint8_t)paramVals[3] };
+    *address = tempAddress;
+  }
+
+  free(command);
+  free(response);
+
+  return err;
+}
diff --git a/src/sfe_sara_r5.h b/src/sfe_sara_r5.h
index 688aa54..87cec80 100644
--- a/src/sfe_sara_r5.h
+++ b/src/sfe_sara_r5.h
@@ -3,10 +3,32 @@
 
 #include "sfe_ublox_cellular.h"
 
+const char UBX_CELL_MESSAGE_PDP_CONFIG[] = "+UPSD";          // Packet switched Data Profile configuration
+const char UBX_CELL_MESSAGE_PDP_ACTION[] = "+UPSDA";         // Perform the action for the specified PSD profile
+const char UBX_CELL_NETWORK_ASSIGNED_DATA[] = "+UPSND";      // Packet switched network-assigned data
+const char UBX_CELL_GNSS_REQUEST_TIME[] = "+UTIME";          // Ask for time information from cellular modem (CellTime)
+const char UBX_CELL_GNSS_TIME_INDICATION[] = "+UTIMEIND";    // Time information request status unsolicited indication
+const char UBX_CELL_GNSS_TIME_CONFIGURATION[] = "+UTIMECFG"; // Sets time configuration
+
 // Base SARA-R5 class
 class SARA_R5: public UBX_CELL
 {
-
+public:
+  UBX_CELL_error_t setUtimeMode(UBX_CELL_utime_mode_t mode = UBX_CELL_UTIME_MODE_PPS, UBX_CELL_utime_sensor_t sensor = UBX_CELL_UTIME_SENSOR_GNSS_LTE); // Time mode, source etc. (+UTIME)
+  UBX_CELL_error_t getUtimeMode(UBX_CELL_utime_mode_t *mode, UBX_CELL_utime_sensor_t *sensor);
+  UBX_CELL_error_t setUtimeIndication(UBX_CELL_utime_urc_configuration_t config = UBX_CELL_UTIME_URC_CONFIGURATION_ENABLED); // +UTIMEIND
+  UBX_CELL_error_t getUtimeIndication(UBX_CELL_utime_urc_configuration_t *config);
+  UBX_CELL_error_t setUtimeConfiguration(int32_t offsetNanoseconds = 0, int32_t offsetSeconds = 0); // +UTIMECFG
+  UBX_CELL_error_t getUtimeConfiguration(int32_t *offsetNanoseconds, int32_t *offsetSeconds);
+
+  // Packet Switched Data
+  // Configure the PDP using +UPSD. See UBX_CELL_pdp_configuration_parameter_t for the list of parameters: protocol, APN, username, DNS, etc.
+  UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, int value);                         // Set parameters in the chosen PSD profile
+  UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, UBX_CELL_pdp_protocol_type_t value); // Set parameters in the chosen PSD profile
+  UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, String value);                      // Set parameters in the chosen PSD profile
+  UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, IPAddress value);                   // Set parameters in the chosen PSD profile
+  UBX_CELL_error_t performPDPaction(int profile, UBX_CELL_pdp_actions_t action);  // Performs the requested action for the specified PSD profile: reset, store, load, activate, deactivate
+  UBX_CELL_error_t getNetworkAssignedIPAddress(int profile, IPAddress *address); // Get the dynamic IP address assigned during PDP context activation
 };
 
 class SARA_R500S: public SARA_R5
diff --git a/src/sfe_ublox_cellular.cpp b/src/sfe_ublox_cellular.cpp
index 3dd79c8..484973c 100644
--- a/src/sfe_ublox_cellular.cpp
+++ b/src/sfe_ublox_cellular.cpp
@@ -1336,218 +1336,6 @@ void UBX_CELL::autoTimeZoneForBegin(bool tz)
   _autoTimeZoneForBegin = tz;
 }
 
-UBX_CELL_error_t UBX_CELL::setUtimeMode(UBX_CELL_utime_mode_t mode, UBX_CELL_utime_sensor_t sensor)
-{
-  UBX_CELL_error_t err;
-  char *command;
-
-  command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_REQUEST_TIME) + 16);
-  if (command == nullptr)
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-  if (mode == UBX_CELL_UTIME_MODE_STOP) // stop UTIME does not require a sensor
-    sprintf(command, "%s=%d", UBX_CELL_GNSS_REQUEST_TIME, mode);
-  else
-    sprintf(command, "%s=%d,%d", UBX_CELL_GNSS_REQUEST_TIME, mode, sensor);
-
-  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR,
-                                nullptr, UBX_CELL_10_SEC_TIMEOUT);
-  free(command);
-  return err;
-}
-
-UBX_CELL_error_t UBX_CELL::getUtimeMode(UBX_CELL_utime_mode_t *mode, UBX_CELL_utime_sensor_t *sensor)
-{
-  UBX_CELL_error_t err;
-  char *command;
-  char *response;
-
-  UBX_CELL_utime_mode_t m;
-  UBX_CELL_utime_sensor_t s;
-
-  command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_REQUEST_TIME) + 2);
-  if (command == nullptr)
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-  sprintf(command, "%s?", UBX_CELL_GNSS_REQUEST_TIME);
-
-  response = ubx_cell_calloc_char(minimumResponseAllocation);
-  if (response == nullptr)
-  {
-    free(command);
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-  }
-
-  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR,
-                                response, UBX_CELL_10_SEC_TIMEOUT);
-
-  // Response format: \r\n+UTIME: <mode>[,<sensor>]\r\n\r\nOK\r\n
-  if (err == UBX_CELL_ERROR_SUCCESS)
-  {
-    int mStore, sStore, scanned = 0;
-    char *searchPtr = strstr(response, "+UTIME:");
-    if (searchPtr != nullptr)
-    {
-      searchPtr += strlen("+UTIME:"); // Move searchPtr to first character - probably a space
-      while (*searchPtr == ' ') searchPtr++; // skip spaces
-      scanned = sscanf(searchPtr, "%d,%d\r\n", &mStore, &sStore);
-    }
-    m = (UBX_CELL_utime_mode_t)mStore;
-    s = (UBX_CELL_utime_sensor_t)sStore;
-    if (scanned == 2)
-    {
-      *mode = m;
-      *sensor = s;
-    }
-    else if (scanned == 1)
-    {
-      *mode = m;
-      *sensor = UBX_CELL_UTIME_SENSOR_NONE;
-    }
-    else
-      err = UBX_CELL_ERROR_UNEXPECTED_RESPONSE;
-  }
-
-  free(command);
-  free(response);
-  return err;
-}
-
-UBX_CELL_error_t UBX_CELL::setUtimeIndication(UBX_CELL_utime_urc_configuration_t config)
-{
-  UBX_CELL_error_t err;
-  char *command;
-
-  command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_INDICATION) + 16);
-  if (command == nullptr)
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-  sprintf(command, "%s=%d", UBX_CELL_GNSS_TIME_INDICATION, config);
-
-  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR,
-                                nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
-  free(command);
-  return err;
-}
-
-UBX_CELL_error_t UBX_CELL::getUtimeIndication(UBX_CELL_utime_urc_configuration_t *config)
-{
-  UBX_CELL_error_t err;
-  char *command;
-  char *response;
-
-  UBX_CELL_utime_urc_configuration_t c;
-
-  command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_INDICATION) + 2);
-  if (command == nullptr)
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-  sprintf(command, "%s?", UBX_CELL_GNSS_TIME_INDICATION);
-
-  response = ubx_cell_calloc_char(minimumResponseAllocation);
-  if (response == nullptr)
-  {
-    free(command);
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-  }
-
-  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR,
-                                response, UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
-
-  // Response format: \r\n+UTIMEIND: <mode>\r\n\r\nOK\r\n
-  if (err == UBX_CELL_ERROR_SUCCESS)
-  {
-    int cStore, scanned = 0;
-    char *searchPtr = strstr(response, "+UTIMEIND:");
-    if (searchPtr != nullptr)
-    {
-      searchPtr += strlen("+UTIMEIND:"); //  Move searchPtr to first char
-      while (*searchPtr == ' ') searchPtr++; // skip spaces
-      scanned = sscanf(searchPtr, "%d\r\n", &cStore);
-    }
-    c = (UBX_CELL_utime_urc_configuration_t)cStore;
-    if (scanned == 1)
-    {
-      *config = c;
-    }
-    else
-      err = UBX_CELL_ERROR_UNEXPECTED_RESPONSE;
-  }
-
-  free(command);
-  free(response);
-  return err;
-}
-
-UBX_CELL_error_t UBX_CELL::setUtimeConfiguration(int32_t offsetNanoseconds, int32_t offsetSeconds)
-{
-  UBX_CELL_error_t err;
-  char *command;
-
-  command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_CONFIGURATION) + 48);
-  if (command == nullptr)
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-#if defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_ESP8266)
-  sprintf(command, "%s=%d,%d", UBX_CELL_GNSS_TIME_CONFIGURATION, offsetNanoseconds, offsetSeconds);
-#else
-  sprintf(command, "%s=%ld,%ld", UBX_CELL_GNSS_TIME_CONFIGURATION, offsetNanoseconds, offsetSeconds);
-#endif
-
-  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR,
-                                nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
-  free(command);
-  return err;
-}
-
-UBX_CELL_error_t UBX_CELL::getUtimeConfiguration(int32_t *offsetNanoseconds, int32_t *offsetSeconds)
-{
-  UBX_CELL_error_t err;
-  char *command;
-  char *response;
-
-  int32_t ons;
-  int32_t os;
-
-  command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_CONFIGURATION) + 2);
-  if (command == nullptr)
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-  sprintf(command, "%s?", UBX_CELL_GNSS_TIME_CONFIGURATION);
-
-  response = ubx_cell_calloc_char(minimumResponseAllocation);
-  if (response == nullptr)
-  {
-    free(command);
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-  }
-
-  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR,
-                                response, UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
-
-  // Response format: \r\n+UTIMECFG: <offset_nano>,<offset_sec>\r\n\r\nOK\r\n
-  if (err == UBX_CELL_ERROR_SUCCESS)
-  {
-    int scanned = 0;
-    char *searchPtr = strstr(response, "+UTIMECFG:");
-    if (searchPtr != nullptr)
-    {
-      searchPtr += strlen("+UTIMECFG:"); //  Move searchPtr to first char
-      while (*searchPtr == ' ') searchPtr++; // skip spaces
-#if defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_ESP8266)
-      scanned = sscanf(searchPtr, "%d,%d\r\n", &ons, &os);
-#else
-      scanned = sscanf(searchPtr, "%ld,%ld\r\n", &ons, &os);
-#endif
-    }
-    if (scanned == 2)
-    {
-      *offsetNanoseconds = ons;
-      *offsetSeconds = os;
-    }
-    else
-      err = UBX_CELL_ERROR_UNEXPECTED_RESPONSE;
-  }
-
-  free(command);
-  free(response);
-  return err;
-}
-
 UBX_CELL_error_t UBX_CELL::autoTimeZone(bool enable)
 {
   UBX_CELL_error_t err;
@@ -4835,94 +4623,6 @@ UBX_CELL_error_t UBX_CELL::setSecurityManager(UBX_CELL_sec_manager_opcode_t opco
   return err;
 }
 
-UBX_CELL_error_t UBX_CELL::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, int value)
-{
-  UBX_CELL_error_t err;
-  char *command;
-
-  if (profile >= UBX_CELL_NUM_PSD_PROFILES)
-    return UBX_CELL_ERROR_ERROR;
-
-  command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_CONFIG) + 24);
-  if (command == nullptr)
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-  sprintf(command, "%s=%d,%d,%d", UBX_CELL_MESSAGE_PDP_CONFIG, profile, parameter,
-          value);
-
-  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr,
-                                UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
-
-  free(command);
-  return err;
-}
-
-UBX_CELL_error_t UBX_CELL::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, UBX_CELL_pdp_protocol_type_t value)
-{
-  return (setPDPconfiguration(profile, parameter, (int)value));
-}
-
-UBX_CELL_error_t UBX_CELL::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, String value)
-{
-  UBX_CELL_error_t err;
-  char *command;
-
-  if (profile >= UBX_CELL_NUM_PSD_PROFILES)
-    return UBX_CELL_ERROR_ERROR;
-
-  command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_CONFIG) + 64);
-  if (command == nullptr)
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-  sprintf(command, "%s=%d,%d,\"%s\"", UBX_CELL_MESSAGE_PDP_CONFIG, profile, parameter,
-          value.c_str());
-
-  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr,
-                                UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
-
-  free(command);
-  return err;
-}
-
-UBX_CELL_error_t UBX_CELL::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, IPAddress value)
-{
-  UBX_CELL_error_t err;
-  char *command;
-
-  if (profile >= UBX_CELL_NUM_PSD_PROFILES)
-    return UBX_CELL_ERROR_ERROR;
-
-  command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_CONFIG) + 64);
-  if (command == nullptr)
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-  sprintf(command, "%s=%d,%d,\"%d.%d.%d.%d\"", UBX_CELL_MESSAGE_PDP_CONFIG, profile, parameter,
-          value[0], value[1], value[2], value[3]);
-
-  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr,
-                                UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
-
-  free(command);
-  return err;
-}
-
-UBX_CELL_error_t UBX_CELL::performPDPaction(int profile, UBX_CELL_pdp_actions_t action)
-{
-  UBX_CELL_error_t err;
-  char *command;
-
-  if (profile >= UBX_CELL_NUM_PSD_PROFILES)
-    return UBX_CELL_ERROR_ERROR;
-
-  command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_ACTION) + 32);
-  if (command == nullptr)
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-  sprintf(command, "%s=%d,%d", UBX_CELL_MESSAGE_PDP_ACTION, profile, action);
-
-  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr,
-                                UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
-
-  free(command);
-  return err;
-}
-
 UBX_CELL_error_t UBX_CELL::activatePDPcontext(bool status, int cid)
 {
   UBX_CELL_error_t err;
@@ -4946,65 +4646,6 @@ UBX_CELL_error_t UBX_CELL::activatePDPcontext(bool status, int cid)
   return err;
 }
 
-UBX_CELL_error_t UBX_CELL::getNetworkAssignedIPAddress(int profile, IPAddress *address)
-{
-  char *command;
-  char *response;
-  UBX_CELL_error_t err;
-  int scanNum = 0;
-  int profileStore = 0;
-  int paramTag = 0; // 0: IP address: dynamic IP address assigned during PDP context activation
-  int paramVals[4];
-
-  command = ubx_cell_calloc_char(strlen(UBX_CELL_NETWORK_ASSIGNED_DATA) + 16);
-  if (command == nullptr)
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-  sprintf(command, "%s=%d,%d", UBX_CELL_NETWORK_ASSIGNED_DATA, profile, paramTag);
-
-  response = ubx_cell_calloc_char(minimumResponseAllocation);
-  if (response == nullptr)
-  {
-    free(command);
-    return UBX_CELL_ERROR_OUT_OF_MEMORY;
-  }
-
-  err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, response,
-                                UBX_CELL_STANDARD_RESPONSE_TIMEOUT);
-
-  if (err == UBX_CELL_ERROR_SUCCESS)
-  {
-    char *searchPtr = strstr(response, "+UPSND:");
-    if (searchPtr != nullptr)
-    {
-      searchPtr += strlen("+UPSND:"); //  Move searchPtr to first char
-      while (*searchPtr == ' ') searchPtr++; // skip spaces
-      scanNum = sscanf(searchPtr, "%d,%d,\"%d.%d.%d.%d\"",
-                        &profileStore, &paramTag,
-                        &paramVals[0], &paramVals[1], &paramVals[2], &paramVals[3]);
-    }
-    if (scanNum != 6)
-    {
-      if (_printDebug == true)
-      {
-        _debugPort->print(F("getNetworkAssignedIPAddress: error: scanNum is "));
-        _debugPort->println(scanNum);
-      }
-      free(command);
-      free(response);
-      return UBX_CELL_ERROR_UNEXPECTED_RESPONSE;
-    }
-
-    IPAddress tempAddress = { (uint8_t)paramVals[0], (uint8_t)paramVals[1],
-                              (uint8_t)paramVals[2], (uint8_t)paramVals[3] };
-    *address = tempAddress;
-  }
-
-  free(command);
-  free(response);
-
-  return err;
-}
-
 bool UBX_CELL::isGPSon(void)
 {
   UBX_CELL_error_t err;
diff --git a/src/sfe_ublox_cellular.h b/src/sfe_ublox_cellular.h
index c361865..b2f74d9 100644
--- a/src/sfe_ublox_cellular.h
+++ b/src/sfe_ublox_cellular.h
@@ -132,11 +132,8 @@ const char UBX_CELL_FLOW_CONTROL[] = "&K";   // Flow control
 const char UBX_CELL_COMMAND_BAUD[] = "+IPR"; // Baud rate
 // ### Packet switched data services
 const char UBX_CELL_MESSAGE_PDP_DEF[] = "+CGDCONT";            // Packet switched Data Profile context definition
-const char UBX_CELL_MESSAGE_PDP_CONFIG[] = "+UPSD";            // Packet switched Data Profile configuration
-const char UBX_CELL_MESSAGE_PDP_ACTION[] = "+UPSDA";           // Perform the action for the specified PSD profile
 const char UBX_CELL_MESSAGE_PDP_CONTEXT_ACTIVATE[] = "+CGACT"; // Activates or deactivates the specified PDP context
 const char UBX_CELL_MESSAGE_ENTER_PPP[] = "D";
-const char UBX_CELL_NETWORK_ASSIGNED_DATA[] = "+UPSND";        // Packet switched network-assigned data
 // ### GPIO
 const char UBX_CELL_COMMAND_GPIO[] = "+UGPIOC"; // GPIO Configuration
 // ### IP
@@ -172,9 +169,6 @@ const char UBX_CELL_GNSS_POWER[] = "+UGPS";                   // GNSS power mana
 const char UBX_CELL_GNSS_ASSISTED_IND[] = "+UGIND";           // Assisted GNSS unsolicited indication
 const char UBX_CELL_GNSS_REQUEST_LOCATION[] = "+ULOC";        // Ask for localization information
 const char UBX_CELL_GNSS_GPRMC[] = "+UGRMC";                  // Ask for localization information
-const char UBX_CELL_GNSS_REQUEST_TIME[] = "+UTIME";           // Ask for time information from cellular modem (CellTime)
-const char UBX_CELL_GNSS_TIME_INDICATION[] = "+UTIMEIND";     // Time information request status unsolicited indication
-const char UBX_CELL_GNSS_TIME_CONFIGURATION[] = "+UTIMECFG";  // Sets time configuration
 const char UBX_CELL_GNSS_CONFIGURE_SENSOR[] = "+ULOCGNSS";    // Configure GNSS sensor
 const char UBX_CELL_GNSS_CONFIGURE_LOCATION[] = "+ULOCCELL";  // Configure cellular location sensor (CellLocate®)
 const char UBX_CELL_AIDING_SERVER_CONFIGURATION[] = "+UGSRV"; // Configure aiding server (CellLocate®)
@@ -728,12 +722,6 @@ class UBX_CELL : public Print
                             uint8_t h, uint8_t min, uint8_t s, int8_t tz); // TZ can be +/- and is in increments of 15 minutes. -28 == 7 hours behind UTC/GMT
   void autoTimeZoneForBegin(bool enable = true); // Call autoTimeZoneForBegin(false) _before_ .begin if you want to disable the automatic time zone
   UBX_CELL_error_t autoTimeZone(bool enable); // Enable/disable automatic time zone adjustment
-  UBX_CELL_error_t setUtimeMode(UBX_CELL_utime_mode_t mode = UBX_CELL_UTIME_MODE_PPS, UBX_CELL_utime_sensor_t sensor = UBX_CELL_UTIME_SENSOR_GNSS_LTE); // Time mode, source etc. (+UTIME)
-  UBX_CELL_error_t getUtimeMode(UBX_CELL_utime_mode_t *mode, UBX_CELL_utime_sensor_t *sensor);
-  UBX_CELL_error_t setUtimeIndication(UBX_CELL_utime_urc_configuration_t config = UBX_CELL_UTIME_URC_CONFIGURATION_ENABLED); // +UTIMEIND
-  UBX_CELL_error_t getUtimeIndication(UBX_CELL_utime_urc_configuration_t *config);
-  UBX_CELL_error_t setUtimeConfiguration(int32_t offsetNanoseconds = 0, int32_t offsetSeconds = 0); // +UTIMECFG
-  UBX_CELL_error_t getUtimeConfiguration(int32_t *offsetNanoseconds, int32_t *offsetSeconds);
 
   // Network service AT commands
   int8_t rssi(void); // Receive signal strength
@@ -951,15 +939,7 @@ class UBX_CELL : public Print
   UBX_CELL_error_t configSecurityProfile(int secprofile, UBX_CELL_sec_profile_parameter_t parameter, int value);
   UBX_CELL_error_t setSecurityManager(UBX_CELL_sec_manager_opcode_t opcode, UBX_CELL_sec_manager_parameter_t parameter, String name, String data);
 
-  // Packet Switched Data
-  // Configure the PDP using +UPSD. See UBX_CELL_pdp_configuration_parameter_t for the list of parameters: protocol, APN, username, DNS, etc.
-  UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, int value);                         // Set parameters in the chosen PSD profile
-  UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, UBX_CELL_pdp_protocol_type_t value); // Set parameters in the chosen PSD profile
-  UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, String value);                      // Set parameters in the chosen PSD profile
-  UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, IPAddress value);                   // Set parameters in the chosen PSD profile
-  UBX_CELL_error_t performPDPaction(int profile, UBX_CELL_pdp_actions_t action);  // Performs the requested action for the specified PSD profile: reset, store, load, activate, deactivate
   UBX_CELL_error_t activatePDPcontext(bool status, int cid = -1);                // Activates or deactivates the specified PDP context. Default to all (cid = -1)
-  UBX_CELL_error_t getNetworkAssignedIPAddress(int profile, IPAddress *address); // Get the dynamic IP address assigned during PDP context activation
 
   // GPS
   typedef enum