Index: pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h
===================================================================
--- pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h	(revision 4919)
+++ pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h	(revision 4920)
@@ -871,5 +871,7 @@
     /**
      * Notify application when call has received new offer from remote
-     * (i.e. re-INVITE/UPDATE with SDP is received). Application can
+     * (i.e. re-INVITE/UPDATE with SDP is received, or from the
+     * INVITE response in the case that the initial outgoing INVITE
+     * has no SDP). Application can
      * decide to accept/reject the offer by setting the code (default
      * is 200). If the offer is accepted, application can update the 
@@ -4106,5 +4108,13 @@
      * for #pjsua_call_make_call().
      */
-    PJSUA_CALL_INCLUDE_DISABLED_MEDIA = 4
+    PJSUA_CALL_INCLUDE_DISABLED_MEDIA = 4,
+    
+    /**
+     * Do not send SDP when sending INVITE or UPDATE. This flag is only valid
+     * for #pjsua_call_make_call(), #pjsua_call_reinvite()/reinvite2(), or
+     * #pjsua_call_update()/update2(). For re-invite/update, specifying
+     * PJSUA_CALL_UNHOLD will take precedence over this flag.
+     */
+    PJSUA_CALL_NO_SDP_OFFER = 8
 
 } pjsua_call_flag;
Index: pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c
===================================================================
--- pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c	(revision 4919)
+++ pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c	(revision 4920)
@@ -364,5 +364,5 @@
                              const pjsua_med_tp_state_info *info)
 {
-    pjmedia_sdp_session *offer;
+    pjmedia_sdp_session *offer = NULL;
     pjsip_inv_session *inv = NULL;
     pjsua_call *call = &pjsua_var.calls[call_id];
@@ -412,9 +412,11 @@
 
     /* Create offer */
-    status = pjsua_media_channel_create_sdp(call->index, dlg->pool, NULL,
-					    &offer, NULL);
-    if (status != PJ_SUCCESS) {
-	pjsua_perror(THIS_FILE, "Error initializing media channel", status);
-	goto on_error;
+    if ((call->opt.flag & PJSUA_CALL_NO_SDP_OFFER) == 0) {
+        status = pjsua_media_channel_create_sdp(call->index, dlg->pool, NULL,
+                                                &offer, NULL);
+        if (status != PJ_SUCCESS) {
+            pjsua_perror(THIS_FILE, "Error initializing media channel", status);
+            goto on_error;
+        }
     }
 
@@ -582,6 +584,11 @@
     call->opt = *opt;
 
-    /* If call is established, reinit media channel */
-    if (call->inv && call->inv->state == PJSIP_INV_STATE_CONFIRMED) {
+    /* If call is established or media channel hasn't been initialized,
+     * reinit media channel.
+     */
+    if ((call->inv && call->inv->state == PJSIP_INV_STATE_CONNECTING &&
+         call->med_cnt == 0) ||
+        (call->inv && call->inv->state == PJSIP_INV_STATE_CONFIRMED))
+    {
 	pjsip_role_e role = rem_sdp? PJSIP_ROLE_UAS : PJSIP_ROLE_UAC;
 	pj_status_t status;
@@ -619,5 +626,4 @@
     pj_str_t contact;
     pj_status_t status;
-
 
     /* Check that account is valid */
@@ -680,5 +686,5 @@
 	goto on_error;
     }
-
+    
     /* Create temporary pool */
     tmp_pool = pjsua_pool_create("tmpcall10", 512, 256);
@@ -766,9 +772,11 @@
     pjsip_dlg_inc_session(dlg, &pjsua_var.mod);
 
-    /* Init media channel */
-    status = pjsua_media_channel_init(call->index, PJSIP_ROLE_UAC,
-				      call->secure_level, dlg->pool,
-				      NULL, NULL, PJ_TRUE,
-                                      &on_make_call_med_tp_complete);
+    if ((call->opt.flag & PJSUA_CALL_NO_SDP_OFFER) == 0) {
+        /* Init media channel */
+        status = pjsua_media_channel_init(call->index, PJSIP_ROLE_UAC,
+                                          call->secure_level, dlg->pool,
+                                          NULL, NULL, PJ_TRUE,
+                                          &on_make_call_med_tp_complete);
+    }
     if (status == PJ_SUCCESS) {
         status = on_make_call_med_tp_complete(call->index, NULL);
@@ -2384,5 +2392,5 @@
 					 const pjsua_msg_data *msg_data)
 {
-    pjmedia_sdp_session *sdp;
+    pjmedia_sdp_session *sdp = NULL;
     pj_str_t *new_contact = NULL;
     pjsip_tx_data *tdata;
@@ -2423,5 +2431,5 @@
     if (call->local_hold && (call->opt.flag & PJSUA_CALL_UNHOLD)==0) {
 	status = create_sdp_of_call_hold(call, &sdp);
-    } else {
+    } else if ((call->opt.flag & PJSUA_CALL_NO_SDP_OFFER) == 0) {
 	status = pjsua_media_channel_create_sdp(call->index,
 						call->inv->pool_prov,
@@ -2498,5 +2506,5 @@
 				       const pjsua_msg_data *msg_data)
 {
-    pjmedia_sdp_session *sdp;
+    pjmedia_sdp_session *sdp = NULL;
     pj_str_t *new_contact = NULL;
     pjsip_tx_data *tdata;
@@ -2530,5 +2538,5 @@
     if (call->local_hold && (call->opt.flag & PJSUA_CALL_UNHOLD)==0) {
 	status = create_sdp_of_call_hold(call, &sdp);
-    } else {
+    } else if ((call->opt.flag & PJSUA_CALL_NO_SDP_OFFER) == 0) {
 	status = pjsua_media_channel_create_sdp(call->index,
 						call->inv->pool_prov,
