implement custom signals, refactor update system