implement VM