setup and initial implementation