Implement almost all required functionality