* HUGE refactoring!