add subprograms & fix bugs