What 2A87 actually means in plain English
Code 2A87 tells you that your BMW's engine control module has detected a problem with the VANOS intake solenoid valve - specifically, it's stuck or not responding as expected. VANOS is BMW's variable valve timing system, and the intake solenoid is the hydraulic valve that controls oil flow to adjust camshaft timing on the intake side.
When your ECU commands the solenoid to open or close, it energizes a coil that creates a magnetic field. That field pulls a plunger, which opens or closes a small passageway for pressurized engine oil. If this solenoid gets stuck - whether from contamination, a failed coil, or electrical issues - the camshaft timing can't adjust properly. The ECU notices the timing isn't changing the way it should and throws 2A87.
The "stuck" part is key. This isn't always a complete failure. Sometimes the solenoid is electrically fine but mechanically gummed up from varnish or sludge. Sometimes the coil itself has an internal break. Sometimes the wiring harness or connector is corroded. All of these trigger the same code because the symptom is the same - the solenoid won't do its job.
How to diagnose 2A87 step by step
Step 1 - Pull live data before clearing the code. Connect your scanner (a solid one, like the best OBD scanner for BMW choices) and watch VANOS timing in real time. Look at intake camshaft position as the engine idles and revs. If it's completely stuck at one position and not moving, you've got a mechanical or electrical block. If it moves intermittently or sluggishly, you're probably dealing with solenoid stiction or a weak coil.
Step 2 - Check your oil. Pull the dipstick and look at the color and level. Dark, thin, or low oil will starve the VANOS system of pressure and cause the solenoid to fail electrically - the ECU sees no movement because there's no hydraulic force. Top it up if needed and change it if it's overdue. Run the engine and scan again. If VANOS timing suddenly normalizes, oil condition was your culprit.
Step 3 - Inspect the solenoid connector and harness. The intake VANOS solenoid lives on top of the engine, typically mounted to the cylinder head or valve cover. Pop it out of its connector and look for corrosion, green oxidation, or bent pins. Wiggle the connector with the ignition on (engine off) and watch your scanner. If the code changes or clears temporarily, you've found your problem. Clean the connector pins with electrical contact cleaner and a small brush.
Step 4 - Test solenoid resistance if you have a multimeter. Disconnect the solenoid electrically and measure resistance across the coil terminals. A healthy solenoid typically reads 5 - 15 ohms depending on the engine. Zero ohms means a short. Infinite ohms means an open coil. Either way, the solenoid is dead and needs replacing.
Step 5 - Check fuel trim and oxygen sensor data. A stuck intake solenoid throws off the air-fuel ratio because camshaft timing is locked. Look at short-term and long-term fuel trims on your scanner. If they're extremely high (over 15%) or low (under minus 10%), the engine is compensating hard. This confirms the VANOS solenoid is genuinely affecting combustion, not just a wiring ghost.
DIY fix for 2A87
Replacing the intake VANOS solenoid is a 2 out of 5 difficulty job for most BMWs, but access varies by engine bay layout. On my own G20 330i with the B48, you can reach it without removing much - valve cover comes off, solenoid unbolts, connector unplugs, done in 45 minutes. On an N54 or N55 with turbos and a tighter bay, you might spend two hours.
Before you buy a solenoid, try the connector cleaning step first. I've seen 2A87 disappear after a ten-minute electrical contact spray session. If that doesn't work, order a OEM solenoid (roughly 60 - 120 dollars depending on engine) and a new sealing ring (five dollars, don't skip it).
Remove the valve cover if needed for access. Unbolt the solenoid from the head. Unplug the electrical connector by pressing the tab. Slide the solenoid out, noting the small o-ring in the bore - it might stay in the engine or come out with the solenoid. Clean the bore with a soft brush and fresh oil. Install the new solenoid with a fresh o-ring coated lightly in engine oil. Bolt it down snug but not gorilla-tight. Reconnect the plug. Reinstall the valve cover if you removed it. Clear the code with your scanner and test drive.
If you're uncomfortable doing this yourself, it's a one-hour shop job. Don't let a shop sell you a "VANOS flush" or intake cleaning as a first step - that's usually upsell noise. The solenoid is mechanical and electrical; flushing oil won't fix a stuck plunger or a broken coil.
When 2A87 comes back after repair
If you replaced the solenoid and 2A87 returns within 500 miles, think about root cause. Did you check oil pressure? A bad oil pressure sensor or clogged filter will starve any new solenoid. Did the dealer or shop actually verify the old solenoid was bad, or did they just swap it? Sometimes the problem is a wiring short downstream, a bad ECU pin, or a failing camshaft position sensor that's throwing false readings.
If it comes back intermittently after weeks or months, suspect a harness rub or connector that's working loose again. Intermittent codes almost always point to electrical contact issues, not components.
My take on 2A87
I see 2A87 show up most on higher-mileage N52s and N54s - cars that are eight years old or older and have never had a serious oil service. It's a moderate severity code in my book. You can drive home safely, but don't ignore it for a month. A stuck VANOS solenoid will wear your valve train over time because timing control is gone, and it'll tank your fuel economy.
Start with oil and connector inspection before ordering parts. Ninety percent of the time, one of those two solves it for free or near-free. If you need the solenoid replaced, it's a weekend job for someone comfortable with hand tools. This is one of the few VANOS codes where DIY makes sense.
For more on VANOS faults and how to read fault codes in general, check out the BMW fault codes explained guide. If you want to dive into live data and testing yourself, I recommend BimmerCode and OBDLink setup. And if you want to search other codes or circle back to this one, head to the fault code tool.