uses system_message instead of register_error