Firmware DTC Remover

Upload your ECU firmware file and see every DTC hardcoded inside. Remove fault codes directly in your browser — no software needed. Supports BMW/MINI EDC16 · EDC17 · MEVD17 and VAG Group EDC17. Free: 3 removals/day.

Upload your ECU firmware file, detect DTC fault codes hardcoded inside, remove selected codes, and download clean firmware. Supports BMW/MINI (EDC16/EDC17/MEVD17) and VAG Group (EDC17 Diesel). Free: 3 removals per day.

Upload Your Firmware

Free tier: 3 removals remaining today

Limits reset daily at midnight UTC.

Step 1: Select ECU Parameters

Step 2: Upload Firmware File

📁

Drop your firmware file here

or click to browse (max 15 MB)

Supported: .bin, .ori, .fls, .hex, .ecu

Frequently Asked Questions

What ECUs are supported?

BMW/MINI Diesel ECUs:

  • EDC16 E-series: EDC16C, EDC16C31, EDC16C35, EDC16CP35
  • EDC17 E-series: EDC17C06, EDC17CP02, EDC17CP09, EDC17C41, EDC17CP45
  • EDC17 F-series: EDC17CP09, EDC17CP45, EDC17CP49, EDC17C50, EDC17C56, EDC17C76

BMW/MINI Petrol ECUs:

  • MEVD17 F-series: MEVD17.2.3, MEVD17.2.5, MEVD17.2.8, MEVD17.2.H, MEVD17.2/2.4/2.6/2.9/2.G
  • MEVD17 E-series: MEV17.2.2, MEVD17.2.2, MEVD1726, MEVD172
  • MED17 E-series: MED17.2, MEV17.4.6, MEVD17.4.6

VAG Diesel ECUs (Volkswagen Group):

  • EDC17: EDC17C46, EDC17C54, EDC17CP20, EDC17CP14, EDC17CP44, EDC17CP24, EDC17CP04, EDC17CP54, EDC17C74, EDC17CP74, EDC17C64, EDC17U01

Includes Volkswagen, Audi, Porsche, Skoda, Seat, Lamborghini. VAG petrol ECUs and other manufacturers (Mercedes, Renault) coming soon.

Is this really free?

Yes. Up to 3 DTC removals per day at no cost, no registration required. Limits reset daily at midnight UTC.

Is it safe to upload my firmware?

Yes. Files are encrypted during upload, processed server-side, and automatically deleted after 24 hours. We never store or share your firmware files.

What file formats are supported?

We support .bin, .ori, .fls files (most common ECU firmware formats). Maximum file size is 15 MB.

What code format should I use for removal?

You can use either HEX format (as stored in firmware) or OBD format (as shown in diagnostic scanners). Our tool accepts both:

  • HEX format: 0420, 0115, 1234 (4-digit hex, as in ECU memory)
  • OBD format: P0420, P0115, P1234 (5-digit with prefix)

Example: to remove catalytic converter code, enter either 0420 or P0420 — both work. Learn more about code conversion →

How are codes stored in firmware? Why do some codes not appear in results?

ECU firmware stores codes in rows of 4 codes (multiplier = 4). Each row represents one error with 4 related code variants:

Example 1: BMW/MINI + OBD codes

Row in firmware:
BMW/MINI: 4500 4501 4502 4503  (4 variants of same error)
OBD: 0000 0401 0000 0000  (OBD equivalent)

What you see in results:
BMW/MINI Code: 4500 | OBD Code: P0401

Our tool shows first non-empty code from each row. In this case: BMW/MINI=4500 (first), OBD=0401 (second, because first is 0000).

Example 2: Multiple OBD codes

Row in firmware:
BMW/MINI: 4BC0 4BC1 4BC2 4BC3
OBD: 0102 0103 0101 0000

What you see in results:
BMW/MINI Code: 4BC0 | OBD Code: P0102

Even though OBD row has 0102, 0103, 0101 - we show only first one (0102 → P0102). Other codes (4BC1, 4BC2, 0103, 0101) exist but are hidden.

What happens during code removal?

  • You can remove ANY code from the row:
    Enter 4BC1 (BMW/MINI) or 0101 (OBD) - even though they're not shown in results table, they exist in firmware!
  • When you remove a code:
    • With "Erase code values" UNCHECKED → Only Class table is zeroed (error severity/category)
    • With "Erase code values" CHECKEDENTIRE ROW is erased in all tables:
      Before:
      BMW/MINI: 4BC0 4BC1 4BC2 4BC3 → After: 0000 0000 0000 0000
      OBD: 0102 0103 0101 0000 → After: FFFF FFFF FFFF FFFF
      Class: 3C                → After: 00
  • Class table (error category/severity):
    Each row has ONE class value shared by all 4 codes. When you remove any code from row, class is always zeroed.

💡 Important:

  • Firmware has 4 codes per row, but we show only first non-empty one
  • You can remove ANY code (visible or hidden) by entering its value
  • Removing one code affects the ENTIRE row in all tables
  • This is normal ECU firmware structure - not a bug!

What are Class, Mask and Behavior tables?

In Bosch EDC16/EDC17/MEVD17 firmware, each DTC is not just a stored code — it's linked to several parallel service tables that control how the ECU detects the fault and what it does in response. Understanding these tables explains why simply zeroing a code value is sometimes not enough.

Class table (1 byte per DTC row) — Error Path pointer

The Class byte is an index (pointer) to an Error Path — a Bosch internal parameter set that defines the full behaviour profile for this fault: whether it stores to memory, whether it lights the MIL (Check Engine), healing/debounce counters, and more.

Class = 0x3C → points to Error Path 60 (active fault, MIL on)
Class = 0x00 → no valid Error Path → fault is ignored by ECU

This is why zeroing the Class byte is the primary and safest way to disable a DTC — without it the ECU cannot look up the fault's behaviour, so the code is never stored and the Check Engine light never comes on. Our tool always zeros the Class table on every removal.

Mask table (2 bytes per DTC row) — DFC OFF Mask (detection conditions)

The Mask is a bitfield that enables or disables the diagnostic monitor (DFC — Diagnostic Function Check) for each DTC. Each bit corresponds to a specific operating condition under which the ECU is allowed to run the check.

Mask bits control:
- Whether the diagnostic monitor runs at all
- Engine warm-up / coolant temp threshold
- RPM and load operating window
- Cold start exclusion
- Number of confirmed drive cycles required

Zeroing the Mask table disables the diagnostic monitor entirely — the ECU never runs the check, so the fault can never be detected in the first place. This is zeroed when "Erase code values" is checked.

Behavior table (2 bytes per DTC row) — DFC Behavior Mask (ECU reactions)

The Behavior table defines what the ECU does when a fault becomes active. It is a bitmask where each bit enables a specific response or emergency strategy.

Behavior bits control:
- MIL (Check Engine Light) activation
- Limp mode / torque reduction (derate)
- AdBlue dosing inhibit
- DPF regeneration inhibit
- Fuel cut or boost limit activation

Not all ECU files have a separate Behavior table — when detected, the optional "Erase behavior table" checkbox appears. Zeroing it prevents limp mode and other emergency reactions even if the fault condition is still present on the sensor level.

💡 In practice — what gets zeroed and when:

  • Class — always zeroed. Removes the Error Path pointer → no MIL, no fault storage.
  • Mask — zeroed when "Erase code values" is checked. Disables the diagnostic monitor entirely.
  • Code values (Primary/Secondary tables) — zeroed (BMW: 0000, OBD: FFFF) when "Erase code values" is checked.
  • Behavior — zeroed with the optional checkbox (shown only when behavior tables are present). Disables limp mode, AdBlue inhibit, DPF regen block.

Why don't I see some duplicate codes in results?

Our tool automatically removes duplicate codes to keep results clean. A code is considered a duplicate when both BMW/MINI code AND OBD code are identical.

Before deduplication (raw firmware data):

1B21 + P165A  ← Unique (different OBD codes)
1B21 + P1660  ← Unique (different OBD codes)
1B21 + N/A    ← Unique (no OBD mapping)
1B2B + N/A    ← Unique (first occurrence)
1B2B + N/A    ← DUPLICATE!
1B2B + N/A    ← DUPLICATE!

After deduplication (what you see):

1B21 + P165A  ✅ Shown
1B21 + P1660  ✅ Shown
1B21 + N/A    ✅ Shown
1B2B + N/A    ✅ Shown (first occurrence kept)

💡 Why this happens:

  • ECU firmware may store the same error multiple times in different table rows
  • This is normal firmware structure, not a bug
  • We keep only the first occurrence to avoid confusion
  • When you remove a code, ALL occurrences in firmware are removed