diff --git a/src/org/jitsi/impl/neomedia/RawPacket.java b/src/org/jitsi/impl/neomedia/RawPacket.java
index 5d4a65ce94cccd7748138c0a04e2d761f1b4eacb..7d220b89baa7978cdcc1d371be7ffd25c67e560e 100644
--- a/src/org/jitsi/impl/neomedia/RawPacket.java
+++ b/src/org/jitsi/impl/neomedia/RawPacket.java
@@ -88,10 +88,10 @@ public RawPacket(byte[] buffer, int offset, int length)
     }
 
     /**
-     * Adds the <tt>extBuff</tt> buffer to as an extension of this packet
+     * Adds the <tt>extBuff</tt> buffer as an extension of this packet
      * according the rules specified in RFC 5285. Note that this method does
      * not replace extensions so if you add the same buffer twice it would be
-     * added as to separate extensions.
+     * added as a separate extension.
      *
      * @param extBuff the buffer that we'd like to add as an extension in this
      * packet.
@@ -580,6 +580,15 @@ public int getOffset()
         return this.offset;
     }
 
+    /**
+     * Gets the value of the "version" field of an RTP packet.
+     * @return the value of the RTP "version" field.
+     */
+    public int getVersion()
+    {
+        return (buffer[offset] & 0xC0) >> 6;
+    }
+
     /**
      * Get RTP padding size from a RTP packet
      *
diff --git a/src/org/jitsi/impl/neomedia/transform/AbsSendTimeEngine.java b/src/org/jitsi/impl/neomedia/transform/AbsSendTimeEngine.java
index 1f5e024803ce6b93631e6f66a530e94dbf62f693..b43e4ca155161561b8acbecd77fbb6ab5f376e1d 100644
--- a/src/org/jitsi/impl/neomedia/transform/AbsSendTimeEngine.java
+++ b/src/org/jitsi/impl/neomedia/transform/AbsSendTimeEngine.java
@@ -6,6 +6,7 @@
  */
 package org.jitsi.impl.neomedia.transform;
 
+import net.sf.fmj.media.rtp.*;
 import org.jitsi.impl.neomedia.*;
 
 /**
@@ -38,6 +39,8 @@ public class AbsSendTimeEngine
     public RawPacket transform(RawPacket pkt)
     {
         if (extensionID != -1
+              && pkt != null
+              && pkt.getVersion() == RTPHeader.VERSION
               && pkt.getExtensionBit())
         {
             replaceAbsSendTime(pkt);
diff --git a/src/org/jitsi/impl/neomedia/transform/REDTransformEngine.java b/src/org/jitsi/impl/neomedia/transform/REDTransformEngine.java
index b260d0ce1c058a6d5d3d661fed078f7832d250dd..354b7663dd44f132906602468d5464087b5ca481 100644
--- a/src/org/jitsi/impl/neomedia/transform/REDTransformEngine.java
+++ b/src/org/jitsi/impl/neomedia/transform/REDTransformEngine.java
@@ -6,6 +6,7 @@
  */
 package org.jitsi.impl.neomedia.transform;
 
+import net.sf.fmj.media.rtp.*;
 import org.jitsi.impl.neomedia.*;
 import org.jitsi.util.*;
 
@@ -145,9 +146,7 @@ public RawPacket[] transform(RawPacket[] pkts)
 
         for (RawPacket pkt : pkts)
         {
-            // we don't touch packets with PT=0, because they might be ZRTP
-            // packets. Do we need any other filters -- PT, SSRC?
-            if (pkt != null && pkt.getPayloadType() != 0)
+            if (pkt != null && pkt.getVersion() == RTPHeader.VERSION)
             {
                 byte[] buf = pkt.getBuffer();
                 int len = pkt.getLength();
diff --git a/src/org/jitsi/impl/neomedia/transform/csrc/CsrcTransformEngine.java b/src/org/jitsi/impl/neomedia/transform/csrc/CsrcTransformEngine.java
index ebf2ead10e8c8ad126a83f6b851744c956b5d798..7246a49abcc75576fb7f7a14dc6bc03340264f4d 100644
--- a/src/org/jitsi/impl/neomedia/transform/csrc/CsrcTransformEngine.java
+++ b/src/org/jitsi/impl/neomedia/transform/csrc/CsrcTransformEngine.java
@@ -8,6 +8,7 @@
 
 import java.util.*;
 
+import net.sf.fmj.media.rtp.*;
 import org.jitsi.impl.neomedia.*;
 import org.jitsi.impl.neomedia.transform.*;
 import org.jitsi.service.neomedia.*;
@@ -268,10 +269,8 @@ public void setCsrcAudioLevelExtensionID(byte extID, MediaDirection dir)
     @Override
     public synchronized RawPacket transform(RawPacket pkt)
     {
-        // if somebody has modified the packet and added an extension
-        // don't process it. As ZRTP creates special RTP packets carrying no
-        // RTP data and those packets are used only by ZRTP we don't use them.
-        if(pkt.getExtensionBit())
+        // Only transform RTP packets (and not ZRTP/DTLS, etc)
+        if (pkt == null || pkt.getVersion() != RTPHeader.VERSION)
             return pkt;
 
         long[] csrcList = mediaStream.getLocalContributingSourceIDs();
diff --git a/src/org/jitsi/impl/neomedia/transform/csrc/SsrcTransformEngine.java b/src/org/jitsi/impl/neomedia/transform/csrc/SsrcTransformEngine.java
index ad14e0c7a6119a60004833620ee2060b33865178..f14ffbac508ac1fd46632325582744ada6174742 100644
--- a/src/org/jitsi/impl/neomedia/transform/csrc/SsrcTransformEngine.java
+++ b/src/org/jitsi/impl/neomedia/transform/csrc/SsrcTransformEngine.java
@@ -221,7 +221,7 @@ public RawPacket reverseTransform(RawPacket pkt)
         if ((ssrcAudioLevelExtID > 0)
                 && ssrcAudioLevelDirection.allowsReceiving()
                 && !pkt.isInvalid()
-                && (RTPHeader.VERSION == ((pkt.readByte(0) & 0xC0) >>> 6)))
+                && RTPHeader.VERSION == pkt.getVersion())
         {
             byte level = pkt.extractSsrcAudioLevel(ssrcAudioLevelExtID);
 
diff --git a/src/org/jitsi/impl/neomedia/transform/dtmf/DtmfRawPacket.java b/src/org/jitsi/impl/neomedia/transform/dtmf/DtmfRawPacket.java
index de5f36b1845c086ec67f934fb61f0d651f699b7a..796731bd1f5b31165c39010b84ce5ef54672efb7 100644
--- a/src/org/jitsi/impl/neomedia/transform/dtmf/DtmfRawPacket.java
+++ b/src/org/jitsi/impl/neomedia/transform/dtmf/DtmfRawPacket.java
@@ -108,12 +108,15 @@ public void init(int     code,
                 " Marker = " + marker + " End = " + end);
         }
 
-        // Set the payload type and the marker
+        // Set the marker
         setMarker(marker);
 
         // set the Timestamp
         setTimestamp(timestamp);
 
+        // Clear any RTP header extensions
+        removeExtension();
+
          // Create the RTP data
         setDtmfPayload(code, end, duration, volume);
     }
diff --git a/src/org/jitsi/impl/neomedia/transform/dtmf/DtmfTransformEngine.java b/src/org/jitsi/impl/neomedia/transform/dtmf/DtmfTransformEngine.java
index daf5ef9610cd32b629bedb145f09df516bdc278d..93ff442beb365a0be57796902de09d50b3f84469 100644
--- a/src/org/jitsi/impl/neomedia/transform/dtmf/DtmfTransformEngine.java
+++ b/src/org/jitsi/impl/neomedia/transform/dtmf/DtmfTransformEngine.java
@@ -10,6 +10,7 @@
 
 import javax.media.*;
 
+import net.sf.fmj.media.rtp.*;
 import org.jitsi.impl.neomedia.*;
 import org.jitsi.impl.neomedia.transform.*;
 import org.jitsi.service.neomedia.*;
@@ -272,7 +273,9 @@ public RawPacket reverseTransform(RawPacket pkt)
      */
     public RawPacket transform(RawPacket pkt)
     {
-        if(currentTone.isEmpty())
+        if (currentTone.isEmpty()
+                || pkt == null
+                || pkt.getVersion() != RTPHeader.VERSION)
         {
             return pkt;
         }
diff --git a/src/org/jitsi/impl/neomedia/transform/fec/FECReceiver.java b/src/org/jitsi/impl/neomedia/transform/fec/FECReceiver.java
index 27eade9ed8cc907b35ab26344db9a869d303bf02..725fd32d412beffed8efa41b84b8fba2040a4ee3 100644
--- a/src/org/jitsi/impl/neomedia/transform/fec/FECReceiver.java
+++ b/src/org/jitsi/impl/neomedia/transform/fec/FECReceiver.java
@@ -539,7 +539,7 @@ private RawPacket recover()
             }
 
             // set the version to 2
-            recoveredBuf[0] &= 0x3f; //set version to 2
+            recoveredBuf[0] &= 0x3f;
             recoveredBuf[0] |= 0x80;
             // the RTP header is now set, except for SSRC and seq. which are not
             // recoverable in this way and will be set later
diff --git a/src/org/jitsi/impl/neomedia/transform/fec/FECSender.java b/src/org/jitsi/impl/neomedia/transform/fec/FECSender.java
index 49e73f8c5b2043405fc98d521c90c788d6f303d3..b8cbd2c39b44dba5bbbcea68f30dc6fb6940549c 100644
--- a/src/org/jitsi/impl/neomedia/transform/fec/FECSender.java
+++ b/src/org/jitsi/impl/neomedia/transform/fec/FECSender.java
@@ -6,6 +6,7 @@
  */
 package org.jitsi.impl.neomedia.transform.fec;
 
+import net.sf.fmj.media.rtp.*;
 import org.jitsi.impl.neomedia.*;
 import org.jitsi.impl.neomedia.transform.*;
 import org.jitsi.util.Logger;
@@ -90,7 +91,7 @@ public synchronized RawPacket[] transform(RawPacket[] pkts)
         RawPacket pkt = null;
         for (RawPacket p : pkts)
         {
-            if (p != null && p.getPayloadType() != 0) //might be ZRTP
+            if (p != null && p.getVersion() == RTPHeader.VERSION)
             {
                 pkt = p;
                 break;
diff --git a/src/org/jitsi/impl/neomedia/transform/pt/PayloadTypeTransformEngine.java b/src/org/jitsi/impl/neomedia/transform/pt/PayloadTypeTransformEngine.java
index c0555fc851d9685e53c2f89c8494453a6c94eb92..805b5dbfd9b3c2063672ca8a045d07d015a1228a 100644
--- a/src/org/jitsi/impl/neomedia/transform/pt/PayloadTypeTransformEngine.java
+++ b/src/org/jitsi/impl/neomedia/transform/pt/PayloadTypeTransformEngine.java
@@ -6,6 +6,7 @@
  */
 package org.jitsi.impl.neomedia.transform.pt;
 
+import net.sf.fmj.media.rtp.*;
 import org.jitsi.impl.neomedia.*;
 import org.jitsi.impl.neomedia.transform.*;
 
@@ -53,7 +54,9 @@ public class PayloadTypeTransformEngine
      */
     public RawPacket transform(RawPacket pkt)
     {
-        if(mappingOverridesCopy == null || mappingOverridesCopy.isEmpty())
+        if (mappingOverridesCopy == null
+                || mappingOverridesCopy.isEmpty()
+                || pkt.getVersion() != RTPHeader.VERSION)
             return pkt;
 
         Byte newPT = mappingOverridesCopy.get(pkt.getPayloadType());