diff --git a/bin/dbus/configurationmanager-introspec.xml b/bin/dbus/configurationmanager-introspec.xml
index c5fe0b71500603a165b356c52f5b3a2f7cfdda17..fc055d5267867b15574a251b6ad8b6bd52664045 100644
--- a/bin/dbus/configurationmanager-introspec.xml
+++ b/bin/dbus/configurationmanager-introspec.xml
@@ -362,6 +362,22 @@
            </arg>
        </method>
 
+       <method name="muteRingtone" tp:name-for-bindings="muteRingtone">
+           <arg type="b" name="mute" direction="in">
+               <tp:docstring>
+                   True to mute ringtone, false otherwise.
+               </tp:docstring>
+           </arg>
+       </method>
+
+       <method name="isRingtoneMuted" tp:name-for-bindings="isRingtoneMuted">
+           <arg type="b" name="muted" direction="out">
+               <tp:docstring>
+                   Returns true if ringtone is muted, false otherwise.
+               </tp:docstring>
+           </arg>
+       </method>
+
        <method name="getAudioManager" tp:name-for-bindings="getAudioManager">
            <arg type="s" name="api" direction="out">
            </arg>
diff --git a/bin/dbus/dbusconfigurationmanager.cpp b/bin/dbus/dbusconfigurationmanager.cpp
index c0618ad43c6a1c9423ded04858c7bfe976abc2e8..74f95bd439e1e27febfd036895ab92e8e19fb584 100644
--- a/bin/dbus/dbusconfigurationmanager.cpp
+++ b/bin/dbus/dbusconfigurationmanager.cpp
@@ -272,6 +272,18 @@ DBusConfigurationManager::mutePlayback(const bool& mute)
     DRing::mutePlayback(mute);
 }
 
+auto
+DBusConfigurationManager::isRingtoneMuted() -> decltype(DRing::isRingtoneMuted())
+{
+    return DRing::isRingtoneMuted();
+}
+
+void
+DBusConfigurationManager::muteRingtone(const bool& mute)
+{
+    DRing::muteRingtone(mute);
+}
+
 auto
 DBusConfigurationManager::getAudioManager() -> decltype(DRing::getAudioManager())
 {
diff --git a/bin/dbus/dbusconfigurationmanager.h b/bin/dbus/dbusconfigurationmanager.h
index 1d05047318c384492c1b127f69279e87f57355c4..8d66d37fe64a8e10bb8e40c73e96df951d0700d7 100644
--- a/bin/dbus/dbusconfigurationmanager.h
+++ b/bin/dbus/dbusconfigurationmanager.h
@@ -96,6 +96,8 @@ class DBusConfigurationManager :
         void muteCapture(const bool& mute);
         bool isPlaybackMuted();
         void mutePlayback(const bool& mute);
+        bool isRingtoneMuted();
+        void muteRingtone(const bool& mute);
         std::string getAudioManager();
         bool setAudioManager(const std::string& api);
         std::vector<std::string> getSupportedAudioManagers();
diff --git a/src/client/configurationmanager.cpp b/src/client/configurationmanager.cpp
index 9791c5060cd0d15998f4564e352f467f637a5c10..a4ae58ee5d05e2f853c1d682d9858f22048bc868 100644
--- a/src/client/configurationmanager.cpp
+++ b/src/client/configurationmanager.cpp
@@ -716,6 +716,26 @@ mutePlayback(bool mute)
     return;
 }
 
+bool
+isRingtoneMuted()
+{
+    if (auto audiolayer = ring::Manager::instance().getAudioDriver())
+        return audiolayer->isRingtoneMuted();
+
+    RING_ERR("Audio layer not valid");
+    return false;
+}
+
+void
+muteRingtone(bool mute)
+{
+    if (auto audiolayer = ring::Manager::instance().getAudioDriver())
+        return audiolayer->muteRingtone(mute);
+
+    RING_ERR("Audio layer not valid");
+    return;
+}
+
 std::map<std::string, std::string>
 getHookSettings()
 {
diff --git a/src/dring/configurationmanager_interface.h b/src/dring/configurationmanager_interface.h
index 2d2f9c81d5d7d6d38c9d6db1c81e86cc941b6de0..a5422a5fbf541b732939e0c1509b9aca3b3e6de7 100644
--- a/src/dring/configurationmanager_interface.h
+++ b/src/dring/configurationmanager_interface.h
@@ -86,6 +86,8 @@ bool isCaptureMuted();
 void muteCapture(bool mute);
 bool isPlaybackMuted();
 void mutePlayback(bool mute);
+bool isRingtoneMuted();
+void muteRingtone(bool mute);
 
 std::string getAudioManager();
 bool setAudioManager(const std::string& api);
diff --git a/src/media/audio/audiolayer.cpp b/src/media/audio/audiolayer.cpp
index f43663ddfe4dde2f152e5e584b3e44c895090975..8c63d3acf58093384e06ace89ce4ee8f63f6133d 100644
--- a/src/media/audio/audiolayer.cpp
+++ b/src/media/audio/audiolayer.cpp
@@ -130,7 +130,7 @@ const AudioBuffer& AudioLayer::getToRing(AudioFormat format, size_t writableSamp
 
         ringtoneBuffer_.setFormat(fileformat);
         ringtoneBuffer_.resize(readableSamples);
-        fileToPlay->getNext(ringtoneBuffer_, 1.0);
+        fileToPlay->getNext(ringtoneBuffer_, isRingtoneMuted_ ? 0. : 1.);
         ringtoneBuffer_.setChannelNum(format.nb_channels, true);
         AudioBuffer* out;
         if (resample) {
diff --git a/src/media/audio/audiolayer.h b/src/media/audio/audiolayer.h
index 88192681c4283230d60ec8b68d9443e527d70dc3..c101a0a8a506408b6fc4966bf95fd282d5d72c2d 100644
--- a/src/media/audio/audiolayer.h
+++ b/src/media/audio/audiolayer.h
@@ -155,6 +155,13 @@ class AudioLayer {
             isPlaybackMuted_ = muted;
         }
 
+        bool isRingtoneMuted() const {
+            return isRingtoneMuted_;
+        }
+        void muteRingtone(bool muted) {
+            isRingtoneMuted_ = muted;
+        }
+
         /**
          * Set capture stream gain (microphone)
          * Range should be [-1.0, 1.0]
@@ -235,6 +242,11 @@ class AudioLayer {
          */
         bool isPlaybackMuted_;
 
+        /**
+         * True if ringtone should be muted
+         */
+        bool isRingtoneMuted_ {false};
+
         /**
          * Gain applied to mic signal
          */