Observer implementation, take 2

@simpsus, take a look. I think this looks pretty good.