WIP - Need some design work to breakup code, reduce redundancy and most importantly reduce the amount of code that must be downloaded when you don't need it