diff --git a/sflphone-common/src/audio/audiortp.cpp b/sflphone-common/src/audio/audiortp.cpp
index b8d780c269bca8755e8571655cd57d7fd543d142..4109f03efe420dc913bbbf42e07048b84505efc9 100644
--- a/sflphone-common/src/audio/audiortp.cpp
+++ b/sflphone-common/src/audio/audiortp.cpp
@@ -186,8 +186,7 @@ AudioRtpRTX::~AudioRtpRTX ()
     }
 
     _debug("Unbind call id %s from all participants\n", _ca->getCallId().c_str());
-    // _audiolayer->getMainBuffer()->unBindCallID(_ca->getCallId());
-    // _audiolayer->getMainBuffer()->unBindAll(_ca->getCallID());
+    _audiolayer->getMainBuffer()->unBindAll(_ca->getCallId());
 
     _ca = 0;
 
@@ -233,7 +232,7 @@ AudioRtpRTX::initBuffers()
     spkrDataConverted = new SFLDataFormat[nbSamplesMax];
     spkrDataDecoded = new SFLDataFormat[nbSamplesMax];
 
-    _audiolayer->getMainBuffer()->bindCallID(_ca->getCallId());
+    // _audiolayer->getMainBuffer()->bindCallID(_ca->getCallId());
 }
 
 
diff --git a/sflphone-common/src/audio/mainbuffer.cpp b/sflphone-common/src/audio/mainbuffer.cpp
index bd53b5b7c2ffdaf91bc65a7bb95903444a67eb4f..e2bbe9e1323d7bb894ee91c07d314adbd857e51d 100644
--- a/sflphone-common/src/audio/mainbuffer.cpp
+++ b/sflphone-common/src/audio/mainbuffer.cpp
@@ -22,14 +22,12 @@
 
 MainBuffer::MainBuffer()
 {
-    mixBuffer = new SFLDataFormat[5000];
+    mixBuffer = new SFLDataFormat[STATIC_BUFSIZE];
 }
 
 
 MainBuffer::~MainBuffer()
 {
-    removeRingBuffer(default_id);
-    removeCallIDSet(default_id);
 
     delete mixBuffer;
     mixBuffer = NULL;
@@ -186,18 +184,24 @@ void MainBuffer::bindCallID(CallID call_id1, CallID call_id2)
 
     _debug("---- MainBuffer:: bindCallID %s and callid %s\n", call_id1.c_str(), call_id2.c_str());
 
-    RingBuffer* ring_buffer = getRingBuffer(call_id1);
-    CallIDSet* callid_set = getCallIDSet(call_id1);
+    RingBuffer* ring_buffer;
+    CallIDSet* callid_set;
 
-    if(ring_buffer == NULL)
+    if((ring_buffer = getRingBuffer(call_id1)) == NULL)
 	createRingBuffer(call_id1);
 
-    if(callid_set == NULL)
+    if((callid_set = getCallIDSet(call_id1)) == NULL)
 	createCallIDSet(call_id1);
 
+    if((ring_buffer = getRingBuffer(call_id2)) == NULL)
+	createRingBuffer(call_id2);
+
+    if((callid_set = getCallIDSet(call_id2)) == NULL)
+	createCallIDSet(call_id2);
+
     getRingBuffer(call_id1)->createReadPointer(call_id2);
     getRingBuffer(call_id2)->createReadPointer(call_id1);
- 
+
     addCallIDtoSet(call_id1, call_id2);
     addCallIDtoSet(call_id2, call_id1);
 
@@ -218,19 +222,27 @@ void MainBuffer::unBindCallID(CallID call_id1, CallID call_id2)
 
     ringbuffer = getRingBuffer(call_id2);
     if(ringbuffer != NULL)
+    {
+
 	ringbuffer->removeReadPointer(call_id1);
 
+	if(ringbuffer->getNbReadPointer() == 0)
+        {
+	    removeCallIDSet(call_id2);
+	    removeRingBuffer(call_id2);
+        }
+
+    }
+
     ringbuffer = getRingBuffer(call_id1);
     if(ringbuffer != NULL)
     {
 	ringbuffer->removeReadPointer(call_id2);
 
-        if(ringbuffer->getNbReadPointer() < 1)
+        if(ringbuffer->getNbReadPointer() == 0)
         {
-
 	    removeCallIDSet(call_id1);
 	    removeRingBuffer(call_id1);
-
         }
     }
 
@@ -240,9 +252,17 @@ void MainBuffer::unBindCallID(CallID call_id1, CallID call_id2)
 void MainBuffer::unBindAll(CallID call_id)
 {
 
-    // CallIDSet* callid_set = getCallIDSet(call_id);
+    CallIDSet* callid_set = getCallIDSet(call_id);
+
+    if (callid_set == NULL)
+	return;
+    
+    CallIDSet::iterator iter_set;
 
-    // CallIDSet::iterator iter_set = callid_set->begin
+    for (iter_set = callid_set->begin(); iter_set != callid_set->end(); iter_set++)
+    {
+	unBindCallID(call_id, *iter_set);
+    }
 
 }
 
@@ -492,7 +512,7 @@ void MainBuffer::flushDefault()
 {
     ost::MutexLock guard (_mutex);
 
-    flushByID(default_id);
+    flushByID(default_id, default_id);
 
 }
 
diff --git a/sflphone-common/src/audio/mainbuffer.h b/sflphone-common/src/audio/mainbuffer.h
index 5229fb0126fdc2a48b3941b3001df1a20ec7aa40..ed122e207461183a114a59920c0281791e94f5d0 100644
--- a/sflphone-common/src/audio/mainbuffer.h
+++ b/sflphone-common/src/audio/mainbuffer.h
@@ -83,13 +83,13 @@ public:
 
 	RingBuffer* getRingBuffer(CallID call_id);
 
-	int getDataByID(void *buffer, int toCopy, unsigned short volume = 100, CallID call_id = default_id, CallID reader_id = default_id);
+	int getDataByID(void *buffer, int toCopy, unsigned short volume, CallID call_id, CallID reader_id);
 
-	int availForGetByID(CallID call_id = default_id, CallID reader_id = default_id);
+	int availForGetByID(CallID call_id, CallID reader_id);
 
-	int discardByID(int toDiscard, CallID call_id = default_id, CallID reader_id = default_id);
+	int discardByID(int toDiscard, CallID call_id, CallID reader_id);
 
-	void flushByID(CallID call_id = default_id, CallID reader_id = default_id);
+	void flushByID(CallID call_id, CallID reader_id);
 
 	RingBufferMap _ringBufferMap;
 
diff --git a/sflphone-common/src/audio/pulselayer.cpp b/sflphone-common/src/audio/pulselayer.cpp
index a2c86be4bceef283ceaff970f74779df08f4924c..c8c28c33eef3dc21b0f08ef98182bb49873fe03c 100644
--- a/sflphone-common/src/audio/pulselayer.cpp
+++ b/sflphone-common/src/audio/pulselayer.cpp
@@ -38,7 +38,7 @@ PulseLayer::PulseLayer (ManagerImpl* manager)
         , record()
 {
     _debug ("PulseLayer::Pulse audio constructor: Create context\n");
-    out_buffer = new SFLDataFormat[SIZEBUF];
+    out_buffer = new SFLDataFormat[STATIC_BUFSIZE];
 
 }
 
@@ -357,7 +357,7 @@ void PulseLayer::writeToSpeaker (void)
     // _debug("PulseLayer::writeToSpeaker _urgentRingBuffer.AvailForGet()\n");
     urgentAvail = _urgentRingBuffer.AvailForGet();
 
-    for(int k = 0; k < SIZEBUF; k++)
+    for(int k = 0; k < STATIC_BUFSIZE; k++)
 	out_buffer[k] = 0;
 
     if (urgentAvail > 0) {
diff --git a/sflphone-common/src/audio/ringbuffer.cpp b/sflphone-common/src/audio/ringbuffer.cpp
index 832ea1706705b1f3d3eafc61f672ec1531a66b90..c8198df9a234935ba841edd991b96a94e19f3a91 100644
--- a/sflphone-common/src/audio/ringbuffer.cpp
+++ b/sflphone-common/src/audio/ringbuffer.cpp
@@ -55,7 +55,6 @@ void
 RingBuffer::flush (CallID call_id)
 {
     storeReadPointer(mEnd, call_id);
-    // mEnd = 0;
 }
 
 int
@@ -63,13 +62,13 @@ RingBuffer::putLen()
 {
     int mStart;
 
-    if(_readpointer.size() > 1)
+    if(_readpointer.size() >= 1)
     {
 	mStart = getSmallestReadPointer();
     }
     else
     {
-        mStart = getReadPointer();
+        mStart = 0;
     }
 
     return (mEnd + mBufferSize - mStart) % mBufferSize;
@@ -95,7 +94,6 @@ RingBuffer::debug()
 int
 RingBuffer::getReadPointer(CallID call_id)
 {
-    _debug("RingBuffer::getReadPointer callid: %s\n", call_id.c_str());
 
     if(getNbReadPointer() == 0)
 	return 0;
@@ -108,7 +106,6 @@ RingBuffer::getReadPointer(CallID call_id)
     }
     else
     {
-	_debug("RingBuffer::getReadPointer readpointer: %i\n", iter->second);
         return iter->second;
     }
     
@@ -156,7 +153,7 @@ RingBuffer::createReadPointer(CallID call_id)
 
     _debug("---- createReadPointer call_id %s\n", call_id.c_str());
  
-    _readpointer.insert(pair<CallID, int>(call_id, 0));
+    _readpointer.insert(pair<CallID, int>(call_id, mEnd));
     _debug("---- createReadPointer size:  %i\n", _readpointer.size());
 
 }
@@ -174,13 +171,25 @@ RingBuffer::removeReadPointer(CallID call_id)
 }
 
 
+bool
+RingBuffer::hasThisReadPointer(CallID call_id)
+{
+    ReadPointer::iterator iter = _readpointer.find(call_id);
+    if(iter == _readpointer.end())
+    {
+	return false;
+    }
+    else
+    {
+	return true;
+    }
+}
+
+
 int
 RingBuffer::getNbReadPointer()
 {
-
-    _debug("RingBuffer::getNbReadPointer: %i", _readpointer.size());
     return _readpointer.size();
-
 }
 
 //
@@ -268,31 +277,28 @@ RingBuffer::AvailForGet(CallID call_id)
 int
 RingBuffer::Get (void *buffer, int toCopy, unsigned short volume, CallID call_id)
 {
-    // _debug("RingBuffer::get callid: %s\n", call_id.c_str());
 
-    if(getNbReadPointer() == 0);
+    if(getNbReadPointer() == 0)
         return 0;
 
+    if(!hasThisReadPointer(call_id))
+	return 0;
+
     samplePtr dest;
     int block;
     int copied;
     int len = getLen(call_id);
 
-    _debug("RingBuffer::Get len: %i\n", len);
     if (toCopy > len)
         toCopy = len;
 
     dest = (samplePtr) buffer;
 
     copied = 0;
-
-    _debug("RingBuffer::Get getReadPointer call_id %s\n", call_id.c_str());
     
     int mStart = getReadPointer(call_id);
 
-    _debug("RingBuffer::Get getReadPointer mStart %i\n", mStart);
 
-    // _debug("RingBuffer::get mStart: %i, mEnd: %i, len: %i, toCopy: %i\n", mStart, mEnd, len, toCopy);
 
     //fprintf(stderr, "G");
     while (toCopy) {
diff --git a/sflphone-common/src/audio/ringbuffer.h b/sflphone-common/src/audio/ringbuffer.h
index 3468a2a31eb099f1ebcfa71c2b902b970e89fd86..ce02a346fd693f1c0ae7b90c3f636f4cb5372c15 100644
--- a/sflphone-common/src/audio/ringbuffer.h
+++ b/sflphone-common/src/audio/ringbuffer.h
@@ -61,6 +61,8 @@ class RingBuffer {
 
     void removeReadPointer(CallID call_id = default_id);
 
+    bool hasThisReadPointer(CallID call_id);
+
     int getNbReadPointer();
 
     /**
diff --git a/sflphone-common/src/global.h b/sflphone-common/src/global.h
index 511ece3dcbbc15afd5752238741dc141bba559f0..fc0a149e9a405e093fd8a4d427eaf4ec671c7c34 100644
--- a/sflphone-common/src/global.h
+++ b/sflphone-common/src/global.h
@@ -86,6 +86,7 @@ static const SOUND_FORMAT INT32 = 0x8;
 #define CODECDIR         "codecs"		/** Codecs directory */
 
 #define SIZEBUF 				1024*1024
+#define STATIC_BUFSIZE 	 5000
 
 #define ALSA_DFT_CARD_ID     0			/** Index of the default soundcard */
 
diff --git a/sflphone-common/test/mainbufferTest.cpp b/sflphone-common/test/mainbufferTest.cpp
index 0bb70919ff74257873483b239b4a0bbb38711d65..bdbda503a3b8ff620a7e2ed3b2cf17a4727a5546 100644
--- a/sflphone-common/test/mainbufferTest.cpp
+++ b/sflphone-common/test/mainbufferTest.cpp
@@ -239,7 +239,7 @@ void MainBufferTest::testRingBufferInt()
     int testint2 = 13;
     int init_put_size;
 
-    
+
     // test with default ring buffer
     RingBuffer* test_ring_buffer = _mainbuffer.createRingBuffer(default_id);
 
@@ -261,7 +261,6 @@ void MainBufferTest::testRingBufferInt()
     CPPUNIT_ASSERT(test_ring_buffer->getReadPointer() == 0);
 
     int testget = (int)NULL;
-    int size;
 
     // get some data (without any read pointers)
     CPPUNIT_ASSERT(test_ring_buffer->getNbReadPointer() == 0);
@@ -281,10 +280,9 @@ void MainBufferTest::testRingBufferInt()
     CPPUNIT_ASSERT(test_ring_buffer->AvailForGet() == 2*sizeof(int));
     CPPUNIT_ASSERT(test_ring_buffer->getLen() == 2*sizeof(int));
 
-    _debug("THE GET PROBLEM\n");
     CPPUNIT_ASSERT(test_ring_buffer->Get(&testget, sizeof(int), 100, default_id) == sizeof(int));
-    CPPUNIT_ASSERT(test_ring_buffer->AvailForGet() == 2*sizeof(int));
-    CPPUNIT_ASSERT(test_ring_buffer->getLen() == 2*sizeof(int));
+    CPPUNIT_ASSERT(test_ring_buffer->AvailForGet() == sizeof(int));
+    CPPUNIT_ASSERT(test_ring_buffer->getLen() == sizeof(int));
     CPPUNIT_ASSERT(testget == testint1);
     CPPUNIT_ASSERT(test_ring_buffer->AvailForPut() == (init_put_size - (int)sizeof(int)));
     CPPUNIT_ASSERT(test_ring_buffer->getReadPointer() == sizeof(int));
@@ -312,7 +310,6 @@ void MainBufferTest::testRingBufferInt()
     CPPUNIT_ASSERT(test_ring_buffer->AvailForPut() == init_put_size);
     CPPUNIT_ASSERT(test_ring_buffer->getLen() == 0);
     CPPUNIT_ASSERT(test_ring_buffer->AvailForGet() == 0);
-    _debug("------------------------------ %i \n", test_ring_buffer->getReadPointer());
     CPPUNIT_ASSERT(test_ring_buffer->getReadPointer() == 3*sizeof(int));
 
     // test flush data
@@ -323,7 +320,6 @@ void MainBufferTest::testRingBufferInt()
     CPPUNIT_ASSERT(test_ring_buffer->AvailForPut() == (init_put_size - (int)sizeof(int)));
     CPPUNIT_ASSERT(test_ring_buffer->AvailForGet() == sizeof(int));
     CPPUNIT_ASSERT(test_ring_buffer->getLen() == sizeof(int));
-    _debug("------------------------------ %i \n", test_ring_buffer->getReadPointer());
     CPPUNIT_ASSERT(test_ring_buffer->getReadPointer() == 3*sizeof(int));
 
     test_ring_buffer->Discard(sizeof(int));
@@ -331,7 +327,6 @@ void MainBufferTest::testRingBufferInt()
     CPPUNIT_ASSERT(test_ring_buffer->AvailForPut() == init_put_size);
     CPPUNIT_ASSERT(test_ring_buffer->getLen() == 0);
     CPPUNIT_ASSERT(test_ring_buffer->AvailForGet() == 0);
-    _debug("------------------------------ %i \n", test_ring_buffer->getReadPointer());
     CPPUNIT_ASSERT(test_ring_buffer->getReadPointer() == 4*sizeof(int));
 
     
@@ -350,8 +345,8 @@ void MainBufferTest::testRingBufferNonDefaultID()
     int init_put_size;
 
     
-    // test with arbitrary id
-    RingBuffer* test_ring_buffer = _mainbuffer.getRingBuffer(default_id);
+    // test putData, getData with arbitrary read pointer id
+    RingBuffer* test_ring_buffer = _mainbuffer.createRingBuffer(default_id);
     test_ring_buffer->createReadPointer(test_id);
 
     init_put_size = test_ring_buffer->AvailForPut();
@@ -402,7 +397,6 @@ void MainBufferTest::testRingBufferNonDefaultID()
     CPPUNIT_ASSERT(test_ring_buffer->AvailForPut() == init_put_size);
     CPPUNIT_ASSERT(test_ring_buffer->getLen(test_id) == 0);
     CPPUNIT_ASSERT(test_ring_buffer->AvailForGet(test_id) == 0);
-    _debug("------------------------------ %i \n", test_ring_buffer->getReadPointer(test_id));
     CPPUNIT_ASSERT(test_ring_buffer->getReadPointer(test_id) == 3*sizeof(int));
 
     // test flush data
@@ -413,7 +407,6 @@ void MainBufferTest::testRingBufferNonDefaultID()
     CPPUNIT_ASSERT(test_ring_buffer->AvailForPut() == (init_put_size - (int)sizeof(int)));
     CPPUNIT_ASSERT(test_ring_buffer->AvailForGet(test_id) == sizeof(int));
     CPPUNIT_ASSERT(test_ring_buffer->getLen(test_id) == sizeof(int));
-    _debug("------------------------------ %i \n", test_ring_buffer->getReadPointer(test_id));
     CPPUNIT_ASSERT(test_ring_buffer->getReadPointer(test_id) == 3*sizeof(int));
 
     test_ring_buffer->Discard(sizeof(int), test_id);
@@ -421,7 +414,6 @@ void MainBufferTest::testRingBufferNonDefaultID()
     CPPUNIT_ASSERT(test_ring_buffer->AvailForPut() == init_put_size);
     CPPUNIT_ASSERT(test_ring_buffer->getLen(test_id) == 0);
     CPPUNIT_ASSERT(test_ring_buffer->AvailForGet(test_id) == 0);
-    _debug("------------------------------ %i \n", test_ring_buffer->getReadPointer(test_id));
     CPPUNIT_ASSERT(test_ring_buffer->getReadPointer(test_id) == 4*sizeof(int));
 
     test_ring_buffer->removeReadPointer(test_id);
@@ -434,12 +426,12 @@ void MainBufferTest::testRingBufferFloat()
 
     _debug("MainBufferTest::testRingBufferFloat()\n");
 
-    CallID test_id = "test_float";
-
     float testfloat1 = 12.5;
     float testfloat2 = 13.4;
 
-    RingBuffer* test_ring_buffer = _mainbuffer.getRingBuffer(default_id);
+    RingBuffer* test_ring_buffer = _mainbuffer.createRingBuffer(default_id);
+    test_ring_buffer->createReadPointer(default_id);
+    
 
     CPPUNIT_ASSERT(test_ring_buffer->Put(&testfloat1, sizeof(float)) == sizeof(float));
     CPPUNIT_ASSERT(test_ring_buffer->putLen() == sizeof(float));
@@ -469,7 +461,9 @@ void MainBufferTest::testTwoPointer()
 
     _debug("MainBufferTest::testTwoPointer()\n");
 
-    RingBuffer* input_buffer = _mainbuffer.getRingBuffer(default_id);
+    
+    RingBuffer* input_buffer = _mainbuffer.createRingBuffer(default_id);
+    input_buffer->createReadPointer(default_id);
     RingBuffer* output_buffer = _mainbuffer.getRingBuffer(default_id);
 
     int test_input = 12;
@@ -484,145 +478,504 @@ void MainBufferTest::testTwoPointer()
 void MainBufferTest::testBindUnbindBuffer()
 {
 
-    _debug("MainBufferTest::testGetPutData()\n");
+    _debug("MainBufferTest::testBindUnbindBuffer()\n");
     
-    CallID test_id = "bind unbind";
-
-    // _mainbuffer.createRingBuffer(test_id);
-    _mainbuffer.bindCallID(test_id);
+    CallID test_id1 = "bind unbind 1";
+    CallID test_id2 = "bind unbind 2";
 
     RingBufferMap::iterator iter_buffer;
     CallIDMap::iterator iter_idset;
     CallIDSet::iterator iter_id;
 
-    // RingBuffer* defaultbuffer = _mainbuffer.getRingBuffer(default_id);
-    // RingBuffer* otherbuffer = _mainbuffer.getRingBuffer(test_id);
+    ReadPointer::iterator iter_readpointer;
+
+    RingBuffer* ringbuffer;
+
+    // test initial state with no ring brffer created
+    CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 0);
+    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 0);
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(default_id);
+    CPPUNIT_ASSERT(iter_buffer == _mainbuffer._ringBufferMap.end());
+    iter_idset = _mainbuffer._callIDMap.find(default_id);
+    CPPUNIT_ASSERT(iter_idset == _mainbuffer._callIDMap.end());
+
+    // bind test_id1 with default_id (both buffer not already created)
+    _mainbuffer.bindCallID(test_id1);
 
     CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 2);
+    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 2);
 
     iter_buffer = _mainbuffer._ringBufferMap.find(default_id);
     CPPUNIT_ASSERT(iter_buffer->first == default_id);
     CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(default_id));
 
+    iter_buffer = _mainbuffer._ringBufferMap.find(test_id1);
+    CPPUNIT_ASSERT(iter_buffer->first == test_id1);
+    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(test_id1));
+
     iter_idset = _mainbuffer._callIDMap.find(default_id);
     CPPUNIT_ASSERT(iter_idset->second->size() == 1);
-    iter_id = iter_idset->second->find(test_id);
-    CPPUNIT_ASSERT(*iter_id == test_id);
+    iter_id = iter_idset->second->find(test_id1);
+    CPPUNIT_ASSERT(*iter_id == test_id1);
+
+    iter_idset = _mainbuffer._callIDMap.find(test_id1);
+    CPPUNIT_ASSERT(iter_idset->second->size() == 1);
+    iter_id = iter_idset->second->find(default_id);
+    CPPUNIT_ASSERT(*iter_id == default_id);
 
-    iter_buffer = _mainbuffer._ringBufferMap.find(test_id);
-    CPPUNIT_ASSERT(iter_buffer->first == test_id);
-    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(test_id));
+    ringbuffer = _mainbuffer.getRingBuffer(default_id);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 1);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id1);
+    CPPUNIT_ASSERT(iter_readpointer->first == test_id1);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
 
-    iter_idset = _mainbuffer._callIDMap.find(test_id);
+    ringbuffer = _mainbuffer.getRingBuffer(test_id1);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 1);
+    iter_readpointer = ringbuffer->_readpointer.find(default_id);
+    CPPUNIT_ASSERT(iter_readpointer->first == default_id);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+
+
+    // unbind test_id1 with default_id 
+    _mainbuffer.unBindCallID(test_id1);
+
+    _debug("%i\n", _mainbuffer._ringBufferMap.size());
+    CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 0);
+    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 0);
+
+    CPPUNIT_ASSERT(_mainbuffer.getRingBuffer(default_id) == NULL);
+    CPPUNIT_ASSERT(_mainbuffer.getRingBuffer(test_id1) == NULL);
+    
+
+    // bind test_id2 with default_id (default_id already created)
+    // calling it twice not supposed to break anything
+    _mainbuffer.bindCallID(test_id1, default_id);
+    _mainbuffer.bindCallID(test_id1, default_id);
+
+    CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 2);
+    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 2);
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(test_id2);
+    CPPUNIT_ASSERT(iter_buffer == _mainbuffer._ringBufferMap.end());
+    iter_idset = _mainbuffer._callIDMap.find(test_id2);
+    CPPUNIT_ASSERT(iter_idset == _mainbuffer._callIDMap.end());
+
+    _mainbuffer.bindCallID(test_id2, default_id);
+    _mainbuffer.bindCallID(test_id2, default_id);
+
+    CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 3);
+    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 3);
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(default_id);
+    CPPUNIT_ASSERT(iter_buffer->first == default_id);
+    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(default_id));
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(test_id1);
+    CPPUNIT_ASSERT(iter_buffer->first == test_id1);
+    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(test_id1));
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(test_id2);
+    CPPUNIT_ASSERT(iter_buffer->first == test_id2);
+    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(test_id2));
+
+    iter_idset = _mainbuffer._callIDMap.find(default_id);
+    CPPUNIT_ASSERT(iter_idset->second->size() == 2);
+    iter_id = iter_idset->second->find(test_id1);
+    CPPUNIT_ASSERT(*iter_id == test_id1);
+    iter_id = iter_idset->second->find(test_id2);
+    CPPUNIT_ASSERT(*iter_id == test_id2);
+
+    iter_idset = _mainbuffer._callIDMap.find(test_id1);
     CPPUNIT_ASSERT(iter_idset->second->size() == 1);
     iter_id = iter_idset->second->find(default_id);
-    CPPUNIT_ASSERT(*iter_id == test_id);
+    CPPUNIT_ASSERT(*iter_id == default_id);
 
-    _mainbuffer.unBindCallID(test_id);
-    // _mainbuffer.removeRingBuffer(test_id);
+    iter_idset = _mainbuffer._callIDMap.find(test_id2);
+    CPPUNIT_ASSERT(iter_idset->second->size() == 1);
+    iter_id = iter_idset->second->find(default_id);
+    CPPUNIT_ASSERT(*iter_id == default_id);
 
-     CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 1);
+    ringbuffer = _mainbuffer.getRingBuffer(default_id);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 2);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id1);
+    CPPUNIT_ASSERT(iter_readpointer->first == test_id1);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id2);
+    CPPUNIT_ASSERT(iter_readpointer->first == test_id2);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+
+    ringbuffer = _mainbuffer.getRingBuffer(test_id1);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 1);
+    iter_readpointer = ringbuffer->_readpointer.find(default_id);
+    CPPUNIT_ASSERT(iter_readpointer->first == default_id);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+
+    ringbuffer = _mainbuffer.getRingBuffer(test_id2);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 1);
+    iter_readpointer = ringbuffer->_readpointer.find(default_id);
+    CPPUNIT_ASSERT(iter_readpointer->first == default_id);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+
+    // 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);
+    
+    CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 3);
+    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 3);
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(default_id);
+    CPPUNIT_ASSERT(iter_buffer->first == default_id);
+    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(default_id));
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(test_id1);
+    CPPUNIT_ASSERT(iter_buffer->first == test_id1);
+    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(test_id1));
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(test_id2);
+    CPPUNIT_ASSERT(iter_buffer->first == test_id2);
+    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(test_id2));
+
+    iter_idset = _mainbuffer._callIDMap.find(default_id);
+    CPPUNIT_ASSERT(iter_idset->second->size() == 2);
+    iter_id = iter_idset->second->find(test_id1);
+    CPPUNIT_ASSERT(*iter_id == test_id1);
+    iter_id = iter_idset->second->find(test_id2);
+    CPPUNIT_ASSERT(*iter_id == test_id2);
+
+    iter_idset = _mainbuffer._callIDMap.find(test_id1);
+    CPPUNIT_ASSERT(iter_idset->second->size() == 2);
+    iter_id = iter_idset->second->find(default_id);
+    CPPUNIT_ASSERT(*iter_id == default_id);
+    iter_id = iter_idset->second->find(test_id2);
+    CPPUNIT_ASSERT(*iter_id == test_id2);
+
+    iter_idset = _mainbuffer._callIDMap.find(test_id2);
+    CPPUNIT_ASSERT(iter_idset->second->size() == 2);
+    iter_id = iter_idset->second->find(default_id);
+    CPPUNIT_ASSERT(*iter_id == default_id);
+    iter_id = iter_idset->second->find(test_id1);
+    CPPUNIT_ASSERT(*iter_id == test_id1);
+
+    ringbuffer = _mainbuffer.getRingBuffer(default_id);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 2);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id1);
+    CPPUNIT_ASSERT(iter_readpointer->first == test_id1);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id2);
+    CPPUNIT_ASSERT(iter_readpointer->first == test_id2);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+
+    ringbuffer = _mainbuffer.getRingBuffer(test_id1);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 2);
+    iter_readpointer = ringbuffer->_readpointer.find(default_id);
+    CPPUNIT_ASSERT(iter_readpointer->first == default_id);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id2);
+    CPPUNIT_ASSERT(iter_readpointer->first == test_id2);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
 
-    iter_idset = _mainbuffer._callIDMap.find(test_id);
+    ringbuffer = _mainbuffer.getRingBuffer(test_id2);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 2);
+    iter_readpointer = ringbuffer->_readpointer.find(default_id);
+    CPPUNIT_ASSERT(iter_readpointer->first == default_id);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id1);
+    CPPUNIT_ASSERT(iter_readpointer->first == test_id1);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+
+    // unbind test_id1 with test_id2
+    // calling it twice not supposed to break anything
+    _mainbuffer.unBindCallID(test_id1, test_id2);
+    _mainbuffer.unBindCallID(test_id1, test_id2);
+
+    CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 3);
+    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 3);
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(default_id);
+    CPPUNIT_ASSERT(iter_buffer->first == default_id);
+    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(default_id));
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(test_id1);
+    CPPUNIT_ASSERT(iter_buffer->first == test_id1);
+    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(test_id1));
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(test_id2);
+    CPPUNIT_ASSERT(iter_buffer->first == test_id2);
+    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(test_id2));
+
+    iter_idset = _mainbuffer._callIDMap.find(default_id);
+    CPPUNIT_ASSERT(iter_idset->second->size() == 2);
+    iter_id = iter_idset->second->find(test_id1);
+    CPPUNIT_ASSERT(*iter_id == test_id1);
+    iter_id = iter_idset->second->find(test_id2);
+    CPPUNIT_ASSERT(*iter_id == test_id2);
+
+    iter_idset = _mainbuffer._callIDMap.find(test_id1);
+    CPPUNIT_ASSERT(iter_idset->second->size() == 1);
+    iter_id = iter_idset->second->find(default_id);
+    CPPUNIT_ASSERT(*iter_id == default_id);
+
+    iter_idset = _mainbuffer._callIDMap.find(test_id2);
+    CPPUNIT_ASSERT(iter_idset->second->size() == 1);
+    iter_id = iter_idset->second->find(default_id);
+    CPPUNIT_ASSERT(*iter_id == default_id);
+
+    ringbuffer = _mainbuffer.getRingBuffer(default_id);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 2);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id1);
+    CPPUNIT_ASSERT(iter_readpointer->first == test_id1);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id2);
+    CPPUNIT_ASSERT(iter_readpointer->first == test_id2);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+
+    ringbuffer = _mainbuffer.getRingBuffer(test_id1);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 1);
+    iter_readpointer = ringbuffer->_readpointer.find(default_id);
+    CPPUNIT_ASSERT(iter_readpointer->first == default_id);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+
+    ringbuffer = _mainbuffer.getRingBuffer(test_id2);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 1);
+    iter_readpointer = ringbuffer->_readpointer.find(default_id);
+    CPPUNIT_ASSERT(iter_readpointer->first == default_id);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+
+
+    _debug("ok1\n");
+    
+    // unbind test_id1 with test_id2
+    // calling it twice not supposed to break anything
+    _mainbuffer.unBindCallID(default_id, test_id2);
+    _mainbuffer.unBindCallID(default_id, test_id2);
+
+    CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 2);
+    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 2);
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(default_id);
+    CPPUNIT_ASSERT(iter_buffer->first == default_id);
+    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(default_id));
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(test_id1);
+    CPPUNIT_ASSERT(iter_buffer->first == test_id1);
+    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(test_id1));
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(test_id2);
+    CPPUNIT_ASSERT(iter_buffer == _mainbuffer._ringBufferMap.end());
+
+    iter_idset = _mainbuffer._callIDMap.find(default_id);
+    CPPUNIT_ASSERT(iter_idset->second->size() == 1);
+    iter_id = iter_idset->second->find(test_id1);
+    CPPUNIT_ASSERT(*iter_id == test_id1);
+    iter_id = iter_idset->second->find(test_id2);
+    CPPUNIT_ASSERT(iter_id == iter_idset->second->end());
+
+    iter_idset = _mainbuffer._callIDMap.find(test_id1);
+    CPPUNIT_ASSERT(iter_idset->second->size() == 1);
+    iter_id = iter_idset->second->find(default_id);
+    CPPUNIT_ASSERT(*iter_id == default_id);
+
+    iter_idset = _mainbuffer._callIDMap.find(test_id2);
     CPPUNIT_ASSERT(iter_idset == _mainbuffer._callIDMap.end());
 
+    ringbuffer = _mainbuffer.getRingBuffer(default_id);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 1);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id1);
+    CPPUNIT_ASSERT(iter_readpointer->first == test_id1);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id2);
+    CPPUNIT_ASSERT(iter_readpointer == ringbuffer->_readpointer.end());
+
+    ringbuffer = _mainbuffer.getRingBuffer(test_id1);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 1);
+    iter_readpointer = ringbuffer->_readpointer.find(default_id);
+    CPPUNIT_ASSERT(iter_readpointer->first == default_id);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id2);
+    CPPUNIT_ASSERT(iter_readpointer == ringbuffer->_readpointer.end());
+
+    CPPUNIT_ASSERT(_mainbuffer.getRingBuffer(test_id2) == NULL);
+
+
+    _mainbuffer.unBindCallID(default_id, test_id1);
+
+    CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 0);
+    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 0);
+
+    // test unbind all function
+    _mainbuffer.bindCallID(default_id, test_id1);
+    _mainbuffer.bindCallID(default_id, test_id2);
+    _mainbuffer.bindCallID(test_id1, test_id2);
+    CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 3);
+    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 3);
+
+    _mainbuffer.unBindAll(test_id2);
+    CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 2);
+    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 2);
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(default_id);
+    CPPUNIT_ASSERT(iter_buffer->first == default_id);
+    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(default_id));
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(test_id1);
+    CPPUNIT_ASSERT(iter_buffer->first == test_id1);
+    CPPUNIT_ASSERT(iter_buffer->second == _mainbuffer.getRingBuffer(test_id1));
+
+    iter_buffer = _mainbuffer._ringBufferMap.find(test_id2);
+    CPPUNIT_ASSERT(iter_buffer == _mainbuffer._ringBufferMap.end());
+
     iter_idset = _mainbuffer._callIDMap.find(default_id);
-    CPPUNIT_ASSERT(iter_idset->second->size() == 0);
-    iter_id = iter_idset->second->find(test_id);
+    CPPUNIT_ASSERT(iter_idset->second->size() == 1);
+    iter_id = iter_idset->second->find(test_id1);
+    CPPUNIT_ASSERT(*iter_id == test_id1);
+    iter_id = iter_idset->second->find(test_id2);
     CPPUNIT_ASSERT(iter_id == iter_idset->second->end());
+
+    iter_idset = _mainbuffer._callIDMap.find(test_id1);
+    CPPUNIT_ASSERT(iter_idset->second->size() == 1);
+    iter_id = iter_idset->second->find(default_id);
+    CPPUNIT_ASSERT(*iter_id == default_id);
+
+    iter_idset = _mainbuffer._callIDMap.find(test_id2);
+    CPPUNIT_ASSERT(iter_idset == _mainbuffer._callIDMap.end());
+
+    ringbuffer = _mainbuffer.getRingBuffer(default_id);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 1);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id1);
+    CPPUNIT_ASSERT(iter_readpointer->first == test_id1);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id2);
+    CPPUNIT_ASSERT(iter_readpointer == ringbuffer->_readpointer.end());
+
+    ringbuffer = _mainbuffer.getRingBuffer(test_id1);
+    CPPUNIT_ASSERT(ringbuffer != NULL);
+    CPPUNIT_ASSERT(ringbuffer->getNbReadPointer() == 1);
+    iter_readpointer = ringbuffer->_readpointer.find(default_id);
+    CPPUNIT_ASSERT(iter_readpointer->first == default_id);
+    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+    iter_readpointer = ringbuffer->_readpointer.find(test_id2);
+    CPPUNIT_ASSERT(iter_readpointer == ringbuffer->_readpointer.end());
+    
+    
 }
 
-void MainBufferTest::testGetPutData()
+void MainBufferTest::testGetPutDataByID()
 {
 
     _debug("MainBufferTest::testGetPutData()\n");
     
     CallID test_id = "getData putData";
     CallID false_id = "false id";
-    // _mainbuffer.createRingBuffer(test_id);
+    
     _mainbuffer.bindCallID(test_id);
 
     int test_input1 = 12;
     int test_input2 = 13;
     int test_output;
 
+    int avail_for_put_testid;
+    int avail_for_put_defaultid;
+
+    // put by default_id get by test_id without preleminary put
+    avail_for_put_defaultid = _mainbuffer.availForPut();
+    CPPUNIT_ASSERT(_mainbuffer.availForGetByID(default_id, test_id) == 0);
+    CPPUNIT_ASSERT(_mainbuffer.getDataByID(&test_output, sizeof(int), 100, default_id, test_id) == 0);
+
+    // put by default_id, get by test_id
+    CPPUNIT_ASSERT(_mainbuffer.availForPut() == avail_for_put_defaultid);
     CPPUNIT_ASSERT(_mainbuffer.putData(&test_input1, sizeof(int)) == sizeof(int));
-    CPPUNIT_ASSERT(_mainbuffer.getDataByID(&test_output, sizeof(int)) == sizeof(int));
+    CPPUNIT_ASSERT(_mainbuffer.availForPut() == (avail_for_put_defaultid - (int)sizeof(int)));
+    CPPUNIT_ASSERT(_mainbuffer.availForGetByID(default_id, test_id) == sizeof(int));
+    CPPUNIT_ASSERT(_mainbuffer.getDataByID(&test_output, sizeof(int), 100, default_id, test_id) == sizeof(int));
+    CPPUNIT_ASSERT(_mainbuffer.availForGetByID(default_id, test_id) == 0);
     CPPUNIT_ASSERT(test_input1 == test_output);
+
+    // get by default_id without preliminary input
+    avail_for_put_testid = _mainbuffer.availForPut(test_id);
+    CPPUNIT_ASSERT(_mainbuffer.availForGetByID(test_id, default_id) == 0);
+    CPPUNIT_ASSERT(_mainbuffer.getDataByID(&test_output, sizeof(int), 100, test_id, default_id) == 0);
+    
+    // pu by test_id get by test_id
+    CPPUNIT_ASSERT(_mainbuffer.availForPut(test_id) == avail_for_put_defaultid);
     CPPUNIT_ASSERT(_mainbuffer.putData(&test_input2, sizeof(int), 100, test_id) == sizeof(int));
-    CPPUNIT_ASSERT(_mainbuffer.getDataByID(&test_output, sizeof(int), 100, test_id) == sizeof(int));
+    CPPUNIT_ASSERT(_mainbuffer.availForGetByID(test_id, default_id) == sizeof(int));
+    CPPUNIT_ASSERT(_mainbuffer.getDataByID(&test_output, sizeof(int), 100, test_id, default_id) == sizeof(int));
+    CPPUNIT_ASSERT(_mainbuffer.availForGetByID(test_id, default_id) == 0);
     CPPUNIT_ASSERT(test_input2 == test_output);
 
+    // put/get by false id
     CPPUNIT_ASSERT(_mainbuffer.putData(&test_input2, sizeof(int), 100, false_id) == 0);
-    CPPUNIT_ASSERT(_mainbuffer.getDataByID(&test_input2, sizeof(int), 100, false_id) == 0);
+    CPPUNIT_ASSERT(_mainbuffer.getDataByID(&test_input2, sizeof(int), 100, false_id, false_id) == 0);
+    CPPUNIT_ASSERT(_mainbuffer.getDataByID(&test_input2, sizeof(int), 100, default_id, false_id) == 0);
+    CPPUNIT_ASSERT(_mainbuffer.getDataByID(&test_input2, sizeof(int), 100, false_id, default_id) == 0);
 
     _mainbuffer.unBindCallID(test_id);
-    // _mainbuffer.removeRingBuffer(test_id);
+
 }
 
 
 
-void MainBufferTest::testGetDataAndCallID()
+void MainBufferTest::testGetPutData()
 {
 
     _debug("MainBufferTest::testGetDataAndCallID()\n");
     
     CallID test_id = "incoming rtp session";
-    // _mainbuffer.createRingBuffer(test_id);
+
     _mainbuffer.bindCallID(test_id);
 
     int test_input1 = 12;
     int test_input2 = 13;
     int test_output;
 
-    CPPUNIT_ASSERT(_mainbuffer.putData(&test_input1, sizeof(int), 100, test_id) == sizeof(int));
-    CPPUNIT_ASSERT(_mainbuffer.getData(&test_output, sizeof(int), 100, default_id) == sizeof(int));
-    CPPUNIT_ASSERT(test_input1 == test_output);
-
-    CPPUNIT_ASSERT(_mainbuffer.putData(&test_input2, sizeof(int), 100, default_id) == sizeof(int));
-    CPPUNIT_ASSERT(_mainbuffer.getData(&test_output, sizeof(int), 100, test_id) == sizeof(int));
-    CPPUNIT_ASSERT(test_input2 == test_output);
-
-    _mainbuffer.unBindCallID(test_id);
-    // _mainbuffer.removeRingBuffer(test_id);
-}
-
-
-void MainBufferTest::testAvailForGetPut()
-{
-
-    _debug("MainBufferTest::testAvailForGetPut()\n");
+    int avail_for_put_testid;
+    int avail_for_put_defaultid;
 
-    CallID test_id = "avail for get";
-    // _mainbuffer.createRingBuffer(test_id);
-    _mainbuffer.bindCallID(test_id);
-
-    int test_input1 = 12;
-    int test_output_size;
-    int init_size;
-
-    init_size = _mainbuffer.availForPut(test_id);
-    CPPUNIT_ASSERT(_mainbuffer.putData(&test_input1, sizeof(int), 100, test_id) == sizeof(int));
-    test_output_size = _mainbuffer.availForPut(test_id);
-    CPPUNIT_ASSERT(test_output_size == (init_size - (int)sizeof(int)));
+    // get by test_id without preleminary put
+    avail_for_put_defaultid = _mainbuffer.availForPut();
+    CPPUNIT_ASSERT(_mainbuffer.availForGet(test_id) == 0);
+    CPPUNIT_ASSERT(_mainbuffer.getData(&test_output, sizeof(int), 100,  test_id) == 0);
 
-    init_size = _mainbuffer.availForGetByID(test_id);
-    CPPUNIT_ASSERT(_mainbuffer.putData(&test_input1, sizeof(int), 100, test_id) == sizeof(int));
-    test_output_size = _mainbuffer.availForGetByID(test_id);
-    CPPUNIT_ASSERT(test_output_size == (init_size + (int)sizeof(int)));
+    // put by default_id, get by test_id
+    CPPUNIT_ASSERT(_mainbuffer.availForPut() == avail_for_put_defaultid);
+    CPPUNIT_ASSERT(_mainbuffer.putData(&test_input1, sizeof(int), 100) == sizeof(int));
+    CPPUNIT_ASSERT(_mainbuffer.availForPut() == (avail_for_put_defaultid - (int)sizeof(int)));
+    CPPUNIT_ASSERT(_mainbuffer.availForGet(test_id) == sizeof(int));
+    CPPUNIT_ASSERT(_mainbuffer.getData(&test_output, sizeof(int), 100, test_id) == sizeof(int));
+    CPPUNIT_ASSERT(_mainbuffer.availForGet(test_id) == 0);
+    CPPUNIT_ASSERT(test_input1 == test_output);
 
-    init_size = _mainbuffer.availForGet();
-    CPPUNIT_ASSERT(_mainbuffer.putData(&test_input1, sizeof(int), 100, test_id) == sizeof(int));
-    test_output_size = _mainbuffer.availForGet();
-    CPPUNIT_ASSERT(test_output_size == (init_size + (int)sizeof(int)));
+    // get by default_id without preleminary put
+    avail_for_put_testid = _mainbuffer.availForPut(test_id);
+    CPPUNIT_ASSERT(_mainbuffer.availForGet() == 0);
+    CPPUNIT_ASSERT(_mainbuffer.getData(&test_output, sizeof(int)) == 0);
 
-    init_size = _mainbuffer.availForGet(test_id);
-    CPPUNIT_ASSERT(_mainbuffer.putData(&test_input1, sizeof(int), 100) == sizeof(int));
-    test_output_size = _mainbuffer.availForGet(test_id);
-    CPPUNIT_ASSERT(test_output_size == (init_size + (int)sizeof(int)));
+    // put by test_id, get by default_id
+    CPPUNIT_ASSERT(_mainbuffer.availForPut(test_id) == avail_for_put_testid);
+    CPPUNIT_ASSERT(_mainbuffer.putData(&test_input2, sizeof(int), 100, test_id) == sizeof(int));
+    CPPUNIT_ASSERT(_mainbuffer.availForPut(test_id) == (avail_for_put_testid - (int)sizeof(int)));
+    CPPUNIT_ASSERT(_mainbuffer.availForGet() == sizeof(int));
+    CPPUNIT_ASSERT(_mainbuffer.getData(&test_output, sizeof(int), 100) == sizeof(int));
+    CPPUNIT_ASSERT(_mainbuffer.availForGet() == 0);
+    CPPUNIT_ASSERT(test_input2 == test_output);
 
     _mainbuffer.unBindCallID(test_id);
-    // _mainbuffer.removeRingBuffer(test_id);
 
 }
 
@@ -826,31 +1179,27 @@ void MainBufferTest::testConference()
     ReadPointer::iterator iter_readpointer;
     CallIDMap::iterator iter_callidmap;
     CallIDSet::iterator iter_callidset;
+
     
 
     // test initial setup
     // ringbuffers
-    CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 1);
+    CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 0);
     test_ring_buffer = _mainbuffer.getRingBuffer(default_id);
-    CPPUNIT_ASSERT(test_ring_buffer->getNbReadPointer() == 1);
-    iter_readpointer = test_ring_buffer->_readpointer.find(default_id);
-    CPPUNIT_ASSERT(iter_readpointer->first == default_id);
-    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+    CPPUNIT_ASSERT(test_ring_buffer == NULL);
+
     // callidmap
-    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 1);
+    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 0);
     iter_callidmap = _mainbuffer._callIDMap.find(default_id);
-    CPPUNIT_ASSERT(iter_callidmap->first == default_id);
-    CPPUNIT_ASSERT(iter_callidmap->second->size() == 0);
+    CPPUNIT_ASSERT(iter_callidmap == _mainbuffer._callIDMap.end());
+
 
     // test bind Participant A with default 
     _mainbuffer.bindCallID(test_id1);
     // ringbuffers
     CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 2);
     test_ring_buffer = _mainbuffer.getRingBuffer(default_id);
-    CPPUNIT_ASSERT(test_ring_buffer->getNbReadPointer() == 2);
-    iter_readpointer = test_ring_buffer->_readpointer.find(default_id);
-    CPPUNIT_ASSERT(iter_readpointer->first == default_id);
-    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+    CPPUNIT_ASSERT(test_ring_buffer->getNbReadPointer() == 1);
     iter_readpointer = test_ring_buffer->_readpointer.find(test_id1);
     CPPUNIT_ASSERT(iter_readpointer->first == test_id1);
     CPPUNIT_ASSERT(iter_readpointer->second == 0);
@@ -877,10 +1226,7 @@ void MainBufferTest::testConference()
     // ringbuffers
     CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 3);
     test_ring_buffer = _mainbuffer.getRingBuffer(default_id);
-    CPPUNIT_ASSERT(test_ring_buffer->getNbReadPointer() == 3);
-    iter_readpointer = test_ring_buffer->_readpointer.find(default_id);
-    CPPUNIT_ASSERT(iter_readpointer->first == default_id);
-    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+    CPPUNIT_ASSERT(test_ring_buffer->getNbReadPointer() == 2);
     iter_readpointer = test_ring_buffer->_readpointer.find(test_id1);
     CPPUNIT_ASSERT(iter_readpointer->first == test_id1);
     CPPUNIT_ASSERT(iter_readpointer->second == 0);
@@ -923,10 +1269,7 @@ void MainBufferTest::testConference()
     // ringbuffers
     CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 3);
     test_ring_buffer = _mainbuffer.getRingBuffer(default_id);
-    CPPUNIT_ASSERT(test_ring_buffer->getNbReadPointer() == 3);
-    iter_readpointer = test_ring_buffer->_readpointer.find(default_id);
-    CPPUNIT_ASSERT(iter_readpointer->first == default_id);
-    CPPUNIT_ASSERT(iter_readpointer->second == 0);
+    CPPUNIT_ASSERT(test_ring_buffer->getNbReadPointer() == 2);
     iter_readpointer = test_ring_buffer->_readpointer.find(test_id1);
     CPPUNIT_ASSERT(iter_readpointer->first == test_id1);
     CPPUNIT_ASSERT(iter_readpointer->second == 0);
@@ -1410,8 +1753,8 @@ void MainBufferTest::testConference()
     CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 2);
 
     _mainbuffer.unBindCallID(test_id2);
-    CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 1);
-    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 1);
+    CPPUNIT_ASSERT(_mainbuffer._ringBufferMap.size() == 0);
+    CPPUNIT_ASSERT(_mainbuffer._callIDMap.size() == 0);
 
 
 }
diff --git a/sflphone-common/test/mainbufferTest.h b/sflphone-common/test/mainbufferTest.h
index 39da65c225dd7d666c9a6498a7f17d21fbcbe1d3..330228f9a92d011d4540f74a4cb902c1ff525c20 100644
--- a/sflphone-common/test/mainbufferTest.h
+++ b/sflphone-common/test/mainbufferTest.h
@@ -67,16 +67,16 @@ class MainBufferTest : public CppUnit::TestCase {
        CPPUNIT_TEST( testRingBufferReadPointer );
        CPPUNIT_TEST( testCallIDSet );
        CPPUNIT_TEST( testRingBufferInt );
-       // CPPUNIT_TEST( testRingBufferNonDefaultID );
-       // CPPUNIT_TEST( testRingBufferFloat );
-       // CPPUNIT_TEST( testTwoPointer );
-       // CPPUNIT_TEST( testGetPutData );
-       // CPPUNIT_TEST( testGetDataAndCallID );
-       // CPPUNIT_TEST( testAvailForGetPut );
-       // CPPUNIT_TEST( testDiscardFlush );
-       // CPPUNIT_TEST( testReadPointerInit );
-       // CPPUNIT_TEST( testRingBufferSeveralPointers );
-       // CPPUNIT_TEST( testConference );
+       CPPUNIT_TEST( testRingBufferNonDefaultID );
+       CPPUNIT_TEST( testRingBufferFloat );
+       CPPUNIT_TEST( testTwoPointer );
+       CPPUNIT_TEST( testBindUnbindBuffer );
+       CPPUNIT_TEST( testGetPutDataByID );
+       CPPUNIT_TEST( testGetPutData );
+       CPPUNIT_TEST( testDiscardFlush );
+       CPPUNIT_TEST( testReadPointerInit );
+       CPPUNIT_TEST( testRingBufferSeveralPointers );
+       CPPUNIT_TEST( testConference );
     CPPUNIT_TEST_SUITE_END();
 
     public:
@@ -111,9 +111,9 @@ class MainBufferTest : public CppUnit::TestCase {
 
 	void testBindUnbindBuffer();
 
-	void testGetPutData();
+	void testGetPutDataByID();
 
-	void testGetDataAndCallID();
+	void testGetPutData();
 
 	void testAvailForGetPut();