rewrote everything as private, promise returning methods