diff --git a/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp b/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp
index d300a676651671316b6f8dd3b286ac018391af8e..0a36cc96bd4cb09dfe87647400274fda8011d6f0 100644
--- a/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp
+++ b/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp
@@ -36,10 +36,17 @@
 #include "audio/audiolayer.h"
 #include "manager.h"
 
+#include <fstream>
+
 namespace sfl {
 
 static const SFLDataFormat INIT_FADE_IN_FACTOR = 32000;
 
+#ifdef RECTODISK
+std::ofstream rtpResampled ("testRtpOutputResampled.raw", std::ifstream::binary);
+std::ofstream rtpNotResampled("testRtpOutput.raw", std::ifstream::binary);
+#endif
+
 AudioRtpRecord::AudioRtpRecord() :
     audioCodec_(0)
     , audioCodecMutex_()
@@ -48,13 +55,15 @@ AudioRtpRecord::AudioRtpRecord() :
     , decData_()     // std::tr1::arrays will be 0-initialized
     , resampledData_()
     , encodedData_()
-    , converter_(0)
+    , converterEncode_(0)
+    , converterDecode_(0)
     , codecSampleRate_(0)
     , codecFrameSize_(0)
     , converterSamplingRate_(0)
     , dtmfQueue_()
     , fadeFactor_(INIT_FADE_IN_FACTOR)
-    , noiseSuppress_(0)
+    , noiseSuppressEncode_(0)
+    , noiseSuppressDecode_(0)
     , audioProcessMutex_()
     , callId_("")
     , dtmfPayloadType_(101) // same as Asterisk
@@ -62,9 +71,16 @@ AudioRtpRecord::AudioRtpRecord() :
 
 AudioRtpRecord::~AudioRtpRecord()
 {
-    delete converter_;
+#ifdef RECTODISK
+    rtpResampled.close();
+    rtpNotResampled.close();
+#endif
+
+    delete converterEncode_;
+    delete converterDecode_;
     delete audioCodec_;
-    delete noiseSuppress_;
+    delete noiseSuppressEncode_;
+    delete noiseSuppressDecode_;
 }
 
 
@@ -98,15 +114,19 @@ void AudioRtpRecordHandler::initBuffers()
 
     // initialize SampleRate converter using AudioLayer's sampling rate
     // (internal buffers initialized with maximal sampling rate and frame size)
-    delete audioRtpRecord_.converter_;
-    audioRtpRecord_.converter_ = new SamplerateConverter(getCodecSampleRate());
+    delete audioRtpRecord_.converterEncode_;
+    audioRtpRecord_.converterEncode_ = new SamplerateConverter(getCodecSampleRate());
+    delete audioRtpRecord_.converterDecode_;
+    audioRtpRecord_.converterDecode_ = new SamplerateConverter(getCodecSampleRate());
 }
 
 void AudioRtpRecordHandler::initNoiseSuppress()
 {
     ost::MutexLock lock(audioRtpRecord_.audioProcessMutex_);
-    delete audioRtpRecord_.noiseSuppress_;
-    audioRtpRecord_.noiseSuppress_ = new NoiseSuppress(getCodecFrameSize(), getCodecSampleRate());
+    delete audioRtpRecord_.noiseSuppressEncode_;
+    audioRtpRecord_.noiseSuppressEncode_ = new NoiseSuppress(getCodecFrameSize(), getCodecSampleRate());
+    delete audioRtpRecord_.noiseSuppressDecode_;
+    audioRtpRecord_.noiseSuppressDecode_ = new NoiseSuppress(getCodecFrameSize(), getCodecSampleRate());
 }
 
 void AudioRtpRecordHandler::putDtmfEvent(int digit)
@@ -131,6 +151,10 @@ int AudioRtpRecordHandler::processDataEncode()
     SFLDataFormat *micData = audioRtpRecord_.decData_.data();
     int bytes = Manager::instance().getMainBuffer()->getData(micData, bytesToGet, id_);
 
+#ifdef RECTODISK
+    rtpNotResampled.write((const char *)micData, bytes);
+#endif
+
     if (bytes != bytesToGet) {
         ERROR("Asked for %d bytes from mainbuffer, got %d", bytesToGet, bytes);
         return 0;
@@ -146,19 +170,25 @@ int AudioRtpRecordHandler::processDataEncode()
     SFLDataFormat *out = micData;
 
     if (codecSampleRate != mainBufferSampleRate) {
-        assert(audioRtpRecord_.converter_);
-        audioRtpRecord_.converter_->resample(micData,
+        assert(audioRtpRecord_.converterEncode_);
+
+        audioRtpRecord_.converterEncode_->resample(micData,
                 audioRtpRecord_.resampledData_.data(),
-                audioRtpRecord_.resampledData_.size(), codecSampleRate,
-                mainBufferSampleRate,
+                audioRtpRecord_.resampledData_.size(),
+                mainBufferSampleRate, codecSampleRate,
                 samplesToGet);
+
+#ifdef RECTODISK
+        rtpResampled.write((const char *)audioRtpRecord_.resampledData_.data(), samplesToGet*sizeof(SFLDataFormat)/2 );
+#endif
+
         out = audioRtpRecord_.resampledData_.data();
     }
 
     if (Manager::instance().audioPreference.getNoiseReduce()) {
         ost::MutexLock lock(audioRtpRecord_.audioProcessMutex_);
-        assert(audioRtpRecord_.noiseSuppress_);
-        audioRtpRecord_.noiseSuppress_->process(micData, getCodecFrameSize());
+        assert(audioRtpRecord_.noiseSuppressEncode_);
+        audioRtpRecord_.noiseSuppressEncode_->process(micData, getCodecFrameSize());
     }
 
     {
@@ -198,7 +228,7 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si
         out = audioRtpRecord_.resampledData_.data();
         // Do sample rate conversion
         outSamples = ((float) inSamples * ((float) mainBufferSampleRate / (float) codecSampleRate));
-        audioRtpRecord_.converter_->resample(spkrDataDecoded, out,
+        audioRtpRecord_.converterDecode_->resample(spkrDataDecoded, out,
                 audioRtpRecord_.resampledData_.size(), codecSampleRate,
                 mainBufferSampleRate, inSamples);
     }
diff --git a/daemon/src/audio/audiortp/audio_rtp_record_handler.h b/daemon/src/audio/audiortp/audio_rtp_record_handler.h
index c3c76692f857d91e4fb39ee63e53c48b518abb0e..3f3a7ec649c69c5fdf2cb76e354580e1299c36f3 100644
--- a/daemon/src/audio/audiortp/audio_rtp_record_handler.h
+++ b/daemon/src/audio/audiortp/audio_rtp_record_handler.h
@@ -85,13 +85,15 @@ class AudioRtpRecord {
 // FIXME: resampledData should be resized as needed
         std::tr1::array<SFLDataFormat, DEC_BUFFER_SIZE * 4> resampledData_;
         std::tr1::array<unsigned char, DEC_BUFFER_SIZE> encodedData_;
-        SamplerateConverter *converter_;
+        SamplerateConverter *converterEncode_;
+        SamplerateConverter *converterDecode_;
         int codecSampleRate_;
         int codecFrameSize_;
         int converterSamplingRate_;
         std::list<int> dtmfQueue_;
         SFLDataFormat fadeFactor_;
-        NoiseSuppress *noiseSuppress_;
+        NoiseSuppress *noiseSuppressEncode_;
+        NoiseSuppress *noiseSuppressDecode_;
         ost::Mutex audioProcessMutex_;
         std::string callId_;
         unsigned int dtmfPayloadType_;
diff --git a/daemon/src/audio/mainbuffer.cpp b/daemon/src/audio/mainbuffer.cpp
index 6925bf0f43f13888902fae3ae1075ad980ee5c92..f77a00954ebc89b7592372c2e574a5bca96c76d9 100644
--- a/daemon/src/audio/mainbuffer.cpp
+++ b/daemon/src/audio/mainbuffer.cpp
@@ -37,7 +37,7 @@
 
 const char * const MainBuffer::DEFAULT_ID = "audiolayer_id";
 
-MainBuffer::MainBuffer() : ringBufferMap_(), callIDMap_(), mutex_(), internalSamplingRate_(8000)
+MainBuffer::MainBuffer() : ringBufferMap_(), callIDMap_(), mutex_(), internalSamplingRate_(16000)
 {}
 
 MainBuffer::~MainBuffer()
diff --git a/daemon/src/audio/pulseaudio/pulselayer.cpp b/daemon/src/audio/pulseaudio/pulselayer.cpp
index 1d61c4b99a98dfa14c5ce754f52220130e3102e3..fcf3884ebd5fb03e6d8c9d960f2da4e7df5dbe9c 100644
--- a/daemon/src/audio/pulseaudio/pulselayer.cpp
+++ b/daemon/src/audio/pulseaudio/pulselayer.cpp
@@ -38,6 +38,9 @@
 #include "logger.h"
 #include "manager.h"
 
+#include <stdlib.h>
+#include <fstream>
+
 namespace {
 
 void playback_callback(pa_stream * /*s*/, size_t /*bytes*/, void* userdata)
@@ -62,6 +65,11 @@ void stream_moved_callback(pa_stream *s, void *userdata UNUSED)
 
 } // end anonymous namespace
 
+#ifdef RECTODISK
+std::ofstream outfileResampled ("testMicOuputResampled.raw", std::ifstream::binary);
+std::ofstream outfile("testMicOuput.raw", std::ifstream::binary);
+#endif
+
 PulseLayer::PulseLayer()
     : playback_(0)
     , record_(0)
@@ -106,6 +114,11 @@ PulseLayer::PulseLayer()
 
 PulseLayer::~PulseLayer()
 {
+#ifdef RECTODISK
+    outfile.close();
+    outfileResampled.close();
+#endif
+
     disconnectAudioStream();
 
     if (mainloop_)
@@ -416,12 +429,19 @@ void PulseLayer::readFromMic()
         mic_buffer_ = new SFLDataFormat[samples];
     }
 
-    if (resample)
+#ifdef RECTODISK
+    outfile.write((const char *)data, bytes);
+#endif
+    if (resample) {
         converter_.resample((SFLDataFormat*)data, mic_buffer_, samples, mainBufferSampleRate, sampleRate_, samples);
+    }
 
-    dcblocker_.process(mic_buffer_, resample ? mic_buffer_ : (SFLDataFormat*)data, samples);
+    dcblocker_.process(mic_buffer_, (SFLDataFormat*)data, samples);
     applyGain(mic_buffer_, bytes / sizeof(SFLDataFormat), getCaptureGain());
     Manager::instance().getMainBuffer()->putData(mic_buffer_, bytes, MainBuffer::DEFAULT_ID);
+#ifdef RECTODISK
+    outfileResampled.write((const char *)mic_buffer_, bytes);
+#endif
 
     if (pa_stream_drop(record_->pulseStream()) < 0)
         ERROR("Capture stream drop failed: %s" , pa_strerror(pa_context_errno(context_)));