Index: /pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h
===================================================================
--- /pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h	(revision 4928)
+++ /pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h	(revision 4929)
@@ -613,5 +613,5 @@
      * Bitmask of #pjsua_call_flag constants.
      *
-     * Default: 0
+     * Default: PJSUA_CALL_INCLUDE_DISABLED_MEDIA
      */
     unsigned	     flag;
@@ -620,4 +620,6 @@
      * This flag controls what methods to request keyframe are allowed on
      * the call. Value is bitmask of #pjsua_vid_req_keyframe_method.
+     *
+     * Default: PJSUA_VID_REQ_KEYFRAME_SIP_INFO
      */
     unsigned	     req_keyframe_method;
@@ -4086,7 +4088,8 @@
     /**
      * When the call is being put on hold, specify this flag to unhold it.
-     * This flag is only valid for #pjsua_call_reinvite(). Note: for
-     * compatibility reason, this flag must have value of 1 because
-     * previously the unhold option is specified as boolean value.
+     * This flag is only valid for #pjsua_call_reinvite() and
+     * #pjsua_call_update(). Note: for compatibility reason, this flag must
+     * have value of 1 because previously the unhold option is specified as
+     * boolean value.
      */
     PJSUA_CALL_UNHOLD = 1,
@@ -4106,5 +4109,9 @@
      * Include SDP "m=" line with port set to zero for each disabled media
      * (i.e when aud_cnt or vid_cnt is set to zero). This flag is only valid
-     * for #pjsua_call_make_call().
+     * for #pjsua_call_make_call(), #pjsua_call_reinvite(), and
+     * #pjsua_call_update(). Note that even this flag is applicable in
+     * #pjsua_call_reinvite() and #pjsua_call_update(), it will only take
+     * effect when the re-INVITE/UPDATE operation regenerates SDP offer,
+     * such as changing audio or video count in the call setting.
      */
     PJSUA_CALL_INCLUDE_DISABLED_MEDIA = 4,
@@ -4591,5 +4598,5 @@
 
 /**
- * Send re-INVITE to release hold.
+ * Send re-INVITE request or release hold.
  * The final status of the request itself will be reported on the
  * \a on_call_media_state() callback, which inform the application that
@@ -4611,5 +4618,5 @@
 
 /**
- * Send re-INVITE to release hold.
+ * Send re-INVITE request or release hold.
  * The final status of the request itself will be reported on the
  * \a on_call_media_state() callback, which inform the application that
@@ -4618,5 +4625,9 @@
  * @param call_id	Call identification.
  * @param opt		Optional call setting, if NULL, the current call
- *			setting will remain unchanged.
+ *			setting will be used. Note that to release hold
+ *			or update contact or omit SDP offer, this parameter
+ *			cannot be NULL and it must specify appropriate flags,
+ *			e.g: PJSUA_CALL_UNHOLD, PJSUA_CALL_UPDATE_CONTACT,
+ *			PJSUA_CALL_NO_SDP_OFFER.
  * @param msg_data	Optional message components to be sent with
  *			the request.
@@ -4649,5 +4660,9 @@
  * @param call_id	Call identification.
  * @param opt		Optional call setting, if NULL, the current call
- *			setting will remain unchanged.
+ *			setting will be used. Note that to release hold
+ *			or update contact or omit SDP offer, this parameter
+ *			cannot be NULL and it must specify appropriate flags,
+ *			e.g: PJSUA_CALL_UNHOLD, PJSUA_CALL_UPDATE_CONTACT,
+ *			PJSUA_CALL_NO_SDP_OFFER.
  * @param msg_data	Optional message components to be sent with
  *			the request.
Index: /pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c
===================================================================
--- /pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c	(revision 4928)
+++ /pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c	(revision 4929)
@@ -557,4 +557,16 @@
 
 /*
+ * Cleanup call setting flag to avoid one time flags, such as
+ * PJSUA_CALL_UNHOLD, PJSUA_CALL_UPDATE_CONTACT, or
+ * PJSUA_CALL_NO_SDP_OFFER, to be sticky (ticket #1793).
+ */
+static void cleanup_call_setting_flag(pjsua_call_setting *opt)
+{
+    opt->flag &= ~(PJSUA_CALL_UNHOLD | PJSUA_CALL_UPDATE_CONTACT |
+		   PJSUA_CALL_NO_SDP_OFFER);
+}
+
+
+/*
  * Initialize call settings based on account ID.
  */
@@ -580,6 +592,8 @@
     pj_assert(call);
 
-    if (!opt)
+    if (!opt) {
+	cleanup_call_setting_flag(&call->opt);
 	return PJ_SUCCESS;
+    }
 
 #if !PJMEDIA_HAS_VIDEO
@@ -1146,4 +1160,5 @@
 	/* Copy call setting from the replaced call */
 	call->opt = replaced_call->opt;
+	cleanup_call_setting_flag(&call->opt);
 
 	/* Notify application */
@@ -2411,5 +2426,5 @@
 	call->opt.flag = options;
 
-    status = pjsua_call_reinvite2(call_id, NULL, msg_data);
+    status = pjsua_call_reinvite2(call_id, &call->opt, msg_data);
 
 on_return:
@@ -2525,5 +2540,5 @@
 	call->opt.flag = options;
 
-    status = pjsua_call_update2(call_id, NULL, msg_data);
+    status = pjsua_call_update2(call_id, &call->opt, msg_data);
 
 on_return:
@@ -3952,5 +3967,8 @@
     if (pjsua_var.ua_cfg.cb.on_call_rx_offer) {
 	pjsip_status_code code = PJSIP_SC_OK;
-	pjsua_call_setting opt = call->opt;
+	pjsua_call_setting opt;
+
+	cleanup_call_setting_flag(&call->opt);
+	opt = call->opt;
 
 	(*pjsua_var.ua_cfg.cb.on_call_rx_offer)(call->index, offer, NULL,
@@ -4374,4 +4392,5 @@
     }
 
+    cleanup_call_setting_flag(&existing_call->opt);
     call_opt = existing_call->opt;
     if (pjsua_var.ua_cfg.cb.on_call_transfer_request2) {
@@ -4677,5 +4696,4 @@
         {
             /* Call unhold failed */
-            call->opt.flag &= ~PJSUA_CALL_UNHOLD;
             call->local_hold = PJ_TRUE;
 	    PJ_LOG(3,(THIS_FILE, "Error releasing hold on call %d (reason=%d)",
