I took the headlight switch out of my stock US spec 328xi and modified it to add rear fog lights. The button hardware, the lighting circuit and the button are all in the switch assembly, there are just little plastic tabs that are preventing the button from moving. After modifying the button you just need to code 5 new values to tell the car what to do with the new button and everything will work perfectly.
The first step is to pull the left vent out of the car, basically you just grab it and pull it out.
Next remove the headlight panel, there are little clips that you have to pinch while pulling the panel out at the same time, there are no clips on the bottom, the panel will tip out from the top. The clips are circled in red.
Once you have the switch out pull the wires out of the back, there is no button or catch, just pull them out. Then you need to remove the back of the switch, there are 6 clips that you need to release while simultaneously pulling the back off. The clips are circled in red below.
After you have removed the back you have to pop the button out of the switch assembly. Do this by pinching the four clips circled in red below and pushing the button out of the front.
Now that you have the button out you need to cut the retaining tabs off and smooth everything out. The tabs are circled in the pictures below. I used a box cutter to cut most of the tab off, then used a small flathead screwdriver to smooth everything out. It doesn't look pretty, but it works, and no one will ever see it, so it doesn't matter.
Tabs cut off and everything smoothed out.
After you're all done modifying the button, push it back in the front of the switch, clip the back of the headlight assembly back on, plug the wires back in, put the panel back into the car, then put the vent back in.
Now you have to code the button to work, refer to
this thread to learn how to code or find someone in your area to help you. The values you need to code are:
FEM_BODY / 3060 LCEMaster 1C / NSL_Verbaut = Verbaut
REM / 3063 LCELampMapping 2 / Mapping_Nebelschlussl_L_output = nsl_l
REM / 3063 LCELampMapping 2 / Mapping_Nebelschlussl_L_Function = nebelschlusslicht
REM / 3063 LCELampMapping 2 / Mapping_Nebelschlussl_R_output = nsl_l
REM / 3063 LCELampMapping 2 / Mapping_Nebelschlussl_R_Function = nebelschlusslicht
And that's it, you're done. Let me know if you need any help.
Disclaimer: I am not in any way shape or form responsible anything bad that happens to your car, do this at your own risk.