added forth method. cleaned up. benchmarked