refactored and cleaned up the code