deal with a lot of special cases