First draft.
Second draft. NOT WORKING. WILL BE REBASED.