Simple implementation
Resolves #1 #2 #3 #4 #5