works for everything except particular special cases