version 2.0 rewrite
merge