diff --git a/sflphone-common/src/audio/algorithm.h b/sflphone-common/src/audio/algorithm.h
index 0f9ff389537f46006ab07a08ff4aca603b98f9e9..6da74c1c70d3950e2db0d006cfef591ab4bc80b2 100644
--- a/sflphone-common/src/audio/algorithm.h
+++ b/sflphone-common/src/audio/algorithm.h
@@ -38,6 +38,11 @@ class Algorithm {
    */
   virtual void putData(SFLDataFormat *inputData, int nbBytes) = 0;
 
+  /**
+   *
+   */
+  virtual int getData(SFLDataFormat *outputData) = 0;
+
   /**
    * Class implementing this interface must define this function 
    * for audio processing that require synchronization between spkrdata and
diff --git a/sflphone-common/src/audio/audioprocessing.cpp b/sflphone-common/src/audio/audioprocessing.cpp
index 3bf14f6a12291ee00d46014a96e624efe1ec2ac6..36f17f6fcd60dfe4870a44326fd63f9aafedf935 100644
--- a/sflphone-common/src/audio/audioprocessing.cpp
+++ b/sflphone-common/src/audio/audioprocessing.cpp
@@ -33,6 +33,14 @@ void AudioProcessing::resetAlgorithm(void)
     _algorithm->reset();
 }
 
+int AudioProcessing::getData(SFLDataFormat *outputData)
+{
+  if(_algorithm)
+    return _algorithm->getData(outputData);
+  else
+    return 0;
+}
+
 void AudioProcessing::putData(SFLDataFormat *inputData, int nbBytes)
 {
   if(_algorithm)
diff --git a/sflphone-common/src/audio/audioprocessing.h b/sflphone-common/src/audio/audioprocessing.h
index 264f7177fbc18b0efe52d68423f26b48bfdbbb7c..1ef0464f69b132b2d8c9e4e73ddaae2ac6310fec 100644
--- a/sflphone-common/src/audio/audioprocessing.h
+++ b/sflphone-common/src/audio/audioprocessing.h
@@ -54,6 +54,11 @@ public:
    */
   void putData(SFLDataFormat *inputData, int nbBytes);
 
+  /**
+   * Get data from internal buffer
+   */
+  int getData(SFLDataFormat *outputData);
+
   /**
    * Process some audio data
    */
diff --git a/sflphone-common/src/audio/dcblocker.cpp b/sflphone-common/src/audio/dcblocker.cpp
index ff21780d258d68a2ee8d2184fefee3254d40c8db..4ab4e822c02bba68d410ad459c04558104a14d7c 100644
--- a/sflphone-common/src/audio/dcblocker.cpp
+++ b/sflphone-common/src/audio/dcblocker.cpp
@@ -58,6 +58,8 @@ void DcBlocker::reset()
 
 void DcBlocker::putData(SFLDataFormat *inputData, int nbBytes) {}
 
+int DcBlocker::getData(SFLDataFormat *outputData) { return 0; }
+
 void DcBlocker::process (SFLDataFormat *data, int nbBytes)
 {
     // y(n) = x(n) - x(n-1) + R y(n-1) , R = 0.9999
diff --git a/sflphone-common/src/audio/dcblocker.h b/sflphone-common/src/audio/dcblocker.h
index 29b024ef98a66a94dfc4098336bfb8fe872af260..3dd7f35e301fd2f22f17ca7f800884a6c5cf7576 100644
--- a/sflphone-common/src/audio/dcblocker.h
+++ b/sflphone-common/src/audio/dcblocker.h
@@ -86,6 +86,11 @@ public:
      */
     virtual void putData(SFLDataFormat *inputData, int nbBytes);
 
+    /**
+     * Unused
+     */
+    virtual int getData(SFLDataFormat *outputData);
+
     /**
      * Perform dc blocking given the input data
      */
diff --git a/sflphone-common/src/audio/echocancel.cpp b/sflphone-common/src/audio/echocancel.cpp
index 59d962b141762f736cee282a489e5047e465038a..95cb40b22656e678358703242276425d52c91628 100644
--- a/sflphone-common/src/audio/echocancel.cpp
+++ b/sflphone-common/src/audio/echocancel.cpp
@@ -42,7 +42,8 @@ EchoCancel::EchoCancel(int smplRate, int frameLength) : _samplingRate(smplRate),
 							_micAdaptCnt(0),
 							_spkrAdaptSize(SPKR_ADAPT_SIZE),
 							_micAdaptSize(MIC_ADAPT_SIZE),
-							_correlationSize(0)
+							_correlationSize(0),
+							_processedByte(0)
 {
   _debug("EchoCancel: Instantiate echo canceller");
 
@@ -57,9 +58,11 @@ EchoCancel::EchoCancel(int smplRate, int frameLength) : _samplingRate(smplRate),
 
   _micData = new RingBuffer(50000);
   _spkrData = new RingBuffer(50000);
+  _spkrDataOut = new RingBuffer(50000);
 
   _micData->createReadPointer();
   _spkrData->createReadPointer();
+  _spkrDataOut->createReadPointer();
 
   // variable used to sync mic and spkr
   _spkrStoped = true;
@@ -158,6 +161,7 @@ void EchoCancel::reset()
 
   _micData->flushAll();
   _spkrData->flushAll();
+  _spkrDataOut->flushAll();
 
   // SFLDataFormat delay[960];
   // memset(delay, 0, sizeof(SFLDataFormat));
@@ -180,7 +184,6 @@ void EchoCancel::reset()
   f=.0;
   speex_preprocess_ctl(_noiseState, SPEEX_PREPROCESS_SET_DEREVERB_LEVEL, &f);
 
-
   _spkrStoped = true;
 }
 
@@ -199,9 +202,24 @@ void EchoCancel::putData(SFLDataFormat *inputData, int nbBytes)
 
   // Put data in speaker ring buffer
   _spkrData->Put(inputData, nbBytes);
+  _spkrDataOut->Put(inputData, nbBytes);
 
 }
 
+int EchoCancel::getData(SFLDataFormat *outputData)
+{
+   // int availForGet = _spkrData->AvailForGet();
+
+  int copied = 0;
+
+  if(_processedByte > 0) {
+       copied = _spkrDataOut->Get(outputData, _processedByte);
+       _processedByte = 0;
+  }
+
+   return copied;
+}
+
 void EchoCancel::process(SFLDataFormat *data, int nbBytes) {}
 
 int EchoCancel::process(SFLDataFormat *inputData, SFLDataFormat *outputData, int nbBytes)
@@ -226,7 +244,7 @@ int EchoCancel::process(SFLDataFormat *inputData, SFLDataFormat *outputData, int
   int spkrAvail = _spkrData->AvailForGet();
   int micAvail = _micData->AvailForGet();
 
-  _debug("EchoCancel: speaker avail %d, mic avail %d", spkrAvail, micAvail);
+  _debug("EchoCancel: speaker avail %d, mic avail %d, processed: %d", spkrAvail/320, micAvail/320, _processedByte);
 
   // Init number of frame processed
   int nbFrame = 0;
@@ -246,6 +264,9 @@ int EchoCancel::process(SFLDataFormat *inputData, SFLDataFormat *outputData, int
 
     bcopy(_tmpOut, outputData+(nbFrame*_smplPerFrame), byteSize);
 
+    // used to sync with speaker 
+    _processedByte += byteSize;
+
     // echoFile->write ((const char *)_tmpOut, byteSize);
 
     spkrAvail = _spkrData->AvailForGet();
diff --git a/sflphone-common/src/audio/echocancel.h b/sflphone-common/src/audio/echocancel.h
index ab0c2bdd04d995379677a3c2f410b163157ef646..e122b0cd9122bcf73c0fd118230805852391b9a1 100644
--- a/sflphone-common/src/audio/echocancel.h
+++ b/sflphone-common/src/audio/echocancel.h
@@ -72,6 +72,11 @@ class EchoCancel : public Algorithm {
      */
     virtual void putData(SFLDataFormat *inputData, int nbBytes);
 
+    /**
+     * Get data ready to be played by speakers
+     */
+    virtual int getData(SFLDataFormat *outputData);
+
     /**
      * Unused
      */
@@ -152,6 +157,8 @@ class EchoCancel : public Algorithm {
      */
     RingBuffer *_spkrData;
 
+    RingBuffer *_spkrDataOut;
+
     /**
      * Boolean value 
      */
@@ -274,6 +281,8 @@ class EchoCancel : public Algorithm {
 
     int _correlationArray[BUFF_SIZE];
 
+    int _processedByte;
+
     /*
     ofstream *micFile;
     ofstream *spkrFile;
@@ -287,7 +296,7 @@ class EchoCancel : public Algorithm {
      * Noise reduction processing state
      */
     SpeexPreprocessState *_noiseState;
-    
+
 };
 
 #endif