simplify; add matrix protocol