new observer implementation