basically done with observer