refacor everything