diff --git a/icu4c/source/i18n/ucal.cpp b/icu4c/source/i18n/ucal.cpp
index 099e9e3..33f7258 100644
--- a/icu4c/source/i18n/ucal.cpp
+++ b/icu4c/source/i18n/ucal.cpp
@@ -33,8 +33,8 @@
 
 static TimeZone*
 _createTimeZone(const UChar* zoneID, int32_t len, UErrorCode* ec) {
-    TimeZone* zone = NULL;
-    if (ec != NULL && U_SUCCESS(*ec)) {
+    TimeZone* zone = nullptr;
+    if (ec != nullptr && U_SUCCESS(*ec)) {
         // Note that if zoneID is invalid, we get back GMT. This odd
         // behavior is by design and goes back to the JDK. The only
         // failure we will see is a memory allocation failure.
@@ -42,7 +42,7 @@
         UnicodeString zoneStrID;
         zoneStrID.setTo((UBool)(len < 0), zoneID, l); /* temporary read-only alias */
         zone = TimeZone::createTimeZone(zoneStrID);
-        if (zone == NULL) {
+        if (zone == nullptr) {
             *ec = U_MEMORY_ALLOCATION_ERROR;
         }
     }
@@ -58,20 +58,20 @@
 
 U_CAPI UEnumeration* U_EXPORT2
 ucal_openTimeZones(UErrorCode* ec) {
-    return uenum_openFromStringEnumeration(TimeZone::createEnumeration(), ec);
+    return ucal_openTimeZoneIDEnumeration(UCAL_ZONE_TYPE_ANY, nullptr, nullptr, ec);
 }
 
 U_CAPI UEnumeration* U_EXPORT2
 ucal_openCountryTimeZones(const char* country, UErrorCode* ec) {
-    return uenum_openFromStringEnumeration(TimeZone::createEnumeration(country), ec);
+    return ucal_openTimeZoneIDEnumeration(UCAL_ZONE_TYPE_ANY, country, nullptr, ec);
 }
 
 U_CAPI int32_t U_EXPORT2
 ucal_getDefaultTimeZone(UChar* result, int32_t resultCapacity, UErrorCode* ec) {
     int32_t len = 0;
-    if (ec != NULL && U_SUCCESS(*ec)) {
+    if (ec != nullptr && U_SUCCESS(*ec)) {
         TimeZone* zone = TimeZone::createDefault();
-        if (zone == NULL) {
+        if (zone == nullptr) {
             *ec = U_MEMORY_ALLOCATION_ERROR;
         } else {
             UnicodeString id;
@@ -86,7 +86,7 @@
 U_CAPI void U_EXPORT2
 ucal_setDefaultTimeZone(const UChar* zoneID, UErrorCode* ec) {
     TimeZone* zone = _createTimeZone(zoneID, -1, ec);
-    if (zone != NULL) {
+    if (zone != nullptr) {
         TimeZone::adoptDefault(zone);
     }
 }
@@ -94,9 +94,9 @@
 U_CAPI int32_t U_EXPORT2
 ucal_getHostTimeZone(UChar* result, int32_t resultCapacity, UErrorCode* ec) {
     int32_t len = 0;
-    if (ec != NULL && U_SUCCESS(*ec)) {
+    if (ec != nullptr && U_SUCCESS(*ec)) {
         TimeZone *zone = TimeZone::detectHostTimeZone();
-        if (zone == NULL) {
+        if (zone == nullptr) {
             *ec = U_MEMORY_ALLOCATION_ERROR;
         } else {
             UnicodeString id;
@@ -114,7 +114,7 @@
     TimeZone* zone = _createTimeZone(zoneID, -1, ec);
     if (U_SUCCESS(*ec)) {
         SimpleTimeZone* stz = dynamic_cast<SimpleTimeZone*>(zone);
-        if (stz != NULL) {
+        if (stz != nullptr) {
             result = stz->getDSTSavings();
         } else {
             // Since there is no getDSTSavings on TimeZone, we use a
@@ -219,10 +219,10 @@
   if(U_FAILURE(*status))
     return;
 
-  TimeZone* zone = (zoneID==NULL) ? TimeZone::createDefault()
+  TimeZone* zone = (zoneID==nullptr) ? TimeZone::createDefault()
       : _createTimeZone(zoneID, len, status);
 
-  if (zone != NULL) {
+  if (zone != nullptr) {
       ((Calendar*)cal)->adoptTimeZone(zone);
   }
 }
@@ -255,8 +255,8 @@
 
     const TimeZone& tz = ((Calendar*)cal)->getTimeZone();
     UnicodeString id;
-    if(!(result==NULL && resultLength==0)) {
-        // NULL destination for pure preflighting: empty dummy string
+    if (!(result == nullptr && resultLength == 0)) {
+        // Null destination for pure preflighting: empty dummy string
         // otherwise, alias the destination buffer
         id.setTo(result, 0, resultLength);
     }
@@ -298,12 +298,12 @@
     }
     Calendar *cpp_cal = (Calendar *)cal;
     GregorianCalendar *gregocal = dynamic_cast<GregorianCalendar *>(cpp_cal);
-    // Not if(gregocal == NULL) {
+    // Not if(gregocal == nullptr) {
     // because we really want to work only with a GregorianCalendar, not with
     // its subclasses like BuddhistCalendar.
-    if (cpp_cal == NULL) {
-        // We normally don't check "this" pointers for NULL, but this here avoids
-        // compiler-generated exception-throwing code in case cal == NULL.
+    if (cpp_cal == nullptr) {
+        // We normally don't check "this" pointers for nullptr, but this here avoids
+        // compiler-generated exception-throwing code in case cal == nullptr.
         *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
         return;
     }
@@ -321,11 +321,11 @@
     }
     const Calendar *cpp_cal = (const Calendar *)cal;
     const GregorianCalendar *gregocal = dynamic_cast<const GregorianCalendar *>(cpp_cal);
-    // Not if(gregocal == NULL) {
+    // Not if(gregocal == nullptr) {
     // see comments in ucal_setGregorianChange().
-    if (cpp_cal == NULL) {
-        // We normally don't check "this" pointers for NULL, but this here avoids
-        // compiler-generated exception-throwing code in case cal == NULL.
+    if (cpp_cal == nullptr) {
+        // We normally don't check "this" pointers for nullptr, but this here avoids
+        // compiler-generated exception-throwing code in case cal == nullptr.
         *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
         return (UDate)0;
     }
@@ -572,11 +572,11 @@
 U_CAPI const char * U_EXPORT2
 ucal_getLocaleByType(const UCalendar *cal, ULocDataLocaleType type, UErrorCode* status) 
 {
-    if (cal == NULL) {
+    if (cal == nullptr) {
         if (U_SUCCESS(*status)) {
             *status = U_ILLEGAL_ARGUMENT_ERROR;
         }
-        return NULL;
+        return nullptr;
     }
     return ((Calendar*)cal)->getLocaleID(type, *status);
 }
@@ -617,7 +617,7 @@
 ucal_getType(const UCalendar *cal, UErrorCode* status)
 {
     if (U_FAILURE(*status)) {
-        return NULL;
+        return nullptr;
     }
     return ((Calendar*)cal)->getType();
 }
@@ -662,8 +662,8 @@
 
 
 static const UEnumeration defaultKeywordValues = {
-    NULL,
-    NULL,
+    nullptr,
+    nullptr,
     ulist_close_keyword_values_iterator,
     ulist_count_keyword_values,
     uenum_unextDefault,
@@ -690,7 +690,7 @@
         "islamic-umalqura",
         "islamic-tbla",
         "islamic-rgsa",
-        NULL
+        nullptr
 };
 
 U_CAPI UEnumeration* U_EXPORT2
@@ -700,16 +700,16 @@
     (void)ulocimp_getRegionForSupplementalData(locale, TRUE, prefRegion, sizeof(prefRegion), status);
     
     // Read preferred calendar values from supplementalData calendarPreference
-    UResourceBundle *rb = ures_openDirect(NULL, "supplementalData", status);
+    UResourceBundle *rb = ures_openDirect(nullptr, "supplementalData", status);
     ures_getByKey(rb, "calendarPreferenceData", rb, status);
-    UResourceBundle *order = ures_getByKey(rb, prefRegion, NULL, status);
-    if (*status == U_MISSING_RESOURCE_ERROR && rb != NULL) {
+    UResourceBundle *order = ures_getByKey(rb, prefRegion, nullptr, status);
+    if (*status == U_MISSING_RESOURCE_ERROR && rb != nullptr) {
         *status = U_ZERO_ERROR;
-        order = ures_getByKey(rb, "001", NULL, status);
+        order = ures_getByKey(rb, "001", nullptr, status);
     }
 
     // Create a list of calendar type strings
-    UList *values = NULL;
+    UList *values = nullptr;
     if (U_SUCCESS(*status)) {
         values = ulist_createEmptyList(status);
         if (U_SUCCESS(*status)) {
@@ -717,7 +717,7 @@
                 int32_t len;
                 const UChar *type = ures_getStringByIndex(order, i, &len, status);
                 char *caltype = (char*)uprv_malloc(len + 1);
-                if (caltype == NULL) {
+                if (caltype == nullptr) {
                     *status = U_MEMORY_ALLOCATION_ERROR;
                     break;
                 }
@@ -732,7 +732,7 @@
 
             if (U_SUCCESS(*status) && !commonlyUsed) {
                 // If not commonlyUsed, add other available values
-                for (int32_t i = 0; CAL_TYPES[i] != NULL; i++) {
+                for (int32_t i = 0; CAL_TYPES[i] != nullptr; i++) {
                     if (!ulist_containsString(values, CAL_TYPES[i], (int32_t)uprv_strlen(CAL_TYPES[i]))) {
                         ulist_addItemEndList(values, CAL_TYPES[i], FALSE, status);
                         if (U_FAILURE(*status)) {
@@ -743,7 +743,7 @@
             }
             if (U_FAILURE(*status)) {
                 ulist_deleteList(values);
-                values = NULL;
+                values = nullptr;
             }
         }
     }
@@ -751,16 +751,16 @@
     ures_close(order);
     ures_close(rb);
 
-    if (U_FAILURE(*status) || values == NULL) {
-        return NULL;
+    if (U_FAILURE(*status) || values == nullptr) {
+        return nullptr;
     }
 
     // Create string enumeration
     UEnumeration *en = (UEnumeration*)uprv_malloc(sizeof(UEnumeration));
-    if (en == NULL) {
+    if (en == nullptr) {
         *status = U_MEMORY_ALLOCATION_ERROR;
         ulist_deleteList(values);
-        return NULL;
+        return nullptr;
     }
     ulist_resetList(values);
     memcpy(en, &defaultKeywordValues, sizeof(UEnumeration));
@@ -778,7 +778,7 @@
     UDate base = ((Calendar*)cal)->getTime(*status);
     const TimeZone& tz = ((Calendar*)cal)->getTimeZone();
     const BasicTimeZone * btz = dynamic_cast<const BasicTimeZone *>(&tz);
-    if (btz != NULL && U_SUCCESS(*status)) {
+    if (btz != nullptr && U_SUCCESS(*status)) {
         TimeZoneTransition tzt;
         UBool inclusive = (type == UCAL_TZ_TRANSITION_NEXT_INCLUSIVE || type == UCAL_TZ_TRANSITION_PREVIOUS_INCLUSIVE);
         UBool result = (type == UCAL_TZ_TRANSITION_NEXT || type == UCAL_TZ_TRANSITION_NEXT_INCLUSIVE)?
