diff --git a/doc/Tagging.md b/doc/Tagging.md
index c0f381f..eba8bcb 100644
--- a/doc/Tagging.md
+++ b/doc/Tagging.md
@@ -113,8 +113,7 @@
 QCBOR also provides APIs for directly encoding and decoding all the
 tags standardized in [RFC 8949](https://tools.ietf.org/html/rfc8949)
 for dates, big numbers and such. For encoding their names start with
-"QCBOREncode_AddT" and for decoding they start with "QCBOREncode_Get"
-(TODO: fix this).  These APIs can handle
+"QCBOREncode_AddT" and for decoding they start with "QCBOREncode_GetT"
 
 These APIs and structures support both the full tag form and the
 borrowed content form that is not a tag. An argument of type @ref QCBOREncodeTagReq
diff --git a/inc/qcbor/qcbor_tag_decode.h b/inc/qcbor/qcbor_tag_decode.h
index b6b5dce..1239c5b 100644
--- a/inc/qcbor/qcbor_tag_decode.h
+++ b/inc/qcbor/qcbor_tag_decode.h
@@ -46,16 +46,16 @@
  * message types, those that alter the decode flow. See
  * QCBORDecode_VGetNextTagNumber().
  *
- * QCBOR offers specific functions to decode the standard tags such as
- * epoch dates and big numbers. One form of these is call backs that
- * can be installed such as QCBORDecode_DateEpochTagCB(). Another is
- * spiffy decode style QCBORDecode_GetXxx() functions like
- * QCBORDecode_GetDateString()
+ * Also, QCBOR offers specific functions to decode the standard tags
+ * such as epoch dates and big numbers. One form of these is call
+ * backs that can be installed such as
+ * QCBORDecode_DateEpochTagCB(). Another is spiffy decode style
+ * functions like QCBORDecode_GetTDateString()
  *
  * QCBOR v2 (when not in v1 compatibility) requires all tags be
  * consumed.  If they are not consumed by one of the above methods,
  * @ref QCBOR_ERR_UNPROCESSED_TAG_NUMBER error occurs.  They are never
- * optional (as they were described in RFC 7049) just is it is not
+ * optional (as they were described in RFC 7049) just as it is not
  * optional to ignore whether an item is a string rather than an
  * integer.
  *
@@ -64,8 +64,8 @@
  * Thorough CBOR decoding requires that tag numbers not be
  * ignored. Tag numbers fundamentally change the type of an item.
  * QCBOR v1 does not support this well. It neatly put all the tag
- * numbers on an item in the @ref QCBORItem, but left it up to the
- * caller to check that every QCBORItem had no tag numbers on it. It
+ * numbers on an item in the @ref QCBORItem, but leaves it up to the
+ * caller to check that every QCBORItem has no tag numbers on it. It
  * is likely that protocol implementors rarely performed this check.
  * For the most part this is tolerable, but it really isn't proper and
  * thorough decoding.
@@ -83,13 +83,14 @@
  * If an application relied on the v1 behavior, it can be restored
  * with the configuration @ref QCBOR_DECODE_ALLOW_UNPROCESSED_TAG_NUMBERS.
 
- * Before QCBOR v1.5, the GetString decode functions would error
+ * Before QCBOR v1.5, the QCBORDecode_GetByteString() and
+ * QCBORDecode_GetTextString() would error
  * out if preceeded by a tag number. This was unlike all the other
- * Get() functions that queitly decoded the tag numbers and
- * included them in the QCBORItem. The getString functions
- * were modified by v1.5 so they were more liberal like
- * the other Get functions.  This is only of note between
- * QCBOR v1.5 and what came before it, not fo QCBOR v2.
+ * QCBORDecode_GetXxx() functions that queitly decoded the tag numbers and
+ * included them in the QCBORItem. These string decode functions
+ * were modified by v1.5 so they were  liberal like
+ * the other QCBORDecode_GetXxx functions.  This is only of note between
+ * QCBOR v1.5 and what came before it, not for QCBOR v2.
  * QCBOR v2 in compatibility mode behaves like QCBOR v1.5.
  *
  * @anchor Disabilng-Tag-Decoding
@@ -400,7 +401,7 @@
 
 
 /**
- * @brief Exit some bstr-wrapped CBOR  has been enetered.
+ * @brief Exit some bstr-wrapped CBOR that has been entered.
  *
  * @param[in] pCtx  The decode context.
  *
@@ -434,26 +435,27 @@
  * See also @ref CBOR_TAG_DATE_STRING, QCBOREncode_AddDateString() and
  * @ref QCBOR_TYPE_DATE_STRING.
  */
-// TODO: should this be GetTDateString like AddTDateString???
 static void
-QCBORDecode_GetDateString(QCBORDecodeContext    *pCtx,
-                          enum QCBORDecodeTagReq uTagRequirement,
-                          UsefulBufC            *pDateString);
+QCBORDecode_GetTDateString(QCBORDecodeContext    *pCtx,
+                           enum QCBORDecodeTagReq uTagRequirement,
+                           UsefulBufC            *pDateString);
 
-/** See QCBORDecode_GetDateString(). */
+/** See QCBORDecode_GetTDateString(). */
 static void
-QCBORDecode_GetDateStringInMapN(QCBORDecodeContext    *pCtx,
-                                int64_t                nLabel,
-                                enum QCBORDecodeTagReq uTagRequirement,
-                                UsefulBufC            *pDateString);
-
-/** See QCBORDecode_GetDateString(). */
-static void
-QCBORDecode_GetDateStringInMapSZ(QCBORDecodeContext    *pCtx,
-                                 const char            *szLabel,
+QCBORDecode_GetTDateStringInMapN(QCBORDecodeContext    *pCtx,
+                                 int64_t                nLabel,
                                  enum QCBORDecodeTagReq uTagRequirement,
                                  UsefulBufC            *pDateString);
 
+/** See QCBORDecode_GetTDateString(). */
+static void
+QCBORDecode_GetTDateStringInMapSZ(QCBORDecodeContext    *pCtx,
+                                  const char            *szLabel,
+                                  enum QCBORDecodeTagReq uTagRequirement,
+                                  UsefulBufC            *pDateString);
+
+
+
 
 /**
  * @brief Decode the next item as an epoch date.
@@ -497,28 +499,28 @@
  * @ref QCBOR_TYPE_DATE_EPOCH.
 */
 void
-QCBORDecode_GetEpochDate(QCBORDecodeContext    *pCtx,
-                         enum QCBORDecodeTagReq uTagRequirement,
-                         int64_t               *pnTime);
+QCBORDecode_GetTEpochDate(QCBORDecodeContext    *pCtx,
+                          enum QCBORDecodeTagReq uTagRequirement,
+                          int64_t               *pnTime);
 
-/** See QCBORDecode_GetEpochDate(). */
+/** See QCBORDecode_GetTEpochDate(). */
 void
-QCBORDecode_GetEpochDateInMapN(QCBORDecodeContext    *pCtx,
-                               int64_t                nLabel,
-                               enum QCBORDecodeTagReq uTagRequirement,
-                               int64_t               *pnTime);
-
-/** See QCBORDecode_GetEpochDate(). */
-void
-QCBORDecode_GetEpochDateInMapSZ(QCBORDecodeContext    *pCtx,
-                                const char            *szLabel,
+QCBORDecode_GetTEpochDateInMapN(QCBORDecodeContext    *pCtx,
+                                int64_t                nLabel,
                                 enum QCBORDecodeTagReq uTagRequirement,
                                 int64_t               *pnTime);
 
+/** See QCBORDecode_GetTEpochDate(). */
+void
+QCBORDecode_GetTEpochDateInMapSZ(QCBORDecodeContext    *pCtx,
+                                 const char            *szLabel,
+                                 enum QCBORDecodeTagReq uTagRequirement,
+                                 int64_t               *pnTime);
+
 
 
 /**
- * @brief Decode the next item as a date-only string.
+ * @brief Decode the next item as a date string.
  *
  * @param[in] pCtx             The decode context.
  * @param[in] uTagRequirement  See @ref QCBORDecodeTagReq.
@@ -534,24 +536,24 @@
  * @ref QCBOR_TYPE_DAYS_STRING.
  */
 static void
-QCBORDecode_GetDaysString(QCBORDecodeContext    *pCtx,
-                          enum QCBORDecodeTagReq uTagRequirement,
-                          UsefulBufC            *pDateString);
+QCBORDecode_GetTDaysString(QCBORDecodeContext    *pCtx,
+                           enum QCBORDecodeTagReq uTagRequirement,
+                           UsefulBufC            *pDateString);
 
-/** See QCBORDecode_GetDaysString(). */
+/** See QCBORDecode_GetTDaysString(). */
 static void
-QCBORDecode_GetDaysStringInMapN(QCBORDecodeContext    *pCtx,
-                                int64_t                nLabel,
-                                enum QCBORDecodeTagReq uTagRequirement,
-                                UsefulBufC            *pDateString);
-
-/** See QCBORDecode_GetDaysString(). */
-static void
-QCBORDecode_GetDaysStringInMapSZ(QCBORDecodeContext    *pCtx,
-                                 const char            *szLabel,
+QCBORDecode_GetTDaysStringInMapN(QCBORDecodeContext    *pCtx,
+                                 int64_t                nLabel,
                                  enum QCBORDecodeTagReq uTagRequirement,
                                  UsefulBufC            *pDateString);
 
+/** See QCBORDecode_GetTDaysString(). */
+static void
+QCBORDecode_GetTDaysStringInMapSZ(QCBORDecodeContext    *pCtx,
+                                  const char            *szLabel,
+                                  enum QCBORDecodeTagReq uTagRequirement,
+                                  UsefulBufC            *pDateString);
+
 
 /**
  * @brief Decode the next item as an days-count epoch date.
@@ -571,24 +573,24 @@
  * @ref QCBOR_TYPE_DAYS_EPOCH.
 */
 void
-QCBORDecode_GetEpochDays(QCBORDecodeContext    *pCtx,
-                         enum QCBORDecodeTagReq uTagRequirement,
-                         int64_t               *pnDays);
+QCBORDecode_GetTEpochDays(QCBORDecodeContext    *pCtx,
+                          enum QCBORDecodeTagReq uTagRequirement,
+                          int64_t               *pnDays);
 
-/** See QCBORDecode_GetEpochDays(). */
+/** See QCBORDecode_GetTEpochDays(). */
 void
-QCBORDecode_GetEpochDaysInMapN(QCBORDecodeContext    *pCtx,
-                               int64_t                nLabel,
-                               enum QCBORDecodeTagReq uTagRequirement,
-                               int64_t               *pnDays);
-
-/** See QCBORDecode_GetEpochDays(). */
-void
-QCBORDecode_GetEpochDaysInMapSZ(QCBORDecodeContext    *pCtx,
-                                const char            *szLabel,
+QCBORDecode_GetTEpochDaysInMapN(QCBORDecodeContext    *pCtx,
+                                int64_t                nLabel,
                                 enum QCBORDecodeTagReq uTagRequirement,
                                 int64_t               *pnDays);
 
+/** See QCBORDecode_GetTEpochDays(). */
+void
+QCBORDecode_GetTEpochDaysInMapSZ(QCBORDecodeContext    *pCtx,
+                                 const char            *szLabel,
+                                 enum QCBORDecodeTagReq uTagRequirement,
+                                 int64_t               *pnDays);
+
 
 /**
  * @brief Decode the next item as a URI.
@@ -607,24 +609,24 @@
  *  @ref QCBOR_TYPE_URI.
  */
 static void
-QCBORDecode_GetURI(QCBORDecodeContext    *pCtx,
-                   enum QCBORDecodeTagReq uTagRequirement,
-                   UsefulBufC            *pURI);
+QCBORDecode_GetTURI(QCBORDecodeContext    *pCtx,
+                    enum QCBORDecodeTagReq uTagRequirement,
+                    UsefulBufC            *pURI);
 
-/** See QCBORDecode_GetURI(). */
+/** See QCBORDecode_GetTURI(). */
 static void
-QCBORDecode_GetURIInMapN(QCBORDecodeContext    *pCtx,
-                         int64_t                nLabel,
-                         enum QCBORDecodeTagReq uTagRequirement,
-                         UsefulBufC            *pURI);
-
-/** See QCBORDecode_GetURI(). */
-static void
-QCBORDecode_GetURIInMapSZ(QCBORDecodeContext    *pCtx,
-                          const char            *szLabel,
+QCBORDecode_GetTURIInMapN(QCBORDecodeContext    *pCtx,
+                          int64_t                nLabel,
                           enum QCBORDecodeTagReq uTagRequirement,
                           UsefulBufC            *pURI);
 
+/** See QCBORDecode_GetTURI(). */
+static void
+QCBORDecode_GetTURIInMapSZ(QCBORDecodeContext    *pCtx,
+                           const char            *szLabel,
+                           enum QCBORDecodeTagReq uTagRequirement,
+                           UsefulBufC            *pURI);
+
 
 /**
  * @brief Decode the next item as base64 encoded text.
@@ -645,24 +647,24 @@
  * @ref QCBOR_TYPE_BASE64.
  */
 static void
-QCBORDecode_GetB64(QCBORDecodeContext    *pCtx,
-                   enum QCBORDecodeTagReq uTagRequirement,
-                   UsefulBufC            *pB64Text);
+QCBORDecode_GetTB64(QCBORDecodeContext    *pCtx,
+                    enum QCBORDecodeTagReq uTagRequirement,
+                    UsefulBufC            *pB64Text);
 
-/** See QCBORDecode_GetB64(). */
+/** See QCBORDecode_GetTB64(). */
 static void
-QCBORDecode_GetB64InMapN(QCBORDecodeContext    *pCtx,
-                         int64_t                nLabel,
-                         enum QCBORDecodeTagReq uTagRequirement,
-                         UsefulBufC            *pB64Text);
-
-/** See QCBORDecode_GetB64(). */
-static void
-QCBORDecode_GetB64InMapSZ(QCBORDecodeContext    *pCtx,
-                          const char            *szLabel,
+QCBORDecode_GetTB64InMapN(QCBORDecodeContext    *pCtx,
+                          int64_t                nLabel,
                           enum QCBORDecodeTagReq uTagRequirement,
                           UsefulBufC            *pB64Text);
 
+/** See QCBORDecode_GetTB64(). */
+static void
+QCBORDecode_GetTB64InMapSZ(QCBORDecodeContext    *pCtx,
+                           const char            *szLabel,
+                           enum QCBORDecodeTagReq uTagRequirement,
+                           UsefulBufC            *pB64Text);
+
 /**
  * @brief Decode the next item as base64URL encoded text.
  *
@@ -682,24 +684,24 @@
  * @ref QCBOR_TYPE_BASE64URL.
  */
 static void
-QCBORDecode_GetB64URL(QCBORDecodeContext    *pCtx,
-                      enum QCBORDecodeTagReq uTagRequirement,
-                      UsefulBufC            *pB64Text);
+QCBORDecode_GetTB64URL(QCBORDecodeContext    *pCtx,
+                       enum QCBORDecodeTagReq uTagRequirement,
+                       UsefulBufC            *pB64Text);
 
-/** See QCBORDecode_GetB64URL(). */
+/** See QCBORDecode_GetTB64URL(). */
 static void
-QCBORDecode_GetB64URLInMapN(QCBORDecodeContext    *pCtx,
-                            int64_t                nLabel,
-                            enum QCBORDecodeTagReq uTagRequirement,
-                            UsefulBufC            *pB64Text);
-
-/** See QCBORDecode_GetB64URL(). */
-static void
-QCBORDecode_GetB64URLInMapSZ(QCBORDecodeContext    *pCtx,
-                             const char            *szLabel,
+QCBORDecode_GetTB64URLInMapN(QCBORDecodeContext    *pCtx,
+                             int64_t                nLabel,
                              enum QCBORDecodeTagReq uTagRequirement,
                              UsefulBufC            *pB64Text);
 
+/** See QCBORDecode_GetTB64URL(). */
+static void
+QCBORDecode_GetTB64URLInMapSZ(QCBORDecodeContext    *pCtx,
+                              const char            *szLabel,
+                              enum QCBORDecodeTagReq uTagRequirement,
+                              UsefulBufC            *pB64Text);
+
 /**
  * @brief Decode the next item as a regular expression.
  *
@@ -717,24 +719,24 @@
  * @ref QCBOR_TYPE_REGEX.
  */
 static void
-QCBORDecode_GetRegex(QCBORDecodeContext    *pCtx,
-                     enum QCBORDecodeTagReq uTagRequirement,
-                     UsefulBufC            *pRegex);
+QCBORDecode_GetTRegex(QCBORDecodeContext    *pCtx,
+                      enum QCBORDecodeTagReq uTagRequirement,
+                      UsefulBufC            *pRegex);
 
-/** See QCBORDecode_GetRegex(). */
+/** See QCBORDecode_GetTRegex(). */
 static void
-QCBORDecode_GetRegexInMapN(QCBORDecodeContext    *pCtx,
-                           int64_t                nLabel,
-                           enum QCBORDecodeTagReq uTagRequirement,
-                           UsefulBufC            *pRegex);
-
-/** See QCBORDecode_GetRegex(). */
-static void
-QCBORDecode_GetRegexInMapSZ(QCBORDecodeContext    *pCtx,
-                            const char            *szLabel,
+QCBORDecode_GetTRegexInMapN(QCBORDecodeContext    *pCtx,
+                            int64_t                nLabel,
                             enum QCBORDecodeTagReq uTagRequirement,
                             UsefulBufC            *pRegex);
 
+/** See QCBORDecode_GetTRegex(). */
+static void
+QCBORDecode_GetTRegexInMapSZ(QCBORDecodeContext    *pCtx,
+                             const char            *szLabel,
+                             enum QCBORDecodeTagReq uTagRequirement,
+                             UsefulBufC            *pRegex);
+
 
 /**
  * @brief Decode the next item as a MIME message.
@@ -766,27 +768,27 @@
  * for a discussion of line endings in CBOR.
  */
 void
-QCBORDecode_GetMIMEMessage(QCBORDecodeContext    *pCtx,
-                           enum QCBORDecodeTagReq uTagRequirement,
-                           UsefulBufC            *pMessage,
-                           bool                  *pbIsTag257);
+QCBORDecode_GetTMIMEMessage(QCBORDecodeContext    *pCtx,
+                            enum QCBORDecodeTagReq uTagRequirement,
+                            UsefulBufC            *pMessage,
+                            bool                  *pbIsTag257);
 
-/** See QCBORDecode_GetMIMEMessage(). */
+/** See QCBORDecode_GetTMIMEMessage(). */
 void
-QCBORDecode_GetMIMEMessageInMapN(QCBORDecodeContext    *pCtx,
-                                 int64_t                nLabel,
-                                 enum QCBORDecodeTagReq uTagRequirement,
-                                 UsefulBufC            *pMessage,
-                                 bool                  *pbIsTag257);
-
-/** See QCBORDecode_GetMIMEMessage(). */
-void
-QCBORDecode_GetMIMEMessageInMapSZ(QCBORDecodeContext    *pCtx,
-                                  const char            *szLabel,
+QCBORDecode_GetTMIMEMessageInMapN(QCBORDecodeContext    *pCtx,
+                                  int64_t                nLabel,
                                   enum QCBORDecodeTagReq uTagRequirement,
                                   UsefulBufC            *pMessage,
                                   bool                  *pbIsTag257);
 
+/** See QCBORDecode_GetTMIMEMessage(). */
+void
+QCBORDecode_GetTMIMEMessageInMapSZ(QCBORDecodeContext    *pCtx,
+                                   const char            *szLabel,
+                                   enum QCBORDecodeTagReq uTagRequirement,
+                                   UsefulBufC            *pMessage,
+                                   bool                  *pbIsTag257);
+
 /**
  * @brief Decode the next item as a UUID.
  *
@@ -804,24 +806,24 @@
  * @ref QCBOR_TYPE_UUID.
  */
 static void
-QCBORDecode_GetBinaryUUID(QCBORDecodeContext    *pCtx,
-                          enum QCBORDecodeTagReq uTagRequirement,
-                          UsefulBufC            *pUUID);
+QCBORDecode_GetTBinaryUUID(QCBORDecodeContext    *pCtx,
+                           enum QCBORDecodeTagReq uTagRequirement,
+                           UsefulBufC            *pUUID);
 
-/** See QCBORDecode_GetBinaryUUID(). */
+/** See QCBORDecode_GetTBinaryUUID(). */
 static void
-QCBORDecode_GetBinaryUUIDInMapN(QCBORDecodeContext    *pCtx,
-                                int64_t                nLabel,
-                                enum QCBORDecodeTagReq uTagRequirement,
-                                UsefulBufC            *pUUID);
-
-/** See QCBORDecode_GetBinaryUUID(). */
-static void
-QCBORDecode_GetBinaryUUIDInMapSZ(QCBORDecodeContext    *pCtx,
-                                 const char            *szLabel,
+QCBORDecode_GetTBinaryUUIDInMapN(QCBORDecodeContext    *pCtx,
+                                 int64_t                nLabel,
                                  enum QCBORDecodeTagReq uTagRequirement,
                                  UsefulBufC            *pUUID);
 
+/** See QCBORDecode_GetTBinaryUUID(). */
+static void
+QCBORDecode_GetTBinaryUUIDInMapSZ(QCBORDecodeContext    *pCtx,
+                                  const char            *szLabel,
+                                  enum QCBORDecodeTagReq uTagRequirement,
+                                  UsefulBufC            *pUUID);
+
 
 
 
@@ -1154,6 +1156,219 @@
 uint64_t
 QCBORDecode_GetNthTagOfLast(const QCBORDecodeContext *pCtx, uint32_t uIndex);
 
+
+
+/** @addtogroup DeprecatedTagDecode Deprecated (renamed) functions for decoding tags.
+ *  @{
+ */
+
+
+/** @deprecated Use QCBORDecode_GetTDateString() instead. */
+static void
+QCBORDecode_GetDateString(QCBORDecodeContext    *pCtx,
+                          enum QCBORDecodeTagReq uTagRequirement,
+                          UsefulBufC            *pDateString);
+
+/** @deprecated Use  QCBORDecode_GetTDateStringInMapN() instead. */
+static void
+QCBORDecode_GetDateStringInMapN(QCBORDecodeContext    *pCtx,
+                                int64_t                nLabel,
+                                enum QCBORDecodeTagReq uTagRequirement,
+                                UsefulBufC            *pDateString);
+
+/** @deprecated Use  QCBORDecode_GetTDateStringInMapSZ() instead. */
+static void
+QCBORDecode_GetDateStringInMapSZ(QCBORDecodeContext    *pCtx,
+                                 const char            *szLabel,
+                                 enum QCBORDecodeTagReq uTagRequirement,
+                                 UsefulBufC            *pDateString);
+
+/** @deprecated Use  QCBORDecode_GetTEpochDate() instead. */
+static void
+QCBORDecode_GetEpochDate(QCBORDecodeContext    *pCtx,
+                         enum QCBORDecodeTagReq uTagRequirement,
+                         int64_t               *pnTime);
+
+/** @deprecated Use  QCBORDecode_GetTEpochDateInMapN() instead. */
+static void
+QCBORDecode_GetEpochDateInMapN(QCBORDecodeContext    *pCtx,
+                               int64_t                nLabel,
+                               enum QCBORDecodeTagReq uTagRequirement,
+                               int64_t               *pnTime);
+
+/** @deprecated Use  QCBORDecode_GetTEpochDateInMapSZ() instead. */
+static void
+QCBORDecode_GetEpochDateInMapSZ(QCBORDecodeContext    *pCtx,
+                                const char            *szLabel,
+                                enum QCBORDecodeTagReq uTagRequirement,
+                                int64_t               *pnTime);
+
+/** @deprecated Use  QCBORDecode_GetDTaysString() instead. */
+static void
+QCBORDecode_GetDaysString(QCBORDecodeContext    *pCtx,
+                          enum QCBORDecodeTagReq uTagRequirement,
+                          UsefulBufC            *pDateString);
+
+/** @deprecated Use  QCBORDecode_GetTDaysStringInMapN() instead. */
+static void
+QCBORDecode_GetDaysStringInMapN(QCBORDecodeContext    *pCtx,
+                                int64_t                nLabel,
+                                enum QCBORDecodeTagReq uTagRequirement,
+                                UsefulBufC            *pDateString);
+
+/** @deprecated Use  QCBORDecode_GetTDaysStringInMapSZ() instead. */
+static void
+QCBORDecode_GetDaysStringInMapSZ(QCBORDecodeContext    *pCtx,
+                                 const char            *szLabel,
+                                 enum QCBORDecodeTagReq uTagRequirement,
+                                 UsefulBufC            *pDateString);
+
+/** @deprecated Use  QCBORDecode_GetTEpochDays() instead. */
+static void
+QCBORDecode_GetEpochDays(QCBORDecodeContext    *pCtx,
+                         enum QCBORDecodeTagReq uTagRequirement,
+                         int64_t               *pnDays);
+
+/** @deprecated Use  QCBORDecode_GetTEpochDaysInMapN() instead. */
+static void
+QCBORDecode_GetEpochDaysInMapN(QCBORDecodeContext    *pCtx,
+                               int64_t                nLabel,
+                               enum QCBORDecodeTagReq uTagRequirement,
+                               int64_t               *pnDays);
+
+/** @deprecated Use  QCBORDecode_GetTEpochDaysInMapSZ() instead. */
+static void
+QCBORDecode_GetEpochDaysInMapSZ(QCBORDecodeContext    *pCtx,
+                                const char            *szLabel,
+                                enum QCBORDecodeTagReq uTagRequirement,
+                                int64_t               *pnDays);
+
+/** @deprecated Use  QCBORDecode_GetTURI() instead. */
+static void
+QCBORDecode_GetURI(QCBORDecodeContext    *pCtx,
+                   enum QCBORDecodeTagReq uTagRequirement,
+                   UsefulBufC            *pURI);
+
+/** @deprecated Use  QCBORDecode_GetTURIInMapN() instead. */
+static void
+QCBORDecode_GetURIInMapN(QCBORDecodeContext    *pCtx,
+                         int64_t                nLabel,
+                         enum QCBORDecodeTagReq uTagRequirement,
+                         UsefulBufC            *pURI);
+
+/** @deprecated Use  QCBORDecode_GetTURIInMapSZ() instead. */
+static void
+QCBORDecode_GetURIInMapSZ(QCBORDecodeContext    *pCtx,
+                          const char            *szLabel,
+                          enum QCBORDecodeTagReq uTagRequirement,
+                          UsefulBufC            *pURI);
+
+/** @deprecated Use  QCBORDecode_GetTB64() instead. */
+static void
+QCBORDecode_GetB64(QCBORDecodeContext    *pCtx,
+                   enum QCBORDecodeTagReq uTagRequirement,
+                   UsefulBufC            *pB64Text);
+
+/** @deprecated Use  QCBORDecode_GetTB64InMapN() instead. */
+static void
+QCBORDecode_GetB64InMapN(QCBORDecodeContext    *pCtx,
+                         int64_t                nLabel,
+                         enum QCBORDecodeTagReq uTagRequirement,
+                         UsefulBufC            *pB64Text);
+
+/** @deprecated Use  QCBORDecode_GetTB64InMapSZ() instead. */
+static void
+QCBORDecode_GetB64InMapSZ(QCBORDecodeContext    *pCtx,
+                          const char            *szLabel,
+                          enum QCBORDecodeTagReq uTagRequirement,
+                          UsefulBufC            *pB64Text);
+
+/** @deprecated Use  QCBORDecode_GetTB64URL() instead. */
+static void
+QCBORDecode_GetB64URL(QCBORDecodeContext    *pCtx,
+                      enum QCBORDecodeTagReq uTagRequirement,
+                      UsefulBufC            *pB64Text);
+
+/** @deprecated Use  QCBORDecode_GetTB64URLInMapN() instead. */
+static void
+QCBORDecode_GetB64URLInMapN(QCBORDecodeContext    *pCtx,
+                            int64_t                nLabel,
+                            enum QCBORDecodeTagReq uTagRequirement,
+                            UsefulBufC            *pB64Text);
+
+/** @deprecated Use  QCBORDecode_GetTB64URLInMapSZ() instead. */
+static void
+QCBORDecode_GetB64URLInMapSZ(QCBORDecodeContext    *pCtx,
+                             const char            *szLabel,
+                             enum QCBORDecodeTagReq uTagRequirement,
+                             UsefulBufC            *pB64Text);
+
+/** @deprecated Use  QCBORDecode_GetTRegex() instead. */
+static void
+QCBORDecode_GetRegex(QCBORDecodeContext    *pCtx,
+                     enum QCBORDecodeTagReq uTagRequirement,
+                     UsefulBufC            *pRegex);
+
+/** @deprecated Use  QCBORDecode_GetTRegexInMapN() instead. */
+static void
+QCBORDecode_GetRegexInMapN(QCBORDecodeContext    *pCtx,
+                           int64_t                nLabel,
+                           enum QCBORDecodeTagReq uTagRequirement,
+                           UsefulBufC            *pRegex);
+
+/** @deprecated Use  QCBORDecode_GetTRegexInMapSZ() instead. */
+static void
+QCBORDecode_GetRegexInMapSZ(QCBORDecodeContext    *pCtx,
+                            const char            *szLabel,
+                            enum QCBORDecodeTagReq uTagRequirement,
+                            UsefulBufC            *pRegex);
+
+/** @deprecated Use  QCBORDecode_GetTMIMEMessage() instead. */
+static void
+QCBORDecode_GetMIMEMessage(QCBORDecodeContext    *pCtx,
+                           enum QCBORDecodeTagReq uTagRequirement,
+                           UsefulBufC            *pMessage,
+                           bool                  *pbIsTag257);
+
+/** @deprecated Use  QCBORDecode_GetTMIMEMessageInMapN() instead. */
+static void
+QCBORDecode_GetMIMEMessageInMapN(QCBORDecodeContext    *pCtx,
+                                 int64_t                nLabel,
+                                 enum QCBORDecodeTagReq uTagRequirement,
+                                 UsefulBufC            *pMessage,
+                                 bool                  *pbIsTag257);
+
+/** @deprecated Use  QCBORDecode_GetTMIMEMessageInMapSZ() instead. */
+static void
+QCBORDecode_GetMIMEMessageInMapSZ(QCBORDecodeContext    *pCtx,
+                                  const char            *szLabel,
+                                  enum QCBORDecodeTagReq uTagRequirement,
+                                  UsefulBufC            *pMessage,
+                                  bool                  *pbIsTag257);
+
+/** @deprecated Use  QCBORDecode_GetTBinaryUUID() instead. */
+static void
+QCBORDecode_GetBinaryUUID(QCBORDecodeContext    *pCtx,
+                          enum QCBORDecodeTagReq uTagRequirement,
+                          UsefulBufC            *pUUID);
+
+/** @deprecated Use  QCBORDecode_GetTBinaryUUIDInMapN() instead. */
+static void
+QCBORDecode_GetBinaryUUIDInMapN(QCBORDecodeContext    *pCtx,
+                                int64_t                nLabel,
+                                enum QCBORDecodeTagReq uTagRequirement,
+                                UsefulBufC            *pUUID);
+
+/** @deprecated Use  QCBORDecode_GetTBinaryUUIDInMapSZ() instead. */
+static void
+QCBORDecode_GetBinaryUUIDInMapSZ(QCBORDecodeContext    *pCtx,
+                                 const char            *szLabel,
+                                 enum QCBORDecodeTagReq uTagRequirement,
+                                 UsefulBufC            *pUUID);
+
+/** @}*/
+
+
 #endif /* ! QCBOR_DISABLE_TAGS */
 
 
@@ -1163,6 +1378,7 @@
 
 
 
+
 /* ========================================================================= *
  *    BEGINNING OF PRIVATE AND INLINE IMPLEMENTATION                         *
  * ========================================================================= */
@@ -1230,7 +1446,7 @@
 
 
 static inline void
-QCBORDecode_GetDateString(QCBORDecodeContext    *pMe,
+QCBORDecode_GetTDateString(QCBORDecodeContext    *pMe,
                           enum QCBORDecodeTagReq uTagRequirement,
                           UsefulBufC            *pValue)
 {
@@ -1242,21 +1458,21 @@
 }
 
 static inline void
-QCBORDecode_GetDateStringInMapN(QCBORDecodeContext    *pMe,
+QCBORDecode_GetTDateStringInMapN(QCBORDecodeContext    *pMe,
                                 const int64_t          nLabel,
                                 enum QCBORDecodeTagReq uTagRequirement,
                                 UsefulBufC            *pText)
 {
    QCBORDecode_Private_GetTaggedStringInMapN(pMe,
-                                              nLabel,
-                                              uTagRequirement,
-                                              QCBOR_TYPE_DATE_STRING,
-                                              CBOR_TAG_DATE_STRING,
-                                              pText);
+                                             nLabel,
+                                             uTagRequirement,
+                                             QCBOR_TYPE_DATE_STRING,
+                                             CBOR_TAG_DATE_STRING,
+                                             pText);
 }
 
 static inline void
-QCBORDecode_GetDateStringInMapSZ(QCBORDecodeContext    *pMe,
+QCBORDecode_GetTDateStringInMapSZ(QCBORDecodeContext    *pMe,
                                  const char            *szLabel,
                                  enum QCBORDecodeTagReq uTagRequirement,
                                  UsefulBufC            *pText)
@@ -1270,7 +1486,7 @@
 }
 
 static inline void
-QCBORDecode_GetDaysString(QCBORDecodeContext    *pMe,
+QCBORDecode_GetTDaysString(QCBORDecodeContext    *pMe,
                           enum QCBORDecodeTagReq uTagRequirement,
                           UsefulBufC            *pValue)
 {
@@ -1282,7 +1498,7 @@
 }
 
 static inline void
-QCBORDecode_GetDaysStringInMapN(QCBORDecodeContext    *pMe,
+QCBORDecode_GetTDaysStringInMapN(QCBORDecodeContext    *pMe,
                                 const int64_t          nLabel,
                                 enum QCBORDecodeTagReq uTagRequirement,
                                 UsefulBufC            *pText)
@@ -1296,7 +1512,7 @@
 }
 
 static inline void
-QCBORDecode_GetDaysStringInMapSZ(QCBORDecodeContext    *pMe,
+QCBORDecode_GetTDaysStringInMapSZ(QCBORDecodeContext    *pMe,
                                  const char            *szLabel,
                                  enum QCBORDecodeTagReq uTagRequirement,
                                  UsefulBufC            *pText)
@@ -1312,7 +1528,7 @@
 
 
 static inline void
-QCBORDecode_GetURI(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTURI(QCBORDecodeContext          *pMe,
                    const enum QCBORDecodeTagReq uTagRequirement,
                    UsefulBufC                  *pUUID)
 {
@@ -1324,21 +1540,21 @@
 }
 
 static inline void
-QCBORDecode_GetURIInMapN(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTURIInMapN(QCBORDecodeContext          *pMe,
                          const int64_t                nLabel,
                          const enum QCBORDecodeTagReq uTagRequirement,
                          UsefulBufC                  *pUUID)
 {
    QCBORDecode_Private_GetTaggedStringInMapN(pMe,
-                                              nLabel,
-                                              uTagRequirement,
-                                              QCBOR_TYPE_URI,
-                                              CBOR_TAG_URI,
-                                              pUUID);
+                                             nLabel,
+                                             uTagRequirement,
+                                             QCBOR_TYPE_URI,
+                                             CBOR_TAG_URI,
+                                             pUUID);
 }
 
 static inline void
-QCBORDecode_GetURIInMapSZ(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTURIInMapSZ(QCBORDecodeContext          *pMe,
                           const char                  *szLabel,
                           const enum QCBORDecodeTagReq uTagRequirement,
                           UsefulBufC                  *pUUID)
@@ -1353,7 +1569,7 @@
 
 
 static inline void
-QCBORDecode_GetB64(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTB64(QCBORDecodeContext          *pMe,
                    const enum QCBORDecodeTagReq uTagRequirement,
                    UsefulBufC                  *pB64Text)
 {
@@ -1365,7 +1581,7 @@
 }
 
 static inline void
-QCBORDecode_GetB64InMapN(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTB64InMapN(QCBORDecodeContext          *pMe,
                          const int64_t                nLabel,
                          const enum QCBORDecodeTagReq uTagRequirement,
                          UsefulBufC                  *pB64Text)
@@ -1379,7 +1595,7 @@
 }
 
 static inline void
-QCBORDecode_GetB64InMapSZ(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTB64InMapSZ(QCBORDecodeContext          *pMe,
                           const char                  *szLabel,
                           const enum QCBORDecodeTagReq uTagRequirement,
                           UsefulBufC                  *pB64Text)
@@ -1394,7 +1610,7 @@
 
 
 static inline void
-QCBORDecode_GetB64URL(QCBORDecodeContext *pMe,
+QCBORDecode_GetTB64URL(QCBORDecodeContext *pMe,
                       const enum QCBORDecodeTagReq uTagRequirement,
                       UsefulBufC         *pB64Text)
 {
@@ -1406,21 +1622,21 @@
 }
 
 static inline void
-QCBORDecode_GetB64URLInMapN(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTB64URLInMapN(QCBORDecodeContext          *pMe,
                             const int64_t                nLabel,
                             const enum QCBORDecodeTagReq uTagRequirement,
                             UsefulBufC                  *pB64Text)
 {
    QCBORDecode_Private_GetTaggedStringInMapN(pMe,
-                                              nLabel,
-                                              uTagRequirement,
-                                              QCBOR_TYPE_BASE64URL,
-                                              CBOR_TAG_B64URL,
-                                              pB64Text);
+                                             nLabel,
+                                             uTagRequirement,
+                                             QCBOR_TYPE_BASE64URL,
+                                             CBOR_TAG_B64URL,
+                                             pB64Text);
 }
 
 static inline void
-QCBORDecode_GetB64URLInMapSZ(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTB64URLInMapSZ(QCBORDecodeContext          *pMe,
                              const char                  *szLabel,
                              const enum QCBORDecodeTagReq uTagRequirement,
                              UsefulBufC                  *pB64Text)
@@ -1435,7 +1651,7 @@
 
 
 static inline void
-QCBORDecode_GetRegex(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTRegex(QCBORDecodeContext          *pMe,
                      const enum QCBORDecodeTagReq uTagRequirement,
                      UsefulBufC                  *pRegex)
 {
@@ -1447,7 +1663,7 @@
 }
 
 static inline void
-QCBORDecode_GetRegexInMapN(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTRegexInMapN(QCBORDecodeContext          *pMe,
                            const int64_t                nLabel,
                            const enum QCBORDecodeTagReq uTagRequirement,
                            UsefulBufC                  *pRegex)
@@ -1461,7 +1677,7 @@
 }
 
 static inline void
-QCBORDecode_GetRegexInMapSZ(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTRegexInMapSZ(QCBORDecodeContext          *pMe,
                             const char                  *szLabel,
                             const enum QCBORDecodeTagReq uTagRequirement,
                             UsefulBufC                  *pRegex)
@@ -1476,7 +1692,7 @@
 
 
 static inline void
-QCBORDecode_GetBinaryUUID(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTBinaryUUID(QCBORDecodeContext          *pMe,
                           const enum QCBORDecodeTagReq uTagRequirement,
                           UsefulBufC                  *pUUID)
 {
@@ -1488,7 +1704,7 @@
 }
 
 static inline void
-QCBORDecode_GetBinaryUUIDInMapN(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTBinaryUUIDInMapN(QCBORDecodeContext          *pMe,
                                 const int64_t                nLabel,
                                 const enum QCBORDecodeTagReq uTagRequirement,
                                 UsefulBufC                  *pUUID)
@@ -1502,7 +1718,7 @@
 }
 
 static inline void
-QCBORDecode_GetBinaryUUIDInMapSZ(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTBinaryUUIDInMapSZ(QCBORDecodeContext          *pMe,
                                  const char                  *szLabel,
                                  const enum QCBORDecodeTagReq uTagRequirement,
                                  UsefulBufC                  *pUUID)
@@ -1521,6 +1737,281 @@
  * ======================================================================== */
 
 
+
+/* ========================================================================= *
+ *    BEGINNING OF INLINES FOR DEPRECATED FUNCTIONS                          *
+ * ========================================================================= */
+
+static inline void
+QCBORDecode_GetDateString(QCBORDecodeContext    *pMe,
+                          enum QCBORDecodeTagReq uTagRequirement,
+                          UsefulBufC            *pDateString)
+{
+   QCBORDecode_GetTDateString(pMe, uTagRequirement, pDateString);
+}
+
+static inline void
+QCBORDecode_GetDateStringInMapN(QCBORDecodeContext    *pMe,
+                                int64_t                nLabel,
+                                enum QCBORDecodeTagReq uTagRequirement,
+                                UsefulBufC            *pDateString)
+{
+   QCBORDecode_GetTDateStringInMapN(pMe, nLabel, uTagRequirement, pDateString);
+}
+
+static inline void
+QCBORDecode_GetDateStringInMapSZ(QCBORDecodeContext    *pMe,
+                                 const char            *szLabel,
+                                 enum QCBORDecodeTagReq uTagRequirement,
+                                 UsefulBufC            *pDateString)
+{
+   QCBORDecode_GetTDateStringInMapSZ(pMe, szLabel, uTagRequirement, pDateString);
+}
+
+
+static inline void
+QCBORDecode_GetEpochDate(QCBORDecodeContext    *pMe,
+                         enum QCBORDecodeTagReq uTagRequirement,
+                         int64_t               *pnTime)
+{
+   QCBORDecode_GetTEpochDate(pMe, uTagRequirement, pnTime);
+}
+
+static inline void
+QCBORDecode_GetEpochDateInMapN(QCBORDecodeContext    *pMe,
+                               int64_t                nLabel,
+                               enum QCBORDecodeTagReq uTagRequirement,
+                               int64_t               *pnTime)
+{
+   QCBORDecode_GetTEpochDateInMapN(pMe, nLabel, uTagRequirement, pnTime);
+}
+
+static inline void
+QCBORDecode_GetEpochDateInMapSZ(QCBORDecodeContext    *pMe,
+                                const char            *szLabel,
+                                enum QCBORDecodeTagReq uTagRequirement,
+                                int64_t               *pnTime)
+{
+   QCBORDecode_GetTEpochDateInMapSZ(pMe, szLabel, uTagRequirement, pnTime);
+}
+
+static inline void
+QCBORDecode_GetDaysString(QCBORDecodeContext    *pMe,
+                          enum QCBORDecodeTagReq uTagRequirement,
+                          UsefulBufC            *pDateString)
+{
+   QCBORDecode_GetTDaysString(pMe, uTagRequirement, pDateString);
+}
+
+static inline void
+QCBORDecode_GetDaysStringInMapN(QCBORDecodeContext    *pMe,
+                                int64_t                nLabel,
+                                enum QCBORDecodeTagReq uTagRequirement,
+                                UsefulBufC            *pDateString)
+{
+   QCBORDecode_GetTDaysStringInMapN(pMe, nLabel, uTagRequirement, pDateString);
+}
+
+static inline void
+QCBORDecode_GetDaysStringInMapSZ(QCBORDecodeContext    *pMe,
+                                 const char            *szLabel,
+                                 enum QCBORDecodeTagReq uTagRequirement,
+                                 UsefulBufC            *pDateString)
+{
+   QCBORDecode_GetTDaysStringInMapSZ(pMe, szLabel, uTagRequirement, pDateString);
+}
+
+static inline void
+QCBORDecode_GetEpochDays(QCBORDecodeContext    *pMe,
+                         enum QCBORDecodeTagReq uTagRequirement,
+                         int64_t               *pnDays)
+{
+   QCBORDecode_GetTEpochDays(pMe, uTagRequirement, pnDays);
+}
+
+static inline void
+QCBORDecode_GetEpochDaysInMapN(QCBORDecodeContext    *pMe,
+                               int64_t                nLabel,
+                               enum QCBORDecodeTagReq uTagRequirement,
+                               int64_t               *pnDays)
+{
+   QCBORDecode_GetTEpochDaysInMapN(pMe, nLabel, uTagRequirement, pnDays);
+}
+
+static inline void
+QCBORDecode_GetEpochDaysInMapSZ(QCBORDecodeContext    *pMe,
+                                const char            *szLabel,
+                                enum QCBORDecodeTagReq uTagRequirement,
+                                int64_t               *pnDays)
+{
+   QCBORDecode_GetTEpochDaysInMapSZ(pMe, szLabel, uTagRequirement, pnDays);
+}
+
+static inline void
+QCBORDecode_GetURI(QCBORDecodeContext    *pMe,
+                   enum QCBORDecodeTagReq uTagRequirement,
+                   UsefulBufC            *pURI)
+{
+   QCBORDecode_GetTURI(pMe, uTagRequirement, pURI);
+}
+
+static inline void
+QCBORDecode_GetURIInMapN(QCBORDecodeContext    *pMe,
+                         int64_t                nLabel,
+                         enum QCBORDecodeTagReq uTagRequirement,
+                         UsefulBufC            *pURI)
+{
+   QCBORDecode_GetTURIInMapN(pMe, nLabel, uTagRequirement, pURI);
+}
+
+static inline void
+QCBORDecode_GetURIInMapSZ(QCBORDecodeContext    *pMe,
+                          const char            *szLabel,
+                          enum QCBORDecodeTagReq uTagRequirement,
+                          UsefulBufC            *pURI)
+{
+   QCBORDecode_GetTURIInMapSZ(pMe, szLabel, uTagRequirement, pURI);
+}
+
+static inline void
+QCBORDecode_GetB64(QCBORDecodeContext    *pMe,
+                   enum QCBORDecodeTagReq uTagRequirement,
+                   UsefulBufC            *pB64Text)
+{
+   QCBORDecode_GetTB64(pMe, uTagRequirement, pB64Text);
+}
+
+static inline void
+QCBORDecode_GetB64InMapN(QCBORDecodeContext    *pMe,
+                         int64_t                nLabel,
+                         enum QCBORDecodeTagReq uTagRequirement,
+                         UsefulBufC            *pB64Text)
+{
+   QCBORDecode_GetTB64InMapN(pMe, nLabel, uTagRequirement, pB64Text);
+}
+
+static inline void
+QCBORDecode_GetB64InMapSZ(QCBORDecodeContext    *pMe,
+                          const char            *szLabel,
+                          enum QCBORDecodeTagReq uTagRequirement,
+                          UsefulBufC            *pB64Text)
+{
+   QCBORDecode_GetTB64InMapSZ(pMe, szLabel, uTagRequirement, pB64Text);
+}
+
+static inline void
+QCBORDecode_GetB64URL(QCBORDecodeContext    *pMe,
+                      enum QCBORDecodeTagReq uTagRequirement,
+                      UsefulBufC            *pB64Text)
+{
+   QCBORDecode_GetTB64URL(pMe, uTagRequirement, pB64Text);
+}
+
+static inline void
+QCBORDecode_GetB64URLInMapN(QCBORDecodeContext    *pMe,
+                            int64_t                nLabel,
+                            enum QCBORDecodeTagReq uTagRequirement,
+                            UsefulBufC            *pB64Text)
+{
+   QCBORDecode_GetTB64URLInMapN(pMe, nLabel, uTagRequirement, pB64Text);
+}
+
+static inline void
+QCBORDecode_GetB64URLInMapSZ(QCBORDecodeContext    *pMe,
+                             const char            *szLabel,
+                             enum QCBORDecodeTagReq uTagRequirement,
+                             UsefulBufC            *pB64Text)
+{
+   QCBORDecode_GetTB64URLInMapSZ(pMe, szLabel, uTagRequirement, pB64Text);
+}
+
+static inline void
+QCBORDecode_GetRegex(QCBORDecodeContext    *pMe,
+                     enum QCBORDecodeTagReq uTagRequirement,
+                     UsefulBufC            *pRegex)
+{
+   QCBORDecode_GetTRegex(pMe, uTagRequirement, pRegex);
+}
+
+static inline void
+QCBORDecode_GetRegexInMapN(QCBORDecodeContext    *pMe,
+                           int64_t                nLabel,
+                           enum QCBORDecodeTagReq uTagRequirement,
+                           UsefulBufC            *pRegex)
+{
+   QCBORDecode_GetTRegexInMapN(pMe, nLabel, uTagRequirement, pRegex);
+}
+
+static inline void
+QCBORDecode_GetRegexInMapSZ(QCBORDecodeContext    *pMe,
+                            const char            *szLabel,
+                            enum QCBORDecodeTagReq uTagRequirement,
+                            UsefulBufC            *pRegex)
+{
+   QCBORDecode_GetTRegexInMapSZ(pMe, szLabel, uTagRequirement, pRegex);
+}
+
+static inline void
+QCBORDecode_GetMIMEMessage(QCBORDecodeContext    *pMe,
+                           enum QCBORDecodeTagReq uTagRequirement,
+                           UsefulBufC            *pMessage,
+                           bool                  *pbIsTag257)
+{
+   QCBORDecode_GetTMIMEMessage(pMe, uTagRequirement, pMessage, pbIsTag257);
+}
+
+static inline void
+QCBORDecode_GetMIMEMessageInMapN(QCBORDecodeContext    *pMe,
+                                 int64_t                nLabel,
+                                 enum QCBORDecodeTagReq uTagRequirement,
+                                 UsefulBufC            *pMessage,
+                                 bool                  *pbIsTag257)
+{
+   QCBORDecode_GetTMIMEMessageInMapN(pMe, nLabel, uTagRequirement, pMessage, pbIsTag257);
+}
+
+static inline void
+QCBORDecode_GetMIMEMessageInMapSZ(QCBORDecodeContext    *pMe,
+                                  const char            *szLabel,
+                                  enum QCBORDecodeTagReq uTagRequirement,
+                                  UsefulBufC            *pMessage,
+                                  bool                  *pbIsTag257)
+{
+   QCBORDecode_GetTMIMEMessageInMapSZ(pMe, szLabel, uTagRequirement, pMessage, pbIsTag257);
+}
+
+static inline void
+QCBORDecode_GetBinaryUUID(QCBORDecodeContext    *pMe,
+                          enum QCBORDecodeTagReq uTagRequirement,
+                          UsefulBufC            *pUUID)
+{
+   QCBORDecode_GetTBinaryUUID(pMe, uTagRequirement, pUUID);
+}
+
+static inline void
+QCBORDecode_GetBinaryUUIDInMapN(QCBORDecodeContext    *pMe,
+                                int64_t                nLabel,
+                                enum QCBORDecodeTagReq uTagRequirement,
+                                UsefulBufC            *pUUID)
+{
+   QCBORDecode_GetTBinaryUUIDInMapN(pMe, nLabel, uTagRequirement, pUUID);
+}
+
+static inline void
+QCBORDecode_GetBinaryUUIDInMapSZ(QCBORDecodeContext    *pMe,
+                                 const char            *szLabel,
+                                 enum QCBORDecodeTagReq uTagRequirement,
+                                 UsefulBufC            *pUUID)
+{
+   QCBORDecode_GetTBinaryUUIDInMapSZ(pMe, szLabel, uTagRequirement, pUUID);
+}
+
+
+/* ========================================================================= *
+ *    END OF INLINES FOR DEPRECATED FUNCTIONS                                *
+ * ========================================================================= */
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/inc/qcbor/qcbor_tag_encode.h b/inc/qcbor/qcbor_tag_encode.h
index 7e71128..f3c0313 100644
--- a/inc/qcbor/qcbor_tag_encode.h
+++ b/inc/qcbor/qcbor_tag_encode.h
@@ -256,7 +256,7 @@
  *                             @ref QCBOR_ENCODE_AS_BORROWED.
  * @param[in] UUID            Pointer and length of the binary UUID.
  *
- * A binary UUID as defined in 
+ * A binary UUID as defined in
  * [RFC 4122](https://www.rfc-editor.org/rfc/rfc4122.html) is added to the
  * output.
  *
@@ -291,7 +291,7 @@
  *                             @ref QCBOR_ENCODE_AS_BORROWED.
  * @param[in] URI              Pointer and length of the URI.
  *
- * The format of URI must be per 
+ * The format of URI must be per
  * [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986.html).
  *
  * It is output as CBOR major type 3, a text string, with tag @ref
@@ -330,7 +330,7 @@
  *                             @ref QCBOR_ENCODE_AS_BORROWED.
  * @param[in] B64Text          Pointer and length of the base-64 encoded text.
  *
- * The text content is Base64 encoded data per 
+ * The text content is Base64 encoded data per
  * [RFC 4648](https://www.rfc-editor.org/rfc/rfc4648.html).
  *
  * It is output as CBOR major type 3, a text string, with tag @ref
@@ -433,7 +433,7 @@
  *                             @ref QCBOR_ENCODE_AS_BORROWED.
  * @param[in] MIMEData         Pointer and length of the MIME data.
  *
- * The text content is in MIME format per 
+ * The text content is in MIME format per
  * [RFC 2045](https://www.rfc-editor.org/rfc/rfc2045.html) including the headers.
  *
  * It is output as CBOR major type 2, a binary string, with tag
@@ -569,6 +569,11 @@
  *    They just have been replaced by something better.                      *
  * ========================================================================= */
 
+/**
+ * \defgroup DeprecatedAddTag  Deprecated functions for adding tags.
+ * @{
+ */
+
 /** @deprecated Use QCBOREncode_AddTDateEpoch() instead. */
 static void
 QCBOREncode_AddDateEpoch(QCBOREncodeContext *pCtx, int64_t nDate);
@@ -685,6 +690,7 @@
                                 int64_t             nLabel,
                                 const char         *szDate);
 
+/**@}*/
 
 /* ========================================================================= *
  *    END OF DEPRECATED FUNCTION DECLARATIONS                                *
@@ -694,7 +700,7 @@
 
 
 /* ========================================================================= *
- *    BEGINNING OF PRIVATE INLINE IMPLEMENTATION    
+ *    BEGINNING OF PRIVATE INLINE IMPLEMENTATION
  *    Note that the entire qcbor_tag_encode implementation is line.
  * ========================================================================= */
 
diff --git a/src/qcbor_tag_decode.c b/src/qcbor_tag_decode.c
index d8a0780..27c40b0 100644
--- a/src/qcbor_tag_decode.c
+++ b/src/qcbor_tag_decode.c
@@ -780,7 +780,7 @@
 
 /* Public function; see qcbor_tag_decode.h */
 void
-QCBORDecode_GetEpochDate(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTEpochDate(QCBORDecodeContext          *pMe,
                          const enum QCBORDecodeTagReq uTagRequirement,
                          int64_t                     *pnTime)
 {
@@ -801,7 +801,7 @@
 
 /* Public function; see qcbor_tag_decode.h */
 void
-QCBORDecode_GetEpochDateInMapN(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTEpochDateInMapN(QCBORDecodeContext          *pMe,
                                int64_t                      nLabel,
                                const enum QCBORDecodeTagReq uTagRequirement,
                                int64_t                     *pnTime)
@@ -827,7 +827,7 @@
 
 /* Public function; see qcbor_tag_decode.h */
 void
-QCBORDecode_GetEpochDateInMapSZ(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTEpochDateInMapSZ(QCBORDecodeContext          *pMe,
                                 const char                  *szLabel,
                                 const enum QCBORDecodeTagReq uTagRequirement,
                                 int64_t                     *pnTime)
@@ -853,7 +853,7 @@
 
 /* Public function; see qcbor_tag_decode.h */
 void
-QCBORDecode_GetEpochDays(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTEpochDays(QCBORDecodeContext          *pMe,
                          const enum QCBORDecodeTagReq uTagRequirement,
                          int64_t                     *pnDays)
 {
@@ -874,7 +874,7 @@
 
 /* Public function; see qcbor_tag_decode.h */
 void
-QCBORDecode_GetEpochDaysInMapN(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTEpochDaysInMapN(QCBORDecodeContext          *pMe,
                                int64_t                      nLabel,
                                const enum QCBORDecodeTagReq uTagRequirement,
                                int64_t                     *pnDays)
@@ -900,7 +900,7 @@
 
 /* Public function; see qcbor_tag_decode.h */
 void
-QCBORDecode_GetEpochDaysInMapSZ(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTEpochDaysInMapSZ(QCBORDecodeContext          *pMe,
                                 const char                  *szLabel,
                                 const enum QCBORDecodeTagReq uTagRequirement,
                                 int64_t                     *pnDays)
@@ -966,7 +966,7 @@
 
 /* Public function; see qcbor_tag_decode.h */
 void
-QCBORDecode_GetMIMEMessage(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTMIMEMessage(QCBORDecodeContext          *pMe,
                            const enum QCBORDecodeTagReq uTagRequirement,
                            UsefulBufC                  *pMessage,
                            bool                        *pbIsTag257)
@@ -985,7 +985,7 @@
 
 /* Public function; see qcbor_tag_decode.h */
 void
-QCBORDecode_GetMIMEMessageInMapN(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTMIMEMessageInMapN(QCBORDecodeContext          *pMe,
                                  const int64_t                nLabel,
                                  const enum QCBORDecodeTagReq uTagRequirement,
                                  UsefulBufC                  *pMessage,
@@ -1009,7 +1009,7 @@
 
 /* Public function; see qcbor_tag_decode.h */
 void
-QCBORDecode_GetMIMEMessageInMapSZ(QCBORDecodeContext          *pMe,
+QCBORDecode_GetTMIMEMessageInMapSZ(QCBORDecodeContext          *pMe,
                                   const char                  *szLabel,
                                   const enum QCBORDecodeTagReq uTagRequirement,
                                   UsefulBufC                  *pMessage,
diff --git a/test/qcbor_decode_tests.c b/test/qcbor_decode_tests.c
index bc6f3c1..eb86736 100644
--- a/test/qcbor_decode_tests.c
+++ b/test/qcbor_decode_tests.c
@@ -2003,7 +2003,7 @@
    if(uErr) {
       return MakeTestResultCode(11, 11, uErr);
    }
-   QCBORDecode_GetEpochDate(&DCtx, QCBOR_TAG_REQUIREMENT_TAG, &nInt);
+   QCBORDecode_GetTEpochDate(&DCtx, QCBOR_TAG_REQUIREMENT_TAG, &nInt);
    uErr = CheckOneLetterString(&DCtx, 'i');
    if(uErr) {
       return MakeTestResultCode(11, 12, uErr);
@@ -3693,7 +3693,7 @@
    QCBORDecode_EnterMap(&DC, NULL);
 
    // A single-precision date
-   QCBORDecode_GetEpochDateInMapSZ(&DC, "x", QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG,
+   QCBORDecode_GetTEpochDateInMapSZ(&DC, "x", QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG,
                                    &nEpochDate5);
    uError = QCBORDecode_GetAndResetError(&DC);
    if(uError != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)) {
@@ -3706,7 +3706,7 @@
    }
 
    // A half-precision date with value -2 FFF
-   QCBORDecode_GetEpochDateInMapN(&DC, 9, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG,
+   QCBORDecode_GetTEpochDateInMapN(&DC, 9, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG,
                                   &nEpochDate4);
    uError = QCBORDecode_GetAndResetError(&DC);
    if(uError != FLOAT_ERR_CODE_NO_HALF_PREC_NO_FLOAT_HW(QCBOR_SUCCESS)) {
@@ -3719,7 +3719,7 @@
    }
 
    // Fail to get an epoch date by string label
-   QCBORDecode_GetEpochDateInMapSZ(&DC, "no-label",
+   QCBORDecode_GetTEpochDateInMapSZ(&DC, "no-label",
                                    QCBOR_TAG_REQUIREMENT_NOT_A_TAG,
                                    &nEpochDate6);
    uError = QCBORDecode_GetAndResetError(&DC);
@@ -3728,7 +3728,7 @@
    }
 
    // Fail to get an epoch date by integer label
-   QCBORDecode_GetEpochDateInMapN(&DC, 99999, QCBOR_TAG_REQUIREMENT_NOT_A_TAG,
+   QCBORDecode_GetTEpochDateInMapN(&DC, 99999, QCBOR_TAG_REQUIREMENT_NOT_A_TAG,
                                   &nEpochDate6);
    uError = QCBORDecode_GetAndResetError(&DC);
    if(uError != QCBOR_ERR_LABEL_NOT_FOUND) {
@@ -3736,7 +3736,7 @@
    }
 
    // Fail to get a string date by string label
-   QCBORDecode_GetDateStringInMapSZ(&DC, "no-label",
+   QCBORDecode_GetTDateStringInMapSZ(&DC, "no-label",
                                     QCBOR_TAG_REQUIREMENT_NOT_A_TAG,
                                     &StringDate1);
    uError = QCBORDecode_GetAndResetError(&DC);
@@ -3745,7 +3745,7 @@
    }
 
    // Fail to get a string date by integer label
-   QCBORDecode_GetDateStringInMapN(&DC, 99999, QCBOR_TAG_REQUIREMENT_NOT_A_TAG,
+   QCBORDecode_GetTDateStringInMapN(&DC, 99999, QCBOR_TAG_REQUIREMENT_NOT_A_TAG,
                                    &StringDate1);
    uError = QCBORDecode_GetAndResetError(&DC);
    if(uError != QCBOR_ERR_LABEL_NOT_FOUND) {
@@ -3756,16 +3756,16 @@
 
 
    // Untagged integer 0
-   QCBORDecode_GetEpochDateInMapN(&DC, 8, QCBOR_TAG_REQUIREMENT_NOT_A_TAG,
+   QCBORDecode_GetTEpochDateInMapN(&DC, 8, QCBOR_TAG_REQUIREMENT_NOT_A_TAG,
                                   &nEpochDate3);
    // Untagged date string
-   QCBORDecode_GetDateStringInMapSZ(&DC, "y", QCBOR_TAG_REQUIREMENT_NOT_A_TAG,
+   QCBORDecode_GetTDateStringInMapSZ(&DC, "y", QCBOR_TAG_REQUIREMENT_NOT_A_TAG,
                                     &StringDate2);
 
-   QCBORDecode_GetDaysStringInMapN(&DC, 99, QCBOR_TAG_REQUIREMENT_NOT_A_TAG,
+   QCBORDecode_GetTDaysStringInMapN(&DC, 99, QCBOR_TAG_REQUIREMENT_NOT_A_TAG,
                                    &StringDays2);
 
-   QCBORDecode_GetEpochDaysInMapN(&DC, 17, QCBOR_TAG_REQUIREMENT_NOT_A_TAG,
+   QCBORDecode_GetTEpochDaysInMapN(&DC, 17, QCBOR_TAG_REQUIREMENT_NOT_A_TAG,
                                   &nEpochDays2);
 
    QCBORDecode_ExitMap(&DC);
@@ -3784,11 +3784,11 @@
    uint64_t           uTag1, uTag2;
 
    // Tagged date string
-   QCBORDecode_GetDateStringInMapN(&DC, 0, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG,
+   QCBORDecode_GetTDateStringInMapN(&DC, 0, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG,
                                    &StringDate1);
 
    // Epoch date 1400000000; Tue, 13 May 2014 16:53:20 GMT
-   QCBORDecode_GetEpochDateInMapN(&DC,
+   QCBORDecode_GetTEpochDateInMapN(&DC,
                                   1,
                                   QCBOR_TAG_REQUIREMENT_TAG |
                                     QCBOR_TAG_REQUIREMENT_ALLOW_ADDITIONAL_TAGS,
@@ -3796,7 +3796,7 @@
    uTag1 = QCBORDecode_GetNthTagOfLast(&DC, 0);
 
    // Get largest negative double precision epoch date allowed
-   QCBORDecode_GetEpochDateInMapN(&DC,
+   QCBORDecode_GetTEpochDateInMapN(&DC,
                                   5,
                                   QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG |
                                     QCBOR_TAG_REQUIREMENT_ALLOW_ADDITIONAL_TAGS,
@@ -3812,7 +3812,7 @@
    }
 
    // Untagged -1000 with label z
-   QCBORDecode_GetEpochDateInMapSZ(&DC,
+   QCBORDecode_GetTEpochDateInMapSZ(&DC,
                                    "z",
                                    QCBOR_TAG_REQUIREMENT_NOT_A_TAG |
                                     QCBOR_TAG_REQUIREMENT_ALLOW_ADDITIONAL_TAGS,
@@ -3821,7 +3821,7 @@
 
 
    // Get largest double precision epoch date allowed
-   QCBORDecode_GetEpochDateInMapN(&DC, 7, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG,
+   QCBORDecode_GetTEpochDateInMapN(&DC, 7, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG,
                                   &nEpochDate2);
    uError = QCBORDecode_GetAndResetError(&DC);
    if(uError != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)) {
@@ -3841,10 +3841,10 @@
     * and decode options as that is implemented by code
     * that is tested well by the date testing above.
     */
-   QCBORDecode_GetDaysStringInMapSZ(&DC, "SDS", QCBOR_TAG_REQUIREMENT_TAG,
+   QCBORDecode_GetTDaysStringInMapSZ(&DC, "SDS", QCBOR_TAG_REQUIREMENT_TAG,
                                     &StringDays1);
 
-   QCBORDecode_GetEpochDaysInMapSZ(&DC, "SDE", QCBOR_TAG_REQUIREMENT_TAG,
+   QCBORDecode_GetTEpochDaysInMapSZ(&DC, "SDE", QCBOR_TAG_REQUIREMENT_TAG,
                                    &nEpochDays1);
 
    QCBORDecode_ExitMap(&DC);
@@ -3853,21 +3853,21 @@
    }
 
    // Too-negative float, -9.2233720368547748E+18
-   QCBORDecode_GetEpochDate(&DC, QCBOR_TAG_REQUIREMENT_TAG, &nEpochDateFail);
+   QCBORDecode_GetTEpochDate(&DC, QCBOR_TAG_REQUIREMENT_TAG, &nEpochDateFail);
    uError = QCBORDecode_GetAndResetError(&DC);
    if(uError != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_ERR_DATE_OVERFLOW)) {
       return 1111;
    }
 
    // Too-large integer
-   QCBORDecode_GetEpochDate(&DC, QCBOR_TAG_REQUIREMENT_TAG, &nEpochDateFail);
+   QCBORDecode_GetTEpochDate(&DC, QCBOR_TAG_REQUIREMENT_TAG, &nEpochDateFail);
    uError = QCBORDecode_GetAndResetError(&DC);
    if(uError != QCBOR_ERR_DATE_OVERFLOW) {
       return 1;
    }
 
    // Half-precision minus infinity
-   QCBORDecode_GetEpochDate(&DC, QCBOR_TAG_REQUIREMENT_TAG, &nEpochDateFail);
+   QCBORDecode_GetTEpochDate(&DC, QCBOR_TAG_REQUIREMENT_TAG, &nEpochDateFail);
    uError = QCBORDecode_GetAndResetError(&DC);
    if(uError != FLOAT_ERR_CODE_NO_HALF_PREC_NO_FLOAT_HW(QCBOR_ERR_DATE_OVERFLOW)) {
       return 2;
@@ -3875,7 +3875,7 @@
 
 
    // Bad content for epoch date
-   QCBORDecode_GetEpochDate(&DC, QCBOR_TAG_REQUIREMENT_TAG, &nEpochDateFail);
+   QCBORDecode_GetTEpochDate(&DC, QCBOR_TAG_REQUIREMENT_TAG, &nEpochDateFail);
    uError = QCBORDecode_GetAndResetError(&DC);
    if(uError != QCBOR_ERR_UNRECOVERABLE_TAG_CONTENT) {
       return 3;
@@ -3883,7 +3883,7 @@
 
    // Bad content for string date
    // TODO: should this set StringDate3 to NULL? variance between v1 and v2
-   QCBORDecode_GetDateString(&DC, QCBOR_TAG_REQUIREMENT_TAG, &StringDate3);
+   QCBORDecode_GetTDateString(&DC, QCBOR_TAG_REQUIREMENT_TAG, &StringDate3);
    uError = QCBORDecode_GetAndResetError(&DC);
    if(uError != QCBOR_ERR_UNRECOVERABLE_TAG_CONTENT) {
       return 4;
@@ -3975,7 +3975,7 @@
    */
 #ifndef QCBOR_DISABLE_TAGS
    QCBORDecode_GetNextTagNumberInMapN(&DC, 1, &uTag1);
-   QCBORDecode_GetEpochDateInMapN(&DC, 1, QCBOR_TAG_REQUIREMENT_TAG, &nEpochDate2);
+   QCBORDecode_GetTEpochDateInMapN(&DC, 1, QCBOR_TAG_REQUIREMENT_TAG, &nEpochDate2);
 
 #endif /* ! QCBOR_DISABLE_TAGS */
 
@@ -4503,24 +4503,24 @@
 
    QCBORDecode_EnterArray(&DCtx, NULL);
    // tagged date string
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_TAG, &DateString);
    // untagged date string
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &DateString);
    if(QCBORDecode_GetAndResetError(&DCtx) != QCBOR_SUCCESS) {
       return 100;
    }
    // untagged byte string
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &DateString);
    if(QCBORDecode_GetAndResetError(&DCtx) != QCBOR_ERR_UNRECOVERABLE_TAG_CONTENT) {
       return 101;
    }
    // tagged regex
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_TAG, &DateString);
    if(QCBORDecode_GetAndResetError(&DCtx) != QCBOR_ERR_UNEXPECTED_TYPE) {
       return 102;
    }
    // tagged date string with a byte string
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_TAG, &DateString);
    if(QCBORDecode_GetAndResetError(&DCtx) != QCBOR_ERR_UNRECOVERABLE_TAG_CONTENT) {
       return 103;
    }
@@ -4628,24 +4628,24 @@
 
    QCBORDecode_EnterArray(&DCtx, NULL);
    // tagged date string
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &DateString);
    // untagged date string
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &DateString);
    if(QCBORDecode_GetAndResetError(&DCtx) != QCBOR_SUCCESS) {
       return 250;
    }
    // untagged byte string
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &DateString);
    if(QCBORDecode_GetAndResetError(&DCtx) != QCBOR_ERR_UNRECOVERABLE_TAG_CONTENT) {
       return 251;
    }
    // tagged regex
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &DateString);
    if(QCBORDecode_GetAndResetError(&DCtx) != QCBOR_ERR_UNRECOVERABLE_TAG_CONTENT) {
       return 252;
    }
    // tagged date string with a byte string
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &DateString);
    if(QCBORDecode_GetAndResetError(&DCtx) != QCBOR_ERR_UNRECOVERABLE_TAG_CONTENT) {
       return 253;
    }
@@ -4662,27 +4662,27 @@
 
    QCBORDecode_EnterArray(&DCtx, NULL);
    // tagged date string
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &DateString);
    if(QCBORDecode_GetAndResetError(&DCtx) != QCBOR_ERR_UNEXPECTED_TYPE) {
       return 300;
    }
    // untagged date string
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_TAG, &DateString);
    if(QCBORDecode_GetAndResetError(&DCtx) != QCBOR_ERR_UNEXPECTED_TYPE) {
       return 301;
    }
    // untagged byte string
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_TAG, &DateString);
    if(QCBORDecode_GetAndResetError(&DCtx) != QCBOR_ERR_UNEXPECTED_TYPE) {
       return 302;
    }
    // tagged regex
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &DateString);
    if(QCBORDecode_GetAndResetError(&DCtx) != QCBOR_ERR_UNRECOVERABLE_TAG_CONTENT) {
       return 303;
    }
    // tagged date string with a byte string
-   QCBORDecode_GetDateString(&DCtx, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &DateString);
+   QCBORDecode_GetTDateString(&DCtx, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &DateString);
    if(QCBORDecode_GetAndResetError(&DCtx) != QCBOR_ERR_BAD_TAG_CONTENT) { // TODO: make sure this is the right error
       return 304;
    }
@@ -7651,7 +7651,7 @@
 
 
 #ifndef QCBOR_DISABLE_TAGS
-   QCBORDecode_GetEpochDateInMapN(&DCtx, 0x04, QCBOR_TAG_REQUIREMENT_TAG, &nInt);
+   QCBORDecode_GetTEpochDateInMapN(&DCtx, 0x04, QCBOR_TAG_REQUIREMENT_TAG, &nInt);
    uErr = QCBORDecode_GetAndResetError(&DCtx);
    if(uErr != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_ERR_DATE_OVERFLOW)) {
       return 2024;
@@ -8963,25 +8963,25 @@
    bool       bNeg;
 
    QCBORDecode_EnterMap(&DC, NULL);
-   QCBORDecode_GetDateStringInMapN(&DC, 0, QCBOR_TAG_REQUIREMENT_TAG, &String);
-   QCBORDecode_GetDateStringInMapN(&DC, 0, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &String);
+   QCBORDecode_GetTDateStringInMapN(&DC, 0, QCBOR_TAG_REQUIREMENT_TAG, &String);
+   QCBORDecode_GetTDateStringInMapN(&DC, 0, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &String);
    if(QCBORDecode_GetError(&DC) != QCBOR_SUCCESS) {
       return 1;
    }
-   QCBORDecode_GetDateStringInMapN(&DC, 0, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
+   QCBORDecode_GetTDateStringInMapN(&DC, 0, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_UNEXPECTED_TYPE) {
       return 2;
    }
-   QCBORDecode_GetDateStringInMapN(&DC, 1, QCBOR_TAG_REQUIREMENT_TAG, &String);
+   QCBORDecode_GetTDateStringInMapN(&DC, 1, QCBOR_TAG_REQUIREMENT_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_UNEXPECTED_TYPE) {
       return 3;
    }
-   QCBORDecode_GetDateStringInMapN(&DC, 1, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &String);
-   QCBORDecode_GetDateStringInMapN(&DC, 1, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
+   QCBORDecode_GetTDateStringInMapN(&DC, 1, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &String);
+   QCBORDecode_GetTDateStringInMapN(&DC, 1, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
       return 4;
    }
-   QCBORDecode_GetDateStringInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &String);
+   QCBORDecode_GetTDateStringInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_LABEL_NOT_FOUND) {
       return 5;
    }
@@ -9009,120 +9009,120 @@
       return 14;
    }
 
-   QCBORDecode_GetURIInMapN(&DC, 20, QCBOR_TAG_REQUIREMENT_TAG, &String);
+   QCBORDecode_GetTURIInMapN(&DC, 20, QCBOR_TAG_REQUIREMENT_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
       return 20;
    }
-   QCBORDecode_GetURIInMapN(&DC, 21, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
+   QCBORDecode_GetTURIInMapN(&DC, 21, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
       return 21;
    }
-   QCBORDecode_GetURIInMapN(&DC, 22, QCBOR_TAG_REQUIREMENT_TAG, &String);
+   QCBORDecode_GetTURIInMapN(&DC, 22, QCBOR_TAG_REQUIREMENT_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_LABEL_NOT_FOUND) {
       return 22;
    }
-   QCBORDecode_GetURIInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_TAG, &String);
+   QCBORDecode_GetTURIInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_LABEL_NOT_FOUND) {
       return 23;
    }
 
-   QCBORDecode_GetB64InMapN(&DC, 30, QCBOR_TAG_REQUIREMENT_TAG, &String);
+   QCBORDecode_GetTB64InMapN(&DC, 30, QCBOR_TAG_REQUIREMENT_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
       return 30;
    }
-   QCBORDecode_GetB64InMapN(&DC, 31, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
+   QCBORDecode_GetTB64InMapN(&DC, 31, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
       return 31;
    }
-   QCBORDecode_GetB64InMapN(&DC, 32, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
+   QCBORDecode_GetTB64InMapN(&DC, 32, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_LABEL_NOT_FOUND) {
       return 32;
    }
-   QCBORDecode_GetB64InMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
+   QCBORDecode_GetTB64InMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_LABEL_NOT_FOUND) {
       return 33;
    }
 
-   QCBORDecode_GetB64URLInMapN(&DC, 40, QCBOR_TAG_REQUIREMENT_TAG, &String);
+   QCBORDecode_GetTB64URLInMapN(&DC, 40, QCBOR_TAG_REQUIREMENT_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
       return 40;
    }
-   QCBORDecode_GetB64URLInMapN(&DC, 41, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
+   QCBORDecode_GetTB64URLInMapN(&DC, 41, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
       return 41;
    }
-   QCBORDecode_GetB64URLInMapN(&DC, 42, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
+   QCBORDecode_GetTB64URLInMapN(&DC, 42, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_LABEL_NOT_FOUND) {
       return 42;
    }
-   QCBORDecode_GetB64URLInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
+   QCBORDecode_GetTB64URLInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_LABEL_NOT_FOUND) {
       return 43;
    }
 
-   QCBORDecode_GetRegexInMapN(&DC, 50, QCBOR_TAG_REQUIREMENT_TAG, &String);
+   QCBORDecode_GetTRegexInMapN(&DC, 50, QCBOR_TAG_REQUIREMENT_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
       return 50;
    }
-   QCBORDecode_GetRegexInMapN(&DC, 51, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
+   QCBORDecode_GetTRegexInMapN(&DC, 51, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
       return 51;
    }
-   QCBORDecode_GetRegexInMapN(&DC, 52, QCBOR_TAG_REQUIREMENT_TAG, &String);
+   QCBORDecode_GetTRegexInMapN(&DC, 52, QCBOR_TAG_REQUIREMENT_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_LABEL_NOT_FOUND) {
       return 52;
    }
-   QCBORDecode_GetRegexInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_TAG, &String);
+   QCBORDecode_GetTRegexInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_LABEL_NOT_FOUND) {
       return 53;
    }
 
    // MIME
    bool bIsNot7Bit;
-   QCBORDecode_GetMIMEMessageInMapN(&DC, 60, QCBOR_TAG_REQUIREMENT_TAG, &String, &bIsNot7Bit);
+   QCBORDecode_GetTMIMEMessageInMapN(&DC, 60, QCBOR_TAG_REQUIREMENT_TAG, &String, &bIsNot7Bit);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS ||
       bIsNot7Bit == true) {
       return 60;
    }
-   QCBORDecode_GetMIMEMessageInMapN(&DC, 61, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String, &bIsNot7Bit);
+   QCBORDecode_GetTMIMEMessageInMapN(&DC, 61, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String, &bIsNot7Bit);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS ||
       bIsNot7Bit == true) {
       return 61;
    }
-   QCBORDecode_GetMIMEMessageInMapN(&DC, 62, QCBOR_TAG_REQUIREMENT_TAG, &String, &bIsNot7Bit);
+   QCBORDecode_GetTMIMEMessageInMapN(&DC, 62, QCBOR_TAG_REQUIREMENT_TAG, &String, &bIsNot7Bit);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS ||
       bIsNot7Bit == false) {
       return 62;
    }
-   QCBORDecode_GetMIMEMessageInMapN(&DC, 63, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String, &bIsNot7Bit);
+   QCBORDecode_GetTMIMEMessageInMapN(&DC, 63, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String, &bIsNot7Bit);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS ||
       bIsNot7Bit == false) {
       return 63;
    }
-   QCBORDecode_GetMIMEMessageInMapN(&DC, 64, QCBOR_TAG_REQUIREMENT_TAG, &String, &bNeg);
+   QCBORDecode_GetTMIMEMessageInMapN(&DC, 64, QCBOR_TAG_REQUIREMENT_TAG, &String, &bNeg);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_LABEL_NOT_FOUND) {
       return 64;
    }
-   QCBORDecode_GetMIMEMessageInMapSZ(&DC, "zzz", QCBOR_TAG_REQUIREMENT_TAG, &String, &bNeg);
+   QCBORDecode_GetTMIMEMessageInMapSZ(&DC, "zzz", QCBOR_TAG_REQUIREMENT_TAG, &String, &bNeg);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_LABEL_NOT_FOUND) {
       return 65;
    }
 
 
-   QCBORDecode_GetBinaryUUIDInMapN(&DC, 70, QCBOR_TAG_REQUIREMENT_TAG, &String);
+   QCBORDecode_GetTBinaryUUIDInMapN(&DC, 70, QCBOR_TAG_REQUIREMENT_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
       return 70;
    }
 
-   QCBORDecode_GetBinaryUUIDInMapN(&DC, 71, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
+   QCBORDecode_GetTBinaryUUIDInMapN(&DC, 71, QCBOR_TAG_REQUIREMENT_NOT_A_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
       return 71;
    }
-   QCBORDecode_GetBinaryUUIDInMapN(&DC, 72, QCBOR_TAG_REQUIREMENT_TAG, &String);
+   QCBORDecode_GetTBinaryUUIDInMapN(&DC, 72, QCBOR_TAG_REQUIREMENT_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_LABEL_NOT_FOUND) {
       return 72;
    }
-   QCBORDecode_GetBinaryUUIDInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_TAG, &String);
+   QCBORDecode_GetTBinaryUUIDInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_TAG, &String);
    if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_LABEL_NOT_FOUND) {
       return 73;
    }
