diff --git a/UPGRADE.txt b/UPGRADE.txt
index d25bf55d824d7f5363691736c785ba5f2922138b..4dab291215c9f341de2c97fc3130f60e576935b6 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -198,6 +198,13 @@ chan_sip:
    hash to be specified for the DTLS fingerprint placed in SDP. Supported
    values are 'sha-1' and 'sha-256' with 'sha-256' being the default.
 
+ - The 'progressinband=never' option is now more zealous in the persecution of
+   progress messages coming from Asterisk. Channels bridged with a SIP channel
+   that has 'progressinband=never' set will not be able to forward their
+   progress indications through to the SIP device. chan_sip will now turn such
+   progress indications into a 180 Ringing (if a 180 has not yet been
+   transmitted) if 'progressinband=never'.
+
 CLI commands:
  - "core show settings" now lists the current console verbosity in addition
    to the root console verbosity.
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 086913b41e1d493d3906b26fb7282ed950041567..f76963b3974302045ecd0a687b2e68a67944f3fa 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -7428,8 +7428,11 @@ static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
 						ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
 					}
 				}
-				p->lastrtptx = time(NULL);
-				res = ast_rtp_instance_write(p->rtp, frame);
+				if (p->invitestate > INV_EARLY_MEDIA || (p->invitestate == INV_EARLY_MEDIA &&
+									 ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT))) {
+					p->lastrtptx = time(NULL);
+					res = ast_rtp_instance_write(p->rtp, frame);
+				}
 			}
 			sip_pvt_unlock(p);
 		}
@@ -7446,8 +7449,11 @@ static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
 					transmit_provisional_response(p, "183 Session Progress", &p->initreq, TRUE);
 					ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
 				}
-				p->lastrtptx = time(NULL);
-				res = ast_rtp_instance_write(p->vrtp, frame);
+				if (p->invitestate > INV_EARLY_MEDIA || (p->invitestate == INV_EARLY_MEDIA &&
+									 ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT))) {
+					p->lastrtptx = time(NULL);
+					res = ast_rtp_instance_write(p->vrtp, frame);
+				}
 			}
 			sip_pvt_unlock(p);
 		}
@@ -7467,8 +7473,11 @@ static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
 						transmit_provisional_response(p, "183 Session Progress", &p->initreq, TRUE);
 						ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
 					}
-					p->lastrtptx = time(NULL);
-					res = ast_rtp_instance_write(p->trtp, frame);
+					if (p->invitestate > INV_EARLY_MEDIA || (p->invitestate == INV_EARLY_MEDIA &&
+										 ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT))) {
+						p->lastrtptx = time(NULL);
+						res = ast_rtp_instance_write(p->trtp, frame);
+					}
 				}
 			}
 			sip_pvt_unlock(p);
@@ -7896,8 +7905,14 @@ static int sip_indicate(struct ast_channel *ast, int condition, const void *data
 		    !ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT) &&
 		    !ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
 			p->invitestate = INV_EARLY_MEDIA;
-			transmit_provisional_response(p, "183 Session Progress", &p->initreq, TRUE);
-			ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
+			/* SIP_PROG_INBAND_NEVER means sending 180 ringing in place of a 183 */
+			if (ast_test_flag(&p->flags[0], SIP_PROG_INBAND) != SIP_PROG_INBAND_NEVER) {
+				transmit_provisional_response(p, "183 Session Progress", &p->initreq, TRUE);
+				ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
+			} else if (ast_channel_state(ast) == AST_STATE_RING && !ast_test_flag(&p->flags[0], SIP_RINGING)) {
+				transmit_provisional_response(p, "180 Ringing", &p->initreq, 0);
+				ast_set_flag(&p->flags[0], SIP_RINGING);
+			}
 			break;
 		}
 		res = -1;
@@ -23002,6 +23017,8 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
 			if (!req->ignore && p->owner) {
 				/* Queue a progress frame only if we have SDP in 180 or 182 */
 				ast_queue_control(p->owner, AST_CONTROL_PROGRESS);
+				/* We have not sent progress, but we have been sent progress so enable early media */
+				ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
 			}
 			ast_rtp_instance_activate(p->rtp);
 		}
@@ -23085,6 +23102,8 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
 			if (!req->ignore && p->owner) {
 				/* Queue a progress frame */
 				ast_queue_control(p->owner, AST_CONTROL_PROGRESS);
+				/* We have not sent progress, but we have been sent progress so enable early media */
+				ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
 			}
 			ast_rtp_instance_activate(p->rtp);
 		} else {