refacor again