diff --git a/dcmdata/apps/dump2dcm.cc b/dcmdata/apps/dump2dcm.cc
index 9af00dde7..ed8964000 100644
--- a/dcmdata/apps/dump2dcm.cc
+++ b/dcmdata/apps/dump2dcm.cc
@@ -1049,17 +1049,17 @@ int main(int argc, char *argv[])
             if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_StudyInstanceUID))
             {
                 OFLOG_INFO(dump2dcmLogger, "generating new Study Instance UID");
-                dataset->putAndInsertString(DCM_StudyInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT));
+                dataset->putAndInsertString(DCM_StudyInstanceUID, dcmGenerateRootBasedUID(uid, SITE_STUDY_UID_ROOT));
             }
             if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_SeriesInstanceUID))
             {
                 OFLOG_INFO(dump2dcmLogger, "generating new Series Instance UID");
-                dataset->putAndInsertString(DCM_SeriesInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT));
+                dataset->putAndInsertString(DCM_SeriesInstanceUID, dcmGenerateRootBasedUID(uid, SITE_SERIES_UID_ROOT));
             }
             if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_SOPInstanceUID))
             {
                 OFLOG_INFO(dump2dcmLogger, "generating new SOP Instance UID");
-                dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT));
+                dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateRootBasedUID(uid, SITE_INSTANCE_UID_ROOT));
                 /* make sure that the file meta information is updated correspondingly */
                 if (opt_writeMode == EWM_fileformat)
                     opt_writeMode = EWM_updateMeta;
diff --git a/dcmdata/apps/json2dcm.cc b/dcmdata/apps/json2dcm.cc
index bd73bd5e5..3071ec3e1 100644
--- a/dcmdata/apps/json2dcm.cc
+++ b/dcmdata/apps/json2dcm.cc
@@ -290,17 +290,17 @@ void generateUIDs(DcmItem *dataset, OFBool overwriteUIDs, E_FileWriteMode& write
     if (overwriteUIDs || !dataset->tagExistsWithValue(DCM_StudyInstanceUID))
     {
         OFLOG_INFO(json2dcmLogger, "generating new Study Instance UID");
-        dataset->putAndInsertString(DCM_StudyInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT));
+        dataset->putAndInsertString(DCM_StudyInstanceUID, dcmGenerateRootBasedUID(uid, SITE_STUDY_UID_ROOT));
     }
     if (overwriteUIDs || !dataset->tagExistsWithValue(DCM_SeriesInstanceUID))
     {
         OFLOG_INFO(json2dcmLogger, "generating new Series Instance UID");
-        dataset->putAndInsertString(DCM_SeriesInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT));
+        dataset->putAndInsertString(DCM_SeriesInstanceUID, dcmGenerateRootBasedUID(uid, SITE_SERIES_UID_ROOT));
     }
     if (overwriteUIDs || !dataset->tagExistsWithValue(DCM_SOPInstanceUID))
     {
         OFLOG_INFO(json2dcmLogger, "generating new SOP Instance UID");
-        dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT));
+        dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateRootBasedUID(uid, SITE_INSTANCE_UID_ROOT));
 
         /* make sure that the file meta information is updated correspondingly */
         if (writeMode == EWM_fileformat)
diff --git a/dcmdata/apps/mdfdsman.cc b/dcmdata/apps/mdfdsman.cc
index bb12b31ed..f149be858 100644
--- a/dcmdata/apps/mdfdsman.cc
+++ b/dcmdata/apps/mdfdsman.cc
@@ -1159,12 +1159,12 @@ OFCondition MdfDatasetManager::generateAndInsertUID(const DcmTagKey& uidKey)
     OFCondition result;
     char uid[100];
     if (uidKey == DCM_StudyInstanceUID)
-        dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT);
+        dcmGenerateRootBasedUID(uid, SITE_STUDY_UID_ROOT);
     else if (uidKey == DCM_SeriesInstanceUID)
-        dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT);
+        dcmGenerateRootBasedUID(uid, SITE_SERIES_UID_ROOT);
     else if (uidKey == DCM_SOPInstanceUID)
     {
-        dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT);
+        dcmGenerateRootBasedUID(uid, SITE_INSTANCE_UID_ROOT);
         // force meta-header to refresh SOP Class/Instance UIDs.
         DcmItem* meta_info = dfile->getMetaInfo();
         if (meta_info)
diff --git a/dcmdata/apps/xml2dcm.cc b/dcmdata/apps/xml2dcm.cc
index 4276cabcf..1d9cb7e6c 100644
--- a/dcmdata/apps/xml2dcm.cc
+++ b/dcmdata/apps/xml2dcm.cc
@@ -329,17 +329,17 @@ int main(int argc, char *argv[])
                 if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_StudyInstanceUID))
                 {
                     OFLOG_INFO(xml2dcmLogger, "generating new Study Instance UID");
-                    dataset->putAndInsertString(DCM_StudyInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT));
+                    dataset->putAndInsertString(DCM_StudyInstanceUID, dcmGenerateRootBasedUID(uid, SITE_STUDY_UID_ROOT));
                 }
                 if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_SeriesInstanceUID))
                 {
                     OFLOG_INFO(xml2dcmLogger, "generating new Series Instance UID");
-                    dataset->putAndInsertString(DCM_SeriesInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT));
+                    dataset->putAndInsertString(DCM_SeriesInstanceUID, dcmGenerateRootBasedUID(uid, SITE_SERIES_UID_ROOT));
                 }
                 if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_SOPInstanceUID))
                 {
                     OFLOG_INFO(xml2dcmLogger, "generating new SOP Instance UID");
-                    dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT));
+                    dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateRootBasedUID(uid, SITE_INSTANCE_UID_ROOT));
                 }
             }
             OFLOG_INFO(xml2dcmLogger, "writing DICOM output file: " << opt_ofname);
diff --git a/dcmdata/docs/dcmdata.dox b/dcmdata/docs/dcmdata.dox
index 5bc8a5a4b..e77e696c5 100644
--- a/dcmdata/docs/dcmdata.dox
+++ b/dcmdata/docs/dcmdata.dox
@@ -71,7 +71,7 @@ char uid[100];
 DcmFileFormat fileformat;
 DcmDataset *dataset = fileformat.getDataset();
 dataset->putAndInsertString(DCM_SOPClassUID, UID_SecondaryCaptureImageStorage);
-dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT));
+dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateRootBasedUID(uid, SITE_INSTANCE_UID_ROOT));
 dataset->putAndInsertString(DCM_PatientName, "Doe^John");
 /* ... */
 dataset->putAndInsertUint8Array(DCM_PixelData, pixelData, pixelLength);
diff --git a/dcmdata/include/dcmtk/dcmdata/dcuid.h b/dcmdata/include/dcmtk/dcmdata/dcuid.h
index a02d363b8..dcbaeb160 100644
--- a/dcmdata/include/dcmtk/dcmdata/dcuid.h
+++ b/dcmdata/include/dcmtk/dcmdata/dcuid.h
@@ -26,7 +26,9 @@
 
 #include "dcmtk/config/osconfig.h"    /* make sure OS specific configuration is included first */
 
+#include "dcmtk/ofstd/ofmem.h"
 #include "dcmtk/ofstd/oftypes.h"
+#include "dcmtk/ofstd/ofuuidgn.h"
 #include "dcmtk/dcmdata/dcdefine.h"
 
 // include this file in doxygen documentation
@@ -265,24 +267,44 @@ extern DCMTK_DCMDATA_EXPORT const int numberOfDcmImageSOPClassUIDs;
  */
 DCMTK_DCMDATA_EXPORT OFBool dcmIsImageStorageSOPClassUID(const char* uid);
 
-/** creates a Unique Identifier in uid and returns uid.
- *  uid must be at least 65 bytes. Care is taken to make sure
+/** creates an UID (Unique IDentifier) in \p uid and returns \p uid.
+ *  \p uid must be at least 65 bytes. Care is taken to make sure
  *  that the generated UID is 64 characters or less.
  *  If a prefix string is not passed as the second argument a
  *  default of SITE_INSTANCE_UID_ROOT (see below) will be used.
  *  Otherwise the supplied prefix string will appear at the beginning
- *  of uid.
+ *  of \p uid.
  *  The UID is created by appending to the prefix the following:
  *  - the host ID (if obtainable, zero otherwise),
  *  - the process ID (if obtainable, zero otherwise),
  *  - the system calendar time, and
  *  - an accumulating counter for this process.
- *  @param uid pointer to buffer of 65 or more characters in which the UID is returned
- *  @param prefix prefix for UID creation
- *  @return pointer to UID, identical to uid parameter
+ *  @param[in, out] uid pointer to buffer of 65 or more characters in which the UID is returned
+ *  @param[in] prefix prefix for UID creation
+ *  @return uid
+ */
+DCMTK_DCMDATA_EXPORT char *dcmGenerateRootBasedUID(char *uid, const char* prefix=NULL);
+
+/**
+ *  wrapper for @ref dcmGenerateRootBasedUID.
  */
 DCMTK_DCMDATA_EXPORT char *dcmGenerateUniqueIdentifier(char *uid, const char* prefix=NULL);
 
+/**
+ *  creates an UID (Unique IDentifier) in \p uid and returns \p uid.
+ *  \p uid must be at least 65 bytes. Care is taken to make sure that the
+ *  generated UID is 64 characters or less.
+ *  If \p ptr holds an OFUUID, i. e. it is not empty, its @ref OFUUID::NotationOID
+ *  will be used as returned UID. If \p ptr is neither valid nor provided, an
+ *  @ref OFUUID is created on behalf of this function and used in case of success.
+ *  In case of @ref OFUUID creation failure, the returned UID is the result
+ *  of the call to @ref dcmGenerateRootBasedUID(\p uid).
+ *  @param[in, out] uid pointer to buffer of 65 or more characters in which the UID is returned
+ *  @param[in] ptr shared pointer holding an OFUUID
+ *  @return uid
+ */
+DCMTK_DCMDATA_EXPORT char *dcmGenerateUUIDBasedUID(char *uid, const OFshared_ptr<OFUUID> ptr={});
+
 /** performs a table lookup and returns a short modality identifier
  *  that can be used for building file names etc.
  *  Identifiers are defined for all storage SOP classes.
diff --git a/dcmdata/libi2d/i2d.cc b/dcmdata/libi2d/i2d.cc
index c24189bca..2422eb9f6 100644
--- a/dcmdata/libi2d/i2d.cc
+++ b/dcmdata/libi2d/i2d.cc
@@ -481,7 +481,7 @@ OFCondition Image2Dcm::generateUIDs(DcmDataset *dset)
     if (cond.bad() || value.empty())
     {
       char newUID[100];
-      dcmGenerateUniqueIdentifier(newUID, SITE_SERIES_UID_ROOT);
+      dcmGenerateRootBasedUID(newUID, SITE_SERIES_UID_ROOT);
       cond = dset->putAndInsertOFStringArray(DCM_SeriesInstanceUID, newUID);
       if (cond.bad())
         return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Series Instance UID to file");
@@ -496,7 +496,7 @@ OFCondition Image2Dcm::generateUIDs(DcmDataset *dset)
     if (cond.bad() || value.empty())
     {
       char newUID[100];
-      dcmGenerateUniqueIdentifier(newUID, SITE_STUDY_UID_ROOT);
+      dcmGenerateRootBasedUID(newUID, SITE_STUDY_UID_ROOT);
       cond = dset->putAndInsertOFStringArray(DCM_StudyInstanceUID, newUID);
       if (cond.bad())
         return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Study Instance UID to file");
@@ -509,7 +509,7 @@ OFCondition Image2Dcm::generateUIDs(DcmDataset *dset)
   if (cond.bad() || value.empty())
   {
     char newUID[100];
-    dcmGenerateUniqueIdentifier(newUID, SITE_INSTANCE_UID_ROOT);
+    dcmGenerateRootBasedUID(newUID, SITE_INSTANCE_UID_ROOT);
     cond = dset->putAndInsertOFStringArray(DCM_SOPInstanceUID, newUID);
     if (cond.bad())
       return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write SOP Instance UID to file");
diff --git a/dcmdata/libi2d/i2dplop.cc b/dcmdata/libi2d/i2dplop.cc
index 51931cd1c..70d9acfeb 100644
--- a/dcmdata/libi2d/i2dplop.cc
+++ b/dcmdata/libi2d/i2dplop.cc
@@ -84,7 +84,7 @@ OFString I2DOutputPlugOphthalmicPhotography::isValid(DcmDataset& dataset) const
 
   // compute defaults for some type 1 attributes
   char newUID[70];
-  dcmGenerateUniqueIdentifier(newUID);
+  dcmGenerateRootBasedUID(newUID);
   OFDateTime now = OFDateTime::getCurrentDateTime();
   OFString contentDate;
   OFString contentTime;
diff --git a/dcmdata/libsrc/dccodec.cc b/dcmdata/libsrc/dccodec.cc
index faf2f6004..2f04494da 100644
--- a/dcmdata/libsrc/dccodec.cc
+++ b/dcmdata/libsrc/dccodec.cc
@@ -66,13 +66,13 @@ OFCondition DcmCodec::convertToSecondaryCapture(DcmItem *dataset)
   if (result.good()) result = dataset->putAndInsertString(DCM_SOPClassUID, UID_SecondaryCaptureImageStorage);
 
   // SOP Instance UID - only insert if missing.
-  dcmGenerateUniqueIdentifier(buf);
+  dcmGenerateRootBasedUID(buf);
   if (result.good()) result = insertStringIfMissing(dataset, DCM_SOPInstanceUID, buf);
 
   // Type 1 attributes - insert with value if missing
-  dcmGenerateUniqueIdentifier(buf, SITE_STUDY_UID_ROOT);
+  dcmGenerateRootBasedUID(buf, SITE_STUDY_UID_ROOT);
   if (result.good()) result = insertStringIfMissing(dataset, DCM_StudyInstanceUID, buf);
-  dcmGenerateUniqueIdentifier(buf, SITE_SERIES_UID_ROOT);
+  dcmGenerateRootBasedUID(buf, SITE_SERIES_UID_ROOT);
   if (result.good()) result = insertStringIfMissing(dataset, DCM_SeriesInstanceUID, buf);
   if (result.good()) result = insertStringIfMissing(dataset, DCM_ConversionType, "WSD");
   if (result.good()) result = insertStringIfMissing(dataset, DCM_Modality, "OT");
@@ -187,7 +187,7 @@ OFCondition DcmCodec::newInstance(
     DcmElement *elem = new DcmUniqueIdentifier(DCM_SOPInstanceUID);
     if (elem)
     {
-      if (EC_Normal == (result = elem->putString(dcmGenerateUniqueIdentifier(new_uid))))
+      if (EC_Normal == (result = elem->putString(dcmGenerateRootBasedUID(new_uid))))
         dataset->insert(elem, OFTrue); // replace SOP Instance UID
         else delete elem;
     } else result = EC_MemoryExhausted;
diff --git a/dcmdata/libsrc/dcencdoc.cc b/dcmdata/libsrc/dcencdoc.cc
index 4bcf0b699..4df5400a0 100644
--- a/dcmdata/libsrc/dcencdoc.cc
+++ b/dcmdata/libsrc/dcencdoc.cc
@@ -869,12 +869,12 @@ OFCondition DcmEncapsulatedDocument::createIdentifiers()
 
   if (studyUID_.empty())
   {
-    dcmGenerateUniqueIdentifier(buf, SITE_STUDY_UID_ROOT);
+    dcmGenerateRootBasedUID(buf, SITE_STUDY_UID_ROOT);
     studyUID_ = buf;
   }
   if (seriesUID_.empty())
   {
-    dcmGenerateUniqueIdentifier(buf, SITE_SERIES_UID_ROOT);
+    dcmGenerateRootBasedUID(buf, SITE_SERIES_UID_ROOT);
     seriesUID_ = buf;
   }
 
@@ -1299,7 +1299,7 @@ OFCondition DcmEncapsulatedDocument::addFrameOfReferenceModule(DcmItem *dataset)
     {
         DCMDATA_DEBUG("Frame of Reference UID " << DCM_FrameOfReferenceUID << " value missing, generating a new one."
         );
-        dcmGenerateUniqueIdentifier(buf, SITE_SERIES_UID_ROOT);
+        dcmGenerateRootBasedUID(buf, SITE_SERIES_UID_ROOT);
         frameOfReferenceUID_ = buf;
     }
     else
@@ -1308,7 +1308,7 @@ OFCondition DcmEncapsulatedDocument::addFrameOfReferenceModule(DcmItem *dataset)
         {
             DCMDATA_DEBUG("Frame of Reference UID " << DCM_FrameOfReferenceUID << " value was faulty, generating a new one."
             );
-            dcmGenerateUniqueIdentifier(buf, SITE_SERIES_UID_ROOT);
+            dcmGenerateRootBasedUID(buf, SITE_SERIES_UID_ROOT);
             frameOfReferenceUID_ = buf;
         }
     }
@@ -1427,7 +1427,7 @@ OFCondition DcmEncapsulatedDocument::createHeader()
     if (result.good()) result = dataset->putAndInsertString(DCM_BurnedInAnnotation, annotation_ ? "YES" : "NO");
     OFStandard::snprintf(buf, sizeof(buf), "%ld", OFstatic_cast(long, instance_));
     if (result.good()) result = dataset->putAndInsertString(DCM_InstanceNumber, buf);
-    dcmGenerateUniqueIdentifier(buf, SITE_INSTANCE_UID_ROOT);
+    dcmGenerateRootBasedUID(buf, SITE_INSTANCE_UID_ROOT);
     if (result.good()) result = dataset->putAndInsertString(DCM_StudyInstanceUID, studyUID_.c_str());
     if (result.good()) result = dataset->putAndInsertString(DCM_SeriesInstanceUID, seriesUID_.c_str());
     if (result.good()) result = dataset->putAndInsertString(DCM_SOPInstanceUID, buf);
diff --git a/dcmdata/libsrc/dcfilefo.cc b/dcmdata/libsrc/dcfilefo.cc
index f1250c5d8..15892fdcb 100644
--- a/dcmdata/libsrc/dcfilefo.cc
+++ b/dcmdata/libsrc/dcfilefo.cc
@@ -432,7 +432,7 @@ OFCondition DcmFileFormat::checkMetaHeaderValue(
                     else if (elem->getLength() == 0)
                     {
                         char uid[128];
-                        dcmGenerateUniqueIdentifier(uid);       // from dcuid.h
+                        dcmGenerateRootBasedUID(uid);       // from dcuid.h
                         OFstatic_cast(DcmUniqueIdentifier *, elem)->putString(uid);
                         DCMDATA_DEBUG("DcmFileFormat::checkMetaHeaderValue() use new generated SOPInstanceUID [" << uid << "]");
                     }
diff --git a/dcmdata/libsrc/dcrleccd.cc b/dcmdata/libsrc/dcrleccd.cc
index 6e284f78a..8044c7d6f 100644
--- a/dcmdata/libsrc/dcrleccd.cc
+++ b/dcmdata/libsrc/dcrleccd.cc
@@ -32,7 +32,6 @@
 #include "dcmtk/dcmdata/dcpxitem.h"  /* for class DcmPixelItem */
 #include "dcmtk/dcmdata/dcvrpobw.h"  /* for class DcmPolymorphOBOW */
 #include "dcmtk/dcmdata/dcswap.h"    /* for swapIfNecessary() */
-#include "dcmtk/dcmdata/dcuid.h"     /* for dcmGenerateUniqueIdentifer()*/
 
 
 DcmRLECodecDecoder::DcmRLECodecDecoder()
diff --git a/dcmdata/libsrc/dcuid.cc b/dcmdata/libsrc/dcuid.cc
index be463a814..314f04f7f 100644
--- a/dcmdata/libsrc/dcuid.cc
+++ b/dcmdata/libsrc/dcuid.cc
@@ -67,6 +67,7 @@ BEGIN_EXTERN_C
 END_EXTERN_C
 
 #include "dcmtk/ofstd/ofstream.h"
+#include "dcmtk/ofstd/ofstring.h"
 #include "dcmtk/dcmdata/dcuid.h"
 #include "dcmtk/dcmdata/dctypes.h"
 #include "dcmtk/ofstd/ofthread.h"
@@ -76,6 +77,7 @@ END_EXTERN_C
 #include "dcmtk/ofstd/ofvector.h"
 #include "dcmtk/ofstd/ofsockad.h"
 
+
 /** struct for mapping UID values to keywords, names and properties
  */
 struct UIDNameMap {
@@ -1896,7 +1898,7 @@ long gethostid(void);
  * Global variable storing the return value of gethostid().
  * Since the variable is not declared in the header file it can only be used
  * within this source file. Any access to or modification of its value is
- * protected by a mutex (see dcmGenerateUniqueIdentifier()).
+ * protected by a mutex (see dcmGenerateRootBasedUID()).
  */
 
 static unsigned long hostIdentifier = 0;
@@ -1952,10 +1954,10 @@ stripTrailing(char* s, char c)
 static void
 addUIDComponent(char* uid, const char* s)
 {
-    /* copy into UID as much of the contents of s as possible */
+    /* copy into uid as much of the contents of s as possible */
     if (OFStandard::strlcat(uid, s, maxUIDLen + 1) >= maxUIDLen + 1) // maxUIDLen+1 because strlcat() wants the size of the buffer, not the permitted number of characters.
     {
-        DCMDATA_WARN("Truncated UID in dcmGenerateUniqueIdentifier(), SITE_UID_ROOT too long?");
+        DCMDATA_WARN("Truncated UID in dcmGenerateRootBasedUID(), SITE_UID_ROOT too long?");
     }
     stripTrailing(uid, '.');
 }
@@ -1966,7 +1968,7 @@ forcePositive(long i)
     return (i < 0) ? OFstatic_cast(unsigned long, -i) : OFstatic_cast(unsigned long, i);
 }
 
-char* dcmGenerateUniqueIdentifier(char* uid, const char* prefix)
+char* dcmGenerateRootBasedUID(char* uid, const char* prefix)
 {
     char buf[128]; /* be very safe */
 
@@ -1989,10 +1991,10 @@ char* dcmGenerateUniqueIdentifier(char* uid, const char* prefix)
     uidCounterMutex.unlock();
 #endif
 
-    if (prefix != NULL ) {
-        addUIDComponent(uid, prefix);
-    } else {
+    if (prefix == NULL) {
         addUIDComponent(uid, SITE_INSTANCE_UID_ROOT);
+    } else {
+        addUIDComponent(uid, prefix);
     }
 
     OFStandard::snprintf(buf, sizeof(buf), ".%lu", hostIdentifier);
@@ -2005,8 +2007,30 @@ char* dcmGenerateUniqueIdentifier(char* uid, const char* prefix)
     addUIDComponent(uid, buf);
 
     OFStandard::snprintf(buf, sizeof(buf), ".%u", counter);
-
     addUIDComponent(uid, buf);
 
     return uid;
 }
+
+char* dcmGenerateUUIDBasedUID(char* uid, const OFshared_ptr<OFUUID> ptr)
+{
+    uid[0] = '\0'; /* initialize */
+    const OFshared_ptr<OFUUID> uuid = (ptr ? ptr : OFUUIDGenerator::create());
+    if (uuid) {
+        const OFString oid = uuid->toString(OFUUID::NotationOID);
+        addUIDComponent(uid, oid.c_str());
+
+        return uid;
+    }
+
+    return dcmGenerateRootBasedUID(uid);
+}
+
+char* dcmGenerateUniqueIdentifier(char* uid, const char* prefix)
+{
+    return dcmGenerateRootBasedUID(uid, prefix);
+}
+
+
+
+
diff --git a/dcmdata/tests/tests.cc b/dcmdata/tests/tests.cc
index fd6e52579..f3785aaf6 100644
--- a/dcmdata/tests/tests.cc
+++ b/dcmdata/tests/tests.cc
@@ -121,6 +121,8 @@ OFTEST_REGISTER(dcmdata_attribute_filter);
 OFTEST_REGISTER(dcmdata_attribute_matching);
 OFTEST_REGISTER(dcmdata_newDicomElementPrivate);
 OFTEST_REGISTER(dcmdata_generateUniqueIdentifier);
+OFTEST_REGISTER(dcmdata_generateRootBasedUID);
+OFTEST_REGISTER(dcmdata_generateUUIDBasedUID);
 OFTEST_REGISTER(dcmdata_xferLookup_1);
 OFTEST_REGISTER(dcmdata_xferLookup_2);
 OFTEST_REGISTER(dcmdata_xferLookup_3);
diff --git a/dcmdata/tests/tgenuid.cc b/dcmdata/tests/tgenuid.cc
index 9830dbfcc..9544461de 100644
--- a/dcmdata/tests/tgenuid.cc
+++ b/dcmdata/tests/tgenuid.cc
@@ -15,19 +15,84 @@
  *
  *  Author:  Marco Eichelberg
  *
- *  Purpose: test program for function dcmGenerateUniqueIdentifier
+ *  Purpose: test program for functions dcmGenerateUniqueIdentifier, dcmGenerate*BasedUID
  *
  */
 
 
 #include "dcmtk/config/osconfig.h"    /* make sure OS specific configuration is included first */
 
+#include "dcmtk/ofstd/ofmem.h"
 #include "dcmtk/ofstd/oftest.h"
+#include "dcmtk/ofstd/ofuuidgn.h"
 #include "dcmtk/dcmdata/dcuid.h"
 
 
+static OFshared_ptr<OFUUID> empty_uuid_ptr();
+static OFshared_ptr<OFUUID> filled_uuid_ptr();
+
+static void test_unique_identifier(char* (*f)(char*, const char*), const char* d = NULL);
+static void test_unique_identifier(char* (*f)(char *uid, const OFshared_ptr<OFUUID> ptr), OFshared_ptr<OFUUID> (*u)());
+
+
 OFTEST(dcmdata_generateUniqueIdentifier)
 {
+  test_unique_identifier(dcmGenerateUniqueIdentifier);
+  test_unique_identifier(dcmGenerateUniqueIdentifier, OFFIS_UID_ROOT);
+  test_unique_identifier(dcmGenerateUniqueIdentifier, SITE_UID_ROOT);
+}
+
+OFTEST(dcmdata_generateRootBasedUID)
+{
+  test_unique_identifier(dcmGenerateRootBasedUID);
+  test_unique_identifier(dcmGenerateRootBasedUID, OFFIS_UID_ROOT);
+  test_unique_identifier(dcmGenerateRootBasedUID, SITE_UID_ROOT);
+}
+
+OFTEST(dcmdata_generateUUIDBasedUID)
+{
+  test_unique_identifier(dcmGenerateUUIDBasedUID, empty_uuid_ptr);
+  test_unique_identifier(dcmGenerateUUIDBasedUID, filled_uuid_ptr);
+}
+
+
+static OFshared_ptr<OFUUID> empty_uuid_ptr() {
+  return OFshared_ptr<OFUUID>();
+}
+
+static OFshared_ptr<OFUUID> filled_uuid_ptr() {
+  return OFUUIDGenerator::create();
+}
+
+static void test_unique_identifier(char* (*f)(char*, const char*), const char* d) {
+  // test generation of UIDs. We generate 10000 UIDs in quick
+  // succession and check if they are pair-wise different.
+  // This will also catch any application error during UID generation.
+
+  char uid[65];
+  OFString previousuid;
+
+  // This variable name will be printed on the console if the test fails.
+  // In fact a generated UID is not unique if this variable is false!
+  OFBool generated_uid_is_not_unique;
+
+  for (size_t i = 0; i < 10000; ++i)
+  {
+     // generate UID
+     f(uid, d);
+
+     // compare with the previously generated UID, should be different.
+     generated_uid_is_not_unique = (previousuid != uid);
+     OFCHECK(generated_uid_is_not_unique);
+     previousuid = uid;
+
+     // if we have found a non-unique UID, the test has failed.
+     // Break out of the loop.
+     if (! generated_uid_is_not_unique) break;
+  }
+}
+
+static void test_unique_identifier(char* (*f)(char *uid, const OFshared_ptr<OFUUID> ptr), OFshared_ptr<OFUUID> (*u)()) {
   // test generation of UIDs. We generate 10000 UIDs in quick
   // succession and check if they are pair-wise different.
   // This will also catch any application error during UID generation.
@@ -42,7 +107,7 @@ OFTEST(dcmdata_generateUniqueIdentifier)
   for (size_t i = 0; i < 10000; ++i)
   {
      // generate UID
-     dcmGenerateUniqueIdentifier(uid);
+     f(uid, u());
 
      // compare with the previously generated UID, should be different.
      generated_uid_is_not_unique = (previousuid != uid);
diff --git a/dcmfg/libsrc/concatenationcreator.cc b/dcmfg/libsrc/concatenationcreator.cc
index 764a3e698..42c239b7a 100644
--- a/dcmfg/libsrc/concatenationcreator.cc
+++ b/dcmfg/libsrc/concatenationcreator.cc
@@ -346,7 +346,7 @@ OFCondition ConcatenationCreator::setConcatenationAttributes(DcmItem& dstDataset
     if (result.good())
     {
         char buf[100];
-        dcmGenerateUniqueIdentifier(buf, SITE_INSTANCE_UID_ROOT);
+        dcmGenerateRootBasedUID(buf, SITE_INSTANCE_UID_ROOT);
         result = dstDataset.putAndInsertOFStringArray(DCM_SOPInstanceUID, buf);
     }
     return result;
@@ -495,7 +495,7 @@ OFCondition ConcatenationCreator::configureCommon()
 
     //  Create Concatenation UID
     char buf[65];
-    m_dstConcatenationUID = dcmGenerateUniqueIdentifier(buf, SITE_INSTANCE_UID_ROOT);
+    m_dstConcatenationUID = dcmGenerateRootBasedUID(buf, SITE_INSTANCE_UID_ROOT);
 
     // Set initial context, i.e. initialize for first frame
     m_currentPerFrameItem = OFstatic_cast(DcmItem*, m_srcPerFrameFG->nextInContainer(NULL));
diff --git a/dcmfg/libsrc/concatenationloader.cc b/dcmfg/libsrc/concatenationloader.cc
index 8c7b6e0f1..24ca182e0 100644
--- a/dcmfg/libsrc/concatenationloader.cc
+++ b/dcmfg/libsrc/concatenationloader.cc
@@ -472,7 +472,7 @@ OFCondition ConcatenationLoader::insertDestinationAttributes()
     if (uid.empty())
     {
         char buf[100];
-        dcmGenerateUniqueIdentifier(buf, SITE_INSTANCE_UID_ROOT);
+        dcmGenerateRootBasedUID(buf, SITE_INSTANCE_UID_ROOT);
         uid = buf;
         DCMFG_WARN("SOP Instance UID of Concatenation Source (0020,0242) not set, created new SOP Instance UID "
                    << uid);
diff --git a/dcmimage/apps/dcmscale.cc b/dcmimage/apps/dcmscale.cc
index 8d03a233a..a89077b57 100644
--- a/dcmimage/apps/dcmscale.cc
+++ b/dcmimage/apps/dcmscale.cc
@@ -614,7 +614,7 @@ int main(int argc, char *argv[])
         }
         // create new SOP instance UID
         char new_uid[100];
-        dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(new_uid));
+        dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateRootBasedUID(new_uid));
     }
 
     // ======================================================================
diff --git a/dcmimage/libsrc/dcmicmph.cc b/dcmimage/libsrc/dcmicmph.cc
index de6d03473..cf2e040a4 100644
--- a/dcmimage/libsrc/dcmicmph.cc
+++ b/dcmimage/libsrc/dcmicmph.cc
@@ -1138,7 +1138,7 @@ OFCondition DicomImageComparison::copyReferenceImageAttributes(DcmItem *src, Dcm
     OFString seriesInstanceUID;
     OFString laterality;
     OFString seriesNumber = "1";
-    seriesInstanceUID = dcmGenerateUniqueIdentifier(uidbuf);
+    seriesInstanceUID = dcmGenerateRootBasedUID(uidbuf);
 
     cond = diffImage->putAndInsertOFStringArray(DCM_Modality, modality);
     if (cond.bad()) return cond;
@@ -1316,7 +1316,7 @@ OFCondition DicomImageComparison::copyReferenceImageAttributes(DcmItem *src, Dcm
     OFString instanceCreatorUID = "1.2.276.0.7230010.3.1.2.1787205428.20064.1535731842.951308";
     OFString InstanceNumber = "1";
     if (src->findAndGetOFStringArray(DCM_SpecificCharacterSet, specificCharacterSet).bad()) specificCharacterSet = "";
-    sOPInstanceUID = dcmGenerateUniqueIdentifier(uidbuf);
+    sOPInstanceUID = dcmGenerateRootBasedUID(uidbuf);
 
     cond = diffImage->putAndInsertOFStringArray(DCM_SOPInstanceUID, sOPInstanceUID);
     if (cond.bad()) return cond;
diff --git a/dcmimage/libsrc/diquant.cc b/dcmimage/libsrc/diquant.cc
index 078fd3a48..b6b9f468b 100644
--- a/dcmimage/libsrc/diquant.cc
+++ b/dcmimage/libsrc/diquant.cc
@@ -36,7 +36,7 @@
 #include "dcmtk/dcmdata/dcdeftag.h"   /* for tag constants */
 #include "dcmtk/dcmdata/dcpixel.h"    /* for DcmPixelData */
 #include "dcmtk/dcmdata/dcsequen.h"   /* for DcmSequenceOfItems */
-#include "dcmtk/dcmdata/dcuid.h"      /* for dcmGenerateUniqueIdentifier() */
+#include "dcmtk/dcmdata/dcuid.h"      /* for dcmGenerateRootBasedUID() */
 #include "dcmtk/ofstd/ofstd.h"
 
 
diff --git a/dcmiod/libsrc/iodutil.cc b/dcmiod/libsrc/iodutil.cc
index e87221470..b3ced247d 100644
--- a/dcmiod/libsrc/iodutil.cc
+++ b/dcmiod/libsrc/iodutil.cc
@@ -662,16 +662,16 @@ OFString DcmIODUtil::createUID(const Uint8 level)
     switch (level)
     {
         case 0:
-            dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT);
+            dcmGenerateRootBasedUID(uid, SITE_INSTANCE_UID_ROOT);
             break;
         case 1:
-            dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT);
+            dcmGenerateRootBasedUID(uid, SITE_SERIES_UID_ROOT);
             break;
         case 2:
-            dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT);
+            dcmGenerateRootBasedUID(uid, SITE_STUDY_UID_ROOT);
             break;
         default:
-            dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT);
+            dcmGenerateRootBasedUID(uid, SITE_STUDY_UID_ROOT);
     }
     return uid;
 }
diff --git a/dcmiod/tests/tchecks.cc b/dcmiod/tests/tchecks.cc
index 6a88c6020..95e917b8d 100644
--- a/dcmiod/tests/tchecks.cc
+++ b/dcmiod/tests/tchecks.cc
@@ -49,7 +49,7 @@ static OFBool setupTest(DcmIODCommon& iod)
         return OFFalse;
     }
     char forUID[100];
-    if (iod.getFrameOfReference().setFrameOfReferenceUID(dcmGenerateUniqueIdentifier(forUID)).bad())
+    if (iod.getFrameOfReference().setFrameOfReferenceUID(dcmGenerateRootBasedUID(forUID)).bad())
     {
         OFCHECK_FAIL("Cannot set SOP Instance UID");
         return OFFalse;
diff --git a/dcmnet/apps/storescp.cc b/dcmnet/apps/storescp.cc
index 183c92f1e..548017438 100644
--- a/dcmnet/apps/storescp.cc
+++ b/dcmnet/apps/storescp.cc
@@ -2157,7 +2157,7 @@ static OFCondition storeSCP(
     {
       // create unique filename by generating a temporary UID and using ".X." as an infix
       char buf[70];
-      dcmGenerateUniqueIdentifier(buf);
+      dcmGenerateRootBasedUID(buf);
       OFStandard::snprintf(imageFileName, sizeof(imageFileName), "%s%c%s.X.%s%s", opt_outputDirectory.c_str(), PATH_SEPARATOR,
         dcmSOPClassUIDToModality(req->AffectedSOPClassUID, "UNKNOWN"),
         buf, opt_fileNameExtension.c_str());
diff --git a/dcmnet/apps/storescu.cc b/dcmnet/apps/storescu.cc
index 1a3c9a07d..945f3d688 100644
--- a/dcmnet/apps/storescu.cc
+++ b/dcmnet/apps/storescu.cc
@@ -1139,7 +1139,7 @@ makeUID(OFString basePrefix, int counter)
 {
   OFString prefix = basePrefix + "." + intToString(counter);
   char uidbuf[65];
-  OFString uid = dcmGenerateUniqueIdentifier(uidbuf, prefix.c_str());
+  OFString uid = dcmGenerateRootBasedUID(uidbuf, prefix.c_str());
   return uid;
 }
 
diff --git a/dcmnet/libsrc/dstorscp.cc b/dcmnet/libsrc/dstorscp.cc
index 362936644..411cbfcc3 100644
--- a/dcmnet/libsrc/dstorscp.cc
+++ b/dcmnet/libsrc/dstorscp.cc
@@ -436,7 +436,7 @@ OFCondition DcmStorageSCP::generateDirAndFilename(OFString &filename,
             case FGM_UniqueFromNewUID:
             {
                 char uidBuffer[70];
-                dcmGenerateUniqueIdentifier(uidBuffer);
+                dcmGenerateRootBasedUID(uidBuffer);
                 OFOStringStream stream;
                 stream << dcmSOPClassUIDToModality(sopClassUID.c_str(), "UNKNOWN")
                        << ".X." << uidBuffer << FilenameExtension << OFStringStream_ends;
diff --git a/dcmpstat/apps/dcmprscu.cc b/dcmpstat/apps/dcmprscu.cc
index dacdc55d2..ada80a193 100644
--- a/dcmpstat/apps/dcmprscu.cc
+++ b/dcmpstat/apps/dcmprscu.cc
@@ -937,7 +937,7 @@ int main(int argc, char *argv[])
       // a generated UID contains the process ID and current time.
       // Adding it to the PRNG seed guarantees that we have different seeds for different processes.
       char randomUID[65];
-      dcmGenerateUniqueIdentifier(randomUID);
+      dcmGenerateRootBasedUID(randomUID);
       tLayer->addPRNGseed(randomUID, strlen(randomUID));
     }
 
diff --git a/dcmpstat/apps/dcmpsrcv.cc b/dcmpstat/apps/dcmpsrcv.cc
index 1a2bca777..1d65048c1 100644
--- a/dcmpstat/apps/dcmpsrcv.cc
+++ b/dcmpstat/apps/dcmpsrcv.cc
@@ -1245,7 +1245,7 @@ int main(int argc, char *argv[])
           // Adding it to the PRNG seed guarantees that we have different seeds for
           // different child processes.
           char randomUID[65];
-          dcmGenerateUniqueIdentifier(randomUID);
+          dcmGenerateRootBasedUID(randomUID);
           if (tLayer) tLayer->addPRNGseed(randomUID, strlen(randomUID));
 #endif
           handleClient(&assoc, dbfolder, networkBitPreserving, useTLS, opt_correctUIDPadding);
diff --git a/dcmpstat/apps/dcmpssnd.cc b/dcmpstat/apps/dcmpssnd.cc
index d51861673..3574cd60d 100644
--- a/dcmpstat/apps/dcmpssnd.cc
+++ b/dcmpstat/apps/dcmpssnd.cc
@@ -638,7 +638,7 @@ int main(int argc, char *argv[])
       // a generated UID contains the process ID and current time.
       // Adding it to the PRNG seed guarantees that we have different seeds for different processes.
       char randomUID[65];
-      dcmGenerateUniqueIdentifier(randomUID);
+      dcmGenerateRootBasedUID(randomUID);
       tLayer->addPRNGseed(randomUID, strlen(randomUID));
     }
 
diff --git a/dcmpstat/include/dcmtk/dcmpstat/dvpsdef.h b/dcmpstat/include/dcmtk/dcmpstat/dvpsdef.h
index 799777d68..5f4ec66e0 100644
--- a/dcmpstat/include/dcmtk/dcmpstat/dvpsdef.h
+++ b/dcmpstat/include/dcmtk/dcmpstat/dvpsdef.h
@@ -180,7 +180,7 @@ if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)a_name.getTag(), s
 #define SET_UID(a_name)                                             \
 if (result==EC_Normal)                                              \
 {                                                                   \
-     if (a_name.getLength()==0) result = a_name.putString(dcmGenerateUniqueIdentifier(uid)); \
+     if (a_name.getLength()==0) result = a_name.putString(dcmGenerateRootBasedUID(uid)); \
 }
 
 #endif
diff --git a/dcmpstat/libsrc/dcmpstat.cc b/dcmpstat/libsrc/dcmpstat.cc
index b6ec66fbf..0f6e4a3c1 100644
--- a/dcmpstat/libsrc/dcmpstat.cc
+++ b/dcmpstat/libsrc/dcmpstat.cc
@@ -181,7 +181,7 @@ const char *DcmPresentationState::createInstanceUID()
   OFString aString;
   char *puid = NULL;
 
-  OFCondition result = sOPInstanceUID.putString(dcmGenerateUniqueIdentifier(uid));
+  OFCondition result = sOPInstanceUID.putString(dcmGenerateRootBasedUID(uid));
   DVPSHelper::currentDate(aString);
   DVPSHelper::setDefault(result, instanceCreationDate, aString.c_str());
   DVPSHelper::currentTime(aString);
@@ -241,7 +241,7 @@ OFCondition DcmPresentationState::createDummyValues(OFBool replaceSOPInstanceUID
 
   if ((result==EC_Normal)&&(replaceSOPInstanceUID ||(sOPInstanceUID.getLength()==0)))
   {
-    sOPInstanceUID.putString(dcmGenerateUniqueIdentifier(uid));
+    sOPInstanceUID.putString(dcmGenerateRootBasedUID(uid));
     DVPSHelper::currentDate(aString);
     DVPSHelper::setDefault(result, instanceCreationDate, aString.c_str() );
     DVPSHelper::currentTime(aString);
@@ -964,8 +964,8 @@ OFCondition DcmPresentationState::createFromImage(
     DVPSHelper::currentTime(aString);
     result = presentationCreationTime.putString(aString.c_str());
   }
-  if (result==EC_Normal) result = seriesInstanceUID.putString(dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT));
-  if (result==EC_Normal) result = sOPInstanceUID.putString(dcmGenerateUniqueIdentifier(uid));
+  if (result==EC_Normal) result = seriesInstanceUID.putString(dcmGenerateRootBasedUID(uid, SITE_SERIES_UID_ROOT));
+  if (result==EC_Normal) result = sOPInstanceUID.putString(dcmGenerateRootBasedUID(uid));
   if (result==EC_Normal) result = seriesNumber.putString(DEFAULT_seriesNumber);
 
   /* If no other character set is specified by the image, we use ISO_IR 100 as the default */
diff --git a/dcmpstat/libsrc/dviface.cc b/dcmpstat/libsrc/dviface.cc
index 0a550352f..4eff72f23 100644
--- a/dcmpstat/libsrc/dviface.cc
+++ b/dcmpstat/libsrc/dviface.cc
@@ -2589,11 +2589,11 @@ OFCondition DVInterface::saveDICOMImage(
       if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_Modality, "OT");
       if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_ConversionType, "WSD");
       if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_PhotometricInterpretation, "MONOCHROME2");
-      dcmGenerateUniqueIdentifier(newuid);
+      dcmGenerateRootBasedUID(newuid);
       if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_SOPInstanceUID, (instanceUID ? instanceUID : newuid));
-      dcmGenerateUniqueIdentifier(newuid, SITE_SERIES_UID_ROOT);
+      dcmGenerateRootBasedUID(newuid, SITE_SERIES_UID_ROOT);
       if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_SeriesInstanceUID, newuid);
-      dcmGenerateUniqueIdentifier(newuid, SITE_STUDY_UID_ROOT);
+      dcmGenerateRootBasedUID(newuid, SITE_STUDY_UID_ROOT);
       if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_StudyInstanceUID, newuid);
       if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_SamplesPerPixel, 1);
       if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_Rows, rows);
@@ -2643,7 +2643,7 @@ OFCondition DVInterface::saveDICOMImage(
   releaseDatabase();
 
   char uid[100];
-  dcmGenerateUniqueIdentifier(uid);
+  dcmGenerateRootBasedUID(uid);
 
   DcmQueryRetrieveDatabaseStatus dbStatus(STATUS_Success);
   char imageFileName[MAXPATHLEN+1];
@@ -2722,7 +2722,7 @@ OFCondition DVInterface::saveHardcopyGrayscaleImage(
 
       // SOP Common Module
       if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_SOPClassUID, UID_RETIRED_HardcopyGrayscaleImageStorage);
-      dcmGenerateUniqueIdentifier(newuid);
+      dcmGenerateRootBasedUID(newuid);
       theInstanceUID = (instanceUID ? instanceUID : newuid);
       if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_SOPInstanceUID, theInstanceUID.c_str());
       DVPSHelper::currentDate(aString);
@@ -2804,7 +2804,7 @@ OFCondition DVInterface::saveHardcopyGrayscaleImage(
   releaseDatabase();
 
   char uid[100];
-  dcmGenerateUniqueIdentifier(uid);
+  dcmGenerateRootBasedUID(uid);
 
   DcmQueryRetrieveDatabaseStatus dbStatus(STATUS_Success);
   char imageFileName[MAXPATHLEN+1];
@@ -3011,7 +3011,7 @@ OFCondition DVInterface::saveStoredPrint(
     {
       if (instanceUID) status = pPrint->setInstanceUID(instanceUID); else
       {
-        dcmGenerateUniqueIdentifier(newuid);
+        dcmGenerateRootBasedUID(newuid);
         status = pPrint->setInstanceUID(newuid);
       }
       if (EC_Normal == status) status = pPrint->write(*dataset, writeRequestedImageSize, OFTrue, OFTrue, OFFalse);
@@ -3036,7 +3036,7 @@ OFCondition DVInterface::saveStoredPrint(OFBool writeRequestedImageSize)
   releaseDatabase();
 
   char uid[100];
-  dcmGenerateUniqueIdentifier(uid);
+  dcmGenerateRootBasedUID(uid);
 
   DcmQueryRetrieveDatabaseStatus dbStatus(STATUS_Success);
   char imageFileName[MAXPATHLEN+1];
diff --git a/dcmpstat/libsrc/dvpsib.cc b/dcmpstat/libsrc/dvpsib.cc
index 57fee5763..892358d2d 100644
--- a/dcmpstat/libsrc/dvpsib.cc
+++ b/dcmpstat/libsrc/dvpsib.cc
@@ -1279,7 +1279,7 @@ OFBool DVPSImageBoxContent::printSCPEvaluateBasicGrayscaleImageSequence(
     // SOP Common Module
     if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_SOPClassUID, UID_RETIRED_HardcopyGrayscaleImageStorage);
     if (EC_Normal==writeresult) writeresult = referencedSOPClassUID.putString(UID_RETIRED_HardcopyGrayscaleImageStorage);
-    dcmGenerateUniqueIdentifier(newuid);
+    dcmGenerateRootBasedUID(newuid);
     if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_SOPInstanceUID, newuid);
     if (EC_Normal==writeresult) writeresult = referencedSOPInstanceUID.putString(newuid);
     DVPSHelper::currentDate(aString);
diff --git a/dcmpstat/libsrc/dvpsibl.cc b/dcmpstat/libsrc/dvpsibl.cc
index ef069eb84..f37ba574e 100644
--- a/dcmpstat/libsrc/dvpsibl.cc
+++ b/dcmpstat/libsrc/dvpsibl.cc
@@ -38,7 +38,7 @@ DVPSImageBoxContent_PList::DVPSImageBoxContent_PList(const DVPSImageBoxContent_P
   OFListConstIterator(DVPSImageBoxContent *) first = arg.list_.begin();
   OFListConstIterator(DVPSImageBoxContent *) last = arg.list_.end();
   while (first != last)
-  {     
+  {
     list_.push_back((*first)->clone());
     ++first;
   }
@@ -54,7 +54,7 @@ void DVPSImageBoxContent_PList::clear()
   OFListIterator(DVPSImageBoxContent *) first = list_.begin();
   OFListIterator(DVPSImageBoxContent *) last = list_.end();
   while (first != last)
-  {     
+  {
     delete (*first);
     first = list_.erase(first);
   }
@@ -67,7 +67,7 @@ OFCondition DVPSImageBoxContent_PList::read(DcmItem &dset, DVPSPresentationLUT_P
   DVPSImageBoxContent *newImage = NULL;
   DcmSequenceOfItems *dseq=NULL;
   DcmItem *ditem=NULL;
-  
+
   if (EC_Normal == dset.search(DCM_RETIRED_ImageBoxContentSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
   {
     dseq=(DcmSequenceOfItems *)stack.top();
@@ -85,14 +85,14 @@ OFCondition DVPSImageBoxContent_PList::read(DcmItem &dset, DVPSPresentationLUT_P
         } else result = EC_MemoryExhausted;
       }
     }
-  }    
-  
+  }
+
   return result;
 }
 
 OFCondition DVPSImageBoxContent_PList::write(
   DcmItem &dset,
-  OFBool writeRequestedImageSize, 
+  OFBool writeRequestedImageSize,
   size_t numItems,
   OFBool ignoreEmptyImages,
   OFBool writeReferencedPLUTSQ)
@@ -104,7 +104,7 @@ OFCondition DVPSImageBoxContent_PList::write(
   DcmItem *ditem=NULL;
   OFBool working = OFTrue;
   unsigned long numWritten = 0;
-  
+
   dseq = new DcmSequenceOfItems(DCM_RETIRED_ImageBoxContentSequence);
   if (dseq)
   {
@@ -118,9 +118,9 @@ OFCondition DVPSImageBoxContent_PList::write(
         if (ditem)
         {
           result = (*first)->write(*ditem, writeRequestedImageSize, writeReferencedPLUTSQ);
-          if (result==EC_Normal) 
+          if (result==EC_Normal)
           {
-            dseq->insert(ditem); 
+            dseq->insert(ditem);
             numWritten++;
           } else delete ditem;
         } else result = EC_MemoryExhausted;
@@ -139,11 +139,11 @@ OFCondition DVPSImageBoxContent_PList::createDefaultValues(OFBool renumber, OFBo
   if (size()==0) return EC_IllegalCall; // can't write if sequence is empty
   OFCondition result = EC_Normal;
   unsigned long counter = 1;
-  
+
   OFListIterator(DVPSImageBoxContent *) first = list_.begin();
   OFListIterator(DVPSImageBoxContent *) last = list_.end();
   while ((first != last)&&(EC_Normal == result))
-  {     
+  {
     result = (*first)->createDefaultValues(renumber, counter++, ignoreEmptyImages);
     ++first;
   }
@@ -196,7 +196,7 @@ OFCondition DVPSImageBoxContent_PList::addImageBox(
 OFCondition DVPSImageBoxContent_PList::addImageBox(DVPSImageBoxContent * box)
 {
    list_.push_back(box);
-   return(EC_Normal); 
+   return(EC_Normal);
 }
 
 OFCondition DVPSImageBoxContent_PList::setRequestedDecimateCropBehaviour(DVPSDecimateCropBehaviour value)
@@ -205,7 +205,7 @@ OFCondition DVPSImageBoxContent_PList::setRequestedDecimateCropBehaviour(DVPSDec
   OFListIterator(DVPSImageBoxContent *) first = list_.begin();
   OFListIterator(DVPSImageBoxContent *) last = list_.end();
   while (first != last)
-  {     
+  {
     result = (*first)->setRequestedDecimateCropBehaviour(value);
     if (EC_Normal != result) return result;
     ++first;
@@ -256,98 +256,98 @@ OFBool DVPSImageBoxContent_PList::imageHasAdditionalSettings(size_t idx)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->hasAdditionalSettings();
-  return OFFalse; 
+  return OFFalse;
 }
 
 OFCondition DVPSImageBoxContent_PList::setImagePolarity(size_t idx, const char *value)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->setPolarity(value);
-  return EC_IllegalCall; 
+  return EC_IllegalCall;
 }
 
 OFCondition DVPSImageBoxContent_PList::setImageRequestedSize(size_t idx, const char *value)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->setRequestedImageSize(value);
-  return EC_IllegalCall; 
+  return EC_IllegalCall;
 }
 
 OFCondition DVPSImageBoxContent_PList::setImageMagnificationType(size_t idx, const char *value)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->setMagnificationType(value);
-  return EC_IllegalCall; 
+  return EC_IllegalCall;
 }
 
 OFCondition DVPSImageBoxContent_PList::setImageSmoothingType(size_t idx, const char *value)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->setSmoothingType(value);
-  return EC_IllegalCall; 
+  return EC_IllegalCall;
 }
 
 OFCondition DVPSImageBoxContent_PList::setImageConfigurationInformation(size_t idx, const char *value)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->setConfigurationInformation(value);
-  return EC_IllegalCall; 
+  return EC_IllegalCall;
 }
 
 OFCondition DVPSImageBoxContent_PList::setImageSOPInstanceUID(size_t idx, const char *value)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->setSOPInstanceUID(value);
-  return EC_IllegalCall; 
+  return EC_IllegalCall;
 }
 
 const char *DVPSImageBoxContent_PList::getImagePolarity(size_t idx)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->getPolarity();
-  return NULL; 
+  return NULL;
 }
 
 const char *DVPSImageBoxContent_PList::getImageRequestedSize(size_t idx)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->getRequestedImageSize();
-  return NULL; 
+  return NULL;
 }
 
 const char *DVPSImageBoxContent_PList::getImageMagnificationType(size_t idx)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->getMagnificationType();
-  return NULL; 
+  return NULL;
 }
 
 const char *DVPSImageBoxContent_PList::getImageSmoothingType(size_t idx)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->getSmoothingType();
-  return NULL; 
+  return NULL;
 }
 
 const char *DVPSImageBoxContent_PList::getImageConfigurationInformation(size_t idx)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->getConfigurationInformation();
-  return NULL; 
+  return NULL;
 }
 
 const char *DVPSImageBoxContent_PList::getSOPInstanceUID(size_t idx)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->getSOPInstanceUID();
-  return NULL; 
+  return NULL;
 }
 
 const char *DVPSImageBoxContent_PList::getReferencedPresentationLUTInstanceUID(size_t idx)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->getReferencedPresentationLUTInstanceUID();
-  return NULL; 
+  return NULL;
 }
 
 OFCondition DVPSImageBoxContent_PList::setAllImagesToDefault()
@@ -361,21 +361,21 @@ OFCondition DVPSImageBoxContent_PList::setAllImagesToDefault()
     ++first;
     if (EC_Normal != result) return result;
   }
-  return result;  
+  return result;
 }
 
 OFCondition DVPSImageBoxContent_PList::getImageReference(size_t idx, const char *&studyUID, const char *&seriesUID, const char *&instanceUID)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->getImageReference(studyUID, seriesUID, instanceUID);
-  return EC_IllegalCall; 
+  return EC_IllegalCall;
 }
 
 OFCondition DVPSImageBoxContent_PList::prepareBasicImageBox(size_t idx, DcmItem &dset)
 {
   DVPSImageBoxContent *box = getImageBox(idx);
   if (box) return box->prepareBasicImageBox(dset);
-  return EC_IllegalCall; 
+  return EC_IllegalCall;
 }
 
 OFBool DVPSImageBoxContent_PList::presentationLUTInstanceUIDisUsed(const char *uid)
@@ -383,9 +383,9 @@ OFBool DVPSImageBoxContent_PList::presentationLUTInstanceUIDisUsed(const char *u
   OFString uidS;
   if (uid) uidS = uid;
   const char *c;
-  
+
   OFListIterator(DVPSImageBoxContent *) first = list_.begin();
-  OFListIterator(DVPSImageBoxContent *) last = list_.end();  
+  OFListIterator(DVPSImageBoxContent *) last = list_.end();
   while (first != last)
   {
     c = (*first)->getReferencedPresentationLUTInstanceUID();
@@ -403,21 +403,21 @@ const char *DVPSImageBoxContent_PList::haveSinglePresentationLUTUsed(const char
   OFString aString;
   OFBool found;
   OFListIterator(char *) uidfirst;
-  OFListIterator(char *) uidlast;  
-  
+  OFListIterator(char *) uidlast;
+
   OFListIterator(DVPSImageBoxContent *) first = list_.begin();
-  OFListIterator(DVPSImageBoxContent *) last = list_.end();  
+  OFListIterator(DVPSImageBoxContent *) last = list_.end();
   while (first != last)
   {
     c = (*first)->getReferencedPresentationLUTInstanceUID();
     if ((c == NULL)||(strlen(c)==0)) c = filmBox;
     aString = c;  // aString now contains the UID of the P-LUT to be used for this image, if any.
     uidfirst = uidList.begin();
-    uidlast = uidList.end();  
+    uidlast = uidList.end();
     found = OFFalse;
     while (uidfirst != uidlast)
     {
-      if (aString == (*uidfirst)) 
+      if (aString == (*uidfirst))
       {
       	found = OFTrue;
         break;
@@ -435,8 +435,8 @@ const char *DVPSImageBoxContent_PList::haveSinglePresentationLUTUsed(const char
 
 OFBool DVPSImageBoxContent_PList::printSCPCreate(
   unsigned long numBoxes,
-  DcmUniqueIdentifier& studyUID, 
-  DcmUniqueIdentifier& seriesUID, 
+  DcmUniqueIdentifier& studyUID,
+  DcmUniqueIdentifier& seriesUID,
   const char *aetitle)
 {
   clear();
@@ -447,7 +447,7 @@ OFBool DVPSImageBoxContent_PList::printSCPCreate(
     box = new DVPSImageBoxContent();
     if (box)
     {
-      if ((EC_Normal == box->setSOPInstanceUID(dcmGenerateUniqueIdentifier(uid))) &&
+      if ((EC_Normal == box->setSOPInstanceUID(dcmGenerateRootBasedUID(uid))) &&
           (EC_Normal == box->setUIDsAndAETitle(studyUID, seriesUID, aetitle)))
       {
         list_.push_back(box);
@@ -472,7 +472,7 @@ OFCondition DVPSImageBoxContent_PList::writeReferencedImageBoxSQ(DcmItem &dset)
   DcmItem *ditem=NULL;
   DcmUniqueIdentifier *uid=NULL;
   const char *instanceUID=NULL;
-    
+
   dseq = new DcmSequenceOfItems(DCM_ReferencedImageBoxSequence);
   if (dseq)
   {
@@ -486,12 +486,12 @@ OFCondition DVPSImageBoxContent_PList::writeReferencedImageBoxSQ(DcmItem &dset)
         if (ditem)
         {
           uid = new DcmUniqueIdentifier(DCM_ReferencedSOPClassUID);
-          if (uid) result = uid->putString(UID_BasicGrayscaleImageBoxSOPClass); else result = EC_MemoryExhausted; 
+          if (uid) result = uid->putString(UID_BasicGrayscaleImageBoxSOPClass); else result = EC_MemoryExhausted;
           if (EC_Normal == result) result = ditem->insert(uid, OFTrue /*replaceOld*/); else delete uid;
-           
+
           uid = new DcmUniqueIdentifier(DCM_ReferencedSOPInstanceUID);
           instanceUID = (*first)->getSOPInstanceUID();
-          if (uid && instanceUID) result = uid->putString(instanceUID); else result = EC_MemoryExhausted; 
+          if (uid && instanceUID) result = uid->putString(instanceUID); else result = EC_MemoryExhausted;
           if (EC_Normal == result) result = ditem->insert(uid, OFTrue /*replaceOld*/); else delete uid;
 
           if (result==EC_Normal) dseq->insert(ditem); else delete ditem;
@@ -509,12 +509,12 @@ OFBool DVPSImageBoxContent_PList::matchesPresentationLUT(DVPSPrintPresentationLU
 {
   OFBool result = OFTrue;
   OFListConstIterator(DVPSImageBoxContent *) first = list_.begin();
-  OFListConstIterator(DVPSImageBoxContent *) last = list_.end();  
+  OFListConstIterator(DVPSImageBoxContent *) last = list_.end();
   while (first != last)
   {
     result = result && (*first)->matchesPresentationLUT(align);
     ++first;
-  }  
+  }
   return result;
 }
 
@@ -522,30 +522,30 @@ OFBool DVPSImageBoxContent_PList::matchesPresentationLUT(DVPSPrintPresentationLU
 DVPSImageBoxContent *DVPSImageBoxContent_PList::duplicateImageBox(const char *uid)
 {
   if (uid == NULL) return NULL;
-  
+
   OFString aString(uid);
   OFListIterator(DVPSImageBoxContent *) first = list_.begin();
-  OFListIterator(DVPSImageBoxContent *) last = list_.end();  
+  OFListIterator(DVPSImageBoxContent *) last = list_.end();
   while (first != last)
   {
     if (aString == (*first)->getSOPInstanceUID()) return (*first)->clone();
     ++first;
-  }  
+  }
   return NULL;
 }
 
 OFBool DVPSImageBoxContent_PList::haveImagePositionClash(const char *uid, Uint16 position)
 {
   if (uid == NULL) return OFFalse;
-  
+
   OFString aString(uid);
   OFListIterator(DVPSImageBoxContent *) first = list_.begin();
-  OFListIterator(DVPSImageBoxContent *) last = list_.end();  
+  OFListIterator(DVPSImageBoxContent *) last = list_.end();
   while (first != last)
   {
     if (((*first)->getImageBoxPosition() == position)&&(aString != (*first)->getSOPInstanceUID())) return OFTrue; //clash
     ++first;
-  }  
+  }
   return OFFalse;
 }
 
@@ -556,7 +556,7 @@ void DVPSImageBoxContent_PList::replace(DVPSImageBoxContent *newImageBox)
 
   OFString aString(newImageBox->getSOPInstanceUID());
   OFListIterator(DVPSImageBoxContent *) first = list_.begin();
-  OFListIterator(DVPSImageBoxContent *) last = list_.end();  
+  OFListIterator(DVPSImageBoxContent *) last = list_.end();
   while (first != last)
   {
     if (aString == (*first)->getSOPInstanceUID())
@@ -565,14 +565,14 @@ void DVPSImageBoxContent_PList::replace(DVPSImageBoxContent *newImageBox)
       first = list_.erase(first);
     }
     else ++first;
-  }  
+  }
   list_.push_back(newImageBox);
 }
 
 OFBool DVPSImageBoxContent_PList::emptyPageWarning()
 {
   OFListIterator(DVPSImageBoxContent *) first = list_.begin();
-  OFListIterator(DVPSImageBoxContent *) last = list_.end();  
+  OFListIterator(DVPSImageBoxContent *) last = list_.end();
   while (first != last)
   {
     if ((*first)->getImageBoxPosition() > 0) return OFFalse;
diff --git a/dcmpstat/libsrc/dvpspll.cc b/dcmpstat/libsrc/dvpspll.cc
index 46465171c..7bb539f3a 100644
--- a/dcmpstat/libsrc/dvpspll.cc
+++ b/dcmpstat/libsrc/dvpspll.cc
@@ -216,7 +216,7 @@ const char *DVPSPresentationLUT_PList::addPresentationLUT(DVPSPresentationLUT *n
 
   // no match, store new LUT
   char uid[100];
-  dcmGenerateUniqueIdentifier(uid);
+  dcmGenerateRootBasedUID(uid);
   myLUT->setSOPInstanceUID(uid);
   list_.push_back(myLUT);
   result = myLUT->getSOPInstanceUID();
diff --git a/dcmpstat/libsrc/dvpsprt.cc b/dcmpstat/libsrc/dvpsprt.cc
index 5f13c16cb..f545d4aa6 100644
--- a/dcmpstat/libsrc/dvpsprt.cc
+++ b/dcmpstat/libsrc/dvpsprt.cc
@@ -585,7 +585,7 @@ OFCondition DVPSPrintSCP::handleNCreate(T_DIMSE_Message& rq, T_ASC_PresentationC
     strncpy(rsp.msg.NCreateRSP.AffectedSOPInstanceUID, rq.msg.NCreateRQ.AffectedSOPInstanceUID, sizeof(DIC_UI));
   } else {
     // we generate our own instance UID
-    dcmGenerateUniqueIdentifier(rsp.msg.NCreateRSP.AffectedSOPInstanceUID);
+    dcmGenerateRootBasedUID(rsp.msg.NCreateRSP.AffectedSOPInstanceUID);
   }
   rsp.msg.NCreateRSP.DataSetType = DIMSE_DATASET_NULL;
   OFBool omitFlag = dviface.getTargetPrintSCPOmitSOPClassUIDFromCreateResponse(cfgname);
@@ -852,9 +852,9 @@ void DVPSPrintSCP::filmSessionNCreate(DcmDataset *rqDataset, T_DIMSE_Message& rs
           peerTitle, usePLUTinFilmSession, presentationLUTList))
           filmSession = newSession;
       char uid[100];
-      studyInstanceUID.putString(dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT));
-      psSeriesInstanceUID.putString(dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT));
-      imageSeriesInstanceUID.putString(dcmGenerateUniqueIdentifier(uid));
+      studyInstanceUID.putString(dcmGenerateRootBasedUID(uid, SITE_STUDY_UID_ROOT));
+      psSeriesInstanceUID.putString(dcmGenerateRootBasedUID(uid, SITE_SERIES_UID_ROOT));
+      imageSeriesInstanceUID.putString(dcmGenerateRootBasedUID(uid));
     } else {
       DCMPSTAT_WARN("cannot create film session, out of memory.");
       rsp.msg.NCreateRSP.DimseStatus = STATUS_N_ProcessingFailure;
@@ -1062,7 +1062,7 @@ void DVPSPrintSCP::saveDimseLog()
   }
 
   DVPSHelper::putStringValue(dset, DCM_SOPClassUID, PSTAT_DIMSE_LOG_STORAGE_UID);
-  DVPSHelper::putStringValue(dset, DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid));
+  DVPSHelper::putStringValue(dset, DCM_SOPInstanceUID, dcmGenerateRootBasedUID(uid));
   DVPSHelper::currentDate(aString);
   DVPSHelper::putStringValue(dset, DCM_InstanceCreationDate, aString.c_str());
   DVPSHelper::currentTime(aString);
diff --git a/dcmpstat/libsrc/dvpssp.cc b/dcmpstat/libsrc/dvpssp.cc
index 4cb03f106..de0ce72cb 100644
--- a/dcmpstat/libsrc/dvpssp.cc
+++ b/dcmpstat/libsrc/dvpssp.cc
@@ -548,7 +548,7 @@ OFCondition DVPSStoredPrint::createDefaultValues()
 
   if ((result==EC_Normal)&&(sOPInstanceUID.getLength()==0))
   {
-    result = sOPInstanceUID.putString(dcmGenerateUniqueIdentifier(uid));
+    result = sOPInstanceUID.putString(dcmGenerateRootBasedUID(uid));
     DVPSHelper::currentDate(aString);
     if (result==EC_Normal) result = instanceCreationDate.putString(aString.c_str());
     DVPSHelper::currentTime(aString);
@@ -557,7 +557,7 @@ OFCondition DVPSStoredPrint::createDefaultValues()
 
   if ((result==EC_Normal)&&(studyInstanceUID.getLength()==0))
   {
-    result = studyInstanceUID.putString(dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT));
+    result = studyInstanceUID.putString(dcmGenerateRootBasedUID(uid, SITE_STUDY_UID_ROOT));
     DVPSHelper::currentDate(aString);
     if (result==EC_Normal) result = studyDate.putString(aString.c_str());
     DVPSHelper::currentTime(aString);
@@ -633,7 +633,7 @@ OFCondition DVPSStoredPrint::write(
           {
               // generate a new UID for the "global" presentation LUT
               char uid[100];
-              dcmGenerateUniqueIdentifier(uid);
+              dcmGenerateRootBasedUID(uid);
               globalPresentationLUT.setSOPInstanceUID(uid);
               result = referencedPresentationLUTInstanceUID.putString(uid);
           }
@@ -871,7 +871,7 @@ OFCondition DVPSStoredPrint::addImageBox(
 {
   char instanceuid[100];
   const char *lutUID = presentationLUTList.addPresentationLUT(presentationlut, inversePLUT);
-  return imageBoxContentList.addImageBox(dcmGenerateUniqueIdentifier(instanceuid),
+  return imageBoxContentList.addImageBox(dcmGenerateRootBasedUID(instanceuid),
      retrieveaetitle, refstudyuid, refseriesuid, refsopclassuid,
      refsopinstanceuid, requestedimagesize, patientid, lutUID);
 }
@@ -1903,7 +1903,7 @@ OFCondition DVPSStoredPrint::setSingleAnnotation(
   if (displayformat && text)
   {
     char newuid[70];
-    dcmGenerateUniqueIdentifier(newuid);
+    dcmGenerateRootBasedUID(newuid);
     deleteAnnotations();
     result = annotationContentList.addAnnotationBox(newuid, text, position);
     if (EC_Normal==result) result = annotationDisplayFormatID.putString(displayformat);
diff --git a/dcmsign/libsrc/dcsignat.cc b/dcmsign/libsrc/dcsignat.cc
index f59ab1ed5..917378744 100644
--- a/dcmsign/libsrc/dcsignat.cc
+++ b/dcmsign/libsrc/dcsignat.cc
@@ -413,7 +413,7 @@ OFCondition DcmSignature::createSignature(
       if (result.good())
       {
         char newUID[66];
-        dcmGenerateUniqueIdentifier(newUID);
+        dcmGenerateRootBasedUID(newUID);
         DcmUniqueIdentifier *elemSigUID = new DcmUniqueIdentifier(DCM_DigitalSignatureUID);
         if (elemSigUID)
         {
diff --git a/dcmsr/apps/xml2dsr.cc b/dcmsr/apps/xml2dsr.cc
index 6b816c3d3..8177e5069 100644
--- a/dcmsr/apps/xml2dsr.cc
+++ b/dcmsr/apps/xml2dsr.cc
@@ -342,17 +342,17 @@ int main(int argc, char *argv[])
                 if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_StudyInstanceUID))
                 {
                     OFLOG_INFO(xml2dsrLogger, "generating new Study Instance UID");
-                    dataset->putAndInsertString(DCM_StudyInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT));
+                    dataset->putAndInsertString(DCM_StudyInstanceUID, dcmGenerateRootBasedUID(uid, SITE_STUDY_UID_ROOT));
                 }
                 if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_SeriesInstanceUID))
                 {
                     OFLOG_INFO(xml2dsrLogger, "generating new Series Instance UID");
-                    dataset->putAndInsertString(DCM_SeriesInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT));
+                    dataset->putAndInsertString(DCM_SeriesInstanceUID, dcmGenerateRootBasedUID(uid, SITE_SERIES_UID_ROOT));
                 }
                 if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_SOPInstanceUID))
                 {
                     OFLOG_INFO(xml2dsrLogger, "generating new SOP Instance UID");
-                    dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT));
+                    dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateRootBasedUID(uid, SITE_INSTANCE_UID_ROOT));
                 }
             }
             /* write DICOM file */
diff --git a/dcmsr/libsrc/dsrdoc.cc b/dcmsr/libsrc/dsrdoc.cc
index 046b5e8eb..f0d049ee4 100644
--- a/dcmsr/libsrc/dsrdoc.cc
+++ b/dcmsr/libsrc/dsrdoc.cc
@@ -3155,7 +3155,7 @@ void DSRDocument::updateAttributes(const OFBool updateAll,
         {
             if (verboseMode)
                 DCMSR_DEBUG("  Generating new value for SOP Instance UID");
-            SOPInstanceUID.putString(dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT));
+            SOPInstanceUID.putString(dcmGenerateRootBasedUID(uid, SITE_INSTANCE_UID_ROOT));
             /* set instance creation date to current date (YYYYMMDD) */
             InstanceCreationDate.putOFStringArray(currentDate(tmpString));
             /* set instance creation time to current time (HHMMSS) */
@@ -3166,14 +3166,14 @@ void DSRDocument::updateAttributes(const OFBool updateAll,
         {
             if (verboseMode)
                 DCMSR_DEBUG("  Generating new value for Study Instance UID");
-            StudyInstanceUID.putString(dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT));
+            StudyInstanceUID.putString(dcmGenerateRootBasedUID(uid, SITE_STUDY_UID_ROOT));
         }
         /* create new series instance UID if required */
         if (SeriesInstanceUID.isEmpty())
         {
             if (verboseMode)
                 DCMSR_DEBUG("  Generating new value for Series Instance UID");
-            SeriesInstanceUID.putString(dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT));
+            SeriesInstanceUID.putString(dcmGenerateRootBasedUID(uid, SITE_SERIES_UID_ROOT));
         }
 
         /* check and set content date if required */
diff --git a/ofstd/include/dcmtk/ofstd/ofuuid.h b/ofstd/include/dcmtk/ofstd/ofuuid.h
index 99656d964..41d8db983 100644
--- a/ofstd/include/dcmtk/ofstd/ofuuid.h
+++ b/ofstd/include/dcmtk/ofstd/ofuuid.h
@@ -137,12 +137,12 @@ public:
   } Notation;
 
   /**
-   *  A OFFUID with all bits set to zero (0).
+   *  An OFUUID with all bits set to zero (0).
    */
   static OFUUID const nil;
 
   /**
-   *  A OFFUID with all bits set to one (1).
+   *  An OFUUID with all bits set to one (1).
    */
   static OFUUID const max;
 
@@ -210,7 +210,7 @@ private:
 
   /**
    *  Checks if this OFUUID is equal to @ref OFUUID::max.
-   *  See <a href="https://www.rfc-editor.org/info/rfc9562"> RFC 9562</a>,
+   *  See <a href="https://www.rfc-editor.org/info/rfc9562">RFC 9562</a>,
    *  section 5.10 for details.
    *
    *  @return OFTrue iff all bits of @ref data_ are one (1).
@@ -219,7 +219,7 @@ private:
 
   /**
    *  Checks if this OFUUID is equal to @ref OFUUID::nil.
-   *  See <a href="https://www.rfc-editor.org/info/rfc9562"> RFC 9562</a>,
+   *  See <a href="https://www.rfc-editor.org/info/rfc9562">RFC 9562</a>,
    *  section 5.9 for details.
    *
    *  @return OFTrue iff all bits of @ref data_ are zero (0).
diff --git a/ofstd/include/dcmtk/ofstd/ofuuidgn.h b/ofstd/include/dcmtk/ofstd/ofuuidgn.h
index 288a22039..3a18c18a7 100644
--- a/ofstd/include/dcmtk/ofstd/ofuuidgn.h
+++ b/ofstd/include/dcmtk/ofstd/ofuuidgn.h
@@ -50,7 +50,7 @@ public:
    *
    *  @return A OFshared_ptr encapsulating a newly created OFUUID instance.
    *  @warning The returned object may contain a null pointer (@ref
-   * OFnullptr_t).
+   *  OFnullptr_t).
    */
   static OFshared_ptr<OFUUID> create(rnd8 const & = getRND8);
 
diff --git a/ofstd/libsrc/ofuuidgn.cc b/ofstd/libsrc/ofuuidgn.cc
index dd9609053..ef49a551b 100644
--- a/ofstd/libsrc/ofuuidgn.cc
+++ b/ofstd/libsrc/ofuuidgn.cc
@@ -104,7 +104,7 @@ OFUUIDGenerator::getMillisecondsSinceEpoch() {
   ms_since_unix_epoch.ladd(OFstatic_cast(Uint32, uli.LowPart));
   ms_since_unix_epoch.hadd(OFstatic_cast(Uint32, uli.HighPart));
 
-  #else
+#else
 
   // struct timeval {
   //   time_t      tv_sec;     /* seconds */
