Major changes. Using metaprogramming to generate almost all variations.