diff --git a/src/LabelTrack.cpp b/src/LabelTrack.cpp
index d85dd4db0..b56abd4a3 100644
--- a/src/LabelTrack.cpp
+++ b/src/LabelTrack.cpp
@@ -1171,7 +1171,7 @@ double LabelTrack::GetEndTime() const
    return end;
 }
 
-Track::Holder LabelTrack::Duplicate() const
+Track::Holder LabelTrack::Clone() const
 {
    return std::make_shared<LabelTrack>( *this );
 }
diff --git a/src/LabelTrack.h b/src/LabelTrack.h
index 96c839ca0..ae0b4488a 100644
--- a/src/LabelTrack.h
+++ b/src/LabelTrack.h
@@ -156,8 +156,11 @@ class AUDACITY_DLL_API LabelTrack final : public Track
    double GetEndTime() const override;
 
    using Holder = std::shared_ptr<LabelTrack>;
-   Track::Holder Duplicate() const override;
+   
+private:
+   Track::Holder Clone() const override;
 
+public:
    void SetSelected(bool s) override;
 
    bool HandleXMLTag(const wxChar *tag, const wxChar **attrs) override;
diff --git a/src/NoteTrack.cpp b/src/NoteTrack.cpp
index ef5b3527c..8e63380dd 100644
--- a/src/NoteTrack.cpp
+++ b/src/NoteTrack.cpp
@@ -163,7 +163,7 @@ Alg_seq &NoteTrack::GetSeq() const
    return *mSeq;
 }
 
-Track::Holder NoteTrack::Duplicate() const
+Track::Holder NoteTrack::Clone() const
 {
    auto duplicate = std::make_shared<NoteTrack>(mDirManager);
    duplicate->Init(*this);
@@ -925,7 +925,7 @@ void NoteTrack::WriteXML(XMLWriter &xmlFile) const
    if (!mSeq) {
       // replace saveme with an (unserialized) duplicate, which is
       // destroyed at end of function.
-      holder = Duplicate();
+      holder = Clone();
       saveme = static_cast<NoteTrack*>(holder.get());
    }
    saveme->GetSeq().write(data, true);
diff --git a/src/NoteTrack.h b/src/NoteTrack.h
index 2fccefff4..a47f56629 100644
--- a/src/NoteTrack.h
+++ b/src/NoteTrack.h
@@ -67,7 +67,7 @@ class StretchHandle;
 class AUDACITY_DLL_API NoteTrack final
    : public NoteTrackBase
 {
- public:
+public:
    NoteTrack(const std::shared_ptr<DirManager> &projDirManager);
    virtual ~NoteTrack();
 
@@ -77,8 +77,11 @@ class AUDACITY_DLL_API NoteTrack final
       override;
 
    using Holder = std::shared_ptr<NoteTrack>;
-   Track::Holder Duplicate() const override;
+   
+private:
+   Track::Holder Clone() const override;
 
+public:
    double GetOffset() const override;
    double GetStartTime() const override;
    double GetEndTime() const override;
diff --git a/src/TimeTrack.cpp b/src/TimeTrack.cpp
index 73af3310c..f7d2d97b7 100644
--- a/src/TimeTrack.cpp
+++ b/src/TimeTrack.cpp
@@ -177,7 +177,7 @@ void TimeTrack::InsertSilence(double t, double len)
    mEnvelope->InsertSpace(t, len);
 }
 
-Track::Holder TimeTrack::Duplicate() const
+Track::Holder TimeTrack::Clone() const
 {
    return std::make_shared<TimeTrack>(*this);
 }
diff --git a/src/TimeTrack.h b/src/TimeTrack.h
index 5c1e1fac1..ca0c049a4 100644
--- a/src/TimeTrack.h
+++ b/src/TimeTrack.h
@@ -118,7 +118,9 @@ class TimeTrack final : public Track {
    void Init(const TimeTrack &orig);
 
    using Holder = std::unique_ptr<TimeTrack>;
-   Track::Holder Duplicate() const override;
+
+private:
+   Track::Holder Clone() const override;
 
    friend class TrackFactory;
 
diff --git a/src/Track.cpp b/src/Track.cpp
index 03d89fd2e..81009df98 100644
--- a/src/Track.cpp
+++ b/src/Track.cpp
@@ -115,6 +115,16 @@ void Track::Merge(const Track &orig)
    mSelected = orig.mSelected;
 }
 
+Track::Holder Track::Duplicate() const
+{
+   // invoke "virtual constructor" to copy track object proper:
+   auto result = Clone();
+
+   // other steps to be added here
+
+   return result;
+}
+
 Track::~Track()
 {
 }
diff --git a/src/Track.h b/src/Track.h
index 1697ae8c1..19f8bf40e 100644
--- a/src/Track.h
+++ b/src/Track.h
@@ -370,7 +370,8 @@ private:
    void Init(const Track &orig);
 
    using Holder = std::shared_ptr<Track>;
-   virtual Holder Duplicate() const = 0;
+   // public nonvirtual duplication function that invokes Clone():
+   virtual Holder Duplicate() const;
 
    // Called when this track is merged to stereo with another, and should
    // take on some paramaters of its partner.
@@ -431,6 +432,10 @@ public:
    virtual void InsertSilence(double WXUNUSED(t), double WXUNUSED(len)) = 0;
 
 private:
+   // Subclass responsibility implements only a part of Duplicate(), copying
+   // the track data proper (not associated data such as for groups and views):
+   virtual Holder Clone() const = 0;
+
    virtual TrackKind GetKind() const { return TrackKind::None; }
 
    template<typename T>
diff --git a/src/WaveTrack.cpp b/src/WaveTrack.cpp
index b2fb5c4b2..7fc301a8e 100644
--- a/src/WaveTrack.cpp
+++ b/src/WaveTrack.cpp
@@ -401,7 +401,7 @@ int WaveTrack::ZeroLevelYCoordinate(wxRect rect) const
       (int)((mDisplayMax / (mDisplayMax - mDisplayMin)) * rect.height);
 }
 
-Track::Holder WaveTrack::Duplicate() const
+Track::Holder WaveTrack::Clone() const
 {
    return std::make_shared<WaveTrack>( *this );
 }
diff --git a/src/WaveTrack.h b/src/WaveTrack.h
index 2d434ebef..4a4fa0b44 100644
--- a/src/WaveTrack.h
+++ b/src/WaveTrack.h
@@ -95,7 +95,7 @@ public:
 private:
    void Init(const WaveTrack &orig);
 
-   Track::Holder Duplicate() const override;
+   Track::Holder Clone() const override;
 
    friend class TrackFactory;