total refactor and begin redesign