added a lot of special cases