final enough but still a bit buggy