this performs terribly, events don't fire reliably