Implement #47, #45, #44, #41