
Deleting a DTC means modifying the ECU firmware so a fault code is permanently disabled: not just cleared. On this 2005 BMW E46 318d (EDC16 ECU), I removed P0401 (EGR flow) and BMW code 4298 (Lambda) using KESS V2, MTX DTC Remover, and LSuite for checksum correction.
The full step-by-step video, guide to find software are inside the Carhacker Membership.
Affiliate Disclosure: iamcarhacker.com is an Amazon and other affiliate programs Associate. As an Amazon Associate, I earn from qualifying purchases. Full Affiliate disclosure. // some of tested products I got sent for free but it never affects any scoring parameter. Full sponsor policy.
This content is for members only.
This is not the same as clearing a code with a scanner. It survives drive cycles, battery disconnects, everything. It also has real risks — covered at the end.
The car and the situation
A 2005 BMW E46 318d, M47TU2 engine, Bosch EDC16C31/C35 ECU. Drives fine, but two stored faults the owner wanted gone:
- P0401 — Insufficient EGR flow
- BMW 4298 — Lambda sensor
Background:
- EGR was physically blocked off years ago (common preventative mod on M47TU2)
- Lambda on a diesel is mostly used for EGR feedback — with EGR blocked, it throws nuisance codes
- Neither fault affected drivability
- Owner didn’t want to invest in a new lambda + EGR refurb on an old car
- He asked: “Can you just make the light go off?”
This is the most common DTC delete request — old car, expensive “proper” repair, no real impact on driving, persistent CEL.
What “DTC delete” actually does

Three ways to deal with a fault code:
- Clear with a scanner — wipes the current entry. If the fault is still active, the code returns within a drive cycle.
- Permanent codes (mode $0A) — emission-related codes that resist scanner clearing. They only clear after the ECU verifies the system across multiple drive cycles.
- DTC delete (firmware mod) — what this article covers. You modify the ECU binary so the diagnostic check itself is disabled. The ECU stops looking for the fault entirely. The code never comes back.
#3 is structural. #1 and #2 are temporary.
What I used
Hardware:
KESS V2 clone (Aliexpress: https://s.click.aliexpress.com/e/_c3NwnWaz) — works for hobbyist EDC16 work. Genuine Alientech equipment is the proper choice for paid work.
Victron Energy Blue Smart IP22 12V 30A charger (Amazon: https://amzn.to/4en41LU — battery support during flashing. Stable voltage under load is non-negotiable.
Software:
MTX ECU DTC Remover (Aliexpress: https://s.click.aliexpress.com/e/_c3oCUzYP) — disables specific codes in the BIN file
LSuite 1.0 (Aliexpress: https://s.click.aliexpress.com/e/_c4aIFIbZ — verifies and recalculates EDC16 checksums
KSuite 2.25 — paired with the KESS V2 clone for read/write
INPA — for diagnostic verification before/after
The process (universal framework)

Same 8 steps apply to almost any modern ECU. Tools change, framework doesn’t.
1. Identify the ECU exactly
Not just “Bosch” — the specific part number. EDC16 vs EDC17 vs MED17 are different families with different memory layouts and checksum algorithms. On BMW you read this from INPA’s BMWTNR field.
2. Read the original ECU and back it up twice
Save it on the working machine and on a USB stick or cloud. This is your only restore point if anything goes wrong. Example of naming convention you can use:
E46_318d_VINlast7_ORIGINAL_2026-05-01.bin
E46_318d_VINlast7_DTC-DELETED_2026-05-01.bin
E46_318d_VINlast7_FINAL-FLASHED_2026-05-01.bin
3. Identify the codes to disable
Both the OBD code (P0401) and the manufacturer-specific code (BMW 4501). ECUs store fault codes in multiple internal tables — primary, mirror, freeze frame. The manufacturer code helps the removal tool find all instances.
Only disable codes you understand. If you don’t know what condition triggers it, don’t disable it.
4. Modify the BIN file
DTC removal tools (MTX, DTCFix, online services) locate the byte sequence that triggers the code and disable it. Two options:
- Disable — sets a flag, suppresses the code (less invasive, recommended for EDC16)
- Remove — overwrites the diagnostic logic entirely (can break diagnostic tools on some ECUs)
Save under a new filename. Original BIN stays untouched.
5. Recalculate the checksum

This is the step amateur tutorials skip. ECU binaries contain checksums — mathematical hashes stored at known locations. When the ECU boots, it verifies them. Mismatch = limp mode, EEPROM error, or refused file.
Bosch EDC16 specifically uses multi-level checksums (program checksum + map checksum). Modify any byte → recalculate.
Tools that handle EDC16 correctly:
- WinOLS (commercial, gold standard)
- LSuite / ChecksumFix (freeware, available in tuning forums)
- PCMtuner / KESS / KTAG at flash time — but clone flashers often do this incorrectly, so always pre-correct with a dedicated tool.
I used LSuite 1.0. Took 30 seconds.
6. Verify before flashing
Two paranoid sanity checks:
File size: Modified file must be byte-for-byte identical in size to the original. Different size = something’s wrong. Don’t flash.
Hex compare in HxD: Original vs final BIN should differ only at:
- The DTC offset
- The checksum bytes
If you see differences scattered across hundreds of locations, something is corrupted. Don’t flash.
7. Flash back to ECU
Highest-risk step. Pre-flash checklist:
- Battery / charger providing stable 13.5–14V under load (this is what the Victron is for)
- All accessories off — radio, climate, lights, fans
- Doors closed, no one in the car
- Laptop on AC power, High Performance mode
- USB direct to laptop, no hub
EDC16 over OBD takes 5–15 minutes. Once it starts, you do not interrupt it. If the bar appears stuck for 2–3 minutes, wait 10 before assuming failure.
8. Verify after flash
- Cycle ignition off for 30 seconds
- Ignition on, motor off — engine warning light should illuminate during bulb-check. If it doesn’t, the ECU is bricked.
- Start the engine. Should fire normally.
- MIL extinguishes within 5 seconds of running.
- Connect a scanner — verify no active codes.
- 15–20 minute test drive.
- Re-scan after the drive.
What happened on this BMW

MTX reported “2 found, 1 disabled” for P0401. The code existed in two firmware locations (primary table + a mirror/backup). The tool only disabled the primary. After researching: for BMW EDC16, disabling the primary is sufficient — the mirror is referenced only if the primary fails its integrity check, which it won’t, because we modified it cleanly. This nuance is missing from most tutorials.
MTX saved files with .dtcoff extension, not .bin. Fix is just to rename – content is identical. But I verified it was a valid EDC16 binary in LSuite first (which doesn’t care about extensions).
Win7 and Win11 reported different file sizes. Original BIN showed as 1,014,784 bytes on the Win7 garage laptop and 1,048,576 bytes (1.00 MB) on the Win11 work laptop. Windows display quirk — Win11 was showing “size on disk” (allocated cluster size), Win7 showing actual data size. LSuite reads the actual content (1,014,784 bytes — correct EDC16 partial dump). Freaked me out for ten minutes.
Flash via KESS V2 clone over OBD took ~5 minutes. Battery held stable 13.6V on the Victron throughout. No issues during write.
Post-flash: ignition on showed MIL bulb-check correctly. Engine started normally. MIL extinguished within 3 seconds. No active codes in INPA. Cylinder smooth running values within ±1 mg/Hub across all four cylinders — adaptive logic undisturbed by the flash.
Common pitfalls

In rough order of how often I see them:
- Skipping the checksum step — ECU rejects the file or goes into limp mode. Always run a checksum tool.
- Cheap charger or tired battery — voltage drops mid-flash, write corrupts, ECU bricks. The Victron IP22 (or CTEK MXS, or a regulated lab supply) holds stable output under load. Not where you save money.
- Flashing without a backup — if it fails and you have no original, recovery requires removing the ECU and BDM access. Hours of work, possibly more.
- KESS V2 clone with broken checksum logic — some clone firmwares “correct” checksums during write but do it wrong. Pre-correct with a dedicated tool.
- Wrong ECU profile — write incompatible firmware = brick. Always verify the BMWTNR matches before writing.
- Interrupting the flash — Windows update, USB disconnect, someone bumping the laptop. Disable everything that could interrupt.
⚠️ Before you do this — read this section
Should you actually do it?
For most people: probably not. Better options for “make the check engine light go off”:
- Fix the underlying problem — often the right answer
- Use a basic scanner to clear the code when it returns — no risk, no firmware modification
- Pay a professional tuning shop for a proper DTC delete with their equipment, on the record, with a warranty
If you want to learn ECU programming, get a cheap practice ECU from eBay (used DDE units are inexpensive), set up a bench harness, and practice on something you can afford to brick. Don’t learn on your daily driver.
The risks
Bricking the ECU. Failed flash → ECU dead. Recovery requires removing the ECU, BDM-level access (KTAG or similar), often several hours of work. Worst case: replacement ECU plus immobilizer reprogramming.
Diagnostic blindness. Once a DTC is disabled, the ECU stops monitoring that condition. If the real problem worsens, you have no warning. You’re trading visibility for silence.
Legal exposure. In the EU, UK, and most of the US, modifying emission-related diagnostic systems on a road-going vehicle is technically a tampering offense. P0401 is emission-related. Enforcement varies — Slovak STK rarely deep-scans diesel emission readiness flags, UK MOT does check basic OBD readiness, US enforcement varies by state. “Rarely caught” is not the same as “legal.”
And do not delete codes on a car you’re about to sell
Hidden modifications are a buyer’s worst nightmare and a seller’s legal liability for years. If you sell a car with deleted DTCs without disclosing it, you’ve committed fraud — the buyer believes they’re getting a functional emission system, which they aren’t.
This is the line I personally won’t cross, and I’d encourage you not to either.
Most popular OBD2 guides
Hi, I am Juraj Lukacko. I got frustrated by unhelpful and scammy mechanics, so I decided to learn everything about car diagnostics myself. I test dozens of new car diagnostic tools every month along with learning new strategies to fix and customize cars.
