Index: pjproject/trunk/pjmedia/src/pjmedia/sdp.c
===================================================================
--- pjproject/trunk/pjmedia/src/pjmedia/sdp.c	(revision 3085)
+++ pjproject/trunk/pjmedia/src/pjmedia/sdp.c	(revision 3086)
@@ -1061,4 +1061,62 @@
     return attr;
 }
+
+
+/*
+ * Apply direction attribute in session to all media.
+ */
+static void apply_media_direction(pjmedia_sdp_session *sdp)
+{
+    pjmedia_sdp_attr *dir_attr = NULL;
+    unsigned i;
+
+    const pj_str_t inactive = { "inactive", 8 };
+    const pj_str_t sendonly = { "sendonly", 8 };
+    const pj_str_t recvonly = { "recvonly", 8 };
+    const pj_str_t sendrecv = { "sendrecv", 8 };
+
+    /* Find direction attribute in session, don't need to find default 
+     * direction "sendrecv".
+     */
+    for (i = 0; i < sdp->attr_count && !dir_attr; ++i) {
+	if (!pj_strcmp(&sdp->attr[i]->name, &sendonly) ||
+	    !pj_strcmp(&sdp->attr[i]->name, &recvonly) ||
+	    !pj_strcmp(&sdp->attr[i]->name, &inactive)) 
+	{
+	    dir_attr = sdp->attr[i];
+	}
+    }
+
+    /* Found the direction attribute */
+    if (dir_attr) {
+	/* Remove the direction attribute in session */
+	pjmedia_sdp_attr_remove(&sdp->attr_count, sdp->attr, dir_attr);
+
+	/* Apply the direction attribute to all media, but not overriding it
+	 * if media already has direction attribute.
+	 */
+	for (i = 0; i < sdp->media_count; ++i) {
+	    pjmedia_sdp_media *m;
+	    unsigned j;
+
+	    /* Find direction attribute in this media */
+	    m = sdp->media[i];
+	    for (j = 0; j < m->attr_count; ++j) {
+		if (!pj_strcmp(&m->attr[j]->name, &sendrecv) ||
+		    !pj_strcmp(&m->attr[j]->name, &sendonly) ||
+		    !pj_strcmp(&m->attr[j]->name, &recvonly) ||
+		    !pj_strcmp(&m->attr[j]->name, &inactive)) 
+		{
+		    break;
+		}
+	    }
+
+	    /* Not found, apply direction attribute from session */
+	    if (j == m->attr_count)
+		pjmedia_sdp_media_add_attr(m, dir_attr);
+	}
+    }
+}
+
 
 /*
@@ -1178,4 +1236,6 @@
     pj_scan_fini(&scanner);
 
+    apply_media_direction(session);
+
     *p_sdp = session;
     return ctx.last_error;
Index: pjproject/trunk/tests/pjsua/scripts-sendto/140_sdp_with_direction_attr_in_session_1.py
===================================================================
--- pjproject/trunk/tests/pjsua/scripts-sendto/140_sdp_with_direction_attr_in_session_1.py	(revision 3086)
+++ pjproject/trunk/tests/pjsua/scripts-sendto/140_sdp_with_direction_attr_in_session_1.py	(revision 3086)
@@ -0,0 +1,28 @@
+# $Id$
+import inc_sip as sip
+import inc_sdp as sdp
+
+# Offer contains "sendonly" attribute in the session. Answer should
+# respond with appropriate direction in session or media
+sdp = \
+"""
+v=0
+o=- 0 0 IN IP4 127.0.0.1
+s=-
+c=IN IP4 127.0.0.1
+t=0 0
+a=sendonly
+m=audio 5000 RTP/AVP 0
+"""
+
+pjsua_args = "--null-audio --auto-answer 200"
+extra_headers = ""
+include = ["Content-Type: application/sdp",	# response must include SDP
+	       "a=recvonly"
+	   ]
+exclude = []
+
+sendto_cfg = sip.SendtoCfg("SDP direction in session", pjsua_args, sdp, 200,
+			   extra_headers=extra_headers,
+			   resp_inc=include, resp_exc=exclude) 
+
Index: pjproject/trunk/tests/pjsua/scripts-sendto/140_sdp_with_direction_attr_in_session_2.py
===================================================================
--- pjproject/trunk/tests/pjsua/scripts-sendto/140_sdp_with_direction_attr_in_session_2.py	(revision 3086)
+++ pjproject/trunk/tests/pjsua/scripts-sendto/140_sdp_with_direction_attr_in_session_2.py	(revision 3086)
@@ -0,0 +1,30 @@
+# $Id$
+import inc_sip as sip
+import inc_sdp as sdp
+
+# Offer contains "inactive" attribute in the session, however the media
+# also has "sendonly" attribute. Answer should appropriately respond
+# direction attribute in media, instead of the one in session.
+sdp = \
+"""
+v=0
+o=- 0 0 IN IP4 127.0.0.1
+s=-
+c=IN IP4 127.0.0.1
+t=0 0
+a=inactive
+m=audio 5000 RTP/AVP 0
+a=sendonly
+"""
+
+pjsua_args = "--null-audio --auto-answer 200"
+extra_headers = ""
+include = ["Content-Type: application/sdp",	# response must include SDP
+	       "a=recvonly"
+	   ]
+exclude = []
+
+sendto_cfg = sip.SendtoCfg("SDP direction in session", pjsua_args, sdp, 200,
+			   extra_headers=extra_headers,
+			   resp_inc=include, resp_exc=exclude) 
+
