This resolves #2, #3, #4 and #5