protocols and implementations