added much beautiful code, 5 should be done