Partial Lease Termination Remeasurement Mechanics (ASC 842 / IFRS 16)
Account for a partial lease termination in Python: reduce the ROU asset proportionately to the decrease in the right of use, remeasure the liability at a revised rate, and book the gain or loss.
Problem Statement Link to this section
A tenant hands back three of eight leased floors, or shortens the term of an equipment lease by two years. Scope has decreased, so this is not an ordinary modification that merely adjusts the right-of-use asset — it is a partial termination that must recognize a gain or loss. This page answers one precise question: how do you reduce the ROU asset in proportion to the right of use given up, remeasure the liability at a revised rate, and book the difference to profit or loss without mangling the retained balances? The wrong instinct is to net the whole change into the asset (which buries the gain or loss) or to re-measure the retained asset from scratch (which abandons its historical carrying basis). The correct mechanics are a two-stage sequence: proportional derecognition to profit or loss, then re-discounting of the retained payments.
Standard Anchor Link to this section
The governing provisions treat a decrease in scope differently from every other remeasurement:
- IFRS 16.46(a) — for a modification that decreases the scope of the lease, the lessee decreases the carrying amount of the right-of-use asset to reflect the partial or full termination, and recognizes in profit or loss any gain or loss relating to that partial or full termination. The revised liability is measured by discounting the revised payments at a revised rate (IFRS 16.45).
- ASC 842-10-25-13 — for a modification that decreases scope, the lessee decreases the carrying amount of the right-of-use asset on a basis proportionate to the full or partial termination of the existing lease, and recognizes any difference between the reduction in the lease liability and the proportionate reduction in the right-of-use asset as a gain or loss.
IFRS 16 supports two acceptable approaches to measuring the ROU reduction, applied as an accounting policy choice. Under the right-of-use basis, the proportion is the decrease in the right of use itself — returned floor area or the reduction in remaining term. Under the liability basis, the proportion is the percentage by which the lease liability falls. The two produce different gains or losses; this page implements the right-of-use basis, which is the literal reading of IFRS 16.46(a). Whichever basis is chosen, applying it consistently and reassessing classification are what keep the result auditable — the wider branch logic sits in the parent lease modification and remeasurement accounting topic.
Formula / Algorithm Specification Link to this section
Let
Stage one derecognizes that proportion of both the right-of-use asset and the lease liability, and the difference is the gain or loss:
A positive result is a gain — more liability was released than asset written off. Stage two re-discounts the retained payments
where
Annotated Python Snippet Link to this section
The function derecognizes the proportional slice, books the gain or loss, remeasures the retained liability at the revised rate, and adjusts the retained asset. The terminal assertion proves the recognized gain or loss ties out to the net balance-sheet movement — the reconciliation an auditor re-derives.
from decimal import Decimal, ROUND_HALF_UP, getcontext
getcontext().prec = 28 # audit-grade; no float drift
CENT = Decimal("0.01")
def q(x: Decimal) -> Decimal:
return x.quantize(CENT, rounding=ROUND_HALF_UP)
def partial_termination(rou: Decimal, liability: Decimal, decrease_fraction: Decimal,
retained_payments: tuple[Decimal, ...], revised_rate: Decimal) -> dict:
"""Decrease in scope (IFRS 16.46(a) / ASC 842-10-25-13): derecognise the δ
proportion of both balances to P&L, then re-discount the retained payments."""
rou_der = q(decrease_fraction * rou) # δ · ROU written off
liab_der = q(decrease_fraction * liability) # δ · L released
gain_loss = q(liab_der - rou_der) # >0 = gain, to P&L
new_liab = q(sum( # L'' on retained payments
(p / (Decimal(1) + revised_rate) ** k
for k, p in enumerate(retained_payments, start=1)),
Decimal("0"),
))
rou_retained = rou - rou_der
liab_retained = liability - liab_der
new_rou = q(rou_retained + (new_liab - liab_retained)) # residual adjusts retained ROU
return {"rou": new_rou, "liability": new_liab, "pl_gain_loss": gain_loss}
# Hand back 40% of the space at month 24; 36 payments remain at 60% of the old rent
rou0, liab0 = Decimal("198450.00"), Decimal("205300.00")
retained = tuple(Decimal("5400.00") for _ in range(36)) # 0.60 × 9,000
r_month = (Decimal("1.06")) ** (Decimal(1) / Decimal(12)) - Decimal(1)
out = partial_termination(rou0, liab0, Decimal("0.40"), retained, r_month)
# Terminal invariant — the gain/loss equals the net balance-sheet movement
assert out["pl_gain_loss"] == q((out["rou"] - rou0) - (out["liability"] - liab0))
print("gain/loss to P&L:", out["pl_gain_loss"])
print("retained ROU:", out["rou"], "| retained liability:", out["liability"])
If a refactor books the whole change to the asset, pl_gain_loss no longer reconciles to the net movement and the assert fires. Keeping the check inside the function runs it on every partial termination in CI, not just in a notebook.
Correct vs. Incorrect: Proportionate ROU Reduction vs the Remaining-Right Approach Link to this section
The correct method reduces the retained asset from its historical carrying amount by the proportion given up. A common error remeasures the retained asset as if it were freshly recognized — the "remaining-right" approach — which discards the historical basis and misstates the gain or loss.
| Aspect | Proportionate ROU reduction (correct) | Remaining-right remeasurement (incorrect) |
|---|---|---|
| Standard basis | IFRS 16.46(a) / ASC 842-10-25-13 | Not supported for a partial termination |
| Retained ROU basis | (1−δ) of the historical carrying amount | Re-derived from the present value of remaining payments |
| Gain or loss | δL − δ·ROU, recognized explicitly | Buried in a re-struck asset value |
| Historical cost | Preserved for the retained portion | Lost — asset effectively re-recognized |
| Effect on later depreciation | Continues on the proportionate carrying amount | Distorted by the re-measured base |
The remaining-right approach looks tempting because the liability is remeasured to the present value of remaining payments — but the asset is not a mirror of the liability. It carries a historical basis that must be scaled down proportionately, not rebuilt. Conflating the two is the defining partial-termination defect.
Gotcha / Failure Mode: Booking a Scope Decrease to the ROU Asset Link to this section
The most damaging error treats a partial termination like an ordinary modification — netting the entire change into the right-of-use asset and recognizing no gain or loss.
Before (WRONG — no derecognition, gain or loss buried in the asset):
new_rou = q(rou + (new_liab - liability)) # ordinary modification path
gain_loss = Decimal("0.00") # a scope decrease should not be zero
After (correct — derecognise the proportion first, then re-discount the remainder):
rou_der = q(decrease_fraction * rou)
liab_der = q(decrease_fraction * liability)
gain_loss = q(liab_der - rou_der) # recognised in P&L (IFRS 16.46(a))
new_rou = q((rou - rou_der) + (new_liab - (liability - liab_der)))
Debug checklist when a partial termination looks wrong:
- Confirm the event branch. A decrease in scope must take the derecognition path, not the ROU-adjust path used for other modifications.
- Confirm δ. The proportion must be measured on a consistent basis (area or term) and held at full precision, not rounded before multiplying.
- Confirm the retained payments. Only the retained, revised payments enter
— the given-up portion is gone. - Confirm the reconciliation. The recognized gain or loss must equal the net movement in the asset less the movement in the liability.
Frequently Asked Questions Link to this section
How do I recognize the gain or loss on a partial lease termination?
Derecognize the proportion δ of both the right-of-use asset and the lease liability that corresponds to the right of use given up. The gain or loss is the released liability slice minus the written-off asset slice, δL − δ·ROU, recognized in profit or loss under IFRS 16.46(a) and ASC 842-10-25-13. A positive figure is a gain, meaning more liability was released than asset written off. Only after that do you re-discount the retained payments at the revised rate and adjust the retained asset for any residual difference.
What proportion do I use to reduce the ROU asset?
Under the right-of-use basis, the proportion is the decrease in the right of use itself — the returned floor area or the reduction in remaining term. IFRS 16 also permits a liability basis, where the proportion is the percentage by which the lease liability falls; the two produce different gains or losses and the choice is an accounting policy applied consistently. ASC 842 requires a basis proportionate to the termination and books the difference between the liability and asset reductions as the gain or loss.
Which discount rate applies to a partial termination?
A revised rate determined at the effective date, used to remeasure the retained liability as the present value of the retained payments. A decrease in scope is a modification, and modifications use a revised rate, not the original commencement rate. Only reassessments driven by an index or rate change keep the original locked rate, which is a different event.
Related Link to this section
- Sibling: Accounting for a lease modification in Python — the non-scope-decrease case, where the whole change adjusts the ROU asset with no gain or loss.
- Parent: Lease modification and remeasurement accounting — the decision tree that routes each change to a rate and an offset target.
- Section: ASC 842 & IFRS 16 core architecture and ROU models — the measurement architecture behind the retained right-of-use asset and liability.