ICU-20783 C++ covariant return types: clone(), freeze() & friends
diff --git a/icu4c/source/common/filteredbrk.cpp b/icu4c/source/common/filteredbrk.cpp
index 20c3aa8..c07128c 100644
--- a/icu4c/source/common/filteredbrk.cpp
+++ b/icu4c/source/common/filteredbrk.cpp
@@ -173,7 +173,7 @@
     status = U_SAFECLONE_ALLOCATED_WARNING;
     return clone();
   }
-  virtual BreakIterator* clone(void) const { return new SimpleFilteredSentenceBreakIterator(*this); }
+  virtual SimpleFilteredSentenceBreakIterator* clone() const { return new SimpleFilteredSentenceBreakIterator(*this); }
   virtual UClassID getDynamicClassID(void) const { return NULL; }
   virtual UBool operator==(const BreakIterator& o) const { if(this==&o) return true; return false; }
 
diff --git a/icu4c/source/common/rbbi.cpp b/icu4c/source/common/rbbi.cpp
index 625fe99..01dae48 100644
--- a/icu4c/source/common/rbbi.cpp
+++ b/icu4c/source/common/rbbi.cpp
@@ -323,8 +323,8 @@
 //            Virtual function: does the right thing with subclasses.
 //
 //-----------------------------------------------------------------------------
-BreakIterator*
-RuleBasedBreakIterator::clone(void) const {
+RuleBasedBreakIterator*
+RuleBasedBreakIterator::clone() const {
     return new RuleBasedBreakIterator(*this);
 }
 
@@ -1079,10 +1079,8 @@
 }
 
 
-BreakIterator *  RuleBasedBreakIterator::createBufferClone(void * /*stackBuffer*/,
-                                   int32_t &bufferSize,
-                                   UErrorCode &status)
-{
+RuleBasedBreakIterator *RuleBasedBreakIterator::createBufferClone(
+        void * /*stackBuffer*/, int32_t &bufferSize, UErrorCode &status) {
     if (U_FAILURE(status)){
         return NULL;
     }
diff --git a/icu4c/source/common/schriter.cpp b/icu4c/source/common/schriter.cpp
index f852800..17b68ae 100644
--- a/icu4c/source/common/schriter.cpp
+++ b/icu4c/source/common/schriter.cpp
@@ -101,7 +101,7 @@
         && end == realThat.end;
 }
 
-CharacterIterator*
+StringCharacterIterator*
 StringCharacterIterator::clone() const {
     return new StringCharacterIterator(*this);
 }
diff --git a/icu4c/source/common/uchriter.cpp b/icu4c/source/common/uchriter.cpp
index 822168f..bedbabc 100644
--- a/icu4c/source/common/uchriter.cpp
+++ b/icu4c/source/common/uchriter.cpp
@@ -89,7 +89,7 @@
     return ustr_hashUCharsN(text, textLength) ^ pos ^ begin ^ end;
 }
 
-CharacterIterator*
+UCharCharacterIterator*
 UCharCharacterIterator::clone() const {
     return new UCharCharacterIterator(*this);
 }
diff --git a/icu4c/source/common/unicode/brkiter.h b/icu4c/source/common/unicode/brkiter.h
index a0fbf72..7448198 100644
--- a/icu4c/source/common/unicode/brkiter.h
+++ b/icu4c/source/common/unicode/brkiter.h
@@ -139,7 +139,7 @@
      * method which subclasses implement.
      * @stable ICU 2.0
      */
-    virtual BreakIterator* clone(void) const = 0;
+    virtual BreakIterator* clone() const = 0;
 
     /**
      * Return a polymorphic class ID for this object. Different subclasses
diff --git a/icu4c/source/common/unicode/chariter.h b/icu4c/source/common/unicode/chariter.h
index 0e9b7cd..db86f79 100644
--- a/icu4c/source/common/unicode/chariter.h
+++ b/icu4c/source/common/unicode/chariter.h
@@ -380,7 +380,7 @@
      * @return a pointer to a new CharacterIterator
      * @stable ICU 2.0
      */
-    virtual CharacterIterator* clone(void) const = 0;
+    virtual CharacterIterator* clone() const = 0;
 
     /**
      * Sets the iterator to refer to the first code unit in its
diff --git a/icu4c/source/common/unicode/normlzr.h b/icu4c/source/common/unicode/normlzr.h
index 41f10a1..05bc9df 100644
--- a/icu4c/source/common/unicode/normlzr.h
+++ b/icu4c/source/common/unicode/normlzr.h
@@ -601,7 +601,7 @@
    * @return a pointer to a new Normalizer
    * @deprecated ICU 56 Use Normalizer2 instead.
    */
-  Normalizer*        clone(void) const;
+  Normalizer*        clone() const;
 
   /**
    * Generates a hash code for this iterator.
diff --git a/icu4c/source/common/unicode/rbbi.h b/icu4c/source/common/unicode/rbbi.h
index 5e6b3ab..90dee20 100644
--- a/icu4c/source/common/unicode/rbbi.h
+++ b/icu4c/source/common/unicode/rbbi.h
@@ -274,7 +274,7 @@
      * @return a newly-constructed RuleBasedBreakIterator
      * @stable ICU 2.0
      */
-    virtual BreakIterator* clone() const;
+    virtual RuleBasedBreakIterator* clone() const;
 
     /**
      * Compute a hash code for this BreakIterator
@@ -564,9 +564,9 @@
      *          or if the stackBuffer was too small to hold the clone.
      * @deprecated ICU 52. Use clone() instead.
      */
-    virtual BreakIterator *  createBufferClone(void *stackBuffer,
-                                               int32_t &BufferSize,
-                                               UErrorCode &status);
+    virtual RuleBasedBreakIterator *createBufferClone(void *stackBuffer,
+                                                      int32_t &BufferSize,
+                                                      UErrorCode &status);
 
 
     /**
diff --git a/icu4c/source/common/unicode/rep.h b/icu4c/source/common/unicode/rep.h
index 68b2e7c..6dd4530 100644
--- a/icu4c/source/common/unicode/rep.h
+++ b/icu4c/source/common/unicode/rep.h
@@ -193,9 +193,6 @@
      * Clones can be used concurrently in multiple threads.
      * If a subclass does not implement clone(), or if an error occurs,
      * then NULL is returned.
-     * The clone functions in all subclasses return a pointer to a Replaceable
-     * because some compilers do not support covariant (same-as-this)
-     * return types; cast to the appropriate subclass if necessary.
      * The caller must delete the clone.
      *
      * @return a clone of this object
diff --git a/icu4c/source/common/unicode/schriter.h b/icu4c/source/common/unicode/schriter.h
index b38f95d..1ca5b70 100644
--- a/icu4c/source/common/unicode/schriter.h
+++ b/icu4c/source/common/unicode/schriter.h
@@ -133,7 +133,7 @@
    * @return the newly cloned object.
    * @stable ICU 2.0
    */
-  virtual CharacterIterator* clone(void) const;
+  virtual StringCharacterIterator* clone() const;
 
   /**
    * Sets the iterator to iterate over the provided string.
diff --git a/icu4c/source/common/unicode/strenum.h b/icu4c/source/common/unicode/strenum.h
index a303c5a9..8601f1f 100644
--- a/icu4c/source/common/unicode/strenum.h
+++ b/icu4c/source/common/unicode/strenum.h
@@ -71,9 +71,6 @@
      * Clones can be used concurrently in multiple threads.
      * If a subclass does not implement clone(), or if an error occurs,
      * then NULL is returned.
-     * The clone functions in all subclasses return a base class pointer
-     * because some compilers do not support covariant (same-as-this)
-     * return types; cast to the appropriate subclass if necessary.
      * The caller must delete the clone.
      *
      * @return a clone of this object
diff --git a/icu4c/source/common/unicode/uchriter.h b/icu4c/source/common/unicode/uchriter.h
index bf7c1ce..a485259 100644
--- a/icu4c/source/common/unicode/uchriter.h
+++ b/icu4c/source/common/unicode/uchriter.h
@@ -135,7 +135,7 @@
    * @return the CharacterIterator newly created
    * @stable ICU 2.0
    */
-  virtual CharacterIterator* clone(void) const;
+  virtual UCharCharacterIterator* clone() const;
 
   /**
    * Sets the iterator to refer to the first code unit in its
diff --git a/icu4c/source/common/unicode/uniset.h b/icu4c/source/common/unicode/uniset.h
index 77fab60..c8525ad 100644
--- a/icu4c/source/common/unicode/uniset.h
+++ b/icu4c/source/common/unicode/uniset.h
@@ -505,7 +505,7 @@
      * @see cloneAsThawed
      * @stable ICU 2.0
      */
-    virtual UnicodeFunctor* clone() const;
+    virtual UnicodeSet* clone() const;
 
     /**
      * Returns the hash code value for this set.
@@ -583,7 +583,7 @@
      * @see cloneAsThawed
      * @stable ICU 3.8
      */
-    UnicodeFunctor *freeze();
+    UnicodeSet *freeze();
 
     /**
      * Clone the set and make the clone mutable.
@@ -593,7 +593,7 @@
      * @see isFrozen
      * @stable ICU 3.8
      */
-    UnicodeFunctor *cloneAsThawed() const;
+    UnicodeSet *cloneAsThawed() const;
 
     //----------------------------------------------------------------
     // Public API
diff --git a/icu4c/source/common/unicode/unistr.h b/icu4c/source/common/unicode/unistr.h
index 012b25f..a22743f 100644
--- a/icu4c/source/common/unicode/unistr.h
+++ b/icu4c/source/common/unicode/unistr.h
@@ -3326,9 +3326,6 @@
    * Clones can be used concurrently in multiple threads.
    * If a subclass does not implement clone(), or if an error occurs,
    * then NULL is returned.
-   * The clone functions in all subclasses return a pointer to a Replaceable
-   * because some compilers do not support covariant (same-as-this)
-   * return types; cast to the appropriate subclass if necessary.
    * The caller must delete the clone.
    *
    * @return a clone of this object
@@ -3337,7 +3334,7 @@
    * @see getDynamicClassID
    * @stable ICU 2.6
    */
-  virtual Replaceable *clone() const;
+  virtual UnicodeString *clone() const;
 
   /** Destructor.
    * @stable ICU 2.0
diff --git a/icu4c/source/common/unicode/uobject.h b/icu4c/source/common/unicode/uobject.h
index b9b32ca..eeb331c 100644
--- a/icu4c/source/common/unicode/uobject.h
+++ b/icu4c/source/common/unicode/uobject.h
@@ -215,11 +215,8 @@
  * The clone() function is not available in UObject because it is not
  * implemented by all ICU classes.
  * Many ICU services provide a clone() function for their class trees,
- * defined on the service's C++ base class, and all subclasses within that
- * service class tree return a pointer to the service base class
+ * defined on the service's C++ base class
  * (which itself is a subclass of UObject).
- * This is because some compilers do not support covariant (same-as-this)
- * return types; cast to the appropriate subclass if necessary.
  *
  * @stable ICU 2.2
  */
diff --git a/icu4c/source/common/uniset.cpp b/icu4c/source/common/uniset.cpp
index 2024277..b73d612 100644
--- a/icu4c/source/common/uniset.cpp
+++ b/icu4c/source/common/uniset.cpp
@@ -278,11 +278,11 @@
  * to support cloning in order to allow classes using
  * UnicodeMatchers, such as Transliterator, to implement cloning.
  */
-UnicodeFunctor* UnicodeSet::clone() const {
+UnicodeSet* UnicodeSet::clone() const {
     return new UnicodeSet(*this);
 }
 
-UnicodeFunctor *UnicodeSet::cloneAsThawed() const {
+UnicodeSet *UnicodeSet::cloneAsThawed() const {
     return new UnicodeSet(*this, TRUE);
 }
 
@@ -2172,7 +2172,7 @@
     // We can regenerate an equivalent pattern later when requested.
 }
 
-UnicodeFunctor *UnicodeSet::freeze() {
+UnicodeSet *UnicodeSet::freeze() {
     if(!isFrozen() && !isBogus()) {
         compact();
 
diff --git a/icu4c/source/common/unistr.cpp b/icu4c/source/common/unistr.cpp
index 8f06515..901bb33 100644
--- a/icu4c/source/common/unistr.cpp
+++ b/icu4c/source/common/unistr.cpp
@@ -332,7 +332,7 @@
 }
 
 // UnicodeString overrides clone() with a real implementation
-Replaceable *
+UnicodeString *
 UnicodeString::clone() const {
   return new UnicodeString(*this);
 }
diff --git a/icu4c/source/common/ustr_titlecase_brkiter.cpp b/icu4c/source/common/ustr_titlecase_brkiter.cpp
index 056b40e..457905e 100644
--- a/icu4c/source/common/ustr_titlecase_brkiter.cpp
+++ b/icu4c/source/common/ustr_titlecase_brkiter.cpp
@@ -45,7 +45,7 @@
     WholeStringBreakIterator() : BreakIterator(), length(0) {}
     ~WholeStringBreakIterator() U_OVERRIDE;
     UBool operator==(const BreakIterator&) const U_OVERRIDE;
-    BreakIterator *clone() const U_OVERRIDE;
+    WholeStringBreakIterator *clone() const U_OVERRIDE;
     static UClassID U_EXPORT2 getStaticClassID();
     UClassID getDynamicClassID() const U_OVERRIDE;
     CharacterIterator &getText() const U_OVERRIDE;
@@ -62,9 +62,9 @@
     int32_t preceding(int32_t offset) U_OVERRIDE;
     UBool isBoundary(int32_t offset) U_OVERRIDE;
     int32_t next(int32_t n) U_OVERRIDE;
-    BreakIterator *createBufferClone(void *stackBuffer, int32_t &BufferSize,
-                                     UErrorCode &errorCode) U_OVERRIDE;
-    BreakIterator &refreshInputText(UText *input, UErrorCode &errorCode) U_OVERRIDE;
+    WholeStringBreakIterator *createBufferClone(void *stackBuffer, int32_t &BufferSize,
+                                                UErrorCode &errorCode) U_OVERRIDE;
+    WholeStringBreakIterator &refreshInputText(UText *input, UErrorCode &errorCode) U_OVERRIDE;
 
 private:
     int32_t length;
@@ -74,7 +74,7 @@
 
 WholeStringBreakIterator::~WholeStringBreakIterator() {}
 UBool WholeStringBreakIterator::operator==(const BreakIterator&) const { return FALSE; }
-BreakIterator *WholeStringBreakIterator::clone() const { return nullptr; }
+WholeStringBreakIterator *WholeStringBreakIterator::clone() const { return nullptr; }
 
 CharacterIterator &WholeStringBreakIterator::getText() const {
     UPRV_UNREACHABLE;  // really should not be called
@@ -113,14 +113,14 @@
 UBool WholeStringBreakIterator::isBoundary(int32_t /*offset*/) { return FALSE; }
 int32_t WholeStringBreakIterator::next(int32_t /*n*/) { return length; }
 
-BreakIterator *WholeStringBreakIterator::createBufferClone(
+WholeStringBreakIterator *WholeStringBreakIterator::createBufferClone(
         void * /*stackBuffer*/, int32_t & /*BufferSize*/, UErrorCode &errorCode) {
     if (U_SUCCESS(errorCode)) {
         errorCode = U_UNSUPPORTED_ERROR;
     }
     return nullptr;
 }
-BreakIterator &WholeStringBreakIterator::refreshInputText(
+WholeStringBreakIterator &WholeStringBreakIterator::refreshInputText(
         UText * /*input*/, UErrorCode &errorCode) {
     if (U_SUCCESS(errorCode)) {
         errorCode = U_UNSUPPORTED_ERROR;
diff --git a/icu4c/source/i18n/anytrans.cpp b/icu4c/source/i18n/anytrans.cpp
index 6e382b8..167b018 100644
--- a/icu4c/source/i18n/anytrans.cpp
+++ b/icu4c/source/i18n/anytrans.cpp
@@ -226,7 +226,7 @@
 /**
  * Transliterator API.
  */
-Transliterator* AnyTransliterator::clone() const {
+AnyTransliterator* AnyTransliterator::clone() const {
     return new AnyTransliterator(*this);
 }
 
diff --git a/icu4c/source/i18n/anytrans.h b/icu4c/source/i18n/anytrans.h
index 703d42b..627dee3 100644
--- a/icu4c/source/i18n/anytrans.h
+++ b/icu4c/source/i18n/anytrans.h
@@ -66,7 +66,7 @@
     /**
      * Transliterator API.
      */
-    virtual Transliterator* clone() const;
+    virtual AnyTransliterator* clone() const;
 
     /**
      * Implements {@link Transliterator#handleTransliterate}.
diff --git a/icu4c/source/i18n/brktrans.cpp b/icu4c/source/i18n/brktrans.cpp
index ac9e2af..46b0e34 100644
--- a/icu4c/source/i18n/brktrans.cpp
+++ b/icu4c/source/i18n/brktrans.cpp
@@ -64,7 +64,7 @@
 /**
  * Transliterator API.
  */
-Transliterator* BreakTransliterator::clone(void) const {
+BreakTransliterator* BreakTransliterator::clone() const {
     return new BreakTransliterator(*this);
 }
 
diff --git a/icu4c/source/i18n/brktrans.h b/icu4c/source/i18n/brktrans.h
index 30cf4ea..cb3def9 100644
--- a/icu4c/source/i18n/brktrans.h
+++ b/icu4c/source/i18n/brktrans.h
@@ -54,7 +54,7 @@
      * Transliterator API.
      * @return    A copy of the object.
      */
-    virtual Transliterator* clone(void) const;
+    virtual BreakTransliterator* clone() const;
 
     virtual const UnicodeString &getInsertion() const;
 
diff --git a/icu4c/source/i18n/buddhcal.cpp b/icu4c/source/i18n/buddhcal.cpp
index 2a36bd3..6083349 100644
--- a/icu4c/source/i18n/buddhcal.cpp
+++ b/icu4c/source/i18n/buddhcal.cpp
@@ -53,7 +53,7 @@
     return *this;
 }
 
-Calendar* BuddhistCalendar::clone(void) const
+BuddhistCalendar* BuddhistCalendar::clone() const
 {
     return new BuddhistCalendar(*this);
 }
diff --git a/icu4c/source/i18n/buddhcal.h b/icu4c/source/i18n/buddhcal.h
index 88509ba..0ad0886 100644
--- a/icu4c/source/i18n/buddhcal.h
+++ b/icu4c/source/i18n/buddhcal.h
@@ -94,7 +94,7 @@
      * @return    return a polymorphic copy of this calendar.
      * @internal
      */
-    virtual Calendar* clone(void) const;
+    virtual BuddhistCalendar* clone() const;
 
 public:
     /**
diff --git a/icu4c/source/i18n/casetrn.cpp b/icu4c/source/i18n/casetrn.cpp
index ac28365..bb650f8 100644
--- a/icu4c/source/i18n/casetrn.cpp
+++ b/icu4c/source/i18n/casetrn.cpp
@@ -125,7 +125,7 @@
 /**
  * Transliterator API.
  */
-/*Transliterator* CaseMapTransliterator::clone(void) const {
+/*CaseMapTransliterator* CaseMapTransliterator::clone() const {
     return new CaseMapTransliterator(*this);
 }*/
 
diff --git a/icu4c/source/i18n/casetrn.h b/icu4c/source/i18n/casetrn.h
index 744406e..2ec3e73 100644
--- a/icu4c/source/i18n/casetrn.h
+++ b/icu4c/source/i18n/casetrn.h
@@ -58,7 +58,7 @@
      * Transliterator API.
      * @return a copy of the object.
      */
-    virtual Transliterator* clone(void) const = 0;
+    virtual CaseMapTransliterator* clone() const = 0;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/icu4c/source/i18n/chnsecal.cpp b/icu4c/source/i18n/chnsecal.cpp
index bd85db1..4c03812 100644
--- a/icu4c/source/i18n/chnsecal.cpp
+++ b/icu4c/source/i18n/chnsecal.cpp
@@ -118,7 +118,7 @@
 //-------------------------------------------------------------------------
 
 
-Calendar* ChineseCalendar::clone() const {
+ChineseCalendar* ChineseCalendar::clone() const {
     return new ChineseCalendar(*this);
 }
 
diff --git a/icu4c/source/i18n/chnsecal.h b/icu4c/source/i18n/chnsecal.h
index 11a9b43..a0c21b6 100644
--- a/icu4c/source/i18n/chnsecal.h
+++ b/icu4c/source/i18n/chnsecal.h
@@ -144,7 +144,7 @@
   virtual ~ChineseCalendar();
 
   // clone
-  virtual Calendar* clone() const;
+  virtual ChineseCalendar* clone() const;
 
  private:
 
diff --git a/icu4c/source/i18n/choicfmt.cpp b/icu4c/source/i18n/choicfmt.cpp
index 42e1fa2..7e26bb7 100644
--- a/icu4c/source/i18n/choicfmt.cpp
+++ b/icu4c/source/i18n/choicfmt.cpp
@@ -563,7 +563,7 @@
 
 // -------------------------------------
 
-Format*
+ChoiceFormat*
 ChoiceFormat::clone() const
 {
     ChoiceFormat *aCopy = new ChoiceFormat(*this);
diff --git a/icu4c/source/i18n/compactdecimalformat.cpp b/icu4c/source/i18n/compactdecimalformat.cpp
index 8211928..a4c9dad 100644
--- a/icu4c/source/i18n/compactdecimalformat.cpp
+++ b/icu4c/source/i18n/compactdecimalformat.cpp
@@ -45,7 +45,7 @@
     return *this;
 }
 
-Format* CompactDecimalFormat::clone() const {
+CompactDecimalFormat* CompactDecimalFormat::clone() const {
     return new CompactDecimalFormat(*this);
 }
 
diff --git a/icu4c/source/i18n/coptccal.cpp b/icu4c/source/i18n/coptccal.cpp
index ba2040d..9c2b1eb 100644
--- a/icu4c/source/i18n/coptccal.cpp
+++ b/icu4c/source/i18n/coptccal.cpp
@@ -40,7 +40,7 @@
 {
 }
 
-Calendar*
+CopticCalendar*
 CopticCalendar::clone() const
 {
     return new CopticCalendar(*this);
diff --git a/icu4c/source/i18n/coptccal.h b/icu4c/source/i18n/coptccal.h
index 5c38aa6..e9e812d 100644
--- a/icu4c/source/i18n/coptccal.h
+++ b/icu4c/source/i18n/coptccal.h
@@ -145,7 +145,7 @@
      * @return    return a polymorphic copy of this calendar.
      * @internal
      */
-    virtual Calendar* clone(void) const;
+    virtual CopticCalendar* clone() const;
 
     /**
      * return the calendar type, "coptic"
diff --git a/icu4c/source/i18n/cpdtrans.cpp b/icu4c/source/i18n/cpdtrans.cpp
index db2ddb7..82ee54a 100644
--- a/icu4c/source/i18n/cpdtrans.cpp
+++ b/icu4c/source/i18n/cpdtrans.cpp
@@ -323,7 +323,7 @@
 /**
  * Transliterator API.
  */
-Transliterator* CompoundTransliterator::clone(void) const {
+CompoundTransliterator* CompoundTransliterator::clone() const {
     return new CompoundTransliterator(*this);
 }
 
diff --git a/icu4c/source/i18n/cpdtrans.h b/icu4c/source/i18n/cpdtrans.h
index 076296a..a2c7abb 100644
--- a/icu4c/source/i18n/cpdtrans.h
+++ b/icu4c/source/i18n/cpdtrans.h
@@ -98,7 +98,7 @@
     /**
      * Transliterator API.
      */
-    virtual Transliterator* clone(void) const;
+    virtual CompoundTransliterator* clone() const;
 
     /**
      * Returns the number of transliterators in this chain.
diff --git a/icu4c/source/i18n/curramt.cpp b/icu4c/source/i18n/curramt.cpp
index d224270..6fd2ea2 100644
--- a/icu4c/source/i18n/curramt.cpp
+++ b/icu4c/source/i18n/curramt.cpp
@@ -38,7 +38,7 @@
     return *this;
 }
 
-UObject* CurrencyAmount::clone() const {
+CurrencyAmount* CurrencyAmount::clone() const {
     return new CurrencyAmount(*this);
 }
 
diff --git a/icu4c/source/i18n/currfmt.cpp b/icu4c/source/i18n/currfmt.cpp
index 8f20f78..0ad0492 100644
--- a/icu4c/source/i18n/currfmt.cpp
+++ b/icu4c/source/i18n/currfmt.cpp
@@ -33,7 +33,7 @@
 CurrencyFormat::~CurrencyFormat() {
 }
 
-Format* CurrencyFormat::clone() const {
+CurrencyFormat* CurrencyFormat::clone() const {
     return new CurrencyFormat(*this);
 }
 
diff --git a/icu4c/source/i18n/currfmt.h b/icu4c/source/i18n/currfmt.h
index cc9bb3c..69a0319 100644
--- a/icu4c/source/i18n/currfmt.h
+++ b/icu4c/source/i18n/currfmt.h
@@ -57,7 +57,7 @@
     /**
      * Override Format API.
      */
-    virtual Format* clone() const;
+    virtual CurrencyFormat* clone() const;
 
 
     using MeasureFormat::format;
diff --git a/icu4c/source/i18n/currunit.cpp b/icu4c/source/i18n/currunit.cpp
index a5b039f..dab6dda 100644
--- a/icu4c/source/i18n/currunit.cpp
+++ b/icu4c/source/i18n/currunit.cpp
@@ -109,7 +109,7 @@
     return *this;
 }
 
-UObject* CurrencyUnit::clone() const {
+CurrencyUnit* CurrencyUnit::clone() const {
     return new CurrencyUnit(*this);
 }
 
diff --git a/icu4c/source/i18n/dangical.cpp b/icu4c/source/i18n/dangical.cpp
index 73bc421..02db403 100644
--- a/icu4c/source/i18n/dangical.cpp
+++ b/icu4c/source/i18n/dangical.cpp
@@ -65,7 +65,7 @@
 {
 }
 
-Calendar*
+DangiCalendar*
 DangiCalendar::clone() const
 {
     return new DangiCalendar(*this);
diff --git a/icu4c/source/i18n/dangical.h b/icu4c/source/i18n/dangical.h
index 04bd67b..ece805e 100644
--- a/icu4c/source/i18n/dangical.h
+++ b/icu4c/source/i18n/dangical.h
@@ -66,7 +66,7 @@
    * Clone.
    * @internal
    */
-  virtual Calendar* clone() const;
+  virtual DangiCalendar* clone() const;
 
   //----------------------------------------------------------------------
   // Internal methods & astronomical calculations
diff --git a/icu4c/source/i18n/decimfmt.cpp b/icu4c/source/i18n/decimfmt.cpp
index b729035..cb82e7f 100644
--- a/icu4c/source/i18n/decimfmt.cpp
+++ b/icu4c/source/i18n/decimfmt.cpp
@@ -485,7 +485,7 @@
     delete fields;
 }
 
-Format* DecimalFormat::clone() const {
+DecimalFormat* DecimalFormat::clone() const {
     // can only clone valid objects.
     if (fields == nullptr) {
         return nullptr;
diff --git a/icu4c/source/i18n/dtitvfmt.cpp b/icu4c/source/i18n/dtitvfmt.cpp
index f5d8694..8f4fcc5 100644
--- a/icu4c/source/i18n/dtitvfmt.cpp
+++ b/icu4c/source/i18n/dtitvfmt.cpp
@@ -215,8 +215,8 @@
 }
 
 
-Format*
-DateIntervalFormat::clone(void) const {
+DateIntervalFormat*
+DateIntervalFormat::clone() const {
     return new DateIntervalFormat(*this);
 }
 
diff --git a/icu4c/source/i18n/esctrn.cpp b/icu4c/source/i18n/esctrn.cpp
index 900bed7..ba0e4c2 100644
--- a/icu4c/source/i18n/esctrn.cpp
+++ b/icu4c/source/i18n/esctrn.cpp
@@ -122,7 +122,7 @@
 /**
  * Transliterator API.
  */
-Transliterator* EscapeTransliterator::clone() const {
+EscapeTransliterator* EscapeTransliterator::clone() const {
     return new EscapeTransliterator(*this);
 }
 
diff --git a/icu4c/source/i18n/esctrn.h b/icu4c/source/i18n/esctrn.h
index 60ecc74..2a2c6dc 100644
--- a/icu4c/source/i18n/esctrn.h
+++ b/icu4c/source/i18n/esctrn.h
@@ -115,7 +115,7 @@
     /**
      * Transliterator API.
      */
-    virtual Transliterator* clone() const;
+    virtual EscapeTransliterator* clone() const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/icu4c/source/i18n/ethpccal.cpp b/icu4c/source/i18n/ethpccal.cpp
index 995dd6a..7c7c0ba 100644
--- a/icu4c/source/i18n/ethpccal.cpp
+++ b/icu4c/source/i18n/ethpccal.cpp
@@ -46,7 +46,7 @@
 {
 }
 
-Calendar*
+EthiopicCalendar*
 EthiopicCalendar::clone() const
 {
     return new EthiopicCalendar(*this);
diff --git a/icu4c/source/i18n/ethpccal.h b/icu4c/source/i18n/ethpccal.h
index acd7c3c..d1e8f42 100644
--- a/icu4c/source/i18n/ethpccal.h
+++ b/icu4c/source/i18n/ethpccal.h
@@ -141,7 +141,7 @@
      * @return    return a polymorphic copy of this calendar.
      * @internal
      */
-    virtual Calendar* clone() const;
+    virtual EthiopicCalendar* clone() const;
 
     /**
      * return the calendar type, "ethiopic"
diff --git a/icu4c/source/i18n/funcrepl.cpp b/icu4c/source/i18n/funcrepl.cpp
index 01c8754..7dd54ed 100644
--- a/icu4c/source/i18n/funcrepl.cpp
+++ b/icu4c/source/i18n/funcrepl.cpp
@@ -59,7 +59,7 @@
 /**
  * Implement UnicodeFunctor
  */
-UnicodeFunctor* FunctionReplacer::clone() const {
+FunctionReplacer* FunctionReplacer::clone() const {
     return new FunctionReplacer(*this);
 }
 
diff --git a/icu4c/source/i18n/funcrepl.h b/icu4c/source/i18n/funcrepl.h
index a835d5b..fe41f6c 100644
--- a/icu4c/source/i18n/funcrepl.h
+++ b/icu4c/source/i18n/funcrepl.h
@@ -70,7 +70,7 @@
     /**
      * Implement UnicodeFunctor
      */
-    virtual UnicodeFunctor* clone() const;
+    virtual FunctionReplacer* clone() const;
 
     /**
      * UnicodeFunctor API.  Cast 'this' to a UnicodeReplacer* pointer
diff --git a/icu4c/source/i18n/gregocal.cpp b/icu4c/source/i18n/gregocal.cpp
index 71faeb0..ee15b52 100644
--- a/icu4c/source/i18n/gregocal.cpp
+++ b/icu4c/source/i18n/gregocal.cpp
@@ -286,7 +286,7 @@
 
 // -------------------------------------
 
-Calendar* GregorianCalendar::clone() const
+GregorianCalendar* GregorianCalendar::clone() const
 {
     return new GregorianCalendar(*this);
 }
diff --git a/icu4c/source/i18n/hebrwcal.cpp b/icu4c/source/i18n/hebrwcal.cpp
index c025be4..c8fb8a1 100644
--- a/icu4c/source/i18n/hebrwcal.cpp
+++ b/icu4c/source/i18n/hebrwcal.cpp
@@ -169,7 +169,7 @@
     return "hebrew";
 }
 
-Calendar* HebrewCalendar::clone() const {
+HebrewCalendar* HebrewCalendar::clone() const {
     return new HebrewCalendar(*this);
 }
 
diff --git a/icu4c/source/i18n/hebrwcal.h b/icu4c/source/i18n/hebrwcal.h
index bde6466..08136de 100644
--- a/icu4c/source/i18n/hebrwcal.h
+++ b/icu4c/source/i18n/hebrwcal.h
@@ -192,7 +192,7 @@
      * @return    return a polymorphic copy of this calendar.
      * @internal
      */
-    virtual Calendar* clone(void) const;
+    virtual HebrewCalendar* clone() const;
     
 public:
     /**
diff --git a/icu4c/source/i18n/indiancal.cpp b/icu4c/source/i18n/indiancal.cpp
index ae1098f..f1ab853 100644
--- a/icu4c/source/i18n/indiancal.cpp
+++ b/icu4c/source/i18n/indiancal.cpp
@@ -35,7 +35,7 @@
 //-------------------------------------------------------------------------
 
 
-Calendar* IndianCalendar::clone() const {
+IndianCalendar* IndianCalendar::clone() const {
   return new IndianCalendar(*this);
 }
 
diff --git a/icu4c/source/i18n/indiancal.h b/icu4c/source/i18n/indiancal.h
index e36d4eb..e259d9b 100644
--- a/icu4c/source/i18n/indiancal.h
+++ b/icu4c/source/i18n/indiancal.h
@@ -186,7 +186,7 @@
   // TODO: copy c'tor, etc
 
   // clone
-  virtual Calendar* clone() const;
+  virtual IndianCalendar* clone() const;
 
  private:
   /**
diff --git a/icu4c/source/i18n/islamcal.cpp b/icu4c/source/i18n/islamcal.cpp
index 6e91d6e..582b336 100644
--- a/icu4c/source/i18n/islamcal.cpp
+++ b/icu4c/source/i18n/islamcal.cpp
@@ -227,7 +227,7 @@
     return sType;
 }
 
-Calendar* IslamicCalendar::clone() const {
+IslamicCalendar* IslamicCalendar::clone() const {
     return new IslamicCalendar(*this);
 }
 
diff --git a/icu4c/source/i18n/islamcal.h b/icu4c/source/i18n/islamcal.h
index 062733e..fde5847 100644
--- a/icu4c/source/i18n/islamcal.h
+++ b/icu4c/source/i18n/islamcal.h
@@ -230,7 +230,7 @@
   // TODO: copy c'tor, etc
 
   // clone
-  virtual Calendar* clone() const;
+  virtual IslamicCalendar* clone() const;
 
  private:
   /**
diff --git a/icu4c/source/i18n/japancal.cpp b/icu4c/source/i18n/japancal.cpp
index 1cb43f3..75a248f 100644
--- a/icu4c/source/i18n/japancal.cpp
+++ b/icu4c/source/i18n/japancal.cpp
@@ -136,7 +136,7 @@
     return *this;
 }
 
-Calendar* JapaneseCalendar::clone(void) const
+JapaneseCalendar* JapaneseCalendar::clone() const
 {
     return new JapaneseCalendar(*this);
 }
diff --git a/icu4c/source/i18n/japancal.h b/icu4c/source/i18n/japancal.h
index 25409d4..03e6361 100644
--- a/icu4c/source/i18n/japancal.h
+++ b/icu4c/source/i18n/japancal.h
@@ -116,7 +116,7 @@
      * @return    return a polymorphic copy of this calendar.
      * @internal
      */
-    virtual Calendar* clone(void) const;
+    virtual JapaneseCalendar* clone() const;
 
     /**
      * Return the extended year defined by the current fields.  In the 
diff --git a/icu4c/source/i18n/measfmt.cpp b/icu4c/source/i18n/measfmt.cpp
index 8f306c0..7d9612d 100644
--- a/icu4c/source/i18n/measfmt.cpp
+++ b/icu4c/source/i18n/measfmt.cpp
@@ -460,7 +460,7 @@
             **numberFormat == **rhs.numberFormat);
 }
 
-Format *MeasureFormat::clone() const {
+MeasureFormat *MeasureFormat::clone() const {
     return new MeasureFormat(*this);
 }
 
diff --git a/icu4c/source/i18n/measunit.cpp b/icu4c/source/i18n/measunit.cpp
index 9ae7aeb..82f595b 100644
--- a/icu4c/source/i18n/measunit.cpp
+++ b/icu4c/source/i18n/measunit.cpp
@@ -1923,7 +1923,7 @@
     return *this;
 }
 
-UObject *MeasureUnit::clone() const {
+MeasureUnit *MeasureUnit::clone() const {
     return new MeasureUnit(*this);
 }
 
diff --git a/icu4c/source/i18n/measure.cpp b/icu4c/source/i18n/measure.cpp
index d9084f8..a10b37f 100644
--- a/icu4c/source/i18n/measure.cpp
+++ b/icu4c/source/i18n/measure.cpp
@@ -48,7 +48,7 @@
     return *this;
 }
 
-UObject *Measure::clone() const {
+Measure *Measure::clone() const {
     return new Measure(*this);
 }
 
diff --git a/icu4c/source/i18n/msgfmt.cpp b/icu4c/source/i18n/msgfmt.cpp
index 8a824ba..3ca368e 100644
--- a/icu4c/source/i18n/msgfmt.cpp
+++ b/icu4c/source/i18n/msgfmt.cpp
@@ -436,7 +436,7 @@
 // -------------------------------------
 // Creates a copy of this MessageFormat, the caller owns the copy.
 
-Format*
+MessageFormat*
 MessageFormat::clone() const
 {
     return new MessageFormat(*this);
@@ -1873,7 +1873,7 @@
     return TRUE;
 }
 
-Format* MessageFormat::DummyFormat::clone() const {
+MessageFormat::DummyFormat* MessageFormat::DummyFormat::clone() const {
     return new DummyFormat();
 }
 
diff --git a/icu4c/source/i18n/name2uni.cpp b/icu4c/source/i18n/name2uni.cpp
index 69e92b8..52bab80 100644
--- a/icu4c/source/i18n/name2uni.cpp
+++ b/icu4c/source/i18n/name2uni.cpp
@@ -100,7 +100,7 @@
 /**
  * Transliterator API.
  */
-Transliterator* NameUnicodeTransliterator::clone(void) const {
+NameUnicodeTransliterator* NameUnicodeTransliterator::clone() const {
     return new NameUnicodeTransliterator(*this);
 }
 
diff --git a/icu4c/source/i18n/name2uni.h b/icu4c/source/i18n/name2uni.h
index 4c743de..44ad85f 100644
--- a/icu4c/source/i18n/name2uni.h
+++ b/icu4c/source/i18n/name2uni.h
@@ -49,7 +49,7 @@
      * Transliterator API.
      * @return    A copy of the object.
      */
-    virtual Transliterator* clone(void) const;
+    virtual NameUnicodeTransliterator* clone() const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/icu4c/source/i18n/nortrans.cpp b/icu4c/source/i18n/nortrans.cpp
index 589c824..6a8d2c7 100644
--- a/icu4c/source/i18n/nortrans.cpp
+++ b/icu4c/source/i18n/nortrans.cpp
@@ -92,7 +92,7 @@
 /**
  * Transliterator API.
  */
-Transliterator* NormalizationTransliterator::clone(void) const {
+NormalizationTransliterator* NormalizationTransliterator::clone() const {
     return new NormalizationTransliterator(*this);
 }
 
diff --git a/icu4c/source/i18n/nortrans.h b/icu4c/source/i18n/nortrans.h
index d309452..198ed29 100644
--- a/icu4c/source/i18n/nortrans.h
+++ b/icu4c/source/i18n/nortrans.h
@@ -44,7 +44,7 @@
      * Transliterator API.
      * @return    A copy of the object.
      */
-    virtual Transliterator* clone(void) const;
+    virtual NormalizationTransliterator* clone() const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/icu4c/source/i18n/nounit.cpp b/icu4c/source/i18n/nounit.cpp
index db07387..076f76f 100644
--- a/icu4c/source/i18n/nounit.cpp
+++ b/icu4c/source/i18n/nounit.cpp
@@ -29,7 +29,7 @@
 NoUnit::NoUnit(const NoUnit& other) : MeasureUnit(other) {
 }
 
-UObject* NoUnit::clone() const {
+NoUnit* NoUnit::clone() const {
     return new NoUnit(*this);
 }
 
diff --git a/icu4c/source/i18n/nultrans.cpp b/icu4c/source/i18n/nultrans.cpp
index 62d1290..439cc55 100644
--- a/icu4c/source/i18n/nultrans.cpp
+++ b/icu4c/source/i18n/nultrans.cpp
@@ -24,7 +24,7 @@
 
 NullTransliterator::~NullTransliterator() {}
 
-Transliterator* NullTransliterator::clone(void) const {
+NullTransliterator* NullTransliterator::clone() const {
     return new NullTransliterator();
 }
 
diff --git a/icu4c/source/i18n/nultrans.h b/icu4c/source/i18n/nultrans.h
index a01b04e..36c92fa 100644
--- a/icu4c/source/i18n/nultrans.h
+++ b/icu4c/source/i18n/nultrans.h
@@ -45,7 +45,7 @@
      * Transliterator API.
      * @internal Use transliterator factory methods instead since this class will be removed in that release.
      */
-    virtual Transliterator* clone(void) const;
+    virtual NullTransliterator* clone() const;
 
     /**
      * Implements {@link Transliterator#handleTransliterate}.
diff --git a/icu4c/source/i18n/number_asformat.cpp b/icu4c/source/i18n/number_asformat.cpp
index 974dfba..e876174 100644
--- a/icu4c/source/i18n/number_asformat.cpp
+++ b/icu4c/source/i18n/number_asformat.cpp
@@ -43,7 +43,7 @@
     return fFormatter.toSkeleton(localStatus) == _other->fFormatter.toSkeleton(localStatus);
 }
 
-Format* LocalizedNumberFormatterAsFormat::clone() const {
+LocalizedNumberFormatterAsFormat* LocalizedNumberFormatterAsFormat::clone() const {
     return new LocalizedNumberFormatterAsFormat(*this);
 }
 
diff --git a/icu4c/source/i18n/number_asformat.h b/icu4c/source/i18n/number_asformat.h
index bf82d72..7b0a1de 100644
--- a/icu4c/source/i18n/number_asformat.h
+++ b/icu4c/source/i18n/number_asformat.h
@@ -45,7 +45,7 @@
     /**
      * Creates a copy of this object.
      */
-    Format* clone() const U_OVERRIDE;
+    LocalizedNumberFormatterAsFormat* clone() const U_OVERRIDE;
 
     /**
      * Formats a Number using the wrapped LocalizedNumberFormatter. The provided formattable must be a
diff --git a/icu4c/source/i18n/olsontz.cpp b/icu4c/source/i18n/olsontz.cpp
index 7f9fe43..732140b 100644
--- a/icu4c/source/i18n/olsontz.cpp
+++ b/icu4c/source/i18n/olsontz.cpp
@@ -319,7 +319,7 @@
 /**
  * TimeZone API.
  */
-TimeZone* OlsonTimeZone::clone() const {
+OlsonTimeZone* OlsonTimeZone::clone() const {
     return new OlsonTimeZone(*this);
 }
 
diff --git a/icu4c/source/i18n/olsontz.h b/icu4c/source/i18n/olsontz.h
index 7bec8e0..a3b7dcc 100644
--- a/icu4c/source/i18n/olsontz.h
+++ b/icu4c/source/i18n/olsontz.h
@@ -151,7 +151,7 @@
     /**
      * TimeZone API.
      */
-    virtual TimeZone* clone() const;
+    virtual OlsonTimeZone* clone() const;
 
     /**
      * TimeZone API.
diff --git a/icu4c/source/i18n/persncal.cpp b/icu4c/source/i18n/persncal.cpp
index f38f779..26fd294 100644
--- a/icu4c/source/i18n/persncal.cpp
+++ b/icu4c/source/i18n/persncal.cpp
@@ -74,7 +74,7 @@
     return "persian";
 }
 
-Calendar* PersianCalendar::clone() const {
+PersianCalendar* PersianCalendar::clone() const {
     return new PersianCalendar(*this);
 }
 
diff --git a/icu4c/source/i18n/persncal.h b/icu4c/source/i18n/persncal.h
index bcfd68a..ce6d739 100644
--- a/icu4c/source/i18n/persncal.h
+++ b/icu4c/source/i18n/persncal.h
@@ -164,7 +164,7 @@
   // TODO: copy c'tor, etc
 
   // clone
-  virtual Calendar* clone() const;
+  virtual PersianCalendar* clone() const;
 
  private:
   /**
diff --git a/icu4c/source/i18n/plurfmt.cpp b/icu4c/source/i18n/plurfmt.cpp
index b2f1487..044f4b3 100644
--- a/icu4c/source/i18n/plurfmt.cpp
+++ b/icu4c/source/i18n/plurfmt.cpp
@@ -362,7 +362,7 @@
     }
 }
 
-Format*
+PluralFormat*
 PluralFormat::clone() const
 {
     return new PluralFormat(*this);
diff --git a/icu4c/source/i18n/quant.cpp b/icu4c/source/i18n/quant.cpp
index acf579e..ed33933 100644
--- a/icu4c/source/i18n/quant.cpp
+++ b/icu4c/source/i18n/quant.cpp
@@ -47,7 +47,7 @@
 /**
  * Implement UnicodeFunctor
  */
-UnicodeFunctor* Quantifier::clone() const {
+Quantifier* Quantifier::clone() const {
     return new Quantifier(*this);
 }
 
diff --git a/icu4c/source/i18n/quant.h b/icu4c/source/i18n/quant.h
index 1abb0db..d5aa8e5 100644
--- a/icu4c/source/i18n/quant.h
+++ b/icu4c/source/i18n/quant.h
@@ -45,7 +45,7 @@
      * Implement UnicodeFunctor
      * @return a copy of the object.
      */
-    virtual UnicodeFunctor* clone() const;
+    virtual Quantifier* clone() const;
 
     /**
      * Implement UnicodeMatcher
diff --git a/icu4c/source/i18n/rbnf.cpp b/icu4c/source/i18n/rbnf.cpp
index 4078f93..17319fb 100644
--- a/icu4c/source/i18n/rbnf.cpp
+++ b/icu4c/source/i18n/rbnf.cpp
@@ -930,8 +930,8 @@
     dispose();
 }
 
-Format*
-RuleBasedNumberFormat::clone(void) const
+RuleBasedNumberFormat*
+RuleBasedNumberFormat::clone() const
 {
     return new RuleBasedNumberFormat(*this);
 }
diff --git a/icu4c/source/i18n/rbt.cpp b/icu4c/source/i18n/rbt.cpp
index 50bffb3..4cef242 100644
--- a/icu4c/source/i18n/rbt.cpp
+++ b/icu4c/source/i18n/rbt.cpp
@@ -191,8 +191,8 @@
     }
 }
 
-Transliterator* // Covariant return NOT ALLOWED (for portability)
-RuleBasedTransliterator::clone(void) const {
+RuleBasedTransliterator*
+RuleBasedTransliterator::clone() const {
     return new RuleBasedTransliterator(*this);
 }
 
diff --git a/icu4c/source/i18n/rbt.h b/icu4c/source/i18n/rbt.h
index 671149f..97ef01e 100644
--- a/icu4c/source/i18n/rbt.h
+++ b/icu4c/source/i18n/rbt.h
@@ -144,7 +144,7 @@
      * Implement Transliterator API.
      * @internal Use transliterator factory methods instead since this class will be removed in that release.
      */
-    virtual Transliterator* clone(void) const;
+    virtual RuleBasedTransliterator* clone() const;
 
 protected:
     /**
diff --git a/icu4c/source/i18n/rbtz.cpp b/icu4c/source/i18n/rbtz.cpp
index 4864555..3249a32 100644
--- a/icu4c/source/i18n/rbtz.cpp
+++ b/icu4c/source/i18n/rbtz.cpp
@@ -356,8 +356,8 @@
     fUpToDate = FALSE;
 }
 
-TimeZone*
-RuleBasedTimeZone::clone(void) const {
+RuleBasedTimeZone*
+RuleBasedTimeZone::clone() const {
     return new RuleBasedTimeZone(*this);
 }
 
diff --git a/icu4c/source/i18n/reldtfmt.cpp b/icu4c/source/i18n/reldtfmt.cpp
index 5e7dddd..271bda0 100644
--- a/icu4c/source/i18n/reldtfmt.cpp
+++ b/icu4c/source/i18n/reldtfmt.cpp
@@ -131,7 +131,7 @@
 }
 
 
-Format* RelativeDateFormat::clone(void) const {
+RelativeDateFormat* RelativeDateFormat::clone() const {
     return new RelativeDateFormat(*this);
 }
 
diff --git a/icu4c/source/i18n/reldtfmt.h b/icu4c/source/i18n/reldtfmt.h
index aa5f923..ff48d3b 100644
--- a/icu4c/source/i18n/reldtfmt.h
+++ b/icu4c/source/i18n/reldtfmt.h
@@ -71,7 +71,7 @@
      * @return    A copy of the object.
      * @internal ICU 3.8
      */
-    virtual Format* clone(void) const;
+    virtual RelativeDateFormat* clone() const;
 
     /**
      * Return true if the given Format objects are semantically equal. Objects
diff --git a/icu4c/source/i18n/remtrans.cpp b/icu4c/source/i18n/remtrans.cpp
index 70a6ed3..c198e65 100644
--- a/icu4c/source/i18n/remtrans.cpp
+++ b/icu4c/source/i18n/remtrans.cpp
@@ -48,8 +48,8 @@
 
 RemoveTransliterator::~RemoveTransliterator() {}
 
-Transliterator* RemoveTransliterator::clone(void) const {
-    Transliterator* result = new RemoveTransliterator();
+RemoveTransliterator* RemoveTransliterator::clone() const {
+    RemoveTransliterator* result = new RemoveTransliterator();
     if (result != NULL && getFilter() != 0) {
         result->adoptFilter((UnicodeFilter*)(getFilter()->clone()));
     }
diff --git a/icu4c/source/i18n/remtrans.h b/icu4c/source/i18n/remtrans.h
index ed038d5..13de015 100644
--- a/icu4c/source/i18n/remtrans.h
+++ b/icu4c/source/i18n/remtrans.h
@@ -47,7 +47,7 @@
      * Transliterator API.
      * @return A copy of the object.
      */
-    virtual Transliterator* clone(void) const;
+    virtual RemoveTransliterator* clone() const;
 
     /**
      * Implements {@link Transliterator#handleTransliterate}.
diff --git a/icu4c/source/i18n/rulebasedcollator.cpp b/icu4c/source/i18n/rulebasedcollator.cpp
index 92fa538..60acf17 100644
--- a/icu4c/source/i18n/rulebasedcollator.cpp
+++ b/icu4c/source/i18n/rulebasedcollator.cpp
@@ -220,7 +220,7 @@
     actualLocaleIsSameAsValid = FALSE;
 }
 
-Collator *
+RuleBasedCollator *
 RuleBasedCollator::clone() const {
     return new RuleBasedCollator(*this);
 }
diff --git a/icu4c/source/i18n/scientificnumberformatter.cpp b/icu4c/source/i18n/scientificnumberformatter.cpp
index 03d98dd..6c2cb3a 100644
--- a/icu4c/source/i18n/scientificnumberformatter.cpp
+++ b/icu4c/source/i18n/scientificnumberformatter.cpp
@@ -121,7 +121,7 @@
     return result;
 }
 
-ScientificNumberFormatter::Style *ScientificNumberFormatter::SuperscriptStyle::clone() const {
+ScientificNumberFormatter::SuperscriptStyle *ScientificNumberFormatter::SuperscriptStyle::clone() const {
     return new ScientificNumberFormatter::SuperscriptStyle(*this);
 }
 
@@ -195,7 +195,7 @@
     return appendTo;
 }
 
-ScientificNumberFormatter::Style *ScientificNumberFormatter::MarkupStyle::clone() const {
+ScientificNumberFormatter::MarkupStyle *ScientificNumberFormatter::MarkupStyle::clone() const {
     return new ScientificNumberFormatter::MarkupStyle(*this);
 }
 
diff --git a/icu4c/source/i18n/selfmt.cpp b/icu4c/source/i18n/selfmt.cpp
index 29aee36..47e53d7 100644
--- a/icu4c/source/i18n/selfmt.cpp
+++ b/icu4c/source/i18n/selfmt.cpp
@@ -151,7 +151,7 @@
     return msgStart;
 }
 
-Format* SelectFormat::clone() const
+SelectFormat* SelectFormat::clone() const
 {
     return new SelectFormat(*this);
 }
diff --git a/icu4c/source/i18n/simpletz.cpp b/icu4c/source/i18n/simpletz.cpp
index cbf1f9d..7972e2b 100644
--- a/icu4c/source/i18n/simpletz.cpp
+++ b/icu4c/source/i18n/simpletz.cpp
@@ -243,7 +243,7 @@
 // -------------------------------------
 
 // Called by TimeZone::createDefault() inside a Mutex - be careful.
-TimeZone*
+SimpleTimeZone*
 SimpleTimeZone::clone() const
 {
     return new SimpleTimeZone(*this);
diff --git a/icu4c/source/i18n/smpdtfmt.cpp b/icu4c/source/i18n/smpdtfmt.cpp
index 1e837c35..c17e54f 100644
--- a/icu4c/source/i18n/smpdtfmt.cpp
+++ b/icu4c/source/i18n/smpdtfmt.cpp
@@ -620,7 +620,7 @@
 
 //----------------------------------------------------------------------
 
-Format*
+SimpleDateFormat*
 SimpleDateFormat::clone() const
 {
     return new SimpleDateFormat(*this);
diff --git a/icu4c/source/i18n/strmatch.cpp b/icu4c/source/i18n/strmatch.cpp
index aa9e7ae..a20f787 100644
--- a/icu4c/source/i18n/strmatch.cpp
+++ b/icu4c/source/i18n/strmatch.cpp
@@ -58,7 +58,7 @@
 /**
  * Implement UnicodeFunctor
  */
-UnicodeFunctor* StringMatcher::clone() const {
+StringMatcher* StringMatcher::clone() const {
     return new StringMatcher(*this);
 }
 
diff --git a/icu4c/source/i18n/strmatch.h b/icu4c/source/i18n/strmatch.h
index 8ebdb30..71ae984 100644
--- a/icu4c/source/i18n/strmatch.h
+++ b/icu4c/source/i18n/strmatch.h
@@ -78,7 +78,7 @@
      * Implement UnicodeFunctor
      * @return a copy of the object.
      */
-    virtual UnicodeFunctor* clone() const;
+    virtual StringMatcher* clone() const;
 
     /**
      * UnicodeFunctor API.  Cast 'this' to a UnicodeMatcher* pointer
diff --git a/icu4c/source/i18n/strrepl.cpp b/icu4c/source/i18n/strrepl.cpp
index 0eef3d4..9fafeb2 100644
--- a/icu4c/source/i18n/strrepl.cpp
+++ b/icu4c/source/i18n/strrepl.cpp
@@ -87,7 +87,7 @@
 /**
  * Implement UnicodeFunctor
  */
-UnicodeFunctor* StringReplacer::clone() const {
+StringReplacer* StringReplacer::clone() const {
     return new StringReplacer(*this);
 }
 
diff --git a/icu4c/source/i18n/strrepl.h b/icu4c/source/i18n/strrepl.h
index feec058..7f74d0d 100644
--- a/icu4c/source/i18n/strrepl.h
+++ b/icu4c/source/i18n/strrepl.h
@@ -111,7 +111,7 @@
     /**
      * Implement UnicodeFunctor
      */
-    virtual UnicodeFunctor* clone() const;
+    virtual StringReplacer* clone() const;
 
     /**
      * UnicodeFunctor API.  Cast 'this' to a UnicodeReplacer* pointer
diff --git a/icu4c/source/i18n/stsearch.cpp b/icu4c/source/i18n/stsearch.cpp
index c556567..3e6ed46 100644
--- a/icu4c/source/i18n/stsearch.cpp
+++ b/icu4c/source/i18n/stsearch.cpp
@@ -282,7 +282,7 @@
     usearch_reset(m_strsrch_);
 }
 
-SearchIterator * StringSearch::safeClone(void) const
+StringSearch * StringSearch::safeClone() const
 {
     UErrorCode status = U_ZERO_ERROR;
     StringSearch *result = new StringSearch(m_pattern_, m_text_,
diff --git a/icu4c/source/i18n/taiwncal.cpp b/icu4c/source/i18n/taiwncal.cpp
index dfd5f3c..27352aa 100644
--- a/icu4c/source/i18n/taiwncal.cpp
+++ b/icu4c/source/i18n/taiwncal.cpp
@@ -53,7 +53,7 @@
     return *this;
 }
 
-Calendar* TaiwanCalendar::clone(void) const
+TaiwanCalendar* TaiwanCalendar::clone() const
 {
     return new TaiwanCalendar(*this);
 }
diff --git a/icu4c/source/i18n/taiwncal.h b/icu4c/source/i18n/taiwncal.h
index a1c25df..01d4d31 100644
--- a/icu4c/source/i18n/taiwncal.h
+++ b/icu4c/source/i18n/taiwncal.h
@@ -91,7 +91,7 @@
      * @return    return a polymorphic copy of this calendar.
      * @internal
      */
-    virtual Calendar* clone(void) const;
+    virtual TaiwanCalendar* clone() const;
 
 public:
     /**
diff --git a/icu4c/source/i18n/titletrn.cpp b/icu4c/source/i18n/titletrn.cpp
index 9b37d7f..9c39b46 100644
--- a/icu4c/source/i18n/titletrn.cpp
+++ b/icu4c/source/i18n/titletrn.cpp
@@ -60,7 +60,7 @@
 /**
  * Transliterator API.
  */
-Transliterator* TitlecaseTransliterator::clone(void) const {
+TitlecaseTransliterator* TitlecaseTransliterator::clone() const {
     return new TitlecaseTransliterator(*this);
 }
 
diff --git a/icu4c/source/i18n/titletrn.h b/icu4c/source/i18n/titletrn.h
index 166378f..4e45ac6 100644
--- a/icu4c/source/i18n/titletrn.h
+++ b/icu4c/source/i18n/titletrn.h
@@ -52,7 +52,7 @@
      * Transliterator API.
      * @return a copy of the object.
      */
-    virtual Transliterator* clone(void) const;
+    virtual TitlecaseTransliterator* clone() const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/icu4c/source/i18n/tmunit.cpp b/icu4c/source/i18n/tmunit.cpp
index f169c30..910489b 100644
--- a/icu4c/source/i18n/tmunit.cpp
+++ b/icu4c/source/i18n/tmunit.cpp
@@ -102,7 +102,7 @@
 :   MeasureUnit(other), fTimeUnitField(other.fTimeUnitField) {
 }
 
-UObject* 
+TimeUnit* 
 TimeUnit::clone() const {
     return new TimeUnit(*this);
 }
diff --git a/icu4c/source/i18n/tmutamt.cpp b/icu4c/source/i18n/tmutamt.cpp
index a69fe57..2546469 100644
--- a/icu4c/source/i18n/tmutamt.cpp
+++ b/icu4c/source/i18n/tmutamt.cpp
@@ -50,7 +50,7 @@
     return Measure::operator==(other);
 }
 
-UObject* 
+TimeUnitAmount* 
 TimeUnitAmount::clone() const {
     return new TimeUnitAmount(*this);
 }
diff --git a/icu4c/source/i18n/tmutfmt.cpp b/icu4c/source/i18n/tmutfmt.cpp
index dad8825..2a4273e 100644
--- a/icu4c/source/i18n/tmutfmt.cpp
+++ b/icu4c/source/i18n/tmutfmt.cpp
@@ -136,8 +136,8 @@
 }
 
 
-Format*
-TimeUnitFormat::clone(void) const {
+TimeUnitFormat*
+TimeUnitFormat::clone() const {
     return new TimeUnitFormat(*this);
 }
 
diff --git a/icu4c/source/i18n/tolowtrn.cpp b/icu4c/source/i18n/tolowtrn.cpp
index 6dae6f1..2893278 100644
--- a/icu4c/source/i18n/tolowtrn.cpp
+++ b/icu4c/source/i18n/tolowtrn.cpp
@@ -58,7 +58,7 @@
 /**
  * Transliterator API.
  */
-Transliterator* LowercaseTransliterator::clone(void) const {
+LowercaseTransliterator* LowercaseTransliterator::clone() const {
     return new LowercaseTransliterator(*this);
 }
 
diff --git a/icu4c/source/i18n/tolowtrn.h b/icu4c/source/i18n/tolowtrn.h
index e311431..2fbfb90 100644
--- a/icu4c/source/i18n/tolowtrn.h
+++ b/icu4c/source/i18n/tolowtrn.h
@@ -50,7 +50,7 @@
      * Transliterator API.
      * @return a copy of the object.
      */
-    virtual Transliterator* clone(void) const;
+    virtual LowercaseTransliterator* clone() const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/icu4c/source/i18n/toupptrn.cpp b/icu4c/source/i18n/toupptrn.cpp
index 098dba9..2a8b78b 100644
--- a/icu4c/source/i18n/toupptrn.cpp
+++ b/icu4c/source/i18n/toupptrn.cpp
@@ -58,7 +58,7 @@
 /**
  * Transliterator API.
  */
-Transliterator* UppercaseTransliterator::clone(void) const {
+UppercaseTransliterator* UppercaseTransliterator::clone() const {
     return new UppercaseTransliterator(*this);
 }
 
diff --git a/icu4c/source/i18n/toupptrn.h b/icu4c/source/i18n/toupptrn.h
index 677a04e..e96ca8f 100644
--- a/icu4c/source/i18n/toupptrn.h
+++ b/icu4c/source/i18n/toupptrn.h
@@ -50,7 +50,7 @@
      * Transliterator API.
      * @return a copy of the object.
      */
-    virtual Transliterator* clone(void) const;
+    virtual UppercaseTransliterator* clone() const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/icu4c/source/i18n/tzfmt.cpp b/icu4c/source/i18n/tzfmt.cpp
index c16fb59..f87f0f6 100644
--- a/icu4c/source/i18n/tzfmt.cpp
+++ b/icu4c/source/i18n/tzfmt.cpp
@@ -505,7 +505,7 @@
     return isEqual;
 }
 
-Format*
+TimeZoneFormat*
 TimeZoneFormat::clone() const {
     return new TimeZoneFormat(*this);
 }
diff --git a/icu4c/source/i18n/tznames.cpp b/icu4c/source/i18n/tznames.cpp
index 50d7a66..d789c12 100644
--- a/icu4c/source/i18n/tznames.cpp
+++ b/icu4c/source/i18n/tznames.cpp
@@ -106,7 +106,7 @@
 
     virtual UBool operator==(const TimeZoneNames& other) const;
     virtual UBool operator!=(const TimeZoneNames& other) const {return !operator==(other);}
-    virtual TimeZoneNames* clone() const;
+    virtual TimeZoneNamesDelegate* clone() const;
 
     StringEnumeration* getAvailableMetaZoneIDs(UErrorCode& status) const;
     StringEnumeration* getAvailableMetaZoneIDs(const UnicodeString& tzID, UErrorCode& status) const;
@@ -233,7 +233,7 @@
     return FALSE;
 }
 
-TimeZoneNames*
+TimeZoneNamesDelegate*
 TimeZoneNamesDelegate::clone() const {
     TimeZoneNamesDelegate* other = new TimeZoneNamesDelegate();
     if (other != NULL) {
diff --git a/icu4c/source/i18n/tznames_impl.cpp b/icu4c/source/i18n/tznames_impl.cpp
index d92f5fb..186aaaf 100644
--- a/icu4c/source/i18n/tznames_impl.cpp
+++ b/icu4c/source/i18n/tznames_impl.cpp
@@ -1113,7 +1113,7 @@
     return FALSE;
 }
 
-TimeZoneNames*
+TimeZoneNamesImpl*
 TimeZoneNamesImpl::clone() const {
     UErrorCode status = U_ZERO_ERROR;
     return new TimeZoneNamesImpl(fLocale, status);
@@ -2165,7 +2165,7 @@
     return FALSE;
 }
 
-TimeZoneNames*
+TZDBTimeZoneNames*
 TZDBTimeZoneNames::clone() const {
     return new TZDBTimeZoneNames(fLocale);
 }
diff --git a/icu4c/source/i18n/tznames_impl.h b/icu4c/source/i18n/tznames_impl.h
index 4db036e..1286eeb 100644
--- a/icu4c/source/i18n/tznames_impl.h
+++ b/icu4c/source/i18n/tznames_impl.h
@@ -174,7 +174,7 @@
     virtual ~TimeZoneNamesImpl();
 
     virtual UBool operator==(const TimeZoneNames& other) const;
-    virtual TimeZoneNames* clone() const;
+    virtual TimeZoneNamesImpl* clone() const;
 
     StringEnumeration* getAvailableMetaZoneIDs(UErrorCode& status) const;
     StringEnumeration* getAvailableMetaZoneIDs(const UnicodeString& tzID, UErrorCode& status) const;
@@ -236,7 +236,7 @@
     virtual ~TZDBTimeZoneNames();
 
     virtual UBool operator==(const TimeZoneNames& other) const;
-    virtual TimeZoneNames* clone() const;
+    virtual TZDBTimeZoneNames* clone() const;
 
     StringEnumeration* getAvailableMetaZoneIDs(UErrorCode& status) const;
     StringEnumeration* getAvailableMetaZoneIDs(const UnicodeString& tzID, UErrorCode& status) const;
diff --git a/icu4c/source/i18n/tzrule.cpp b/icu4c/source/i18n/tzrule.cpp
index f4ede7c..759a2d4 100644
--- a/icu4c/source/i18n/tzrule.cpp
+++ b/icu4c/source/i18n/tzrule.cpp
@@ -108,7 +108,7 @@
 }
 
 InitialTimeZoneRule*
-InitialTimeZoneRule::clone(void) const {
+InitialTimeZoneRule::clone() const {
     return new InitialTimeZoneRule(*this);
 }
 
diff --git a/icu4c/source/i18n/unesctrn.cpp b/icu4c/source/i18n/unesctrn.cpp
index 86c55d1..0636fe1 100644
--- a/icu4c/source/i18n/unesctrn.cpp
+++ b/icu4c/source/i18n/unesctrn.cpp
@@ -164,7 +164,7 @@
 /**
  * Transliterator API.
  */
-Transliterator* UnescapeTransliterator::clone() const {
+UnescapeTransliterator* UnescapeTransliterator::clone() const {
     return new UnescapeTransliterator(*this);
 }
 
diff --git a/icu4c/source/i18n/unesctrn.h b/icu4c/source/i18n/unesctrn.h
index e8e171f..57dd8d3 100644
--- a/icu4c/source/i18n/unesctrn.h
+++ b/icu4c/source/i18n/unesctrn.h
@@ -77,7 +77,7 @@
     /**
      * Transliterator API.
      */
-    virtual Transliterator* clone() const;
+    virtual UnescapeTransliterator* clone() const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/icu4c/source/i18n/uni2name.cpp b/icu4c/source/i18n/uni2name.cpp
index a56f1a6..41d5c93 100644
--- a/icu4c/source/i18n/uni2name.cpp
+++ b/icu4c/source/i18n/uni2name.cpp
@@ -60,7 +60,7 @@
 /**
  * Transliterator API.
  */
-Transliterator* UnicodeNameTransliterator::clone(void) const {
+UnicodeNameTransliterator* UnicodeNameTransliterator::clone() const {
     return new UnicodeNameTransliterator(*this);
 }
 
diff --git a/icu4c/source/i18n/uni2name.h b/icu4c/source/i18n/uni2name.h
index 4d6eaa0..99309c8 100644
--- a/icu4c/source/i18n/uni2name.h
+++ b/icu4c/source/i18n/uni2name.h
@@ -48,7 +48,7 @@
     /**
      * Transliterator API.
      */
-    virtual Transliterator* clone(void) const;
+    virtual UnicodeNameTransliterator* clone() const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/icu4c/source/i18n/unicode/calendar.h b/icu4c/source/i18n/unicode/calendar.h
index fd86be3..6d9d1e4 100644
--- a/icu4c/source/i18n/unicode/calendar.h
+++ b/icu4c/source/i18n/unicode/calendar.h
@@ -289,7 +289,7 @@
      * @return    a polymorphic copy of this calendar.
      * @stable ICU 2.0
      */
-    virtual Calendar* clone(void) const = 0;
+    virtual Calendar* clone() const = 0;
 
     /**
      * Creates a Calendar using the default timezone and locale. Clients are responsible
diff --git a/icu4c/source/i18n/unicode/choicfmt.h b/icu4c/source/i18n/unicode/choicfmt.h
index 67a9d93..54c2e13 100644
--- a/icu4c/source/i18n/unicode/choicfmt.h
+++ b/icu4c/source/i18n/unicode/choicfmt.h
@@ -250,7 +250,7 @@
      * @return a copy of this object
      * @deprecated ICU 49 Use MessageFormat instead, with plural and select arguments.
      */
-    virtual Format* clone(void) const;
+    virtual ChoiceFormat* clone() const;
 
     /**
      * Returns true if the given Format objects are semantically equal.
diff --git a/icu4c/source/i18n/unicode/coll.h b/icu4c/source/i18n/unicode/coll.h
index f105bda..861bd5c 100644
--- a/icu4c/source/i18n/unicode/coll.h
+++ b/icu4c/source/i18n/unicode/coll.h
@@ -267,7 +267,7 @@
      * @return a copy of this object, owned by the caller
      * @stable ICU 2.0
      */
-    virtual Collator* clone(void) const = 0;
+    virtual Collator* clone() const = 0;
 
     /**
      * Creates the Collator object for the current default locale.
@@ -981,7 +981,7 @@
      * @see clone()
      * @deprecated ICU 50 no need to have two methods for cloning
      */
-    virtual Collator* safeClone(void) const;
+    virtual Collator* safeClone() const;
 
     /**
      * Get the sort key as an array of bytes from a UnicodeString.
diff --git a/icu4c/source/i18n/unicode/compactdecimalformat.h b/icu4c/source/i18n/unicode/compactdecimalformat.h
index aad8070..9c1e200 100644
--- a/icu4c/source/i18n/unicode/compactdecimalformat.h
+++ b/icu4c/source/i18n/unicode/compactdecimalformat.h
@@ -105,7 +105,7 @@
      * @return    a polymorphic copy of this CompactDecimalFormat.
      * @stable ICU 51
      */
-    Format* clone() const U_OVERRIDE;
+    CompactDecimalFormat* clone() const U_OVERRIDE;
 
     using DecimalFormat::format;
 
diff --git a/icu4c/source/i18n/unicode/curramt.h b/icu4c/source/i18n/unicode/curramt.h
index 18fd3b9..5cfe1cf 100644
--- a/icu4c/source/i18n/unicode/curramt.h
+++ b/icu4c/source/i18n/unicode/curramt.h
@@ -81,7 +81,7 @@
      * have the same class as returned by getDynamicClassID().
      * @stable ICU 3.0
      */
-    virtual UObject* clone() const;
+    virtual CurrencyAmount* clone() const;
 
     /**
      * Destructor
diff --git a/icu4c/source/i18n/unicode/currunit.h b/icu4c/source/i18n/unicode/currunit.h
index f923264..d536e2f 100644
--- a/icu4c/source/i18n/unicode/currunit.h
+++ b/icu4c/source/i18n/unicode/currunit.h
@@ -96,7 +96,7 @@
      * have the same class as returned by getDynamicClassID().
      * @stable ICU 3.0
      */
-    virtual UObject* clone() const;
+    virtual CurrencyUnit* clone() const;
 
     /**
      * Destructor
diff --git a/icu4c/source/i18n/unicode/decimfmt.h b/icu4c/source/i18n/unicode/decimfmt.h
index 13d7b79..c70603d 100644
--- a/icu4c/source/i18n/unicode/decimfmt.h
+++ b/icu4c/source/i18n/unicode/decimfmt.h
@@ -899,7 +899,7 @@
      * @return    a polymorphic copy of this DecimalFormat.
      * @stable ICU 2.0
      */
-    Format* clone(void) const U_OVERRIDE;
+    DecimalFormat* clone() const U_OVERRIDE;
 
     /**
      * Return true if the given Format objects are semantically equal.
diff --git a/icu4c/source/i18n/unicode/dtitvfmt.h b/icu4c/source/i18n/unicode/dtitvfmt.h
index 3afb9c4..23fc02e 100644
--- a/icu4c/source/i18n/unicode/dtitvfmt.h
+++ b/icu4c/source/i18n/unicode/dtitvfmt.h
@@ -434,7 +434,7 @@
      * @return    A copy of the object.
      * @stable ICU 4.0
      */
-    virtual Format* clone(void) const;
+    virtual DateIntervalFormat* clone() const;
 
     /**
      * Return true if the given Format objects are semantically equal. Objects
diff --git a/icu4c/source/i18n/unicode/dtitvinf.h b/icu4c/source/i18n/unicode/dtitvinf.h
index cfa0d8e..a894d12 100644
--- a/icu4c/source/i18n/unicode/dtitvinf.h
+++ b/icu4c/source/i18n/unicode/dtitvinf.h
@@ -197,7 +197,7 @@
      * @return   a copy of the object
      * @stable ICU 4.0
      */
-    virtual DateIntervalInfo* clone(void) const;
+    virtual DateIntervalInfo* clone() const;
 
     /**
      * Destructor.
diff --git a/icu4c/source/i18n/unicode/dtrule.h b/icu4c/source/i18n/unicode/dtrule.h
index 66afdb8..adab896 100644
--- a/icu4c/source/i18n/unicode/dtrule.h
+++ b/icu4c/source/i18n/unicode/dtrule.h
@@ -128,7 +128,7 @@
      * @return    A copy of the object.
      * @stable ICU 3.8
      */
-    DateTimeRule* clone(void) const;
+    DateTimeRule* clone() const;
 
     /**
      * Assignment operator.
diff --git a/icu4c/source/i18n/unicode/gregocal.h b/icu4c/source/i18n/unicode/gregocal.h
index 8bfb8f4..9249b59 100644
--- a/icu4c/source/i18n/unicode/gregocal.h
+++ b/icu4c/source/i18n/unicode/gregocal.h
@@ -303,7 +303,7 @@
      * @return    return a polymorphic copy of this calendar.
      * @stable ICU 2.0
      */
-    virtual Calendar* clone(void) const;
+    virtual GregorianCalendar* clone() const;
 
     /**
      * Sets the GregorianCalendar change date. This is the point when the switch from
diff --git a/icu4c/source/i18n/unicode/measfmt.h b/icu4c/source/i18n/unicode/measfmt.h
index a41aa88..df79c0f 100644
--- a/icu4c/source/i18n/unicode/measfmt.h
+++ b/icu4c/source/i18n/unicode/measfmt.h
@@ -153,7 +153,7 @@
      * Clones this object polymorphically.
      * @stable ICU 53
      */
-    virtual Format *clone() const;
+    virtual MeasureFormat *clone() const;
 
     /**
      * Formats object to produce a string.
diff --git a/icu4c/source/i18n/unicode/measunit.h b/icu4c/source/i18n/unicode/measunit.h
index 0c04980..8ec3367 100644
--- a/icu4c/source/i18n/unicode/measunit.h
+++ b/icu4c/source/i18n/unicode/measunit.h
@@ -64,7 +64,7 @@
      * have the same class as returned by getDynamicClassID().
      * @stable ICU 3.0
      */
-    virtual UObject* clone() const;
+    virtual MeasureUnit* clone() const;
 
     /**
      * Destructor
diff --git a/icu4c/source/i18n/unicode/measure.h b/icu4c/source/i18n/unicode/measure.h
index ea17a70..fa9c293 100644
--- a/icu4c/source/i18n/unicode/measure.h
+++ b/icu4c/source/i18n/unicode/measure.h
@@ -74,7 +74,7 @@
      * have the same class as returned by getDynamicClassID().
      * @stable ICU 3.0
      */
-    virtual UObject* clone() const;
+    virtual Measure* clone() const;
 
     /**
      * Destructor
diff --git a/icu4c/source/i18n/unicode/msgfmt.h b/icu4c/source/i18n/unicode/msgfmt.h
index e3db8e8..99b0eae 100644
--- a/icu4c/source/i18n/unicode/msgfmt.h
+++ b/icu4c/source/i18n/unicode/msgfmt.h
@@ -420,7 +420,7 @@
      * result and should delete it when done.
      * @stable ICU 2.0
      */
-    virtual Format* clone(void) const;
+    virtual MessageFormat* clone() const;
 
     /**
      * Returns true if the given Format objects are semantically equal.
@@ -1089,7 +1089,7 @@
     class U_I18N_API DummyFormat : public Format {
     public:
         virtual UBool operator==(const Format&) const;
-        virtual Format* clone() const;
+        virtual DummyFormat* clone() const;
         virtual UnicodeString& format(const Formattable& obj,
                               UnicodeString& appendTo,
                               UErrorCode& status) const;
diff --git a/icu4c/source/i18n/unicode/nounit.h b/icu4c/source/i18n/unicode/nounit.h
index de33fbb..e1da7c5 100644
--- a/icu4c/source/i18n/unicode/nounit.h
+++ b/icu4c/source/i18n/unicode/nounit.h
@@ -74,7 +74,7 @@
      * have the same class as returned by getDynamicClassID().
      * @draft ICU 60
      */
-    virtual UObject* clone() const;
+    virtual NoUnit* clone() const;
 
     /**
      * Returns a unique class ID for this object POLYMORPHICALLY.
diff --git a/icu4c/source/i18n/unicode/plurfmt.h b/icu4c/source/i18n/unicode/plurfmt.h
index 1900b18..fb9a433 100644
--- a/icu4c/source/i18n/unicode/plurfmt.h
+++ b/icu4c/source/i18n/unicode/plurfmt.h
@@ -450,7 +450,7 @@
      * result and should delete it when done.
      * @stable ICU 4.0
      */
-    virtual Format* clone(void) const;
+    virtual PluralFormat* clone() const;
 
    /**
     * Formats a plural message for a number taken from a Formattable object.
diff --git a/icu4c/source/i18n/unicode/rbnf.h b/icu4c/source/i18n/unicode/rbnf.h
index a7c543e..62b0232 100644
--- a/icu4c/source/i18n/unicode/rbnf.h
+++ b/icu4c/source/i18n/unicode/rbnf.h
@@ -698,7 +698,7 @@
    * @return  A copy of the object.
    * @stable ICU 2.6
    */
-  virtual Format* clone(void) const;
+  virtual RuleBasedNumberFormat* clone() const;
 
   /**
    * Return true if the given Format objects are semantically equal.
diff --git a/icu4c/source/i18n/unicode/rbtz.h b/icu4c/source/i18n/unicode/rbtz.h
index 3884a97..56d6f1c 100644
--- a/icu4c/source/i18n/unicode/rbtz.h
+++ b/icu4c/source/i18n/unicode/rbtz.h
@@ -123,7 +123,7 @@
      * @return   A new copy of this TimeZone object.
      * @stable ICU 3.8
      */
-    virtual TimeZone* clone(void) const;
+    virtual RuleBasedTimeZone* clone() const;
 
     /**
      * Returns the TimeZone's adjusted GMT offset (i.e., the number of milliseconds to add
diff --git a/icu4c/source/i18n/unicode/scientificnumberformatter.h b/icu4c/source/i18n/unicode/scientificnumberformatter.h
index cd358dc..7f860d4 100644
--- a/icu4c/source/i18n/unicode/scientificnumberformatter.h
+++ b/icu4c/source/i18n/unicode/scientificnumberformatter.h
@@ -159,7 +159,7 @@
 
     class U_I18N_API SuperscriptStyle : public Style {
     public:
-        virtual Style *clone() const;
+        virtual SuperscriptStyle *clone() const;
     protected:
         virtual UnicodeString &format(
                 const UnicodeString &original,
@@ -177,7 +177,7 @@
                 : Style(),
                   fBeginMarkup(beginMarkup),
                   fEndMarkup(endMarkup) { }
-        virtual Style *clone() const;
+        virtual MarkupStyle *clone() const;
     protected:
         virtual UnicodeString &format(
                 const UnicodeString &original,
diff --git a/icu4c/source/i18n/unicode/selfmt.h b/icu4c/source/i18n/unicode/selfmt.h
index f30aab0..9b98f6d 100755
--- a/icu4c/source/i18n/unicode/selfmt.h
+++ b/icu4c/source/i18n/unicode/selfmt.h
@@ -275,7 +275,7 @@
      * result and should delete it when done.
      * @stable ICU 4.4
      */
-    virtual Format* clone(void) const;
+    virtual SelectFormat* clone() const;
 
     /**
      * Format an object to produce a string.
diff --git a/icu4c/source/i18n/unicode/simpletz.h b/icu4c/source/i18n/unicode/simpletz.h
index 34263b6..f8e2a74 100644
--- a/icu4c/source/i18n/unicode/simpletz.h
+++ b/icu4c/source/i18n/unicode/simpletz.h
@@ -705,7 +705,7 @@
      * @return   A new copy of this TimeZone object.
      * @stable ICU 2.0
      */
-    virtual TimeZone* clone(void) const;
+    virtual SimpleTimeZone* clone() const;
 
     /**
      * Gets the first time zone transition after the base time.
diff --git a/icu4c/source/i18n/unicode/smpdtfmt.h b/icu4c/source/i18n/unicode/smpdtfmt.h
index e7299cb..8a7a176 100644
--- a/icu4c/source/i18n/unicode/smpdtfmt.h
+++ b/icu4c/source/i18n/unicode/smpdtfmt.h
@@ -867,7 +867,7 @@
      * @return    A copy of the object.
      * @stable ICU 2.0
      */
-    virtual Format* clone(void) const;
+    virtual SimpleDateFormat* clone() const;
 
     /**
      * Return true if the given Format objects are semantically equal. Objects
diff --git a/icu4c/source/i18n/unicode/stsearch.h b/icu4c/source/i18n/unicode/stsearch.h
index 410495f..7ca93f0 100644
--- a/icu4c/source/i18n/unicode/stsearch.h
+++ b/icu4c/source/i18n/unicode/stsearch.h
@@ -414,7 +414,7 @@
      * @return cloned object
      * @stable ICU 2.0
      */
-    virtual SearchIterator * safeClone(void) const;
+    virtual StringSearch * safeClone() const;
     
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
diff --git a/icu4c/source/i18n/unicode/tblcoll.h b/icu4c/source/i18n/unicode/tblcoll.h
index 35adba8..c4471b0 100644
--- a/icu4c/source/i18n/unicode/tblcoll.h
+++ b/icu4c/source/i18n/unicode/tblcoll.h
@@ -230,7 +230,7 @@
      * @return a copy of this object, owned by the caller
      * @stable ICU 2.0
      */
-    virtual Collator* clone(void) const;
+    virtual RuleBasedCollator* clone() const;
 
     /**
      * Creates a collation element iterator for the source string. The caller of
diff --git a/icu4c/source/i18n/unicode/timezone.h b/icu4c/source/i18n/unicode/timezone.h
index badd26c..5c361e7 100644
--- a/icu4c/source/i18n/unicode/timezone.h
+++ b/icu4c/source/i18n/unicode/timezone.h
@@ -754,7 +754,7 @@
      * @return   A new copy of this TimeZone object.
      * @stable ICU 2.0
      */
-    virtual TimeZone* clone(void) const = 0;
+    virtual TimeZone* clone() const = 0;
 
     /**
      * Return the class ID for this class.  This is useful only for
diff --git a/icu4c/source/i18n/unicode/tmunit.h b/icu4c/source/i18n/unicode/tmunit.h
index 2c4d9da..2e949dd 100644
--- a/icu4c/source/i18n/unicode/tmunit.h
+++ b/icu4c/source/i18n/unicode/tmunit.h
@@ -73,7 +73,7 @@
      * Override clone.
      * @stable ICU 4.2
      */
-    virtual UObject* clone() const;
+    virtual TimeUnit* clone() const;
 
     /**
      * Copy operator.
diff --git a/icu4c/source/i18n/unicode/tmutamt.h b/icu4c/source/i18n/unicode/tmutamt.h
index b540996..8bcc684 100644
--- a/icu4c/source/i18n/unicode/tmutamt.h
+++ b/icu4c/source/i18n/unicode/tmutamt.h
@@ -87,7 +87,7 @@
      * @return a polymorphic clone of this object. The result will have the same               class as returned by getDynamicClassID().
      * @stable ICU 4.2
      */
-    virtual UObject* clone() const;
+    virtual TimeUnitAmount* clone() const;
 
     
     /**
diff --git a/icu4c/source/i18n/unicode/tmutfmt.h b/icu4c/source/i18n/unicode/tmutfmt.h
index b92029c..82be597 100644
--- a/icu4c/source/i18n/unicode/tmutfmt.h
+++ b/icu4c/source/i18n/unicode/tmutfmt.h
@@ -126,7 +126,7 @@
      * @return    A copy of the object.
      * @deprecated ICU 53
      */
-    virtual Format* clone(void) const;
+    virtual TimeUnitFormat* clone() const;
 
     /**
      * Assignment operator
diff --git a/icu4c/source/i18n/unicode/tzfmt.h b/icu4c/source/i18n/unicode/tzfmt.h
index 070fcd3..6d3863b 100644
--- a/icu4c/source/i18n/unicode/tzfmt.h
+++ b/icu4c/source/i18n/unicode/tzfmt.h
@@ -307,7 +307,7 @@
      * @return A copy of the object
      * @stable ICU 50
      */
-    virtual Format* clone() const;
+    virtual TimeZoneFormat* clone() const;
 
     /**
      * Creates an instance of <code>TimeZoneFormat</code> for the given locale.
diff --git a/icu4c/source/i18n/unicode/tzrule.h b/icu4c/source/i18n/unicode/tzrule.h
index 6cce299..795806d 100644
--- a/icu4c/source/i18n/unicode/tzrule.h
+++ b/icu4c/source/i18n/unicode/tzrule.h
@@ -47,7 +47,7 @@
      * @return  A copy of the object.
      * @stable ICU 3.8
      */
-    virtual TimeZoneRule* clone(void) const = 0;
+    virtual TimeZoneRule* clone() const = 0;
 
     /**
      * Return true if the given <code>TimeZoneRule</code> objects are semantically equal. Objects
@@ -231,7 +231,7 @@
      * @return    A copy of the object.
      * @stable ICU 3.8
      */
-    virtual InitialTimeZoneRule* clone(void) const;
+    virtual InitialTimeZoneRule* clone() const;
 
     /**
      * Assignment operator.
@@ -442,7 +442,7 @@
      * @return    A copy of the object.
      * @stable ICU 3.8
      */
-    virtual AnnualTimeZoneRule* clone(void) const;
+    virtual AnnualTimeZoneRule* clone() const;
 
     /**
      * Assignment operator.
@@ -658,7 +658,7 @@
      * @return    A copy of the object.
      * @stable ICU 3.8
      */
-    virtual TimeArrayTimeZoneRule* clone(void) const;
+    virtual TimeArrayTimeZoneRule* clone() const;
 
     /**
      * Assignment operator.
diff --git a/icu4c/source/i18n/unicode/tztrans.h b/icu4c/source/i18n/unicode/tztrans.h
index 34f9a91..217d711 100644
--- a/icu4c/source/i18n/unicode/tztrans.h
+++ b/icu4c/source/i18n/unicode/tztrans.h
@@ -70,7 +70,7 @@
      * @return  A copy of the object.
      * @stable ICU 3.8
      */
-    TimeZoneTransition* clone(void) const;
+    TimeZoneTransition* clone() const;
 
     /**
      * Assignment operator.
diff --git a/icu4c/source/i18n/unicode/vtzone.h b/icu4c/source/i18n/unicode/vtzone.h
index f240090..32e22b2 100644
--- a/icu4c/source/i18n/unicode/vtzone.h
+++ b/icu4c/source/i18n/unicode/vtzone.h
@@ -187,7 +187,7 @@
      * @return   A new copy of this TimeZone object.
      * @stable ICU 3.8
      */
-    virtual TimeZone* clone(void) const;
+    virtual VTimeZone* clone() const;
 
     /**
      * Returns the TimeZone's adjusted GMT offset (i.e., the number of milliseconds to add
diff --git a/icu4c/source/i18n/vtzone.cpp b/icu4c/source/i18n/vtzone.cpp
index cb84c62..7308693 100644
--- a/icu4c/source/i18n/vtzone.cpp
+++ b/icu4c/source/i18n/vtzone.cpp
@@ -1177,8 +1177,8 @@
     writeSimple(time, writer, status);
 }
 
-TimeZone*
-VTimeZone::clone(void) const {
+VTimeZone*
+VTimeZone::clone() const {
     return new VTimeZone(*this);
 }
 
diff --git a/icu4c/source/i18n/windtfmt.cpp b/icu4c/source/i18n/windtfmt.cpp
index 6a3779a..bcf272b 100644
--- a/icu4c/source/i18n/windtfmt.cpp
+++ b/icu4c/source/i18n/windtfmt.cpp
@@ -213,7 +213,7 @@
     return *this;
 }
 
-Format *Win32DateFormat::clone(void) const
+Win32DateFormat *Win32DateFormat::clone() const
 {
     return new Win32DateFormat(*this);
 }
diff --git a/icu4c/source/i18n/windtfmt.h b/icu4c/source/i18n/windtfmt.h
index 3306905..7fe7f68 100644
--- a/icu4c/source/i18n/windtfmt.h
+++ b/icu4c/source/i18n/windtfmt.h
@@ -48,7 +48,7 @@
 
     virtual ~Win32DateFormat();
 
-    virtual Format *clone(void) const;
+    virtual Win32DateFormat *clone() const;
 
     Win32DateFormat &operator=(const Win32DateFormat &other);
 
diff --git a/icu4c/source/i18n/winnmfmt.cpp b/icu4c/source/i18n/winnmfmt.cpp
index 5637a0f..72da1be 100644
--- a/icu4c/source/i18n/winnmfmt.cpp
+++ b/icu4c/source/i18n/winnmfmt.cpp
@@ -294,7 +294,7 @@
     return *this;
 }
 
-Format *Win32NumberFormat::clone(void) const
+Win32NumberFormat *Win32NumberFormat::clone() const
 {
     return new Win32NumberFormat(*this);
 }
diff --git a/icu4c/source/i18n/winnmfmt.h b/icu4c/source/i18n/winnmfmt.h
index 6139c1f..99571d2 100644
--- a/icu4c/source/i18n/winnmfmt.h
+++ b/icu4c/source/i18n/winnmfmt.h
@@ -44,7 +44,7 @@
 
     virtual ~Win32NumberFormat();
 
-    virtual Format *clone(void) const;
+    virtual Win32NumberFormat *clone() const;
 
     Win32NumberFormat &operator=(const Win32NumberFormat &other);
 
diff --git a/icu4c/source/test/intltest/apicoll.cpp b/icu4c/source/test/intltest/apicoll.cpp
index 37ce414..a8ee961 100644
--- a/icu4c/source/test/intltest/apicoll.cpp
+++ b/icu4c/source/test/intltest/apicoll.cpp
@@ -2000,7 +2000,7 @@
 class TestCollator  : public Collator
 {
 public:
-    virtual Collator* clone(void) const;
+    virtual TestCollator* clone() const;
 
     using Collator::compare;
 
@@ -2065,7 +2065,7 @@
     //    (compare this vs. o's subclass fields)
 }
 
-Collator* TestCollator::clone() const
+TestCollator* TestCollator::clone() const
 {
     return new TestCollator();
 }
diff --git a/icu4c/source/test/intltest/citrtest.cpp b/icu4c/source/test/intltest/citrtest.cpp
index 375b3c1..e1fed1c 100644
--- a/icu4c/source/test/intltest/citrtest.cpp
+++ b/icu4c/source/test/intltest/citrtest.cpp
@@ -57,7 +57,7 @@
         return TRUE;
     }
 
-    virtual CharacterIterator* clone(void) const {
+    virtual SCharacterIterator* clone(void) const {
         return NULL;
     }
     virtual int32_t hashCode(void) const{
diff --git a/icu4c/source/test/intltest/transtst.cpp b/icu4c/source/test/intltest/transtst.cpp
index 5e84c8b..303f811 100644
--- a/icu4c/source/test/intltest/transtst.cpp
+++ b/icu4c/source/test/intltest/transtst.cpp
@@ -1947,7 +1947,7 @@
 public:
     TestTrans(const UnicodeString& id) : Transliterator(id, 0) {
     }
-    virtual Transliterator* clone(void) const {
+    virtual TestTrans* clone(void) const {
         return new TestTrans(getID());
     }
     virtual void handleTransliterate(Replaceable& /*text*/, UTransPosition& offsets,