diff --git a/src/org/jitsi/impl/neomedia/audiolevel/AudioLevelEffect.java b/src/org/jitsi/impl/neomedia/audiolevel/AudioLevelEffect.java
index f4b9b6528413e3b402d985a4e631e253ac751859..9f6618a15bf13373df6b238089e7d015bfb6da1b 100644
--- a/src/org/jitsi/impl/neomedia/audiolevel/AudioLevelEffect.java
+++ b/src/org/jitsi/impl/neomedia/audiolevel/AudioLevelEffect.java
@@ -214,6 +214,7 @@ public int process(Buffer inputBuffer, Buffer outputBuffer)
             outputBuffer.setHeader(inputBuffer.getHeader());
             outputBuffer.setSequenceNumber(inputBuffer.getSequenceNumber());
             outputBuffer.setTimeStamp(inputBuffer.getTimeStamp());
+            outputBuffer.setRtpTimeStamp(inputBuffer.getRtpTimeStamp());
             outputBuffer.setFlags(inputBuffer.getFlags());
             outputBuffer.setDiscard(inputBuffer.isDiscard());
             outputBuffer.setEOM(inputBuffer.isEOM());
diff --git a/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIDecoder.java b/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIDecoder.java
index fa8fe630f829f3554234e71e655546ad36e150e1..2068b4650da327211e347d7f7871f03d88cd7742 100644
--- a/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIDecoder.java
+++ b/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIDecoder.java
@@ -256,6 +256,13 @@ protected int doProcess(Buffer inBuf, Buffer outBuf)
                             | (((in == null) || (inLength == 0))
                                     ? BUFFER_FLAG_PLC
                                     : BUFFER_FLAG_FEC));
+
+                long ts = inBuf.getRtpTimeStamp();
+                ts -= lostSeqNoCount * lastFrameSizeInSamplesPerChannel;
+                if (ts < 0)
+                    ts += 1L<<32;
+                outBuf.setRtpTimeStamp(ts);
+
                 nbDecodedFec++;
             }
 
@@ -310,7 +317,7 @@ protected int doProcess(Buffer inBuf, Buffer outBuf)
         if (outLength > 0)
         {
             outBuf.setDuration(
-                    totalFrameSizeInSamplesPerChannel * channels * 1000L * 1000L
+                    totalFrameSizeInSamplesPerChannel * 1000L * 1000L * 1000L
                         / outputSampleRate);
             outBuf.setFormat(getOutputFormat());
             outBuf.setLength(outLength);
diff --git a/src/org/jitsi/impl/neomedia/protocol/CachingPushBufferStream.java b/src/org/jitsi/impl/neomedia/protocol/CachingPushBufferStream.java
index 9773e279e633492b371a97b44158ac36b2c0e342..96b77bf918eba1ff817655f3a20571edcb974402 100644
--- a/src/org/jitsi/impl/neomedia/protocol/CachingPushBufferStream.java
+++ b/src/org/jitsi/impl/neomedia/protocol/CachingPushBufferStream.java
@@ -499,6 +499,7 @@ private int read(Buffer in, Buffer out, int outOffset)
                     out.setHeader(in.getHeader());
                     out.setSequenceNumber(in.getSequenceNumber());
                     out.setTimeStamp(in.getTimeStamp());
+                    out.setRtpTimeStamp(in.getRtpTimeStamp());
 
                     /*
                      * It's possible that we've split the input into multiple