Visible light communication receiver
You've got the right basic idea, but I'd change a few things.  Yes, you want to high pass filter the received signal, but I don't like capacitively coupling the detector directly.

The first stage should be about handling the raw detector optimally, and providing a low impedance voltage signal out.  A little gain will be useful here, but that's not the main point of the first stage.

There are basically two ways to run a photodiode, in leakage mode and in solar cell mode.  

In leakage mode, the diode is reverse biased, and the leakage current is proportional to light.  This leakage current is quite small, usually just a few &micro;A.  The current will be largely independent of the reverse voltage, so any convenient "a few volts" pf reverse bias will usually do.  In photocell mode, you keep the diode shorted and measure the current it produces.  Either way, the first stage ends up being a transimpedance amp (current in, voltage out).

After that you want to AC couple (high pass filter) and gain up the signal in probably two stages.  High pass filtering between stages will lose the 50 Hz noise, and will prevent input offset voltage from getting gained up along with the desired signal.

You want 20 kbits/s, so frequency content up to around 100 kHz.  Keep the gain-bandwidth of the opamps in mind and don't try to get too much gain in any one stage.  For example, with 10 MHz gain-bandwidth (easy to find), leaving let's say 5x for the feedback to work properly, that means a maximum of 20x if you consider your highest frequency of interest to be 100 kHz.  Two 20x gain stages gives you overall 400x, which is probably enough after some gain from the first stage too.

Your encoding scheme will also be critical in making this work well.  You want to use encoding that guarantees all content is above some minimum frequency.  This allows you to aggressively high pass filter to eliminate lower frequencies, particularly the 50 Hz light flicker and at least its first few harmonics.  You could use something like manchester code, or 1/3 2/3 duty cycle, etc.  With three poles of high pass filtering set to maybe 5 kHz rolloff, 500 Hz (up to 10th harmonic of light flicker) will be attenuated by 1000.  That will still pass a 20-40 kHz pulses nicely.

After that, you apply normal techniques of data slicing to turn the analog pulses signal into a digital pulse train, then decode digitally from there.