diff --git a/src/audio/audiolayer.h b/src/audio/audiolayer.h
index a0083f99d85038994c0ec31096319abd11dfec0b..95a43ac8f5f4ce1e185785ec068ee4637c2be688 100644
--- a/src/audio/audiolayer.h
+++ b/src/audio/audiolayer.h
@@ -130,6 +130,7 @@ class AudioLayer {
     virtual int putUrgent(void* buffer, int toCopy) = 0; 
 
     virtual int putMain( void* buffer, int toCopy) = 0;
+    virtual int putInCache(char code, void* buffer, int toCopy) = 0;
 
     /**
      * Query the capture device for number of bytes available in the hardware ring buffer
diff --git a/src/audio/audiostream.cpp b/src/audio/audiostream.cpp
index 02deda2559781a3a81756e31af42bf144c67010a..97a5edda2d66afc1aae428155cba425c566f8372 100644
--- a/src/audio/audiostream.cpp
+++ b/src/audio/audiostream.cpp
@@ -75,14 +75,12 @@ AudioStream::createStream( pa_context* c )
 
   if( _streamType == PLAYBACK_STREAM ){
     pa_stream_connect_playback( s , NULL , NULL , flag , NULL, NULL );
-    //pa_stream_set_write_callback( s , audioCallback, this);
   }
   else if( _streamType == CAPTURE_STREAM ){
     pa_stream_connect_record( s , NULL , NULL , flag );
-    //pa_stream_set_read_callback( s , audioCallback, this);
   }
   else if( _streamType == UPLOAD_STREAM ){
-    //pa_stream_connect_upload( s , 1024  );
+    pa_stream_connect_upload( s , 1024  );
   }
   else{
     _debug( "Stream type unknown \n");
diff --git a/src/audio/pulselayer.cpp b/src/audio/pulselayer.cpp
index 121c7f0048913e25b6d81a1fbfad51a69eef6430..480dde04e13e2c3ae0d68a2899c07bd438d5b0b2 100644
--- a/src/audio/pulselayer.cpp
+++ b/src/audio/pulselayer.cpp
@@ -20,7 +20,7 @@
 #include "pulselayer.h"
 
 
-int framesPerBuffer = 1024;
+int framesPerBuffer = 4096;
 
 PulseLayer::PulseLayer(ManagerImpl* manager)
   : AudioLayer( manager , PULSEAUDIO )    
@@ -98,7 +98,7 @@ PulseLayer::createStreams( pa_context* c )
   pa_stream_set_write_callback( playback->pulseStream() , audioCallback, this);
   record = new AudioStream(c, CAPTURE_STREAM, "SFLphone in");
   pa_stream_set_read_callback( record->pulseStream() , audioCallback, this);
-  //cache = new AudioStream(c, UPLOAD_STREAM, "Cache samples");
+  cache = new AudioStream(c, UPLOAD_STREAM, "Cache samples");
 
   pa_threaded_mainloop_signal(m , 0);
 }
@@ -263,3 +263,12 @@ PulseLayer::write( void )
   }
   pa_stream_write( playback->pulseStream() , out , toGet  , pa_xfree, 0 , PA_SEEK_RELATIVE);
 }
+
+int
+PulseLayer::putInCache( char code, void *buffer, int toCopy )
+{
+  _debug("Put the DTMF in cache\n");
+  //pa_stream_write( cache->pulseStream() , buffer , toCopy  , pa_xfree, 0 , PA_SEEK_RELATIVE);
+  //pa_stream_finish_upload( cache->pulseStream() );
+}
+
diff --git a/src/audio/pulselayer.h b/src/audio/pulselayer.h
index 1593862c1eded324eef11c55d6e1d5b1d30e69fe..947df7fca149aa2f5c7543c6e3ddb3fe4cae5fb3 100644
--- a/src/audio/pulselayer.h
+++ b/src/audio/pulselayer.h
@@ -61,6 +61,7 @@ class PulseLayer : public AudioLayer {
     void flushMain();
     int putMain(void* buffer, int toCopy);
     int putUrgent(void* buffer, int toCopy);
+    int putInCache( char code, void* buffer , int toCopy );
     int canGetMic();
     int getMic(void *, int);
     void flushMic();
@@ -115,8 +116,7 @@ class PulseLayer : public AudioLayer {
      * @return std::string  The name of the audio plugin
      */
     std::string getAudioPlugin( void ) { return "default"; }
-
-    //pa_stream* getCacheStream( void ) { return caching; }
+    
 
   private:
     /**
diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp
index 7c176428fd3dfb19cacf4f1aae08b30c9243334c..e7068c9eccafa05014224b557ffd2dc08f6ac733 100644
--- a/src/managerimpl.cpp
+++ b/src/managerimpl.cpp
@@ -507,7 +507,11 @@ ManagerImpl::playDtmf(char code, bool isTalking)
   }
   returnValue = true;
 
-  // TODO: add caching
+#if CHECK_INTERFACE( layer , PULSEAUDIO )
+  // Cache the samples on the sound server
+  (PulseLayer*)audiolayer->putInCache( code, _buf , size * sizeof(SFLDataFormat) );
+#endif
+
   delete[] _buf; _buf = 0;
   return returnValue;
 }