Resolves #30, Resolves #22, Resolves #27