resolves #15, #14, #8, #4