prevented leaking listener and double callbacks