diff --git a/daemon/src/audio/audiortp/audio_rtp_factory.cpp b/daemon/src/audio/audiortp/audio_rtp_factory.cpp
index 2170b06e52a77e238fa1c4241ec4cc4bac363218..4747834738279838373248fd141c762bbfbafd5b 100644
--- a/daemon/src/audio/audiortp/audio_rtp_factory.cpp
+++ b/daemon/src/audio/audiortp/audio_rtp_factory.cpp
@@ -51,8 +51,6 @@ AudioRtpFactory::AudioRtpFactory(SIPCall *ca) : rtpSession_(NULL),
 AudioRtpFactory::~AudioRtpFactory()
 {
     delete rtpSession_;
-    delete cachedLocalContext_;
-    delete cachedRemoteContext_;
 }
 
 void AudioRtpFactory::initConfig()
diff --git a/daemon/src/audio/audiortp/audio_srtp_session.cpp b/daemon/src/audio/audiortp/audio_srtp_session.cpp
index 38567d1b629cdbe7dbc29971401039429b9b3cc3..b6c3d94df80815603025b6536d16e7f355f6d610 100644
--- a/daemon/src/audio/audiortp/audio_srtp_session.cpp
+++ b/daemon/src/audio/audiortp/audio_srtp_session.cpp
@@ -262,7 +262,7 @@ void AudioSrtpSession::initializeRemoteCryptoContext()
 {
     DEBUG("AudioSrtp: Initialize remote crypto context");
 
-    CryptoSuiteDefinition crypto = sfl::CryptoSuites[remoteCryptoSuite_];
+    const CryptoSuiteDefinition &crypto = sfl::CryptoSuites[remoteCryptoSuite_];
 
     delete remoteCryptoCtx_;
     remoteCryptoCtx_ = new ost::CryptoContext(0x0,
@@ -285,7 +285,7 @@ void AudioSrtpSession::initializeLocalCryptoContext()
 {
     DEBUG("AudioSrtp: Initialize local crypto context");
 
-    CryptoSuiteDefinition crypto = sfl::CryptoSuites[localCryptoSuite_];
+    const CryptoSuiteDefinition &crypto = sfl::CryptoSuites[localCryptoSuite_];
 
     delete localCryptoCtx_;
     localCryptoCtx_ = new ost::CryptoContext(OutgoingDataQueue::getLocalSSRC(),
@@ -306,10 +306,14 @@ void AudioSrtpSession::initializeLocalCryptoContext()
 void AudioSrtpSession::restoreCryptoContext(ost::CryptoContext *localContext,
                                             ost::CryptoContext *remoteContext)
 {
-    delete remoteCryptoCtx_;
-    remoteCryptoCtx_ = remoteContext;
-    delete localCryptoCtx_;
-    localCryptoCtx_ = localContext;
+    if (remoteCryptoCtx_ != remoteContext) {
+        delete remoteCryptoCtx_;
+        remoteCryptoCtx_ = remoteContext;
+    }
+    if (localCryptoCtx_ != localContext) {
+        delete localCryptoCtx_;
+        localCryptoCtx_ = localContext;
+    }
     setInQueueCryptoContext(remoteCryptoCtx_);
     setOutQueueCryptoContext(localCryptoCtx_);
 }