Major rewrite of EM class.