wtf, begin to refactor again