diff --git a/sflphone-common/src/audio/pulseaudio/audiostream.cpp b/sflphone-common/src/audio/pulseaudio/audiostream.cpp
index 89986506eede7627bdde82ca37928eca99300d41..38608fbf2bb7a21ad59dfea3b9a13c4e41da6251 100644
--- a/sflphone-common/src/audio/pulseaudio/audiostream.cpp
+++ b/sflphone-common/src/audio/pulseaudio/audiostream.cpp
@@ -101,15 +101,22 @@ AudioStream::disconnectStream (void)
 {
     _debug ("Destroy audio streams\n");
 
-    // pa_threaded_mainloop_lock (_mainloop);
+    pa_threaded_mainloop_lock (_mainloop);
 
     if (_audiostream) {
         pa_stream_disconnect (_audiostream);
+
+	// make sure we don't get any further callback
+	pa_stream_set_state_callback(_audiostream, NULL, NULL);
+	pa_stream_set_write_callback (_audiostream, NULL, NULL);
+	pa_stream_set_underflow_callback (_audiostream, NULL, NULL);
+	pa_stream_set_overflow_callback (_audiostream, NULL, NULL);
+
         pa_stream_unref (_audiostream);
         _audiostream = NULL;
     }
 
-    // pa_threaded_mainloop_unlock (_mainloop);
+    pa_threaded_mainloop_unlock (_mainloop);
 
     return true;
 }
diff --git a/sflphone-common/src/audio/pulseaudio/pulselayer.cpp b/sflphone-common/src/audio/pulseaudio/pulselayer.cpp
index 8f5b94c5a0b96f0045417116322fc0f96841e15f..906ba0a541a8ee50575087c0679bea536ec0d177 100644
--- a/sflphone-common/src/audio/pulseaudio/pulselayer.cpp
+++ b/sflphone-common/src/audio/pulseaudio/pulselayer.cpp
@@ -134,7 +134,7 @@ PulseLayer::closeLayer (void)
     // record->disconnectStream();
     // closeCaptureStream();
 
-    disconnectAudioStream();
+    // disconnectAudioStream();
 
     if (context) {
         pa_context_disconnect (context);
@@ -219,7 +219,7 @@ void PulseLayer::context_state_callback (pa_context* c, void* user_data)
 
 bool PulseLayer::disconnectAudioStream (void)
 {
-    _debug (" PulseLayer::disconnectAudioStream( void ) \n");
+    _debug ("PulseLayer::disconnectAudioStream( void ) \n");
 
     closePlaybackStream();
 
@@ -294,9 +294,7 @@ void PulseLayer::closeCaptureStream (void)
 {
     if (record) {
 
-        pa_threaded_mainloop_lock (m);
         delete record;
-        pa_threaded_mainloop_unlock (m);
         record=NULL;
     }
 }
@@ -305,9 +303,7 @@ void PulseLayer::closePlaybackStream (void)
 {
     if (playback) {
 
-        pa_threaded_mainloop_lock (m);
         delete playback;
-        pa_threaded_mainloop_unlock (m);
         playback=NULL;
     }
 }
@@ -662,7 +658,6 @@ void PulseLayer::readFromMic (void)
     size_t r;
 
     // if (record->getStreamState()
-    // pa_threaded_mainloop_lock (m);
 
     int readableSize = pa_stream_readable_size (record->pulseStream());
 
@@ -672,6 +667,7 @@ void PulseLayer::readFromMic (void)
         _debug ("pa_stream_peek() failed: %s\n" , pa_strerror (pa_context_errno (context)));
     }
 
+
     if (data != 0) {
 
         int _mainBufferSampleRate = getMainBuffer()->getInternalSamplingRate();