Rework design.
Add some missing features.