diff --git a/src/media/audio/sound/tonelist.cpp b/src/media/audio/sound/tonelist.cpp
index ec2a107b4a92f37a6a344376f2eac036031ce656..9e52dbd6c16d58c9cd12a3c5b52ff73f0842eec3 100644
--- a/src/media/audio/sound/tonelist.cpp
+++ b/src/media/audio/sound/tonelist.cpp
@@ -91,14 +91,9 @@ TelephoneTone::getCountryId(const std::string& countryName)
 }
 
 TelephoneTone::TelephoneTone(const std::string& countryName, unsigned int sampleRate) :
-    currentTone_(Tone::TONE_NULL)
+    currentTone_(Tone::TONE_NULL), countryId_(getCountryId(countryName))
 {
-    TelephoneTone::COUNTRYID countryId = getCountryId(countryName);
-
-    tone_[Tone::TONE_DIALTONE] = new Tone(toneZone[countryId][Tone::TONE_DIALTONE], sampleRate);
-    tone_[Tone::TONE_BUSY] = new Tone(toneZone[countryId][Tone::TONE_BUSY], sampleRate);
-    tone_[Tone::TONE_RINGTONE] = new Tone(toneZone[countryId][Tone::TONE_RINGTONE], sampleRate);
-    tone_[Tone::TONE_CONGESTION] = new Tone(toneZone[countryId][Tone::TONE_CONGESTION], sampleRate);
+    buildTones(sampleRate);
 }
 
 TelephoneTone::~TelephoneTone()
@@ -116,6 +111,14 @@ TelephoneTone::setCurrentTone(Tone::TONEID toneId)
     currentTone_ = toneId;
 }
 
+void
+TelephoneTone::setSampleRate(unsigned int sampleRate)
+{
+    for (size_t i=0; i < Tone::TONE_NULL; i++)
+        delete tone_[i];
+    buildTones(sampleRate);
+}
+
 Tone*
 TelephoneTone::getCurrentTone()
 {
@@ -125,4 +128,13 @@ TelephoneTone::getCurrentTone()
     return tone_[currentTone_];
 }
 
+void
+TelephoneTone::buildTones(unsigned int sampleRate)
+{
+    tone_[Tone::TONE_DIALTONE] = new Tone(toneZone[countryId_][Tone::TONE_DIALTONE], sampleRate);
+    tone_[Tone::TONE_BUSY] = new Tone(toneZone[countryId_][Tone::TONE_BUSY], sampleRate);
+    tone_[Tone::TONE_RINGTONE] = new Tone(toneZone[countryId_][Tone::TONE_RINGTONE], sampleRate);
+    tone_[Tone::TONE_CONGESTION] = new Tone(toneZone[countryId_][Tone::TONE_CONGESTION], sampleRate);
+}
+
 } // namespace ring
diff --git a/src/media/audio/sound/tonelist.h b/src/media/audio/sound/tonelist.h
index f57f4e3c5a618fd578a599254d86a9e985dba3dc..d1614c9f68317f0f7ea19b8aaae5e3d82dbceb08 100644
--- a/src/media/audio/sound/tonelist.h
+++ b/src/media/audio/sound/tonelist.h
@@ -46,6 +46,7 @@ class TelephoneTone {
         ~TelephoneTone();
 
         void setCurrentTone(Tone::TONEID toneId);
+        void setSampleRate(unsigned int sampleRate);
         Tone* getCurrentTone();
 
     private:
@@ -53,6 +54,8 @@ class TelephoneTone {
 
         static COUNTRYID getCountryId(const std::string& countryName);
 
+        void buildTones(unsigned int sampleRate);
+        COUNTRYID countryId_;
         Tone* tone_[Tone::TONE_NULL];
         Tone::TONEID currentTone_;
 };
diff --git a/src/media/audio/tonecontrol.cpp b/src/media/audio/tonecontrol.cpp
index 06331a9bf9cbd28da52643dd1b4032ad74dcc1e4..a4a3ba16e56f5898091d1389a894da1865597bc5 100644
--- a/src/media/audio/tonecontrol.cpp
+++ b/src/media/audio/tonecontrol.cpp
@@ -44,7 +44,10 @@ ToneControl::setSampleRate(unsigned rate)
 {
     std::lock_guard<std::mutex> lk(mutex_);
     sampleRate_ = rate;
-    telephoneTone_.reset(new TelephoneTone(prefs_.getZoneToneChoice(), rate));
+    if (!telephoneTone_)
+        telephoneTone_.reset(new TelephoneTone(prefs_.getZoneToneChoice(), rate));
+    else
+        telephoneTone_->setSampleRate(rate);
 }
 
 AudioLoop*