Needs some spaghetti code to handle 'special' cases