diff --git a/sflphone-common/src/Codec.h b/sflphone-common/src/Codec.h
index de1824f84f0533d06251e394e7f425eb3375d27a..b903443fe70e9f45d6fe640701b8cc7f8be90edd 100644
--- a/sflphone-common/src/Codec.h
+++ b/sflphone-common/src/Codec.h
@@ -32,6 +32,8 @@
 
 #include "MimeParameters.h" // TODO Move to some higher directory
 
+#include <tr1/memory>
+
 #include <cc++/digest.h>
 
 /**
@@ -59,6 +61,11 @@ class Codec : public virtual MimeParameters
          */
         virtual std::string getDescription() const = 0;
 
+        /**
+         * @return A copy of the current codec.
+         */
+        virtual Codec* clone() const = 0;
+
         /**
          * Build a unique hash code for identifying the codec uniquely.
          * Note that if multiple implementations of codec are provided,
diff --git a/sflphone-common/src/audio/codecs/alaw.cpp b/sflphone-common/src/audio/codecs/alaw.cpp
index e38931c7a0bec69af664be1366dc43590b9c072d..f6826269eb889e1eba80029390dc86f6ce329d3a 100644
--- a/sflphone-common/src/audio/codecs/alaw.cpp
+++ b/sflphone-common/src/audio/codecs/alaw.cpp
@@ -135,6 +135,15 @@ class Alaw : public sfl::AudioCodec
         std::string getDescription() const {
             return "audio/PCMA 8000 (\"alaw\") codec.";
         }
+
+        /**
+         * @Override
+         */
+        Alaw* clone() const {
+            return new Alaw (*this);
+        }
+
+
 };
 
 // the class factories
diff --git a/sflphone-common/src/audio/codecs/audiocodec.h b/sflphone-common/src/audio/codecs/audiocodec.h
index 1f183b2dfb81f21845b8d1af362db4268e06f385..20558f0527127525c1a223cfbc272eafa5052fb9 100644
--- a/sflphone-common/src/audio/codecs/audiocodec.h
+++ b/sflphone-common/src/audio/codecs/audiocodec.h
@@ -133,6 +133,11 @@ class AudioCodec : public Codec
          */
         unsigned int getFrameSize() const;
 
+        /**
+         * @Override
+         */
+        virtual AudioCodec* clone() const = 0;
+
     protected:
         /** Holds SDP-compliant codec name */
         std::string _codecName; // what we put inside sdp
diff --git a/sflphone-common/src/audio/codecs/celtcodec.cpp b/sflphone-common/src/audio/codecs/celtcodec.cpp
index 69d156e505567e754c70b14bca5d73e62f214efc..4ce2b45f201b4934343d9b51d438e797fe5ab3a4 100644
--- a/sflphone-common/src/audio/codecs/celtcodec.cpp
+++ b/sflphone-common/src/audio/codecs/celtcodec.cpp
@@ -156,6 +156,14 @@ class Celt : public sfl::AudioCodec
             return "audio/celt 32000 (\"HD\") codec. Based on libcelt, by Jean-Marc Valin.";
         }
 
+        /**
+         * @Override
+         */
+        Celt* clone() const {
+            return new Celt (*this);
+        }
+
+
     private:
 
         CELTMode *_mode;
diff --git a/sflphone-common/src/audio/codecs/g722.cpp b/sflphone-common/src/audio/codecs/g722.cpp
index 339010148218486399be17cedd47b230956c7fb2..41ec89a9e101dd2ec3b6b7f45566947de22444e4 100644
--- a/sflphone-common/src/audio/codecs/g722.cpp
+++ b/sflphone-common/src/audio/codecs/g722.cpp
@@ -829,6 +829,14 @@ class G722 : public sfl::AudioCodec
             return "G722 codec. Most of the code comes from Steve Underwood (<steveu@coppice.org>) for the Asterisk project.";
         }
 
+        /**
+         * @Override
+         */
+        G722* clone() const {
+            return new G722 (*this);
+        }
+
+
     private:
 
         g722_decode_state_t *decode_s;
diff --git a/sflphone-common/src/audio/codecs/gsmcodec.cpp b/sflphone-common/src/audio/codecs/gsmcodec.cpp
index 5c43b39cb8792630fa0a981c2d0ec76762f47ec8..8be02bc61c5a520f0a639a6a218bdac96459af04 100644
--- a/sflphone-common/src/audio/codecs/gsmcodec.cpp
+++ b/sflphone-common/src/audio/codecs/gsmcodec.cpp
@@ -93,6 +93,14 @@ class Gsm : public sfl::AudioCodec
             return "GSM codec. Based on libgsm, (C) Jutta Degener and Carsten Bormann, Technische Universitaet Berlin.";
         }
 
+        /**
+         * @Override
+         */
+        Gsm* clone() const {
+            return new Gsm (*this);
+        }
+
+
     private:
         gsm _decode_gsmhandle;
         gsm _encode_gsmhandle;
diff --git a/sflphone-common/src/audio/codecs/speexcodec_nb.cpp b/sflphone-common/src/audio/codecs/speexcodec_nb.cpp
index 7c3c076788f5ea847af7804e1ed5007797f674d7..e0fcd2a8150eb8e9a18d4247dbaa91953ffd4aab 100644
--- a/sflphone-common/src/audio/codecs/speexcodec_nb.cpp
+++ b/sflphone-common/src/audio/codecs/speexcodec_nb.cpp
@@ -121,6 +121,14 @@ class Speex : public sfl::AudioCodec
             return "audio/speex 8000 (\"narrow band\") codec. Based on libspeex, by Jean-Marc Valin.";
         }
 
+        /**
+         * @Override
+         */
+        Speex* clone() const {
+            return new Speex (*this);
+        }
+
+
     private:
         const SpeexMode* _speexModePtr;
         SpeexBits  _speex_dec_bits;
diff --git a/sflphone-common/src/audio/codecs/speexcodec_ub.cpp b/sflphone-common/src/audio/codecs/speexcodec_ub.cpp
index ebffda8a717a8b2eaad659e2d38d9e866ab0cc31..36a8cd1f42abd4c376f316bf588fa756459e0bc9 100644
--- a/sflphone-common/src/audio/codecs/speexcodec_ub.cpp
+++ b/sflphone-common/src/audio/codecs/speexcodec_ub.cpp
@@ -123,6 +123,14 @@ class Speex : public sfl::AudioCodec
             return "audio/speex 32000 (\"ultra wide band\") codec. Based on libspeex, by Jean-Marc Valin.";
         }
 
+        /**
+         * @Override
+         */
+        Speex* clone() const {
+            return new Speex (*this);
+        }
+
+
     private:
         const SpeexMode* _speexModePtr;
         SpeexBits  _speex_dec_bits;
diff --git a/sflphone-common/src/audio/codecs/speexcodec_wb.cpp b/sflphone-common/src/audio/codecs/speexcodec_wb.cpp
index 6e974e3e772ea5128415acf6fd6a23789d6f0991..e4fcd4146280b5b5037ddb6797ae1e7dd7e16c29 100644
--- a/sflphone-common/src/audio/codecs/speexcodec_wb.cpp
+++ b/sflphone-common/src/audio/codecs/speexcodec_wb.cpp
@@ -122,6 +122,13 @@ class Speex : public sfl::AudioCodec
             return "audio/speex 16000 (\"wide band\") codec. Based on libspeex, by Jean-Marc Valin.";
         }
 
+        /**
+         * @Override
+         */
+        Speex* clone() const {
+            return new Speex (*this);
+        }
+
     private:
         const SpeexMode* _speexModePtr;
         SpeexBits  _speex_dec_bits;
diff --git a/sflphone-common/src/audio/codecs/ulaw.cpp b/sflphone-common/src/audio/codecs/ulaw.cpp
index e3560c0728210a1b0367b6c7aae8b119b544fe6d..56d65717425a1537dd281ad0cf9275ea05c2359d 100644
--- a/sflphone-common/src/audio/codecs/ulaw.cpp
+++ b/sflphone-common/src/audio/codecs/ulaw.cpp
@@ -130,6 +130,14 @@ class Ulaw : public sfl::AudioCodec
         std::string getDescription() const {
             return "audio/PCMU 8000 (\"ulaw\") codec.";
         }
+
+        /**
+         * @Override
+         */
+        Ulaw* clone() const {
+            return new Ulaw (*this);
+        }
+
 };
 
 // the class factories