diff --git a/daemon/src/audio/Makefile.am b/daemon/src/audio/Makefile.am
index 6dc37940aaba4c817066db363f1121fa1a2ba104..51400d2115991e5ee31e8a3a0010c09043d33ea4 100644
--- a/daemon/src/audio/Makefile.am
+++ b/daemon/src/audio/Makefile.am
@@ -29,7 +29,7 @@ libaudio_la_SOURCES = \
 		audiobuffer.cpp \
 		audioloop.cpp \
 		ringbuffer.cpp \
-		mainbuffer.cpp \
+		ringbufferpool.cpp \
 		audiorecord.cpp \
 		audiorecorder.cpp \
 		recordable.cpp \
@@ -42,7 +42,7 @@ noinst_HEADERS = \
 		audiobuffer.h \
 		audioloop.h \
 		ringbuffer.h \
-		mainbuffer.h \
+		ringbufferpool.h \
 		audiorecord.h \
 		audiorecorder.h \
 		audiolayer.h \
diff --git a/daemon/src/audio/alsa/alsalayer.cpp b/daemon/src/audio/alsa/alsalayer.cpp
index af03a9504d99bc2512ac0316fac019334b334a49..5a62df201d94168fb35fa7f45bb6afec56e7d317 100644
--- a/daemon/src/audio/alsa/alsalayer.cpp
+++ b/daemon/src/audio/alsa/alsalayer.cpp
@@ -35,6 +35,7 @@
 #include "manager.h"
 #include "noncopyable.h"
 #include "client/configurationmanager.h"
+#include "audio/ringbufferpool.h"
 #include "audio/ringbuffer.h"
 
 #include <thread>
@@ -158,7 +159,7 @@ AlsaLayer::AlsaLayer(const AudioPreference &pref)
     , is_playback_open_(false)
     , is_capture_open_(false)
     , audioThread_(nullptr)
-    , mainRingBuffer_(Manager::instance().getMainBuffer().getRingBuffer(MainBuffer::DEFAULT_ID))
+    , mainRingBuffer_(Manager::instance().getRingBufferPool().getRingBuffer(RingBufferPool::DEFAULT_ID))
 {}
 
 AlsaLayer::~AlsaLayer()
@@ -674,7 +675,7 @@ AlsaLayer::getAudioDeviceName(int index, DeviceType type) const
 
 void AlsaLayer::capture()
 {
-    AudioFormat mainBufferFormat = Manager::instance().getMainBuffer().getInternalAudioFormat();
+    AudioFormat mainBufferFormat = Manager::instance().getRingBufferPool().getInternalAudioFormat();
 
     int toGetFrames = snd_pcm_avail_update(captureHandle_);
 
@@ -713,7 +714,7 @@ void AlsaLayer::capture()
 
 void AlsaLayer::playback(int maxFrames)
 {
-    unsigned framesToGet = Manager::instance().getMainBuffer().availableForGet(MainBuffer::DEFAULT_ID);
+    unsigned framesToGet = Manager::instance().getRingBufferPool().availableForGet(RingBufferPool::DEFAULT_ID);
 
     // no audio available, play tone or silence
     if (framesToGet <= 0) {
@@ -736,7 +737,7 @@ void AlsaLayer::playback(int maxFrames)
         write(playbackIBuff_.data(), playbackBuff_.frames(), playbackHandle_);
     } else {
         // play the regular sound samples
-        const AudioFormat mainBufferFormat = Manager::instance().getMainBuffer().getInternalAudioFormat();
+        const AudioFormat mainBufferFormat = Manager::instance().getRingBufferPool().getInternalAudioFormat();
         const bool resample = audioFormat_.sample_rate != mainBufferFormat.sample_rate;
 
         double resampleFactor = 1.0;
@@ -752,7 +753,7 @@ void AlsaLayer::playback(int maxFrames)
         playbackBuff_.setFormat(mainBufferFormat);
         playbackBuff_.resize(framesToGet);
 
-        Manager::instance().getMainBuffer().getData(playbackBuff_, MainBuffer::DEFAULT_ID);
+        Manager::instance().getRingBufferPool().getData(playbackBuff_, RingBufferPool::DEFAULT_ID);
         playbackBuff_.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_);
 
         if (audioFormat_.nb_channels != mainBufferFormat.nb_channels) {
@@ -785,19 +786,19 @@ void AlsaLayer::audioCallback()
     if (not safeUpdate(playbackHandle_, playbackAvailFrames))
         return;
 
-    unsigned framesToGet = urgentRingBuffer_.availableForGet(MainBuffer::DEFAULT_ID);
+    unsigned framesToGet = urgentRingBuffer_.availableForGet(RingBufferPool::DEFAULT_ID);
 
     if (framesToGet > 0) {
         // Urgent data (dtmf, incoming call signal) come first.
         framesToGet = std::min(framesToGet, (unsigned)playbackAvailFrames);
         playbackBuff_.setFormat(audioFormat_);
         playbackBuff_.resize(framesToGet);
-        urgentRingBuffer_.get(playbackBuff_, MainBuffer::DEFAULT_ID);
+        urgentRingBuffer_.get(playbackBuff_, RingBufferPool::DEFAULT_ID);
         playbackBuff_.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_);
         playbackBuff_.interleave(playbackIBuff_);
         write(playbackIBuff_.data(), framesToGet, playbackHandle_);
         // Consume the regular one as well (same amount of frames)
-        Manager::instance().getMainBuffer().discard(framesToGet, MainBuffer::DEFAULT_ID);
+        Manager::instance().getRingBufferPool().discard(framesToGet, RingBufferPool::DEFAULT_ID);
     } else {
         // regular audio data
         playback(playbackAvailFrames);
diff --git a/daemon/src/audio/audiolayer.cpp b/daemon/src/audio/audiolayer.cpp
index 972cfbed78812d4d3dd005b6ed0bdb6ee4f0421a..9a3120951babe714a9e303c68a9d81fdbe9ac1f9 100644
--- a/daemon/src/audio/audiolayer.cpp
+++ b/daemon/src/audio/audiolayer.cpp
@@ -33,6 +33,7 @@
 #include "audio/dcblocker.h"
 #include "logger.h"
 #include "manager.h"
+#include "audio/ringbufferpool.h"
 
 #include <ctime>
 
@@ -42,14 +43,14 @@ AudioLayer::AudioLayer(const AudioPreference &pref)
     , captureGain_(pref.getVolumemic())
     , playbackGain_(pref.getVolumespkr())
     , isStarted_(false)
-    , audioFormat_(Manager::instance().getMainBuffer().getInternalAudioFormat())
+    , audioFormat_(Manager::instance().getRingBufferPool().getInternalAudioFormat())
     , urgentRingBuffer_("urgentRingBuffer_id", SIZEBUF, audioFormat_)
     , mutex_()
     , dcblocker_()
     , resampler_(audioFormat_.sample_rate)
     , lastNotificationTime_(0)
 {
-    urgentRingBuffer_.createReadOffset(MainBuffer::DEFAULT_ID);
+    urgentRingBuffer_.createReadOffset(RingBufferPool::DEFAULT_ID);
 }
 
 AudioLayer::~AudioLayer()
@@ -68,7 +69,7 @@ void AudioLayer::flushMain()
 {
     std::lock_guard<std::mutex> lock(mutex_);
     // should pass call id
-    Manager::instance().getMainBuffer().flushAllBuffers();
+    Manager::instance().getRingBufferPool().flushAllBuffers();
 }
 
 void AudioLayer::flushUrgent()
diff --git a/daemon/src/audio/audiolayer.h b/daemon/src/audio/audiolayer.h
index c0fb3533741b52500906c56dd3a3f1a1b9b2c12f..91259d546ed33e826f5b39ff93251b3d2dc629b2 100644
--- a/daemon/src/audio/audiolayer.h
+++ b/daemon/src/audio/audiolayer.h
@@ -49,7 +49,6 @@
  * @brief Main sound class. Manages the data transfers between the application and the hardware.
  */
 
-class MainBuffer;
 class AudioPreference;
 
 namespace ost {
diff --git a/daemon/src/audio/audiorecorder.cpp b/daemon/src/audio/audiorecorder.cpp
index 0931e34cb30c1a124f126b7bcafdd30f5a4b05a2..cd051d69f7e16b13a8801eaa990ed445fd7c5d45 100644
--- a/daemon/src/audio/audiorecorder.cpp
+++ b/daemon/src/audio/audiorecorder.cpp
@@ -30,7 +30,7 @@
 
 #include "audiorecorder.h"
 #include "audiorecord.h"
-#include "mainbuffer.h"
+#include "ringbufferpool.h"
 #include "logger.h"
 
 #include <chrono>
@@ -39,8 +39,9 @@
 
 int AudioRecorder::count_ = 0;
 
-AudioRecorder::AudioRecorder(AudioRecord  *arec, MainBuffer &mb) :
-    recorderId_(), mbuffer_(mb), arecord_(arec), running_(false), thread_()
+AudioRecorder::AudioRecorder(AudioRecord  *arec, RingBufferPool &rbp)
+    : recorderId_(), ringBufferPool_(rbp), arecord_(arec), running_(false)
+    , thread_()
 {
     ++count_;
 
@@ -65,7 +66,7 @@ AudioRecorder::~AudioRecorder()
 
 void AudioRecorder::init() {
     if (!arecord_->isRecording()) {
-        arecord_->setSndFormat(mbuffer_.getInternalAudioFormat());
+        arecord_->setSndFormat(ringBufferPool_.getInternalAudioFormat());
     }
 }
 
@@ -84,12 +85,12 @@ void AudioRecorder::run()
     static const size_t BUFFER_LENGTH = 10000;
     static const std::chrono::milliseconds SLEEP_TIME(20); // 20 ms
 
-    AudioBuffer buffer(BUFFER_LENGTH, mbuffer_.getInternalAudioFormat());
+    AudioBuffer buffer(BUFFER_LENGTH, ringBufferPool_.getInternalAudioFormat());
 
     while (running_) {
-        const size_t availableSamples = mbuffer_.availableForGet(recorderId_);
+        const size_t availableSamples = ringBufferPool_.availableForGet(recorderId_);
         buffer.resize(std::min(availableSamples, BUFFER_LENGTH));
-        mbuffer_.getData(buffer, recorderId_);
+        ringBufferPool_.getData(buffer, recorderId_);
 
         if (availableSamples > 0)
             arecord_->recData(buffer);
diff --git a/daemon/src/audio/audiorecorder.h b/daemon/src/audio/audiorecorder.h
index dc9c27949e3289e4930ac051b821214a9ddb6cac..50e6b69fe36925a19822d6ad5b980d9ca3088331 100644
--- a/daemon/src/audio/audiorecorder.h
+++ b/daemon/src/audio/audiorecorder.h
@@ -37,13 +37,13 @@
 #include <atomic>
 #include <string>
 
-class MainBuffer;
+class RingBufferPool;
 class AudioRecord;
 
 class AudioRecorder {
 
     public:
-        AudioRecorder(AudioRecord  *arec, MainBuffer &mb);
+        AudioRecorder(AudioRecord  *arec, RingBufferPool &rbp);
         ~AudioRecorder();
         std::string getRecorderID() const {
             return recorderId_;
@@ -66,7 +66,7 @@ class AudioRecorder {
 
         static int count_;
         std::string recorderId_;
-        MainBuffer &mbuffer_;
+        RingBufferPool &ringBufferPool_;
         AudioRecord *arecord_;
         std::atomic<bool> running_;
         std::thread thread_;
diff --git a/daemon/src/audio/audiortp/audio_rtp_factory.h b/daemon/src/audio/audiortp/audio_rtp_factory.h
index 59bd813542c0703fdc44452287f1e0c50eb918ea..437558ac2708004766550b01abf11bd9754affa3 100644
--- a/daemon/src/audio/audiortp/audio_rtp_factory.h
+++ b/daemon/src/audio/audiortp/audio_rtp_factory.h
@@ -133,9 +133,11 @@ class AudioRtpFactory {
         void setDtmfPayloadType(unsigned int);
 
         /**
-         * Send DTMF over RTP (RFC2833). The timestamp and sequence number must be
-         * incremented as if it was microphone audio. This function change the payload type of the rtp session,
-         * send the appropriate DTMF digit using this payload, discard coresponding data from mainbuffer and get
+         * Send DTMF over RTP (RFC2833).
+         * The timestamp and sequence number must be incremented
+         * as if it was microphone audio. This function change the payload type
+         * of the rtp session, send the appropriate DTMF digit using
+         * this payload, discard corresponding data from RingBufferPool and get
          * back the codec payload for further audio processing.
          */
         void sendDtmfDigit(int digit);
diff --git a/daemon/src/audio/audiortp/audio_rtp_session.h b/daemon/src/audio/audiortp/audio_rtp_session.h
index d4033a2988f7b92e8552739325068eda4fda1942..ccdf15c5b57dfb92bfd537408fc0b37afedbb8a6 100644
--- a/daemon/src/audio/audiortp/audio_rtp_session.h
+++ b/daemon/src/audio/audiortp/audio_rtp_session.h
@@ -141,9 +141,11 @@ class AudioRtpSession {
         virtual void startRTPLoop() = 0;
 
         /**
-         * Send DTMF over RTP (RFC2833). The timestamp and sequence number must be
-         * incremented as if it was microphone audio. This function change the payload type of the rtp session,
-         * send the appropriate DTMF digit using this payload, discard coresponding data from mainbuffer and get
+         * Send DTMF over RTP (RFC2833).
+         * The timestamp and sequence number must be incremented
+         * as if it was microphone audio. This function change the payload type
+         * of the rtp session, send the appropriate DTMF digit using
+         * this payload, discard corresponding data from RingBufferPool and get
          * back the codec payload for further audio processing.
          */
         void sendDtmfEvent();
diff --git a/daemon/src/audio/audiortp/audio_rtp_stream.cpp b/daemon/src/audio/audiortp/audio_rtp_stream.cpp
index bfa89f2b847470863485840b08092f4a422f6592..1e64ee3440807854771cf3c44301721dbb1b99eb 100644
--- a/daemon/src/audio/audiortp/audio_rtp_stream.cpp
+++ b/daemon/src/audio/audiortp/audio_rtp_stream.cpp
@@ -36,6 +36,7 @@
 
 #include "audio/audiolayer.h"
 #include "audio/resampler.h"
+#include "audio/ringbufferpool.h"
 #include "audio/ringbuffer.h"
 
 #if HAVE_SPEEXDSP
@@ -69,7 +70,7 @@ AudioRtpStream::AudioRtpStream(const std::string &id) :
     , plcPool_(nullptr)
     , plcDec_()
 {
-    ringbuffer_ = Manager::instance().getMainBuffer().createRingBuffer(id_);
+    ringbuffer_ = Manager::instance().getRingBufferPool().createRingBuffer(id_);
     pj_caching_pool_init(&plcCachePool_, &pj_pool_factory_default_policy, 0);
     plcPool_ = pj_pool_create(&plcCachePool_.factory, "plc", 64, 1024, nullptr);
 }
@@ -131,7 +132,7 @@ bool AudioRtpStream::tryToSwitchDecoder(int newPt)
     for (unsigned i=0, n=audioCodecs_.size(); i<n; i++) {
         auto codec = audioCodecs_[i];
         if (codec == nullptr || codec->getPayloadType() != newPt) continue;
-        AudioFormat f = Manager::instance().getMainBuffer().getInternalAudioFormat();
+        AudioFormat f = Manager::instance().getRingBufferPool().getInternalAudioFormat();
         codec->setOptimalFormat(f.sample_rate, f.nb_channels);
         decoder_.payloadType_ = codec->getPayloadType();
         decoder_.frameSize_ = codec->getFrameSize();
@@ -250,7 +251,7 @@ void AudioRtpStream::setRtpMedia(const std::vector<AudioCodec*> &audioCodecs)
     currentEncoderIndex_ = currentDecoderIndex_ = 0;
     AudioCodec& codec = *audioCodecs[currentEncoderIndex_];
 
-    AudioFormat f = Manager::instance().getMainBuffer().getInternalAudioFormat();
+    AudioFormat f = Manager::instance().getRingBufferPool().getInternalAudioFormat();
     codec.setOptimalFormat(f.sample_rate, f.nb_channels);
 
     const int pt = codec.getPayloadType();
@@ -288,7 +289,7 @@ void AudioRtpStream::resetDSP()
 
 bool AudioRtpStream::waitForDataEncode(const std::chrono::milliseconds& max_wait) const
 {
-    const auto &mainBuffer = Manager::instance().getMainBuffer();
+    const auto &mainBuffer = Manager::instance().getRingBufferPool();
     const AudioFormat mainBuffFormat = mainBuffer.getInternalAudioFormat();
     const double resampleFactor = (double) mainBuffFormat.sample_rate / encoder_.format_.sample_rate;
     const size_t samplesToGet = resampleFactor * encoder_.frameSize_;
@@ -301,22 +302,23 @@ size_t AudioRtpStream::processDataEncode()
     if (isDead())
         return 0;
 
-    AudioFormat mainBuffFormat = Manager::instance().getMainBuffer().getInternalAudioFormat();
+    AudioFormat mainBuffFormat = Manager::instance().getRingBufferPool().getInternalAudioFormat();
 
     double resampleFactor = (double) mainBuffFormat.sample_rate / encoder_.format_.sample_rate;
 
     // compute nb of byte to get corresponding to 1 audio frame
     const size_t samplesToGet = resampleFactor * encoder_.frameSize_;
 
-    if (Manager::instance().getMainBuffer().availableForGet(id_) < samplesToGet)
+    if (Manager::instance().getRingBufferPool().availableForGet(id_) < samplesToGet)
         return 0;
 
     micData_.setFormat(mainBuffFormat);
     micData_.resize(samplesToGet);
-    const size_t samples = Manager::instance().getMainBuffer().getData(micData_, id_);
+    const size_t samples = Manager::instance().getRingBufferPool().getData(micData_, id_);
 
     if (samples != samplesToGet) {
-        ERROR("Asked for %d samples from mainbuffer, got %d", samplesToGet, samples);
+        ERROR("Asked for %d samples from bindings on call '%s', got %d",
+              samplesToGet, id_.c_str(), samples);
         return 0;
     }
 
@@ -416,7 +418,7 @@ void AudioRtpStream::processDataDecode(unsigned char *spkrData, size_t size, int
     // test if resampling or up/down-mixing is required
     AudioBuffer *out = &rawBuffer_;
     AudioFormat decFormat = out->getFormat();
-    AudioFormat mainBuffFormat = Manager::instance().getMainBuffer().getInternalAudioFormat();
+    AudioFormat mainBuffFormat = Manager::instance().getRingBufferPool().getInternalAudioFormat();
     if (decFormat.sample_rate != mainBuffFormat.sample_rate) {
         if (!decoder_.resampler_) {
             ERROR("Resampler already destroyed");
diff --git a/daemon/src/audio/audiortp/audio_rtp_stream.h b/daemon/src/audio/audiortp/audio_rtp_stream.h
index b1db256f2a42089a7dfaad90ad517bb1555adda3..64fea6c5ac82cf1030bed0caa148bbf5bda271da 100644
--- a/daemon/src/audio/audiortp/audio_rtp_stream.h
+++ b/daemon/src/audio/audiortp/audio_rtp_stream.h
@@ -107,12 +107,12 @@ class AudioRtpStream {
         void processDataDecode(uint8_t *spkrData, size_t size, int payloadType);
 
         /**
-         * Wait for available data to be encoded from mainbuffer.
+         * Wait for available data to be encoded from RingBufferPool.
          */
         bool waitForDataEncode(const std::chrono::milliseconds& max_wait) const;
 
         /**
-         * Encode audio data from mainbuffer
+         * Encode audio data from RingBufferPool
          * @return size of encoded data, in bytes.
          */
         size_t processDataEncode();
diff --git a/daemon/src/audio/jack/jacklayer.cpp b/daemon/src/audio/jack/jacklayer.cpp
index 97302bafdff85fc09bf48ed667103026226eb5e9..0ec4b2aafcc7cc6f137582a5fcb6265fe4e7761c 100644
--- a/daemon/src/audio/jack/jacklayer.cpp
+++ b/daemon/src/audio/jack/jacklayer.cpp
@@ -36,7 +36,7 @@
 #include <cassert>
 #include <climits>
 #include "logger.h"
-#include "audio/mainbuffer.h"
+#include "audio/ringbufferpool.h"
 #include "audio/ringbuffer.h"
 #include "manager.h"
 #include "array_size.h"
@@ -83,19 +83,19 @@ void JackLayer::fillWithUrgent(AudioBuffer &buffer, size_t samplesToGet)
     // Urgent data (dtmf, incoming call signal) come first.
     samplesToGet = std::min(samplesToGet, hardwareBufferSize_);
     buffer.resize(samplesToGet);
-    urgentRingBuffer_.get(buffer, MainBuffer::DEFAULT_ID);
+    urgentRingBuffer_.get(buffer, RingBufferPool::DEFAULT_ID);
     buffer.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_);
 
     // Consume the regular one as well (same amount of samples)
-    Manager::instance().getMainBuffer().discard(samplesToGet, MainBuffer::DEFAULT_ID);
+    Manager::instance().getRingBufferPool().discard(samplesToGet, RingBufferPool::DEFAULT_ID);
 }
 
 void JackLayer::fillWithVoice(AudioBuffer &buffer, size_t samplesAvail)
 {
-    MainBuffer &mainBuffer = Manager::instance().getMainBuffer();
+    RingBufferPool &mainBuffer = Manager::instance().getRingBufferPool();
 
     buffer.resize(samplesAvail);
-    mainBuffer.getData(buffer, MainBuffer::DEFAULT_ID);
+    mainBuffer.getData(buffer, RingBufferPool::DEFAULT_ID);
     buffer.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_);
 
     if (audioFormat_.sample_rate != (unsigned) mainBuffer.getInternalSamplingRate()) {
@@ -129,8 +129,8 @@ JackLayer::playback()
 {
     notifyIncomingCall();
 
-    const size_t samplesToGet = Manager::instance().getMainBuffer().availableForGet(MainBuffer::DEFAULT_ID);
-    const size_t urgentSamplesToGet = urgentRingBuffer_.availableForGet(MainBuffer::DEFAULT_ID);
+    const size_t samplesToGet = Manager::instance().getRingBufferPool().availableForGet(RingBufferPool::DEFAULT_ID);
+    const size_t urgentSamplesToGet = urgentRingBuffer_.availableForGet(RingBufferPool::DEFAULT_ID);
 
     if (urgentSamplesToGet > 0) {
         fillWithUrgent(playbackBuffer_, urgentSamplesToGet);
@@ -152,7 +152,7 @@ JackLayer::capture()
     // get audio from jack ringbuffer
     read(captureBuffer_);
 
-    const AudioFormat mainBufferFormat = Manager::instance().getMainBuffer().getInternalAudioFormat();
+    const AudioFormat mainBufferFormat = Manager::instance().getRingBufferPool().getInternalAudioFormat();
     const bool resample = mainBufferFormat.sample_rate != audioFormat_.sample_rate;
 
     captureBuffer_.applyGain(isCaptureMuted_ ? 0.0 : captureGain_);
@@ -326,7 +326,7 @@ JackLayer::JackLayer(const AudioPreference &p) :
     captureBuffer_(0, audioFormat_),
     captureFloatBuffer_(),
     hardwareBufferSize_(0),
-    mainRingBuffer_(Manager::instance().getMainBuffer().getRingBuffer(MainBuffer::DEFAULT_ID))
+    mainRingBuffer_(Manager::instance().getRingBufferPool().getRingBuffer(RingBufferPool::DEFAULT_ID))
 {
     playbackClient_ = jack_client_open(PACKAGE_NAME,
             (jack_options_t) (JackNullOption | JackNoStartServer), NULL);
diff --git a/daemon/src/audio/opensl/opensllayer.cpp b/daemon/src/audio/opensl/opensllayer.cpp
index 608ebd42231a7a0cd158f3fb9ebd01c05ac61cd7..7d5cd1336f96d4d7b9420f0228eb195330d191ba 100644
--- a/daemon/src/audio/opensl/opensllayer.cpp
+++ b/daemon/src/audio/opensl/opensllayer.cpp
@@ -33,7 +33,7 @@
 #include "client/configurationmanager.h"
 
 #include "manager.h"
-#include "audio/mainbuffer.h"
+#include "audio/ringbufferpool.h"
 #include "audio/ringbuffer.h"
 #include "audio/dcblocker.h"
 #include "logger.h"
@@ -77,7 +77,7 @@ OpenSLLayer::OpenSLLayer(const AudioPreference &pref)
     , hardwareBuffSize_(BUFFER_SIZE)
     , playbackBufferStack_(ANDROID_BUFFER_QUEUE_LENGTH, AudioBuffer(hardwareBuffSize_, AudioFormat::MONO()))
     , recordBufferStack_(ANDROID_BUFFER_QUEUE_LENGTH, AudioBuffer(hardwareBuffSize_, AudioFormat::MONO()))
-    , mainRingBuffer_(Manager::instance().getMainBuffer().getRingBuffer(MainBuffer::DEFAULT_ID))
+    , mainRingBuffer_(Manager::instance().getRingBufferPool().getRingBuffer(RingBufferPool::DEFAULT_ID))
 {
 }
 
@@ -345,7 +345,7 @@ OpenSLLayer::initAudioCapture() const
                                                            };
 
     DEBUG("Capture-> Sampling Rate: %d", audioFormat_.sample_rate);
-    DEBUG("Capture-> getInternalSamplingRate: %d", Manager::instance().getMainBuffer().getInternalSamplingRate());
+    DEBUG("Capture-> getInternalSamplingRate: %d", Manager::instance().getRingBufferPool().getInternalSamplingRate());
     SLDataFormat_PCM audioFormat = {SL_DATAFORMAT_PCM, 1,
                                     audioFormat_.sample_rate * 1000,
                                     SL_PCMSAMPLEFORMAT_FIXED_16,
@@ -638,13 +638,13 @@ OpenSLLayer::playback(SLAndroidSimpleBufferQueueItf queue)
     notifyIncomingCall();
 
     AudioBuffer &buffer = getNextPlaybackBuffer();
-    size_t urgentSamplesToGet = urgentRingBuffer_.availableForGet(MainBuffer::DEFAULT_ID);
+    size_t urgentSamplesToGet = urgentRingBuffer_.availableForGet(RingBufferPool::DEFAULT_ID);
 
     bufferIsFilled_ = false;
     if (urgentSamplesToGet > 0) {
         bufferIsFilled_ = audioPlaybackFillWithUrgent(buffer, std::min(urgentSamplesToGet, hardwareBuffSize_));
     } else {
-        auto& main_buffer = Manager::instance().getMainBuffer();
+        auto& main_buffer = Manager::instance().getRingBufferPool();
         buffer.resize(hardwareBuffSize_);
         size_t samplesToGet = audioPlaybackFillWithVoice(buffer);
         if (samplesToGet == 0) {
@@ -716,7 +716,7 @@ OpenSLLayer::updatePreference(AudioPreference &preference, int index, DeviceType
 
 void OpenSLLayer::audioCaptureFillBuffer(AudioBuffer &buffer)
 {
-    MainBuffer &mbuffer = Manager::instance().getMainBuffer();
+    RingBufferPool &mbuffer = Manager::instance().getRingBufferPool();
 
     //const unsigned mainBufferSampleRate = mbuffer.getInternalSamplingRate();
     const AudioFormat mainBufferFormat = mbuffer.getInternalAudioFormat();
@@ -760,19 +760,19 @@ bool OpenSLLayer::audioPlaybackFillWithUrgent(AudioBuffer &buffer, size_t sample
     // Urgent data (dtmf, incoming call signal) come first.
     samplesToGet = std::min(samplesToGet, hardwareBuffSize_);
     buffer.resize(samplesToGet);
-    urgentRingBuffer_.get(buffer, MainBuffer::DEFAULT_ID);
+    urgentRingBuffer_.get(buffer, RingBufferPool::DEFAULT_ID);
     buffer.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_);
 
     // Consume the regular one as well (same amount of samples)
-    Manager::instance().getMainBuffer().discard(samplesToGet, MainBuffer::DEFAULT_ID);
+    Manager::instance().getRingBufferPool().discard(samplesToGet, RingBufferPool::DEFAULT_ID);
 
     return true;
 }
 
 size_t OpenSLLayer::audioPlaybackFillWithVoice(AudioBuffer &buffer)
 {
-    MainBuffer &mainBuffer = Manager::instance().getMainBuffer();
-    size_t got = mainBuffer.getAvailableData(buffer, MainBuffer::DEFAULT_ID);
+    RingBufferPool &mainBuffer = Manager::instance().getRingBufferPool();
+    size_t got = mainBuffer.getAvailableData(buffer, RingBufferPool::DEFAULT_ID);
     buffer.resize(got);
     buffer.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_);
     if (audioFormat_.sample_rate != mainBuffer.getInternalSamplingRate()) {
diff --git a/daemon/src/audio/pulseaudio/pulselayer.cpp b/daemon/src/audio/pulseaudio/pulselayer.cpp
index 24ceb6d976998848311d863962b7e7cfe9f81aa1..a1444bccd41c9beae13e1bc039546faf28c54256 100644
--- a/daemon/src/audio/pulseaudio/pulselayer.cpp
+++ b/daemon/src/audio/pulseaudio/pulselayer.cpp
@@ -38,6 +38,7 @@
 #include "pulselayer.h"
 #include "audio/resampler.h"
 #include "audio/dcblocker.h"
+#include "audio/ringbufferpool.h"
 #include "audio/ringbuffer.h"
 #include "logger.h"
 #include "manager.h"
@@ -103,7 +104,7 @@ PulseLayer::PulseLayer(AudioPreference &pref)
     , enumeratingSinks_(false)
     , enumeratingSources_(false)
     , preference_(pref)
-    , mainRingBuffer_(Manager::instance().getMainBuffer().getRingBuffer(MainBuffer::DEFAULT_ID))
+    , mainRingBuffer_(Manager::instance().getRingBufferPool().getRingBuffer(RingBufferPool::DEFAULT_ID))
 {
     setCaptureGain(pref.getVolumemic());
     setPlaybackGain(pref.getVolumespkr());
@@ -464,7 +465,7 @@ void PulseLayer::writeToSpeaker()
 
     notifyIncomingCall();
 
-    size_t urgentSamples = urgentRingBuffer_.availableForGet(MainBuffer::DEFAULT_ID);
+    size_t urgentSamples = urgentRingBuffer_.availableForGet(RingBufferPool::DEFAULT_ID);
     size_t urgentBytes = urgentSamples * sample_size;
 
     if (urgentSamples > writableSamples) {
@@ -477,12 +478,12 @@ void PulseLayer::writeToSpeaker()
     if (urgentBytes) {
         AudioBuffer linearbuff(urgentSamples, format);
         pa_stream_begin_write(s, (void**)&data, &urgentBytes);
-        urgentRingBuffer_.get(linearbuff, MainBuffer::DEFAULT_ID); // retrive only the first sample_spec->channels channels
+        urgentRingBuffer_.get(linearbuff, RingBufferPool::DEFAULT_ID); // retrive only the first sample_spec->channels channels
         linearbuff.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_);
         linearbuff.interleave(data);
         pa_stream_write(s, data, urgentBytes, nullptr, 0, PA_SEEK_RELATIVE);
         // Consume the regular one as well (same amount of samples)
-        Manager::instance().getMainBuffer().discard(urgentSamples, MainBuffer::DEFAULT_ID);
+        Manager::instance().getRingBufferPool().discard(urgentSamples, RingBufferPool::DEFAULT_ID);
         return;
     }
 
@@ -504,7 +505,7 @@ void PulseLayer::writeToSpeaker()
 
     flushUrgent(); // flush remaining samples in _urgentRingBuffer
 
-    size_t availSamples = Manager::instance().getMainBuffer().availableForGet(MainBuffer::DEFAULT_ID);
+    size_t availSamples = Manager::instance().getRingBufferPool().availableForGet(RingBufferPool::DEFAULT_ID);
 
     if (availSamples == 0) {
         pa_stream_begin_write(s, (void**)&data, &writableBytes);
@@ -518,7 +519,7 @@ void PulseLayer::writeToSpeaker()
 
     double resampleFactor = 1.;
 
-    AudioFormat mainBufferAudioFormat = Manager::instance().getMainBuffer().getInternalAudioFormat();
+    AudioFormat mainBufferAudioFormat = Manager::instance().getRingBufferPool().getInternalAudioFormat();
     bool resample = audioFormat_.sample_rate != mainBufferAudioFormat.sample_rate;
 
     if (resample) {
@@ -533,7 +534,7 @@ void PulseLayer::writeToSpeaker()
     pa_stream_begin_write(s, (void**)&data, &resampledBytes);
 
     AudioBuffer linearbuff(readableSamples, format);
-    Manager::instance().getMainBuffer().getData(linearbuff, MainBuffer::DEFAULT_ID);
+    Manager::instance().getRingBufferPool().getData(linearbuff, RingBufferPool::DEFAULT_ID);
 
     if (resample) {
         AudioBuffer rsmpl_out(nResampled, format);
@@ -569,7 +570,7 @@ void PulseLayer::readFromMic()
     AudioBuffer in(samples, format);
     in.deinterleave((SFLAudioSample*)data, samples, format.nb_channels);
 
-    unsigned int mainBufferSampleRate = Manager::instance().getMainBuffer().getInternalSamplingRate();
+    unsigned int mainBufferSampleRate = Manager::instance().getRingBufferPool().getInternalSamplingRate();
     bool resample = audioFormat_.sample_rate != mainBufferSampleRate;
 
     in.applyGain(isCaptureMuted_ ? 0.0 : captureGain_);
diff --git a/daemon/src/audio/recordable.cpp b/daemon/src/audio/recordable.cpp
index e89c97bcf6e927cd333f7164eb77590e538192b3..bfd7f9105ba1287191325aa4c88c80ab2e373d46 100644
--- a/daemon/src/audio/recordable.cpp
+++ b/daemon/src/audio/recordable.cpp
@@ -31,7 +31,7 @@
 #include "manager.h"
 #include "logger.h"
 
-Recordable::Recordable() : recAudio_(), recorder_(&recAudio_, Manager::instance().getMainBuffer())
+Recordable::Recordable() : recAudio_(), recorder_(&recAudio_, Manager::instance().getRingBufferPool())
 {
     DEBUG("Set recording options: %s", Manager::instance().audioPreference.getRecordPath().c_str());
     recAudio_.setRecordingOptions(AudioFormat::MONO(), Manager::instance().audioPreference.getRecordPath());
diff --git a/daemon/src/audio/mainbuffer.cpp b/daemon/src/audio/ringbufferpool.cpp
similarity index 82%
rename from daemon/src/audio/mainbuffer.cpp
rename to daemon/src/audio/ringbufferpool.cpp
index 38a7cabf086dc573b78576ddc8f0e9a189286d9d..0e4b1e4808cd327ba8b83e4dd532cc64d44b2f23 100644
--- a/daemon/src/audio/mainbuffer.cpp
+++ b/daemon/src/audio/ringbufferpool.cpp
@@ -1,6 +1,7 @@
 /*
  *  Copyright (C) 2004-2014 Savoir-Faire Linux Inc.
- *  Author : Alexandre Savard <alexandre.savard@savoirfairelinux.com>
+ *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
+ *  Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -28,7 +29,7 @@
  *  as that of the covered work.
  */
 
-#include "mainbuffer.h"
+#include "ringbufferpool.h"
 #include "ringbuffer.h"
 #include "sfl_types.h" // for SIZEBUF
 #include "logger.h"
@@ -37,12 +38,13 @@
 #include <utility> // for std::pair
 #include <cstring>
 
-const char * const MainBuffer::DEFAULT_ID = "audiolayer_id";
+const char * const RingBufferPool::DEFAULT_ID = "audiolayer_id";
 
-MainBuffer::MainBuffer() : defaultRingBuffer_(createRingBuffer(DEFAULT_ID))
+RingBufferPool::RingBufferPool()
+    : defaultRingBuffer_(createRingBuffer(DEFAULT_ID))
 {}
 
-MainBuffer::~MainBuffer()
+RingBufferPool::~RingBufferPool()
 {
     readBindingsMap_.clear();
     defaultRingBuffer_.reset();
@@ -57,7 +59,7 @@ MainBuffer::~MainBuffer()
 }
 
 void
-MainBuffer::setInternalSamplingRate(unsigned sr)
+RingBufferPool::setInternalSamplingRate(unsigned sr)
 {
     std::lock_guard<std::recursive_mutex> lk(stateLock_);
 
@@ -68,7 +70,7 @@ MainBuffer::setInternalSamplingRate(unsigned sr)
 }
 
 void
-MainBuffer::setInternalAudioFormat(AudioFormat format)
+RingBufferPool::setInternalAudioFormat(AudioFormat format)
 {
     std::lock_guard<std::recursive_mutex> lk(stateLock_);
 
@@ -79,7 +81,7 @@ MainBuffer::setInternalAudioFormat(AudioFormat format)
 }
 
 std::shared_ptr<RingBuffer>
-MainBuffer::getRingBuffer(const std::string& id)
+RingBufferPool::getRingBuffer(const std::string& id)
 {
     std::lock_guard<std::recursive_mutex> lk(stateLock_);
 
@@ -94,7 +96,7 @@ MainBuffer::getRingBuffer(const std::string& id)
 }
 
 std::shared_ptr<RingBuffer>
-MainBuffer::getRingBuffer(const std::string& id) const
+RingBufferPool::getRingBuffer(const std::string& id) const
 {
     std::lock_guard<std::recursive_mutex> lk(stateLock_);
 
@@ -106,7 +108,7 @@ MainBuffer::getRingBuffer(const std::string& id) const
 }
 
 std::shared_ptr<RingBuffer>
-MainBuffer::createRingBuffer(const std::string& id)
+RingBufferPool::createRingBuffer(const std::string& id)
 {
     std::lock_guard<std::recursive_mutex> lk(stateLock_);
 
@@ -122,22 +124,22 @@ MainBuffer::createRingBuffer(const std::string& id)
     return rbuf;
 }
 
-const MainBuffer::ReadBindings*
-MainBuffer::getReadBindings(const std::string& call_id) const
+const RingBufferPool::ReadBindings*
+RingBufferPool::getReadBindings(const std::string& call_id) const
 {
     const auto& iter = readBindingsMap_.find(call_id);
     return iter != readBindingsMap_.cend() ? &iter->second : nullptr;
 }
 
-MainBuffer::ReadBindings*
-MainBuffer::getReadBindings(const std::string& call_id)
+RingBufferPool::ReadBindings*
+RingBufferPool::getReadBindings(const std::string& call_id)
 {
     const auto& iter = readBindingsMap_.find(call_id);
     return iter != readBindingsMap_.cend() ? &iter->second : nullptr;
 }
 
 void
-MainBuffer::removeReadBindings(const std::string& call_id)
+RingBufferPool::removeReadBindings(const std::string& call_id)
 {
     if (not readBindingsMap_.erase(call_id))
         ERROR("CallID set %s does not exist!", call_id.c_str());
@@ -147,7 +149,7 @@ MainBuffer::removeReadBindings(const std::string& call_id)
  * Make given call ID a reader of given ring buffer
  */
 void
-MainBuffer::addReaderToRingBuffer(std::shared_ptr<RingBuffer> rbuf,
+RingBufferPool::addReaderToRingBuffer(std::shared_ptr<RingBuffer> rbuf,
                                   const std::string& call_id)
 {
     if (call_id != DEFAULT_ID and rbuf->id == call_id)
@@ -159,7 +161,7 @@ MainBuffer::addReaderToRingBuffer(std::shared_ptr<RingBuffer> rbuf,
 }
 
 void
-MainBuffer::removeReaderFromRingBuffer(std::shared_ptr<RingBuffer> rbuf,
+RingBufferPool::removeReaderFromRingBuffer(std::shared_ptr<RingBuffer> rbuf,
                                        const std::string& call_id)
 {
     if (auto bindings = getReadBindings(call_id)) {
@@ -172,7 +174,8 @@ MainBuffer::removeReaderFromRingBuffer(std::shared_ptr<RingBuffer> rbuf,
 }
 
 void
-MainBuffer::bindCallID(const std::string& call_id1, const std::string& call_id2)
+RingBufferPool::bindCallID(const std::string& call_id1,
+                           const std::string& call_id2)
 {
     const auto& rb_call1 = getRingBuffer(call_id1);
     if (not rb_call1) {
@@ -193,7 +196,7 @@ MainBuffer::bindCallID(const std::string& call_id1, const std::string& call_id2)
 }
 
 void
-MainBuffer::bindHalfDuplexOut(const std::string& process_id,
+RingBufferPool::bindHalfDuplexOut(const std::string& process_id,
                               const std::string& call_id)
 {
     /* This method is used only for active calls, if this call does not exist,
@@ -206,7 +209,7 @@ MainBuffer::bindHalfDuplexOut(const std::string& process_id,
 }
 
 void
-MainBuffer::unBindCallID(const std::string& call_id1,
+RingBufferPool::unBindCallID(const std::string& call_id1,
                          const std::string& call_id2)
 {
     const auto& rb_call1 = getRingBuffer(call_id1);
@@ -228,7 +231,7 @@ MainBuffer::unBindCallID(const std::string& call_id1,
 }
 
 void
-MainBuffer::unBindHalfDuplexOut(const std::string& process_id,
+RingBufferPool::unBindHalfDuplexOut(const std::string& process_id,
                                 const std::string& call_id)
 {
     std::lock_guard<std::recursive_mutex> lk(stateLock_);
@@ -238,7 +241,7 @@ MainBuffer::unBindHalfDuplexOut(const std::string& process_id,
 }
 
 void
-MainBuffer::unBindAll(const std::string& call_id)
+RingBufferPool::unBindAll(const std::string& call_id)
 {
     const auto& rb_call = getRingBuffer(call_id);
     if (not rb_call) {
@@ -260,7 +263,7 @@ MainBuffer::unBindAll(const std::string& call_id)
 }
 
 size_t
-MainBuffer::getData(AudioBuffer& buffer, const std::string& call_id)
+RingBufferPool::getData(AudioBuffer& buffer, const std::string& call_id)
 {
     std::lock_guard<std::recursive_mutex> lk(stateLock_);
 
@@ -289,9 +292,9 @@ MainBuffer::getData(AudioBuffer& buffer, const std::string& call_id)
 }
 
 bool
-MainBuffer::waitForDataAvailable(const std::string& call_id,
-                                 size_t min_frames,
-                                 const std::chrono::microseconds& max_wait) const
+RingBufferPool::waitForDataAvailable(const std::string& call_id,
+									 size_t min_frames,
+                                 	 const std::chrono::microseconds& max_wait) const
 {
     std::unique_lock<std::recursive_mutex> lk(stateLock_);
 
@@ -313,7 +316,7 @@ MainBuffer::waitForDataAvailable(const std::string& call_id,
 }
 
 size_t
-MainBuffer::getAvailableData(AudioBuffer& buffer, const std::string& call_id)
+RingBufferPool::getAvailableData(AudioBuffer& buffer, const std::string& call_id)
 {
     std::lock_guard<std::recursive_mutex> lk(stateLock_);
 
@@ -329,7 +332,8 @@ MainBuffer::getAvailableData(AudioBuffer& buffer, const std::string& call_id)
     size_t availableSamples = std::numeric_limits<size_t>::max();
 
     for (const auto& rbuf : *bindings)
-        availableSamples = std::min(availableSamples, rbuf->availableForGet(call_id));
+        availableSamples = std::min(availableSamples,
+                                    rbuf->availableForGet(call_id));
 
     if (availableSamples == std::numeric_limits<size_t>::max())
         return 0;
@@ -351,7 +355,7 @@ MainBuffer::getAvailableData(AudioBuffer& buffer, const std::string& call_id)
 }
 
 size_t
-MainBuffer::availableForGet(const std::string& call_id) const
+RingBufferPool::availableForGet(const std::string& call_id) const
 {
     std::lock_guard<std::recursive_mutex> lk(stateLock_);
 
@@ -376,7 +380,7 @@ MainBuffer::availableForGet(const std::string& call_id) const
 }
 
 size_t
-MainBuffer::discard(size_t toDiscard, const std::string& call_id)
+RingBufferPool::discard(size_t toDiscard, const std::string& call_id)
 {
     std::lock_guard<std::recursive_mutex> lk(stateLock_);
 
@@ -391,7 +395,7 @@ MainBuffer::discard(size_t toDiscard, const std::string& call_id)
 }
 
 void
-MainBuffer::flush(const std::string& call_id)
+RingBufferPool::flush(const std::string& call_id)
 {
     std::lock_guard<std::recursive_mutex> lk(stateLock_);
 
@@ -404,7 +408,7 @@ MainBuffer::flush(const std::string& call_id)
 }
 
 void
-MainBuffer::flushAllBuffers()
+RingBufferPool::flushAllBuffers()
 {
     std::lock_guard<std::recursive_mutex> lk(stateLock_);
 
diff --git a/daemon/src/audio/mainbuffer.h b/daemon/src/audio/ringbufferpool.h
similarity index 91%
rename from daemon/src/audio/mainbuffer.h
rename to daemon/src/audio/ringbufferpool.h
index 4f9b90fc506c5170eb5fd8b8b19621ec03119cb1..803606f0cd3797a6565cc3e1cd71dbaa8af86f99 100644
--- a/daemon/src/audio/mainbuffer.h
+++ b/daemon/src/audio/ringbufferpool.h
@@ -1,6 +1,7 @@
 /*
  *  Copyright (C) 2004-2014 Savoir-Faire Linux Inc.
- *  Author : Alexandre Savard <alexandre.savard@savoirfairelinux.com>
+ *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
+ *  Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -28,8 +29,8 @@
  *  as that of the covered work.
  */
 
-#ifndef MAIN_BUFFER_H_
-#define MAIN_BUFFER_H_
+#ifndef RING_BUFFER_POOL_H_
+#define RING_BUFFER_POOL_H_
 
 #include "audiobuffer.h"
 #include "noncopyable.h"
@@ -42,14 +43,14 @@
 
 class RingBuffer;
 
-class MainBuffer {
+class RingBufferPool {
 
     public:
         static const char * const DEFAULT_ID;
 
-        MainBuffer();
+        RingBufferPool();
 
-        ~MainBuffer();
+        ~RingBufferPool();
 
         int getInternalSamplingRate() const {
             return internalAudioFormat_.sample_rate;
@@ -129,16 +130,16 @@ class MainBuffer {
         std::shared_ptr<RingBuffer> getRingBuffer(const std::string& id) const;
 
     private:
-        NON_COPYABLE(MainBuffer);
+        NON_COPYABLE(RingBufferPool);
 
         // A set of RingBuffers readable by a call
         typedef std::set<std::shared_ptr<RingBuffer>,
             std::owner_less<std::shared_ptr<RingBuffer>> > ReadBindings;
 
-        const MainBuffer::ReadBindings*
-        getReadBindings(const std::string& call_id) const;
+        const RingBufferPool::ReadBindings*
+		getReadBindings(const std::string& call_id) const;
 
-        MainBuffer::ReadBindings* getReadBindings(const std::string& call_id);
+        RingBufferPool::ReadBindings* getReadBindings(const std::string& call_id);
 
         void removeReadBindings(const std::string& call_id);
 
@@ -161,4 +162,4 @@ class MainBuffer {
         std::shared_ptr<RingBuffer> defaultRingBuffer_;
 };
 
-#endif  // MainBuffer
+#endif  // RING_BUFFER_POOL_H_
diff --git a/daemon/src/call.cpp b/daemon/src/call.cpp
index 584d9f6ef65ff6320958ca8e2d09ab650cdb9963..62c751206692f8cb6e39c94832297e6a5d0f4ee8 100644
--- a/daemon/src/call.cpp
+++ b/daemon/src/call.cpp
@@ -33,7 +33,7 @@
 #include "call.h"
 #include "account.h"
 #include "manager.h"
-#include "audio/mainbuffer.h"
+#include "audio/ringbufferpool.h"
 #include "history/historyitem.h"
 
 #include "sip/sip_utils.h"
@@ -210,17 +210,17 @@ bool
 Call::toggleRecording()
 {
     const bool startRecording = Recordable::toggleRecording();
-    MainBuffer &mbuffer = Manager::instance().getMainBuffer();
+    RingBufferPool &rbPool = Manager::instance().getRingBufferPool();
     std::string process_id = Recordable::recorder_.getRecorderID();
 
     if (startRecording) {
-        mbuffer.bindHalfDuplexOut(process_id, id_);
-        mbuffer.bindHalfDuplexOut(process_id, MainBuffer::DEFAULT_ID);
+        rbPool.bindHalfDuplexOut(process_id, id_);
+        rbPool.bindHalfDuplexOut(process_id, RingBufferPool::DEFAULT_ID);
 
         Recordable::recorder_.start();
     } else {
-        mbuffer.unBindHalfDuplexOut(process_id, id_);
-        mbuffer.unBindHalfDuplexOut(process_id, MainBuffer::DEFAULT_ID);
+        rbPool.unBindHalfDuplexOut(process_id, id_);
+        rbPool.unBindHalfDuplexOut(process_id, RingBufferPool::DEFAULT_ID);
     }
 
     return startRecording;
diff --git a/daemon/src/conference.cpp b/daemon/src/conference.cpp
index b681e9b4d4ba769b3ad9a877f121ba11f973fe71..9fe09c6b32cfbbac613a4071162ee62c60c4216d 100644
--- a/daemon/src/conference.cpp
+++ b/daemon/src/conference.cpp
@@ -34,7 +34,7 @@
 #include "conference.h"
 #include "manager.h"
 #include "audio/audiolayer.h"
-#include "audio/mainbuffer.h"
+#include "audio/ringbufferpool.h"
 
 #ifdef SFL_VIDEO
 #include "sip/sipcall.h"
@@ -100,16 +100,16 @@ void Conference::remove(const std::string &participant_id)
 
 void Conference::bindParticipant(const std::string &participant_id)
 {
-    auto &mainBuffer = Manager::instance().getMainBuffer();
+    auto &rbPool = Manager::instance().getRingBufferPool();
 
     for (const auto &item : participants_) {
         if (participant_id != item)
-            mainBuffer.bindCallID(participant_id, item);
-        mainBuffer.flush(item);
+            rbPool.bindCallID(participant_id, item);
+        rbPool.flush(item);
     }
 
-    mainBuffer.bindCallID(participant_id, MainBuffer::DEFAULT_ID);
-    mainBuffer.flush(MainBuffer::DEFAULT_ID);
+    rbPool.bindCallID(participant_id, RingBufferPool::DEFAULT_ID);
+    rbPool.flush(RingBufferPool::DEFAULT_ID);
 }
 
 std::string Conference::getStateStr() const
@@ -153,23 +153,23 @@ Conference::getDisplayNames() const
 bool Conference::toggleRecording()
 {
     const bool startRecording = Recordable::toggleRecording();
-    MainBuffer &mbuffer = Manager::instance().getMainBuffer();
+    auto& rbPool = Manager::instance().getRingBufferPool();
 
     std::string process_id(Recordable::recorder_.getRecorderID());
 
     // start recording
     if (startRecording) {
         for (const auto &item : participants_)
-            mbuffer.bindHalfDuplexOut(process_id, item);
+            rbPool.bindHalfDuplexOut(process_id, item);
 
-        mbuffer.bindHalfDuplexOut(process_id, MainBuffer::DEFAULT_ID);
+        rbPool.bindHalfDuplexOut(process_id, RingBufferPool::DEFAULT_ID);
 
         Recordable::recorder_.start();
     } else {
         for (const auto &item : participants_)
-            mbuffer.unBindHalfDuplexOut(process_id, item);
+            rbPool.unBindHalfDuplexOut(process_id, item);
 
-        mbuffer.unBindHalfDuplexOut(process_id, MainBuffer::DEFAULT_ID);
+        rbPool.unBindHalfDuplexOut(process_id, RingBufferPool::DEFAULT_ID);
     }
 
     return startRecording;
diff --git a/daemon/src/iax/iaxcall.cpp b/daemon/src/iax/iaxcall.cpp
index c8b059ce496cda358c60a72414983ab6a5ca8ca6..9caa76da5fd7dd1d07fbec10fe7f96b5c23e4fce 100644
--- a/daemon/src/iax/iaxcall.cpp
+++ b/daemon/src/iax/iaxcall.cpp
@@ -40,6 +40,7 @@
 #include "manager.h"
 #include "iaxaccount.h"
 #include "iaxvoiplink.h"
+#include "audio/ringbufferpool.h"
 #include "audio/ringbuffer.h"
 
 #if HAVE_INSTANT_MESSAGING
@@ -74,7 +75,7 @@ IAXCall::IAXCall(IAXAccount& account, const std::string& id, Call::CallType type
       format(0),
       session(NULL)
 {
-    ringbuffer_ = Manager::instance().getMainBuffer().createRingBuffer(getCallId());
+    ringbuffer_ = Manager::instance().getRingBufferPool().createRingBuffer(getCallId());
 }
 
 int IAXCall::getSupportedFormat(const std::string &accountID) const
@@ -148,13 +149,13 @@ IAXCall::answer()
     setState(Call::ACTIVE);
     setConnectionState(Call::CONNECTED);
 
-    Manager::instance().getMainBuffer().flushAllBuffers();
+    Manager::instance().getRingBufferPool().flushAllBuffers();
 }
 
 void
 IAXCall::hangup(int reason UNUSED)
 {
-    Manager::instance().getMainBuffer().unBindAll(getCallId());
+    Manager::instance().getRingBufferPool().unBindAll(getCallId());
 
     std::lock_guard<std::mutex> lock(IAXVoIPLink::mutexIAX);
     iax_hangup(session, (char*) "Dumped Call");
@@ -192,7 +193,7 @@ IAXCall::attendedTransfer(const std::string& /*targetID*/)
 void
 IAXCall::onhold()
 {
-    Manager::instance().getMainBuffer().unBindAll(getCallId());
+    Manager::instance().getRingBufferPool().unBindAll(getCallId());
 
     {
         std::lock_guard<std::mutex> lock(IAXVoIPLink::mutexIAX);
@@ -220,7 +221,7 @@ IAXCall::offhold()
 void
 IAXCall::peerHungup()
 {
-    Manager::instance().getMainBuffer().unBindAll(getCallId());
+    Manager::instance().getRingBufferPool().unBindAll(getCallId());
 
     session = nullptr;
 }
diff --git a/daemon/src/iax/iaxvoiplink.cpp b/daemon/src/iax/iaxvoiplink.cpp
index 51f3c44332493e18d4b4ebbad421b91aeb5d7bfa..364d8ac8678d8eecab48cadf4fdd92a7e137b35e 100644
--- a/daemon/src/iax/iaxvoiplink.cpp
+++ b/daemon/src/iax/iaxvoiplink.cpp
@@ -42,6 +42,7 @@
 #include "hooks/urlhook.h"
 #include "audio/audiolayer.h"
 #include "audio/resampler.h"
+#include "audio/ringbufferpool.h"
 #include "array_size.h"
 #include "map_utils.h"
 #include "call_factory.h"
@@ -157,20 +158,20 @@ IAXVoIPLink::sendAudioFromMic()
         if (!audioCodec)
             continue;
 
-        Manager::instance().getMainBuffer().setInternalSamplingRate(audioCodec->getClockRate());
+        Manager::instance().getRingBufferPool().setInternalSamplingRate(audioCodec->getClockRate());
 
-        unsigned int mainBufferSampleRate = Manager::instance().getMainBuffer().getInternalSamplingRate();
+        unsigned int mainBufferSampleRate = Manager::instance().getRingBufferPool().getInternalSamplingRate();
 
         // we have to get 20ms of data from the mic *20/1000 = /50
         // rate/50 shall be lower than IAX__20S_48KHZ_MAX
         size_t samples = mainBufferSampleRate * 20 / 1000;
 
-        if (Manager::instance().getMainBuffer().availableForGet(currentCall->getCallId()) < samples)
+        if (Manager::instance().getRingBufferPool().availableForGet(currentCall->getCallId()) < samples)
             continue;
 
         // Get bytes from micRingBuffer to data_from_mic
         rawBuffer_.resize(samples);
-        samples = Manager::instance().getMainBuffer().getData(rawBuffer_, currentCall->getCallId());
+        samples = Manager::instance().getRingBufferPool().getData(rawBuffer_, currentCall->getCallId());
 
         int compSize;
         unsigned int audioRate = audioCodec->getClockRate();
@@ -231,7 +232,7 @@ IAXVoIPLink::handleAnswerTransfer(iax_event* event, IAXCall& call)
     Manager::instance().addStream(id);
     Manager::instance().peerAnsweredCall(id);
     Manager::instance().startAudioDriverStream();
-    Manager::instance().getMainBuffer().flushAllBuffers();
+    Manager::instance().getRingBufferPool().flushAllBuffers();
 }
 
 void
@@ -333,8 +334,8 @@ IAXVoIPLink::iaxHandleVoiceEvent(iax_event* event, IAXCall& call)
     if (!audioCodec)
         return;
 
-    Manager::instance().getMainBuffer().setInternalSamplingRate(audioCodec->getClockRate());
-    unsigned int mainBufferSampleRate = Manager::instance().getMainBuffer().getInternalSamplingRate();
+    Manager::instance().getRingBufferPool().setInternalSamplingRate(audioCodec->getClockRate());
+    unsigned int mainBufferSampleRate = Manager::instance().getRingBufferPool().getInternalSamplingRate();
 
     if (event->subclass)
         call.format = event->subclass;
diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp
index 672a6e43ab3e893360d977aa1d359673472130bf..5972f2f054f3cdffcfdf91657b7e402a0aa9f731 100644
--- a/daemon/src/managerimpl.cpp
+++ b/daemon/src/managerimpl.cpp
@@ -63,6 +63,7 @@
 #include "audio/sound/tonelist.h"
 #include "audio/sound/audiofile.h"
 #include "audio/sound/dtmf.h"
+#include "audio/ringbufferpool.h"
 #include "history/historynamecache.h"
 #include "history/history.h"
 #include "manager.h"
@@ -127,8 +128,9 @@ ManagerImpl::ManagerImpl() :
     hasTriedToRegister_(false), audioCodecFactory(), client_(),
     currentCallMutex_(), dtmfKey_(), dtmfBuf_(0, AudioFormat::MONO()),
     toneMutex_(), telephoneTone_(), audiofile_(), audioLayerMutex_(),
-    waitingCalls_(), waitingCallsMutex_(), path_(),
-    mainBuffer_(), callFactory(), conferenceMap_(), history_(),
+    waitingCalls_(), waitingCallsMutex_(), path_()
+    , ringbufferpool_(new RingBufferPool)
+    , callFactory(), conferenceMap_(), history_(),
     finished_(false), accountFactory_()
 {
     // initialize random generator for call id
@@ -209,7 +211,7 @@ ManagerImpl::init(const std::string &config_file)
                 std::lock_guard<std::mutex> toneLock(toneMutex_);
                 telephoneTone_.reset(new TelephoneTone(preferences.getZoneToneChoice(), audiodriver_->getSampleRate()));
             }
-            dtmfKey_.reset(new DTMF(getMainBuffer().getInternalSamplingRate()));
+            dtmfKey_.reset(new DTMF(getRingBufferPool().getInternalSamplingRate()));
         }
     }
 
@@ -345,7 +347,7 @@ ManagerImpl::outgoingCall(const std::string& preferred_account_id,
         if (not isConference(current_call_id) and not isConferenceParticipant(current_call_id))
             onHoldCall(current_call_id);
         else if (isConference(current_call_id) and not isConferenceParticipant(call_id))
-            detachParticipant(MainBuffer::DEFAULT_ID);
+            detachParticipant(RingBufferPool::DEFAULT_ID);
     }
 
     try {
@@ -405,7 +407,7 @@ ManagerImpl::answerCall(const std::string& call_id)
         } else if (isConference(current_call_id) and not isConferenceParticipant(call_id)) {
             // if we are talking to a conference and we are answering an incoming call
             DEBUG("Detach main participant from conference");
-            detachParticipant(MainBuffer::DEFAULT_ID);
+            detachParticipant(RingBufferPool::DEFAULT_ID);
         }
     }
 
@@ -573,7 +575,7 @@ ManagerImpl::offHoldCall(const std::string& callId)
         } else if (isConference(currentCallId) && callId != currentCallId) {
             holdConference(currentCallId);
         } else if (isConference(currentCallId) and not isConferenceParticipant(callId))
-            detachParticipant(MainBuffer::DEFAULT_ID);
+            detachParticipant(RingBufferPool::DEFAULT_ID);
     }
 
     std::shared_ptr<Call> call;
@@ -711,7 +713,7 @@ ManagerImpl::removeConference(const std::string& conference_id)
     // We now need to bind the audio to the remain participant
 
     // Unbind main participant audio from conference
-    getMainBuffer().unBindAll(MainBuffer::DEFAULT_ID);
+    getRingBufferPool().unBindAll(RingBufferPool::DEFAULT_ID);
 
     ParticipantSet participants(conf->getParticipantList());
 
@@ -719,7 +721,7 @@ ManagerImpl::removeConference(const std::string& conference_id)
     ParticipantSet::iterator iter_p = participants.begin();
 
     if (iter_p != participants.end())
-        getMainBuffer().bindCallID(*iter_p, MainBuffer::DEFAULT_ID);
+        getRingBufferPool().bindCallID(*iter_p, RingBufferPool::DEFAULT_ID);
 
     // Then remove the conference from the conference map
     if (conferenceMap_.erase(conference_id))
@@ -845,7 +847,7 @@ ManagerImpl::addParticipant(const std::string& callId,
     // detach from prior communication and switch to this conference
     if (current_call_id != callId) {
         if (isConference(current_call_id))
-            detachParticipant(MainBuffer::DEFAULT_ID);
+            detachParticipant(RingBufferPool::DEFAULT_ID);
         else
             onHoldCall(current_call_id);
     }
@@ -866,7 +868,7 @@ ManagerImpl::addParticipant(const std::string& callId,
     conf->add(callId);
 
     // Connect new audio streams together
-    getMainBuffer().unBindAll(callId);
+    getRingBufferPool().unBindAll(callId);
 
     std::map<std::string, std::string> callDetails(getCallDetails(callId));
     std::string callState(callDetails.find("CALL_STATE")->second);
@@ -897,7 +899,7 @@ ManagerImpl::addMainParticipant(const std::string& conference_id)
         std::string current_call_id(getCurrentCallId());
 
         if (isConference(current_call_id))
-            detachParticipant(MainBuffer::DEFAULT_ID);
+            detachParticipant(RingBufferPool::DEFAULT_ID);
         else
             onHoldCall(current_call_id);
     }
@@ -915,12 +917,12 @@ ManagerImpl::addMainParticipant(const std::string& conference_id)
         ParticipantSet participants(conf->getParticipantList());
 
         for (const auto &item_p : participants) {
-            getMainBuffer().bindCallID(item_p, MainBuffer::DEFAULT_ID);
+            getRingBufferPool().bindCallID(item_p, RingBufferPool::DEFAULT_ID);
             // Reset ringbuffer's readpointers
-            getMainBuffer().flush(item_p);
+            getRingBufferPool().flush(item_p);
         }
 
-        getMainBuffer().flush(MainBuffer::DEFAULT_ID);
+        getRingBufferPool().flush(RingBufferPool::DEFAULT_ID);
 
         if (conf->getState() == Conference::ACTIVE_DETACHED)
             conf->setState(Conference::ACTIVE_ATTACHED);
@@ -981,7 +983,7 @@ ManagerImpl::joinParticipant(const std::string& callId1,
     if ((current_call_id != callId1) and (current_call_id != callId2)) {
         // If currently in a conference
         if (isConference(current_call_id))
-            detachParticipant(MainBuffer::DEFAULT_ID);
+            detachParticipant(RingBufferPool::DEFAULT_ID);
         else
             onHoldCall(current_call_id); // currently in a call
     }
@@ -990,10 +992,10 @@ ManagerImpl::joinParticipant(const std::string& callId1,
     auto conf = createConference(callId1, callId2);
 
     call1->setConfId(conf->getConfID());
-    getMainBuffer().unBindAll(callId1);
+    getRingBufferPool().unBindAll(callId1);
 
     call2->setConfId(conf->getConfID());
-    getMainBuffer().unBindAll(callId2);
+    getRingBufferPool().unBindAll(callId2);
 
     // Process call1 according to its state
     std::string call1_state_str(call1Details.find("CALL_STATE")->second);
@@ -1036,7 +1038,7 @@ ManagerImpl::joinParticipant(const std::string& callId1,
     conf->setState(Conference::ACTIVE_ATTACHED);
 
     // set recording sampling rate
-    conf->setRecordingFormat(mainBuffer_.getInternalAudioFormat());
+    conf->setRecordingFormat(ringbufferpool_->getInternalAudioFormat());
 
     return true;
 }
@@ -1082,7 +1084,7 @@ ManagerImpl::createConfFromParticipantList(const std::vector< std::string > &par
     if (successCounter >= 2) {
         conferenceMap_[conf->getConfID()] = conf;
         client_.getCallManager()->conferenceCreated(conf->getConfID());
-        conf->setRecordingFormat(mainBuffer_.getInternalAudioFormat());
+        conf->setRecordingFormat(ringbufferpool_->getInternalAudioFormat());
     }
 }
 
@@ -1091,7 +1093,7 @@ ManagerImpl::detachParticipant(const std::string& call_id)
 {
     const std::string current_call_id(getCurrentCallId());
 
-    if (call_id != MainBuffer::DEFAULT_ID) {
+    if (call_id != RingBufferPool::DEFAULT_ID) {
         auto call = getCallFromCallID(call_id);
         if (!call) {
             ERROR("Could not find call %s", call_id.c_str());
@@ -1121,7 +1123,7 @@ ManagerImpl::detachParticipant(const std::string& call_id)
 
     } else {
         DEBUG("Unbind main participant from conference %d");
-        getMainBuffer().unBindAll(MainBuffer::DEFAULT_ID);
+        getRingBufferPool().unBindAll(RingBufferPool::DEFAULT_ID);
 
         if (not isConference(current_call_id)) {
             ERROR("Current call id (%s) is not a conference", current_call_id.c_str());
@@ -1194,9 +1196,9 @@ ManagerImpl::processRemainingParticipants(Conference &conf)
     if (n > 1) {
         // Reset ringbuffer's readpointers
         for (const auto &p : participants)
-            getMainBuffer().flush(p);
+            getRingBufferPool().flush(p);
 
-        getMainBuffer().flush(MainBuffer::DEFAULT_ID);
+        getRingBufferPool().flush(RingBufferPool::DEFAULT_ID);
     } else if (n == 1) {
         // this call is the last participant, hence
         // the conference is over
@@ -1264,7 +1266,7 @@ ManagerImpl::addStream(const std::string& call_id)
         DEBUG("Add stream to call");
 
         // bind to main
-        getMainBuffer().bindCallID(call_id, MainBuffer::DEFAULT_ID);
+        getRingBufferPool().bindCallID(call_id, RingBufferPool::DEFAULT_ID);
 
         std::lock_guard<std::mutex> lock(audioLayerMutex_);
         audiodriver_->flushUrgent();
@@ -1276,7 +1278,7 @@ void
 ManagerImpl::removeStream(const std::string& call_id)
 {
     DEBUG("Remove audio stream %s", call_id.c_str());
-    getMainBuffer().unBindAll(call_id);
+    getRingBufferPool().unBindAll(call_id);
 }
 
 void
@@ -2252,7 +2254,7 @@ ManagerImpl::hardwareAudioFormatChanged(AudioFormat format)
 void
 ManagerImpl::audioFormatUsed(AudioFormat format)
 {
-    AudioFormat currentFormat = mainBuffer_.getInternalAudioFormat();
+    AudioFormat currentFormat = ringbufferpool_->getInternalAudioFormat();
     format.nb_channels = std::max(currentFormat.nb_channels, std::min(format.nb_channels, 2u)); // max 2 channels.
     format.sample_rate = std::max(currentFormat.sample_rate, format.sample_rate);
 
@@ -2261,7 +2263,7 @@ ManagerImpl::audioFormatUsed(AudioFormat format)
 
     DEBUG("Audio format changed: %s -> %s", currentFormat.toString().c_str(), format.toString().c_str());
 
-    mainBuffer_.setInternalAudioFormat(format);
+    ringbufferpool_->setInternalAudioFormat(format);
 
     {
         std::lock_guard<std::mutex> toneLock(toneMutex_);
@@ -2707,12 +2709,6 @@ ManagerImpl::getAudioDriver()
     return audiodriver_;
 }
 
-MainBuffer &
-ManagerImpl::getMainBuffer()
-{
-    return mainBuffer_;
-}
-
 Client*
 ManagerImpl::getClient()
 {
diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h
index b3ec3598d5ebe722ebdf8f1252535665fd97e511..2bdd17c7c75addff49806dc8a9d447132b117749 100644
--- a/daemon/src/managerimpl.h
+++ b/daemon/src/managerimpl.h
@@ -57,7 +57,6 @@
 #include "audio/audiolayer.h"
 #include "audio/sound/tone.h"  // for Tone::TONEID declaration
 #include "audio/codecs/audiocodecfactory.h"
-#include "audio/mainbuffer.h"
 
 #include "preferences.h"
 #include "history/history.h"
@@ -73,6 +72,7 @@ class AudioFile;
 class AudioLayer;
 class History;
 class TelephoneTone;
+class RingBufferPool;
 
 /** To send multiple string */
 typedef std::list<std::string> TokenList;
@@ -84,6 +84,8 @@ typedef std::set<std::string> CallIDSet;
 
 static const char * const default_conf = "conf";
 
+typedef std::set<std::string> CallIDSet;
+
 /** Manager (controller) of sflphone daemon */
 class ManagerImpl {
     public:
@@ -838,20 +840,20 @@ class ManagerImpl {
         int loadAccountMap(const YAML::Node &node);
 
         /**
-         * Instance of the MainBuffer for the whole application
+         * Instance of the RingBufferPool for the whole application
          *
-         * In order to send signal to other parts of the application, one must pass through the mainbuffer.
-         * Audio instances must be registered into the MainBuffer and bound together via the ManagerImpl.
+         * In order to send signal to other parts of the application, one must pass through the RingBufferMananger.
+         * Audio instances must be registered into the RingBufferMananger and bound together via the ManagerImpl.
          *
          */
-        MainBuffer mainBuffer_;
+        std::unique_ptr<RingBufferPool> ringbufferpool_;
 
     public:
 
         /**
-         * Return a pointer to the  instance of the mainbuffer
+         * Return a pointer to the instance of the RingBufferPool
          */
-        MainBuffer &getMainBuffer();
+        RingBufferPool& getRingBufferPool() { return *ringbufferpool_; }
 
         /**
          * Tell if there is a current call processed
diff --git a/daemon/test/Makefile.am b/daemon/test/Makefile.am
index 4186f0984c5e3b7a8a67fb0bb55e539ca8ca4470..094777e82fbb0ee8fff076df5ecc5ed407091c9a 100644
--- a/daemon/test/Makefile.am
+++ b/daemon/test/Makefile.am
@@ -34,8 +34,8 @@ test_SOURCES = constants.h \
 			   siptest.cpp \
 			   sdptest.h \
 			   sdptest.cpp \
-			   mainbuffertest.h \
-			   mainbuffertest.cpp \
+			   ringbufferpooltest.h \
+			   ringbufferpooltest.cpp \
 			   resamplertest.h \
 			   resamplertest.cpp \
 			   hooktest.h \
diff --git a/daemon/test/mainbuffertest.cpp b/daemon/test/mainbuffertest.cpp
deleted file mode 100644
index 448b04e71b21b9014daf55ffa8af907e6a69f92e..0000000000000000000000000000000000000000
--- a/daemon/test/mainbuffertest.cpp
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- *  Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
- *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- *
- *  Additional permission under GNU GPL version 3 section 7:
- *
- *  If you modify this program, or any covered work, by linking or
- *  combining it with the OpenSSL project's OpenSSL library (or a
- *  modified version of that library), containing parts covered by the
- *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
- *  grants you additional permission to convey the resulting work.
- *  Corresponding Source for a non-source form of such a combination
- *  shall include the source code for the parts of OpenSSL used as well
- *  as that of the covered work.
- */
-
-#include <string>
-#include <memory>
-
-#include "mainbuffertest.h"
-#include "audio/mainbuffer.h"
-#include "audio/ringbuffer.h"
-#include "logger.h"
-#include "test_utils.h"
-
-void MainBufferTest::testBindUnbindBuffer()
-{
-    TITLE();
-
-    std::string test_id1 = "bind unbind 1";
-    std::string test_id2 = "bind unbind 2";
-
-    // bind test_id1 with MainBuffer::DEFAULT_ID (test_id1 not already created)
-    mainbuffer_->bindCallID(test_id1, MainBuffer::DEFAULT_ID);
-
-    // unbind test_id1 with MainBuffer::DEFAULT_ID
-    mainbuffer_->unBindCallID(test_id1, MainBuffer::DEFAULT_ID);
-
-    mainbuffer_->bindCallID(test_id1, MainBuffer::DEFAULT_ID);
-    mainbuffer_->bindCallID(test_id1, MainBuffer::DEFAULT_ID);
-
-    mainbuffer_->bindCallID(test_id2, MainBuffer::DEFAULT_ID);
-    mainbuffer_->bindCallID(test_id2, MainBuffer::DEFAULT_ID);
-
-    // bind test_id1 with test_id2 (both testid1 and test_id2 already created)
-    // calling it twice not supposed to break anything
-    mainbuffer_->bindCallID(test_id1, test_id2);
-    mainbuffer_->bindCallID(test_id1, test_id2);
-
-    mainbuffer_->unBindCallID(test_id1, test_id2);
-    mainbuffer_->unBindCallID(test_id1, test_id2);
-
-    mainbuffer_->unBindCallID(MainBuffer::DEFAULT_ID, test_id2);
-    mainbuffer_->unBindCallID(MainBuffer::DEFAULT_ID, test_id2);
-
-    mainbuffer_->unBindCallID(MainBuffer::DEFAULT_ID, test_id1);
-
-    // test unbind all function
-    mainbuffer_->bindCallID(MainBuffer::DEFAULT_ID, test_id1);
-    mainbuffer_->bindCallID(MainBuffer::DEFAULT_ID, test_id2);
-    mainbuffer_->bindCallID(test_id1, test_id2);
-
-    mainbuffer_->unBindAll(test_id2);
-}
-
-void MainBufferTest::testGetPutData()
-{
-    TITLE();
-
-    std::string test_id = "incoming rtp session";
-
-    auto mainRingBuffer = mainbuffer_->getRingBuffer(MainBuffer::DEFAULT_ID);
-    auto testRingBuffer = mainbuffer_->createRingBuffer(test_id);
-
-    mainbuffer_->bindCallID(test_id, MainBuffer::DEFAULT_ID);
-
-    SFLAudioSample test_sample1 = 12;
-    SFLAudioSample test_sample2 = 13;
-
-    AudioBuffer test_input1(&test_sample1, 1, AudioFormat::MONO());
-    AudioBuffer test_input2(&test_sample2, 1, AudioFormat::MONO());
-    AudioBuffer test_output(100, AudioFormat::MONO());
-
-    // get by test_id without preleminary put
-    CPPUNIT_ASSERT(mainbuffer_->getData(test_output, test_id) == 0);
-
-    // put by MainBuffer::DEFAULT_ID, get by test_id
-    mainRingBuffer->put(test_input1);
-    CPPUNIT_ASSERT(mainbuffer_->getData(test_output, test_id) == 1);
-    CPPUNIT_ASSERT(test_sample1 == (*test_output.getChannel(0))[0]);
-
-    // get by MainBuffer::DEFAULT_ID without preleminary put
-    CPPUNIT_ASSERT(mainbuffer_->getData(test_output, MainBuffer::DEFAULT_ID) == 0);
-
-    // put by test_id, get by MainBuffer::DEFAULT_ID
-    testRingBuffer->put(test_input2);
-    CPPUNIT_ASSERT(mainbuffer_->getData(test_output, MainBuffer::DEFAULT_ID) == 1);
-    CPPUNIT_ASSERT(test_sample2 == (*test_output.getChannel(0))[0]);
-
-    mainbuffer_->unBindCallID(test_id, MainBuffer::DEFAULT_ID);
-}
-
-void MainBufferTest::testGetAvailableData()
-{
-    TITLE();
-    std::string test_id = "getData putData";
-    std::string false_id = "false id";
-
-    auto mainRingBuffer = mainbuffer_->getRingBuffer(MainBuffer::DEFAULT_ID);
-    auto testRingBuffer = mainbuffer_->createRingBuffer(test_id);
-
-    mainbuffer_->bindCallID(test_id, MainBuffer::DEFAULT_ID);
-
-    SFLAudioSample test_sample1 = 12;
-    SFLAudioSample test_sample2 = 13;
-
-    AudioBuffer test_input1(&test_sample1, 1, AudioFormat::MONO());
-    AudioBuffer test_input2(&test_sample2, 1, AudioFormat::MONO());
-    AudioBuffer test_output(1, AudioFormat::MONO());
-    AudioBuffer test_output_large(100, AudioFormat::MONO());
-
-    // put by MainBuffer::DEFAULT_ID get by test_id without preleminary put
-    CPPUNIT_ASSERT(mainbuffer_->availableForGet(test_id) == 0);
-    CPPUNIT_ASSERT(mainbuffer_->getAvailableData(test_output, test_id) == 0);
-
-    // put by MainBuffer::DEFAULT_ID, get by test_id
-    mainRingBuffer->put(test_input1);
-    CPPUNIT_ASSERT(mainbuffer_->availableForGet(test_id) == 1);
-
-    // get by MainBuffer::DEFAULT_ID without preliminary input
-    CPPUNIT_ASSERT(mainbuffer_->availableForGet(test_id) == 0);
-    CPPUNIT_ASSERT(mainbuffer_->getData(test_output_large, test_id) == 0);
-
-    // put by test_id get by test_id
-    testRingBuffer->put(test_input2);
-    CPPUNIT_ASSERT(mainbuffer_->availableForGet(test_id) == 1);
-    CPPUNIT_ASSERT(mainbuffer_->getData(test_output_large, test_id) == 1);
-    CPPUNIT_ASSERT(mainbuffer_->availableForGet(test_id) == 0);
-    CPPUNIT_ASSERT((*test_output_large.getChannel(0))[0] == test_sample2);
-
-    // get by false id
-    CPPUNIT_ASSERT(mainbuffer_->getData(test_output_large, false_id) == 0);
-
-    mainbuffer_->unBindCallID(test_id, MainBuffer::DEFAULT_ID);
-}
-
-void MainBufferTest::testDiscardFlush()
-{
-    TITLE();
-    std::string test_id = "flush discard";
-
-    auto mainRingBuffer = mainbuffer_->getRingBuffer(MainBuffer::DEFAULT_ID);
-    auto testRingBuffer = mainbuffer_->createRingBuffer(test_id);
-
-    mainbuffer_->bindCallID(test_id, MainBuffer::DEFAULT_ID);
-
-    SFLAudioSample test_sample1 = 12;
-    AudioBuffer test_input1(&test_sample1, 1, AudioFormat::MONO());
-
-    testRingBuffer->put(test_input1);
-    mainbuffer_->discard(1, MainBuffer::DEFAULT_ID);
-
-    mainbuffer_->discard(1, test_id);
-
-    mainRingBuffer->put(test_input1);
-
-    mainbuffer_->discard(1, test_id);
-
-    mainbuffer_->unBindCallID(test_id, MainBuffer::DEFAULT_ID);
-}
-
-void MainBufferTest::testConference()
-{
-    TITLE();
-
-    std::string test_id1 = "participant A";
-    std::string test_id2 = "participant B";
-
-    auto mainRingBuffer = mainbuffer_->getRingBuffer(MainBuffer::DEFAULT_ID);
-    auto testRingBuffer1 = mainbuffer_->createRingBuffer(test_id1);
-    auto testRingBuffer2 = mainbuffer_->createRingBuffer(test_id2);
-
-    // test bind Participant A with default
-    mainbuffer_->bindCallID(test_id1, MainBuffer::DEFAULT_ID);
-
-    // test bind Participant B with default
-    mainbuffer_->bindCallID(test_id2, MainBuffer::DEFAULT_ID);
-
-    // test bind Participant A with Participant B
-    mainbuffer_->bindCallID(test_id1, test_id2);
-
-    SFLAudioSample testint = 12;
-    AudioBuffer testbuf(&testint, 1, AudioFormat::MONO());
-
-    // put data test ring buffers
-    mainRingBuffer->put(testbuf);
-
-    // put data test ring buffers
-    testRingBuffer1->put(testbuf);
-    testRingBuffer2->put(testbuf);
-}
-
-MainBufferTest::MainBufferTest() : CppUnit::TestCase("Audio Layer Tests"), mainbuffer_(new MainBuffer) {}
diff --git a/daemon/test/ringbufferpooltest.cpp b/daemon/test/ringbufferpooltest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..94bc01057a2545c9db4109a5ecfbb79362ef1fe3
--- /dev/null
+++ b/daemon/test/ringbufferpooltest.cpp
@@ -0,0 +1,219 @@
+/*
+ *  Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
+ *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
+ *
+ *  Additional permission under GNU GPL version 3 section 7:
+ *
+ *  If you modify this program, or any covered work, by linking or
+ *  combining it with the OpenSSL project's OpenSSL library (or a
+ *  modified version of that library), containing parts covered by the
+ *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
+ *  grants you additional permission to convey the resulting work.
+ *  Corresponding Source for a non-source form of such a combination
+ *  shall include the source code for the parts of OpenSSL used as well
+ *  as that of the covered work.
+ */
+
+#include <string>
+#include <memory>
+
+#include "ringbufferpooltest.h"
+#include "audio/ringbufferpool.h"
+#include "audio/ringbuffer.h"
+#include "logger.h"
+#include "test_utils.h"
+
+void RingBufferPoolTest::testBindUnbindBuffer()
+{
+    TITLE();
+
+    std::string test_id1 = "bind unbind 1";
+    std::string test_id2 = "bind unbind 2";
+
+    // bind test_id1 with RingBufferPool::DEFAULT_ID (test_id1 not already created)
+    rbPool_->bindCallID(test_id1, RingBufferPool::DEFAULT_ID);
+
+    // unbind test_id1 with RingBufferPool::DEFAULT_ID
+    rbPool_->unBindCallID(test_id1, RingBufferPool::DEFAULT_ID);
+
+    rbPool_->bindCallID(test_id1, RingBufferPool::DEFAULT_ID);
+    rbPool_->bindCallID(test_id1, RingBufferPool::DEFAULT_ID);
+
+    rbPool_->bindCallID(test_id2, RingBufferPool::DEFAULT_ID);
+    rbPool_->bindCallID(test_id2, RingBufferPool::DEFAULT_ID);
+
+    // bind test_id1 with test_id2 (both testid1 and test_id2 already created)
+    // calling it twice not supposed to break anything
+    rbPool_->bindCallID(test_id1, test_id2);
+    rbPool_->bindCallID(test_id1, test_id2);
+
+    rbPool_->unBindCallID(test_id1, test_id2);
+    rbPool_->unBindCallID(test_id1, test_id2);
+
+    rbPool_->unBindCallID(RingBufferPool::DEFAULT_ID, test_id2);
+    rbPool_->unBindCallID(RingBufferPool::DEFAULT_ID, test_id2);
+
+    rbPool_->unBindCallID(RingBufferPool::DEFAULT_ID, test_id1);
+
+    // test unbind all function
+    rbPool_->bindCallID(RingBufferPool::DEFAULT_ID, test_id1);
+    rbPool_->bindCallID(RingBufferPool::DEFAULT_ID, test_id2);
+    rbPool_->bindCallID(test_id1, test_id2);
+
+    rbPool_->unBindAll(test_id2);
+}
+
+void RingBufferPoolTest::testGetPutData()
+{
+    TITLE();
+
+    std::string test_id = "incoming rtp session";
+
+    auto mainRingBuffer = rbPool_->getRingBuffer(RingBufferPool::DEFAULT_ID);
+    auto testRingBuffer = rbPool_->createRingBuffer(test_id);
+
+    rbPool_->bindCallID(test_id, RingBufferPool::DEFAULT_ID);
+
+    SFLAudioSample test_sample1 = 12;
+    SFLAudioSample test_sample2 = 13;
+
+    AudioBuffer test_input1(&test_sample1, 1, AudioFormat::MONO());
+    AudioBuffer test_input2(&test_sample2, 1, AudioFormat::MONO());
+    AudioBuffer test_output(100, AudioFormat::MONO());
+
+    // get by test_id without preleminary put
+    CPPUNIT_ASSERT(rbPool_->getData(test_output, test_id) == 0);
+
+    // put by RingBufferPool::DEFAULT_ID, get by test_id
+    mainRingBuffer->put(test_input1);
+    CPPUNIT_ASSERT(rbPool_->getData(test_output, test_id) == 1);
+    CPPUNIT_ASSERT(test_sample1 == (*test_output.getChannel(0))[0]);
+
+    // get by RingBufferPool::DEFAULT_ID without preleminary put
+    CPPUNIT_ASSERT(rbPool_->getData(test_output, RingBufferPool::DEFAULT_ID) == 0);
+
+    // put by test_id, get by RingBufferPool::DEFAULT_ID
+    testRingBuffer->put(test_input2);
+    CPPUNIT_ASSERT(rbPool_->getData(test_output, RingBufferPool::DEFAULT_ID) == 1);
+    CPPUNIT_ASSERT(test_sample2 == (*test_output.getChannel(0))[0]);
+
+    rbPool_->unBindCallID(test_id, RingBufferPool::DEFAULT_ID);
+}
+
+void RingBufferPoolTest::testGetAvailableData()
+{
+    TITLE();
+    std::string test_id = "getData putData";
+    std::string false_id = "false id";
+
+    auto mainRingBuffer = rbPool_->getRingBuffer(RingBufferPool::DEFAULT_ID);
+    auto testRingBuffer = rbPool_->createRingBuffer(test_id);
+
+    rbPool_->bindCallID(test_id, RingBufferPool::DEFAULT_ID);
+
+    SFLAudioSample test_sample1 = 12;
+    SFLAudioSample test_sample2 = 13;
+
+    AudioBuffer test_input1(&test_sample1, 1, AudioFormat::MONO());
+    AudioBuffer test_input2(&test_sample2, 1, AudioFormat::MONO());
+    AudioBuffer test_output(1, AudioFormat::MONO());
+    AudioBuffer test_output_large(100, AudioFormat::MONO());
+
+    // put by RingBufferPool::DEFAULT_ID get by test_id without preleminary put
+    CPPUNIT_ASSERT(rbPool_->availableForGet(test_id) == 0);
+    CPPUNIT_ASSERT(rbPool_->getAvailableData(test_output, test_id) == 0);
+
+    // put by RingBufferPool::DEFAULT_ID, get by test_id
+    mainRingBuffer->put(test_input1);
+    CPPUNIT_ASSERT(rbPool_->availableForGet(test_id) == 1);
+
+    // get by RingBufferPool::DEFAULT_ID without preliminary input
+    CPPUNIT_ASSERT(rbPool_->availableForGet(test_id) == 0);
+    CPPUNIT_ASSERT(rbPool_->getData(test_output_large, test_id) == 0);
+
+    // put by test_id get by test_id
+    testRingBuffer->put(test_input2);
+    CPPUNIT_ASSERT(rbPool_->availableForGet(test_id) == 1);
+    CPPUNIT_ASSERT(rbPool_->getData(test_output_large, test_id) == 1);
+    CPPUNIT_ASSERT(rbPool_->availableForGet(test_id) == 0);
+    CPPUNIT_ASSERT((*test_output_large.getChannel(0))[0] == test_sample2);
+
+    // get by false id
+    CPPUNIT_ASSERT(rbPool_->getData(test_output_large, false_id) == 0);
+
+    rbPool_->unBindCallID(test_id, RingBufferPool::DEFAULT_ID);
+}
+
+void RingBufferPoolTest::testDiscardFlush()
+{
+    TITLE();
+    std::string test_id = "flush discard";
+
+    auto mainRingBuffer = rbPool_->getRingBuffer(RingBufferPool::DEFAULT_ID);
+    auto testRingBuffer = rbPool_->createRingBuffer(test_id);
+
+    rbPool_->bindCallID(test_id, RingBufferPool::DEFAULT_ID);
+
+    SFLAudioSample test_sample1 = 12;
+    AudioBuffer test_input1(&test_sample1, 1, AudioFormat::MONO());
+
+    testRingBuffer->put(test_input1);
+    rbPool_->discard(1, RingBufferPool::DEFAULT_ID);
+
+    rbPool_->discard(1, test_id);
+
+    mainRingBuffer->put(test_input1);
+
+    rbPool_->discard(1, test_id);
+
+    rbPool_->unBindCallID(test_id, RingBufferPool::DEFAULT_ID);
+}
+
+void RingBufferPoolTest::testConference()
+{
+    TITLE();
+
+    std::string test_id1 = "participant A";
+    std::string test_id2 = "participant B";
+
+    auto mainRingBuffer = rbPool_->getRingBuffer(RingBufferPool::DEFAULT_ID);
+    auto testRingBuffer1 = rbPool_->createRingBuffer(test_id1);
+    auto testRingBuffer2 = rbPool_->createRingBuffer(test_id2);
+
+    // test bind Participant A with default
+    rbPool_->bindCallID(test_id1, RingBufferPool::DEFAULT_ID);
+
+    // test bind Participant B with default
+    rbPool_->bindCallID(test_id2, RingBufferPool::DEFAULT_ID);
+
+    // test bind Participant A with Participant B
+    rbPool_->bindCallID(test_id1, test_id2);
+
+    SFLAudioSample testint = 12;
+    AudioBuffer testbuf(&testint, 1, AudioFormat::MONO());
+
+    // put data test ring buffers
+    mainRingBuffer->put(testbuf);
+
+    // put data test ring buffers
+    testRingBuffer1->put(testbuf);
+    testRingBuffer2->put(testbuf);
+}
+
+RingBufferPoolTest::RingBufferPoolTest()
+    : CppUnit::TestCase("Audio Layer Tests") , rbPool_(new RingBufferPool)
+{}
diff --git a/daemon/test/mainbuffertest.h b/daemon/test/ringbufferpooltest.h
similarity index 83%
rename from daemon/test/mainbuffertest.h
rename to daemon/test/ringbufferpooltest.h
index ee342c118459e8493aa65993a94faae95ac1925f..68d798f5c2306fd6e6ca0fd4c05c8b2d9953d54e 100644
--- a/daemon/test/mainbuffertest.h
+++ b/daemon/test/ringbufferpooltest.h
@@ -28,8 +28,8 @@
  *  as that of the covered work.
  */
 
-#ifndef MAINBUFFER_TEST_
-#define MAINBUFFER_TEST_
+#ifndef RINGBUFFERPOOL_TEST_
+#define RINGBUFFERPOOL_TEST_
 
 // Cppunit import
 #include <cppunit/extensions/HelperMacros.h>
@@ -39,18 +39,19 @@
 
 #include <memory>
 
-class MainBuffer;
+class RingBufferPool;
+
 /*
  * @file audiorecorderTest.cpp
  * @brief       Regroups unit tests related to the main buffer.
  */
 
-class MainBufferTest : public CppUnit::TestCase {
+class RingBufferPoolTest : public CppUnit::TestCase {
 
         /*
          * Use cppunit library macros to add unit test the factory
          */
-        CPPUNIT_TEST_SUITE(MainBufferTest);
+        CPPUNIT_TEST_SUITE(RingBufferPoolTest);
         CPPUNIT_TEST(testBindUnbindBuffer);
         CPPUNIT_TEST(testGetPutData);
         CPPUNIT_TEST(testDiscardFlush);
@@ -59,7 +60,7 @@ class MainBufferTest : public CppUnit::TestCase {
 
     public:
 
-        MainBufferTest();
+        RingBufferPoolTest();
 
         void testBindUnbindBuffer();
 
@@ -73,11 +74,11 @@ class MainBufferTest : public CppUnit::TestCase {
 
     private:
 
-        std::unique_ptr<MainBuffer> mainbuffer_;
+        std::unique_ptr<RingBufferPool> rbPool_;
 };
 
 /* Register our test module */
-CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(MainBufferTest, "MainBufferTest");
-CPPUNIT_TEST_SUITE_REGISTRATION(MainBufferTest);
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(RingBufferPoolTest, "RingBufferPoolTest");
+CPPUNIT_TEST_SUITE_REGISTRATION(RingBufferPoolTest);
 
-#endif  // MAINBUFFER_TEST_
+#endif  // RINGBUFFERPOOL_TEST_