RFC 7614
Explicit Subscriptions for the REFER Method
RFC 7614: Explicit Subscriptions for the REFER Method π
Okay bestie, this one is RFC 7614, called Explicit Subscriptions for the REFER Method β¨. It was written by R. Sparks at Oracle and published in August 2015 as an Internet Standards Track document. Its ISSN is 2070-1721. It updates RFC 3515 (you'll see that in Section 7), and the title block doesn't list anything it obsoletes. Now let's get into it π
Abstract β¨
Okay so the SIP REFER request, defined in RFC 3515, quietly starts a SIP-Specific Event Notification framework subscription π. Mixing up "starting the subscription" with "handling the REFER" makes it impossible to negotiate SUBSCRIBE extensions, and it makes avoiding SIP dialog sharing way harder π. This doc adds extensions to REFER that get rid of that implicit subscription and, if you want one, swap in an explicit one π¦.
Status of This Memo πΈ
This is an Internet Standards Track document π.
It's a product of the Internet Engineering Task Force (IETF), so it reflects the consensus of the IETF community. It got public review and was approved for publication by the Internet Engineering Steering Group (IESG) π«Ά. If you want more on Internet Standards, check Section 2 of RFC 5741.
For the current status, any errata, and how to send feedback, go to http://www.rfc-editor.org/info/rfc7614 π.
Copyright Notice π
Copyright (c) 2015 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) as they stand on the date this document was published. Please read these carefully, because they spell out your rights and restrictions for this document. Code Components pulled out of this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions, and they come with no warranty, as the Simplified BSD License describes π₯.
Table of Contents π§
1. Introduction ....................................................3
2. Conventions .....................................................3
3. Overview ........................................................4
3.1. Explicit Subscriptions .....................................4
3.2. No Subscriptions ...........................................5
4. The Explicit Subscription Extension .............................5
4.1. Sending a REFER ............................................5
4.2. Processing a REFER Response ................................5
4.3. Processing a Received REFER ................................6
4.4. Subscribing to the 'refer' Event ...........................7
4.5. Processing a Received SUBSCRIBE ............................7
4.6. Sending a NOTIFY ...........................................7
4.7. Managing 'refer' Event State ...............................8
4.8. The Refer-Events-At Header Field ...........................8
5. The No Subscription Extension ...................................9
5.1. Sending a REFER ............................................9
5.2. Processing a REFER Response ................................9
5.3. Processing a Received REFER ................................9
6. The 'explicitsub' and 'nosub' Option Tags ......................10
7. Updates to RFC 3515 ............................................10
8. Security Considerations ........................................10
9. IANA Considerations ............................................12
9.1. Register the 'explicitsub' Option Tag .....................12
9.2. Register the 'nosub' Option Tag ...........................12
9.3. Register the Refer-Events-At Header Field .................12
10. References ....................................................13
10.1. Normative References .....................................13
10.2. Informative References ...................................13
Author's Address ..................................................14
1. Introduction π¦
Okay so REFER, as defined in [RFC3515], quietly triggers an implicit SIP-Specific Event Framework subscription β¨. If you send a REFER inside a dialog that an INVITE created, the dialog gets reused, and that brings along the problems described in [RFC5057] π. The SIP-Specific Event Notification framework definition in [RFC6665] doesn't allow that kind of dialog reuse π
ββοΈ. So call transfer, as defined in [RFC5589], has to send its REFER on a new dialog, then link it to the existing dialog using the Target-Dialog mechanism from [RFC4538] π
.
Here's the tea: there's no explicit SUBSCRIBE request, so you can't use the usual tools to negotiate subscription details for REFER subscriptions π. That includes negotiating how long the subscription lasts and passing info through Event header field parameters. Using the SIP Supported and Require extension mechanisms from [RFC3261] gets messy too, since the implicit subscription makes it unclear whether an extension applies to handling the REFER itself, to the messages in the subscription the REFER creates, or to both π€. Every extension has to be carefully specified to clear that up, and existing extensions don't do that clearly.
This doc defines two mechanisms that get rid of the implicit subscription, and one of them swaps in an explicit one π. The perks are:
- Using REFER inside INVITE-created dialogs without creating dialog reuse β¨
- Standard subscription parameter negotiation π
- Standard negotiation of SIP extensions π
There are limits on when you can use the extension that allows an explicit subscription, and they come straight from how non-INVITE transaction handling works in SIP π§. Section 4.1 covers those limits.
2. Conventions π
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119] π«Ά.
3. Overview πΈ
This section is a non-normative overview of the behaviors that the later sections define, so it's basically a sneak peek π.
3.1. Explicit Subscriptions π¦
A SIP User Agent (UA) that wants to send a REFER which won't create an implicit subscription, but which will allow an explicit one, includes a new option tag, explicitsub, in the Require header field of the REFER request π. That REFER can go inside an existing dialog or as an out-of-dialog request.
If the recipient accepts the REFER, it starts managing the 'refer' event state described in RFC 3515, and it gives back a URI that reaches an event server, which handles subscriptions to that state π. (A lot of the time, the REFER's recipient is the event server itself π.) That URI comes back in a new header field in the REFER response, called Refer-Events-At β¨.
The UA that sent the REFER can now subscribe to the 'refer' event at the URI it was given, using a SUBSCRIBE request with a new dialog identifier π. It can use the full range of negotiation mechanisms in that request. As RFCs 6665 and 3515 describe, the event server that accepts the subscription sends an immediate NOTIFY with the current refer event state, more NOTIFY messages as the refer state changes, and a terminal NOTIFY when the referred action is finished π . It's totally possible that the initial NOTIFY is also the terminal NOTIFY π.
The referred action might finish before the SUBSCRIBE gets to the event server π³. So the server has to hold onto the final refer event state for some amount of time, so it can include that in the terminal NOTIFY that goes out to those subscriptions. It's also possible that a SUBSCRIBE never shows up at all π₯².
This extension lets the event server that handles subscriptions be separate from the UA that accepted the REFER π§. That UA could use something like PUBLISH [RFC3903] to send the refer event state to the event server β¨. The extension also lets more than one subscription to the refer event state exist at a time π.
3.2. No Subscriptions π
A UA that wants to send a REFER which won't create an implicit subscription, and which wants to tell the recipient that it isn't interested in an explicit subscription, includes a new option tag, nosub, in the Require header field of the REFER request π«Ά. That REFER can go inside an existing dialog or as an out-of-dialog request.
If the recipient accepts the REFER, it knows not to create an implicit subscription, and it knows no explicit subscription is coming π. The recipient keeps processing the request named in the Refer-To header field, as RFC 3515 specifies, but it can skip the work of getting ready to handle any 'refer' event subscriptions tied to this REFER π.
4. The Explicit Subscription Extension π
4.1. Sending a REFER π
To stop any implicit subscription from being created while still allowing an explicit one, a UA that forms a REFER includes the option tag explicitsub in the Require header field of the request π¦. Otherwise, the REFER gets formed following the requirements of [RFC3515] β¨. Since this REFER has no chance of creating an implicit subscription, the UA MAY send the REFER request within an existing dialog or out-of-dialog πΈ.
Heads up: if the REFER forks (see [RFC3261]), only one final response goes back to the issuing UA π. So if it matters that the UA can subscribe to any refer state created by accepting this request, the UA has to form the request so it gets accepted in only one place π€. You can do that by sending the REFER inside an existing dialog, or by using the Target-Dialog mechanism from [RFC4538] π
. If the request could be accepted in more than one location, and things would go wrong if the UA didn't find out about every location where it was accepted, then this extension isn't the right move π«.
4.2. Processing a REFER Response π
The UA processes responses to the REFER request the way [RFC3515] specifies (and, by extension, [RFC3261]) π§. The big one: if the REFER went to an element that doesn't support this extension, or that won't use it, the response has a 420 (Bad Extension) response code (see Section 8.1.3.5 of [RFC3261]) π¬. As that document says, the UA can retry the request without using this extension π.
If the UA gets a 2xx-class response, it contains a Refer-Events-At header field (Section 4.8) with a single URI as its value β¨. If the UA cares about the state of the referenced action, it subscribes to the 'refer' event at that URI π.
4.3. Processing a Received REFER π
okay so when an element gets a REFER that requires 'explicitsub', it uses the SAME admissions policies it would use without the extension π§, with one lowkey twist: it's totally fine to admit an in-dialog REFER requiring this extension, because it literally can't create another usage inside that dialog π . For the details, check out Section 5.2 of [RFC3515].
accepting a REFER that requires 'explicitsub' does NOT create a dialog or a new usage inside an existing dialog β¨. The element MUST NOT create an implicit subscription when accepting the REFER request π .
if the REFER came in within an existing dialog, the accepting element isn't acting as a SIP-Events notifier in that dialog π¦. If it's not otherwise going to become a notifier in that dialog, then none of the requirements in [RFC6665] apply to the message accepting the REFER request. That includes the one about providing a Globally Routable User Agent URI (GRUU) as the local contact, so no GRUU stress here π«Ά.
an element that accepts a REFER request with 'explicitsub' in its Require header field MUST return a 200 response containing a sip: or sips: URI in the Refer-Events-At header field. This URI can be used to subscribe to the refer event state tied to this REFER request πΈ. The URI MUST uniquely identify this refer event state. It also needs to reach the event server when the element that sent the REFER uses it in a SUBSCRIBE request. One good way to make sure the URI has that property is to use a GRUU [RFC5627] for the event server π. As discussed in Section 8, having this URI is often the only thing needed to authorize a subscription to it π. Implementations SHOULD provide a URI constructed in a way that is hard to guess π. Again, using a GRUU (specifically, a temporary GRUU) is one good way to get that property β¨.
the accepting element will otherwise carry on with the processing defined in [RFC3515] π.
the event server identified by the Refer-Events-At URI could receive SUBSCRIBE requests at any point after the response carrying the Refer-Events-At header field is sent π. Implementations should take care to make sure the event server is ready for those SUBSCRIBE requests before sending the REFER response. But, just like all non-INVITE responses, the response should be sent as soon as possible (see [RFC4321]) πββοΈ. It's also possible that the referred action completes before any SUBSCRIBE request shows up π. So the event server needs to hang on to the final refer event state for a period of time after the action completes, so it can serve those subscriptions (see Section 4.7) π§ .
4.4. Subscribing to the 'refer' Event π
a UA that has a URI obtained from a Refer-Events-At header field MAY subscribe to the refer event state at that URI π. It does this by following the requirements of [RFC6665], putting the token 'refer' in the Event header field and the URI in the Request-URI of the SUBSCRIBE request. The SUBSCRIBE request MUST NOT reuse any existing dialog identifiers π .
after that, handling of the subscription MUST follow the requirements of [RFC6665] and [RFC3515]. In particular, as discussed in Section 2.4.6 of [RFC3515], the NOTIFY messages in the subscription might include an id parameter in their Event header fields π. Subsequent SUBSCRIBE requests used to refresh or terminate this subscription MUST contain this id parameter. The rationale for the id parameter in that section doesn't really apply when this extension is used π. The URI returned in the Refer-Events-At header field already uniquely identifies the right state, so the id parameter is kinda redundant. BUT this behavioral requirement is kept anyway, to reduce the number of changes existing implementations need in order to support this extension, and to make it more likely that existing diagnostic tools keep working with little or no modification π οΈβ¨.
4.5. Processing a Received SUBSCRIBE π₯
an event server that receives a SUBSCRIBE request processes it according to the requirements of [RFC6665] π . The event server MAY choose to authorize the SUBSCRIBE request based on the Request-URI matching existing refer event state. It MAY also require further authorization, as discussed in Section 8 π.
when accepting a subscription, the event server sets the initial subscription duration using the guidance in Section 3.4 of [RFC3515] β°.
4.6. Sending a NOTIFY π¨
NOTIFY messages within a subscription are formed and sent following the requirements in [RFC3515]. See, in particular, Section 2.4.5 of that document π.
4.7. Managing 'refer' Event State π§
as [RFC3515] describes, an element creates the state for event 'refer' when it accepts a REFER request π±. It updates that state as the referred request moves along, until it reaches a state where the request has completed and the final state is known π.
okay this part is a big deal π. In RFC 3515 implementations, it was a reasonable design choice to destroy the refer event state right after sending the NOTIFY that terminated the implicit subscription. That is NOT the case with this extension π ββοΈ. The referenced request can finish super fast, maybe even before the REFER response has traveled across the network to the UA that sent the request, and before that agent sends the SUBSCRIBE request for the event state to the URI in the response. So the event server MUST retain the final refer event state for a reasonable period of time, which SHOULD be at least 2*64*T1 (that is, 64 seconds). That's an upper-bound estimate of how long it would take to complete two non-INVITE transactions: the REFER and an immediate SUBSCRIBE π°οΈπ.
if an otherwise acceptable SUBSCRIBE shows up during this retention period, the subscription gets accepted and immediately terminated. The terminating NOTIFY carries the final event state, with a Subscription-State of terminated and a reason value of "noresource" π« .
4.8. The Refer-Events-At Header Field π
the Refer-Events-At header field is an extension-header as defined by [RFC3261] β¨. Its ABNF [RFC5234] looks like this:
Refer-Events-At = "Refer-Events-At" HCOLON
LAQUOT ( SIP-URI / SIPS-URI ) RAQUOT
*( SEMI generic-param )
see [RFC3261] for what the elements used in that production mean π.
note that this rule does NOT allow a full addr-spec as defined in RFC 3261, and it insists on the angle brackets. So this is well formed π:
Refer-Events-At: <sips:vPT3izGmo8NTxaPADRZvEAY22BKx@example.com;gr>
but this is invalid π:
Refer-Events-At: sip:wsXa9mkHtPcGu8@example.com
the Refer-Events-At header field only means something in a 2xx-class response to a REFER request π―. If it shows up in any other SIP message, its meaning is undefined, and it MUST be ignored π.
5. The No Subscription Extension π«
5.1. Sending a REFER π€
to suppress the creation of any implicit subscription and signal that no explicit subscription is coming, a UA forming a REFER request includes the option tag 'nosub' in the Require header field of the request π€«. Otherwise the REFER request is formed following the requirements of [RFC3515]. Since this REFER has no chance of creating an implicit subscription, the UA MAY send the REFER request within an existing dialog or out-of-dialog π¦.
5.2. Processing a REFER Response π¬
the UA processes responses to the REFER request as specified in [RFC3515] (and, as a result, [RFC3261]) π . If the REFER was sent to an element that doesn't support this extension, or is unwilling to use it, the response contains a 420 (Bad Extension) response code (see Section 8.1.3.5 of [RFC3261]) π¬. As that document says, the UA can retry the request without using this extension π.
5.3. Processing a Received REFER ποΈ
an element receiving a REFER request requiring the 'nosub' extension uses the same admissions policies it would use without the extension, with one addition: it's acceptable to admit an in-dialog REFER requiring this extension, since it can't create another usage inside that dialog π . See Section 5.2 of [RFC3515] for the specifics.
accepting a REFER that requires 'nosub' doesn't create a dialog or a new usage inside an existing dialog π·. The element MUST NOT create an implicit subscription when accepting the REFER request π . Plus, the element accepting the REFER is NOT required to keep any state for serving refer event subscriptions π.
if the REFER is received within an existing dialog, the accepting element isn't acting as a SIP-Events notifier in that dialog π¦. If it's not otherwise going to become a notifier in that dialog, then none of the requirements in [RFC6665] apply, particularly the one about providing a GRUU as the local contact, to the message accepting the REFER request π«Ά.
the accepting element otherwise carries on with the processing defined in [RFC3515] β¨.
6. The 'explicitsub' and 'nosub' Option Tags π·οΈ
this document defines the 'explicitsub' option tag, which signals the use of the extension in Section 4, and the 'nosub' option tag, which signals the use of the extension in Section 5 π.
using either option tag in a Require header field is only defined when it shows up in a REFER request or in a response to a REFER request π―. A UA MUST NOT include the 'explicitsub' or 'nosub' option tag in the Require header field of any request other than REFER π . A UA MUST NOT include the 'explicitsub' or 'nosub' option tag in the Require header field of any SIP response other than a 200 or 421 response to a REFER request π«.
the 'explicitsub' and 'nosub' option tags MAY appear in the Supported header field of SIP messages, and in the sip.extensions feature tag defined in [RFC3840] π. This only signals that the UA including the value is aware of the extensions π§ . A UA can only invoke one of the extensions in a request, ngl that's a key detail π. A UA MUST NOT include either option tag in the Require header field of a 200 response to a REFER request if that tag wasn't in the Require header field of the request π ββοΈ.
a User Agent Server (UAS) processing a REFER request that lists 'explicitsub' or 'nosub' in its Supported header field, and that wants to use one of those extensions, returns a 421 response indicating which extension is required π.
7. Updates to RFC 3515 π
the requirement in Section 2.4.4 of [RFC3515] to reject out-of-dialog SUBSCRIBE requests to event 'refer' is removed π₯³. An element MAY accept a SUBSCRIBE request to event 'refer', following the requirements and guidance in this document. REFER is no longer the only mechanism that can create a subscription to event 'refer' π.
8. Security Considerations πβ¨
Okay bestie, this part is SERIOUS but we're still gonna slay it π . The security considerations of [RFC3515] all still apply to a REFER request using this extension. The security stuff there for the implicit subscription applies to any explicit subscription for the 'refer' event. Same rules, no cap π«Ά.
This update to RFC 3515 adds a brand new authorization consideration π₯. An element that gets an initial SUBSCRIBE request to the 'refer' event has to decide whether the subscriber is allowed to see the refer event state. In RFC 3515, that decision was tangled up with accepting the REFER request, and the only possible subscriber was the element that sent the REFER. With this update, there may be multiple subscribers to any given refer event state π. Main character energy for the subscriber list, literally.
This document lets an element accept an initial SUBSCRIBE request based on having a Request-URI that identifies existing refer event state β¨. (That kind of URI will have been sent earlier in the Refer-Events-At header field of a successful REFER response.) The element that pulls that URI out of the response, plus any elements that element shares the URI with, are authorized to SUBSCRIBE to the event state π¦. So the URI should be built so it's not easy to guess, and it should be protected from eavesdroppers when it's sent π. [RFC3261] details mechanisms for providing that protection, like sending SIP messages over Transport Layer Security (TLS) or Datagram TLS (DTLS) π. For considerations when using other security mechanisms, check the Security Considerations section of [RFC3261]. An event server that receives a REFER request over an unprotected transport can redirect the requester to use a protected transport before it accepts the request πΈ. A good way to make sure subscriptions use a protected transport is to only construct sips: URIs π. The event server can also require any of the additional authorization mechanisms allowed for any SIP request. For example, the event server could require a valid assertion of the subscriber's identity using [RFC4474] πͺͺ.
β οΈ The URI provided in a Refer-Events-At header field will be used as the Request-URI of SUBSCRIBE requests. A malicious agent could take advantage of being able to choose this URI in ways similar to the ways an agent sending a REFER request can take advantage of the Refer-To URI, as described in the Security Considerations section of [RFC3515]. In particular, the malicious agent could cause a SIP SUBSCRIBE to be sent as raw traffic toward a victim. If the victim isn't SIP aware and the SUBSCRIBE is sent over UDP, there is (at most) a factor of 11 amplification due to retransmissions of the request π. The potential for abuse here is lower than with the Refer-To URI, since the URI can only have asip:orsips:scheme and is only provided in a REFER response. A malicious agent would have to first receive a REFER request to take advantage of providing a Refer-Events-At URI π.
9. IANA Considerations ππ
9.1. Register the 'explicitsub' Option Tag
The option tag 'explicitsub' has been registered in the 'Option Tags' subregistry of the 'Session Initiation Protocol (SIP) Parameters' registry by adding a row with these values π¦:
Name: explicitsub
Description: This option tag identifies an extension to REFER to
suppress the implicit subscription and provide a URI for an explicit
subscription.
Reference: RFC 7614 (this document)
9.2. Register the 'nosub' Option Tag
The option tag 'nosub' has been registered in the 'Option Tags' subregistry of the 'Session Initiation Protocol (SIP) Parameters' registry by adding a row with these values πΈ:
Name: nosub
Description: This option tag identifies an extension to REFER to
suppress the implicit subscription and indicate that no explicit
subscription is forthcoming.
Reference: RFC 7614 (this document)
9.3. Register the Refer-Events-At Header Field
The header field described in Section 4.8 has been registered in the 'Header Fields' subregistry of the 'Session Initiation Protocol (SIP) Parameters' registry by adding a row with these values π§:
Header Name: Refer-Events-At
compact: none
Reference: RFC 7614 (this document)
10. References ππ
10.1. Normative References
These are the must-read ones, bestie π€. (Lowercase, so no drama.)
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997,
<http://www.rfc-editor.org/info/rfc2119>.
[RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston,
A., Peterson, J., Sparks, R., Handley, M., and E.
Schooler, "SIP: Session Initiation Protocol", RFC 3261,
DOI 10.17487/RFC3261, June 2002,
<http://www.rfc-editor.org/info/rfc3261>.
[RFC3515] Sparks, R., "The Session Initiation Protocol (SIP) Refer
Method", RFC 3515, DOI 10.17487/RFC3515, April 2003,
<http://www.rfc-editor.org/info/rfc3515>.
[RFC3840] Rosenberg, J., Schulzrinne, H., and P. Kyzivat,
"Indicating User Agent Capabilities in the Session
Initiation Protocol (SIP)", RFC 3840,
DOI 10.17487/RFC3840, August 2004,
<http://www.rfc-editor.org/info/rfc3840>.
[RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
Specifications: ABNF", STD 68, RFC 5234,
DOI 10.17487/RFC5234, January 2008,
<http://www.rfc-editor.org/info/rfc5234>.
[RFC6665] Roach, A., "SIP-Specific Event Notification", RFC 6665,
DOI 10.17487/RFC6665, July 2012,
<http://www.rfc-editor.org/info/rfc6665>.
10.2. Informative References
These are the extra-credit reads π§ π.
[RFC3903] Niemi, A., Ed., "Session Initiation Protocol (SIP)
Extension for Event State Publication", RFC 3903,
DOI 10.17487/RFC3903, October 2004,
<http://www.rfc-editor.org/info/rfc3903>.
[RFC4321] Sparks, R., "Problems Identified Associated with the
Session Initiation Protocol's (SIP) Non-INVITE
Transaction", RFC 4321, DOI 10.17487/RFC4321, January
2006, <http://www.rfc-editor.org/info/rfc4321>.
[RFC4474] Peterson, J. and C. Jennings, "Enhancements for
Authenticated Identity Management in the Session
Initiation Protocol (SIP)", RFC 4474,
DOI 10.17487/RFC4474, August 2006,
<http://www.rfc-editor.org/info/rfc4474>.
[RFC4538] Rosenberg, J., "Request Authorization through Dialog
Identification in the Session Initiation Protocol (SIP)",
RFC 4538, DOI 10.17487/RFC4538, June 2006,
<http://www.rfc-editor.org/info/rfc4538>.
[RFC5057] Sparks, R., "Multiple Dialog Usages in the Session
Initiation Protocol", RFC 5057, DOI 10.17487/RFC5057,
November 2007, <http://www.rfc-editor.org/info/rfc5057>.
[RFC5589] Sparks, R., Johnston, A., Ed., and D. Petrie, "Session
Initiation Protocol (SIP) Call Control - Transfer",
BCP 149, RFC 5589, DOI 10.17487/RFC5589, June 2009,
<http://www.rfc-editor.org/info/rfc5589>.
[RFC5627] Rosenberg, J., "Obtaining and Using Globally Routable User
Agent URIs (GRUUs) in the Session Initiation Protocol
(SIP)", RFC 5627, DOI 10.17487/RFC5627, October 2009,
<http://www.rfc-editor.org/info/rfc5627>.
Author's Address π
Robert Sparks
Oracle
7460 Warren Parkway, Suite 300
Frisco, Texas 75034
United States
Email: rjsparks@nostrum.com
And that's the whole thing, bestie! ππ You made it through every single section πβ¨
π¦ where this page comes from
- ietf: rfc7614 2015-08
- π girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms