diff --git a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java
index a9c8ded75051c9a3e0e264519c396a133f0917fc..d89cb71a9e4ce3af5886b34edbed1774c6279d44 100644
--- a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java
+++ b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java
@@ -1292,7 +1292,7 @@ public StreamRTPManager getRTPManager()
             if (rtpConnector == null)
                 throw new IllegalStateException("rtpConnector");
 
-            rtpManager = new StreamRTPManager(rtpTranslator);
+            rtpManager = new StreamRTPManager(this, rtpTranslator);
 
             registerCustomCodecFormats(rtpManager);
 
diff --git a/src/org/jitsi/impl/neomedia/RTPTranslatorImpl.java b/src/org/jitsi/impl/neomedia/RTPTranslatorImpl.java
index 8655f4cc5b982a8ccee19876dfda9f89d8430acf..0efc456b86b81a5b439ad3007b13f6884218b7eb 100644
--- a/src/org/jitsi/impl/neomedia/RTPTranslatorImpl.java
+++ b/src/org/jitsi/impl/neomedia/RTPTranslatorImpl.java
@@ -130,8 +130,8 @@ public synchronized void addFormat(
      * @param streamRTPManager the <tt>StreamRTPManager</tt> which specifies
      * the neomedia <tt>MediaStream</tt> with which the
      * <tt>ReceiveStreamEvent</tt>s delivered to the specified <tt>listener</tt>
-     * are to be related. In other words, a <tt>ReceiveStremEvent</tt> received
-     * by <tt>RTPTranslatorImpl</tt> is first examined to determine with which
+     * are to be related. In other words, a <tt>ReceiveStreamEvent</tt> received
+     * by <tt>RTPTranslatorImpl</tt> is first examined to determine which
      * <tt>StreamRTPManager</tt> it is related to and then it is delivered to
      * the <tt>ReceiveStreamListener</tt>s which have been added to this
      * <tt>RTPTranslatorImpl</tt> by that <tt>StreamRTPManager</tt>.
@@ -748,6 +748,14 @@ private synchronized int read(
             = streamDesc.connectorDesc.streamRTPManagerDesc;
         Format format = null;
 
+        /**
+         * Ignore packets coming from peers whose MediaStream's direction
+         * does not allow receiving.
+         */
+        if (!streamRTPManagerDesc.streamRTPManager.getMediaStream()
+                    .getDirection().allowsReceiving())
+            return read;
+
         if (data)
         {
             /*
@@ -1015,7 +1023,13 @@ private synchronized int doWrite(
                 StreamRTPManagerDesc streamRTPManagerDesc
                     = streamDesc.connectorDesc.streamRTPManagerDesc;
 
-                if (streamRTPManagerDesc != exclusion)
+                /*
+                 * Only write to OutputDataStream-s for which the associated
+                 * MediaStream allows sending.
+                 */
+                if (streamRTPManagerDesc != exclusion
+                        && streamRTPManagerDesc.streamRTPManager
+                               .getMediaStream().getDirection().allowsSending())
                 {
                     if (data)
                     {
@@ -1215,6 +1229,9 @@ private static class PushSourceStreamDesc
     {
         public final RTPConnectorDesc connectorDesc;
 
+        /**
+         * <tt>true</tt> if this instance represents a data (RTP) stream.
+         */
         public final boolean data;
 
         public final PushSourceStream stream;
diff --git a/src/org/jitsi/impl/neomedia/StreamRTPManager.java b/src/org/jitsi/impl/neomedia/StreamRTPManager.java
index 46737f1e803eaef0ecd56399dd9a65b9e9938b65..7339fe941525531b86bea5dffd5122e8b3763589 100644
--- a/src/org/jitsi/impl/neomedia/StreamRTPManager.java
+++ b/src/org/jitsi/impl/neomedia/StreamRTPManager.java
@@ -26,6 +26,11 @@
  */
 public class StreamRTPManager
 {
+    /**
+     * The <tt>MediaStream</tt> that uses this <tt>StreamRTPManager</tt>
+     */
+    private final MediaStream stream;
+
     /**
      * The <tt>RTPManager</tt> this instance is to delegate to when it is not
      * attached to an <tt>RTPTranslator</tt>.
@@ -45,12 +50,15 @@ public class StreamRTPManager
      * forward the RTP and RTCP flows of the associated <tt>MediaStream</tt> to
      * other <tt>MediaStream</tt>s.
      *
+     * @param stream the <tt>MediaStream</tt> that created this
+     * <tt>StreamRTPManager</tt>.
      * @param translator the <tt>RTPTranslator</tt> to attach the new instance
      * to or <tt>null</tt> if the new instance is to not be attached to any
      * <tt>RTPTranslator</tt>
      */
-    public StreamRTPManager(RTPTranslator translator)
+    public StreamRTPManager(MediaStream stream, RTPTranslator translator)
     {
+        this.stream = stream;
         this.translator = (RTPTranslatorImpl) translator;
 
         manager = (this.translator == null) ? RTPManager.newInstance() : null;
@@ -171,6 +179,15 @@ public long getLocalSSRC()
             return translator.getLocalSSRC(this);
     }
 
+    /**
+     * Returns the <tt>MediaStream</tt> that uses this <tt>StreamRTPManager</tt>
+     * @return the <tt>MediaStream</tt> that uses this <tt>StreamRTPManager</tt>
+     */
+    public MediaStream getMediaStream()
+    {
+        return stream;
+    }
+
     @SuppressWarnings("rawtypes")
     public Vector getReceiveStreams()
     {