diff --git a/samples/vboxwrapper/deprecated/vboxwrapper.cpp b/samples/vboxwrapper/deprecated/vboxwrapper.cpp
new file mode 100644
index 0000000000..ad05423dfc
--- /dev/null
+++ b/samples/vboxwrapper/deprecated/vboxwrapper.cpp
@@ -0,0 +1,173 @@
+// This file is part of BOINC.
+// http://boinc.berkeley.edu
+// Copyright (C) 2010 University of California
+//
+// BOINC is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License
+// as published by the Free Software Foundation,
+// either version 3 of the License, or (at your option) any later version.
+//
+// BOINC is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with BOINC. If not, see .
+
+// vboxwrapper.cpp
+// vboxwrapper program - lets you use VirtualBox VMs with BOINC
+//
+// Handles:
+// - suspend/resume/quit/abort
+// - reporting CPU time
+// - loss of heartbeat from core client
+// - checkpointing
+// (at the level of task; or potentially within task)
+//
+// See http://boinc.berkeley.edu/wrapper.php for details
+// Contributor: Andrew J. Younge (ajy4490@umiacs.umd.edu)
+
+#ifdef _WIN32
+#include "boinc_win.h"
+#include "win_util.h"
+#else
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#endif
+
+#include "boinc_api.h"
+#include "diagnostics.h"
+#include "filesys.h"
+#include "parse.h"
+#include "str_util.h"
+#include "str_replace.h"
+#include "util.h"
+#include "error_numbers.h"
+#include "procinfo.h"
+#include "vm.h"
+#include "vbox.h"
+
+#define JOB_FILENAME "job.xml"
+#define POLL_PERIOD 1.0
+
+int parse_job_file() {
+ MIOFILE mf;
+ char tag[1024], buf[256], buf2[256];
+ bool is_tag;
+
+ boinc_resolve_filename(JOB_FILENAME, buf, 1024);
+ FILE* f = boinc_fopen(buf, "r");
+ if (!f) {
+ fprintf(stderr,
+ "%s can't open job file %s\n",
+ boinc_msg_prefix(buf2, sizeof(buf2)), buf
+ );
+ return ERR_FOPEN;
+ }
+ mf.init_file(f);
+ XML_PARSER xp(&mf);
+
+ if (!xp.parse_start("job_desc")) return ERR_XML_PARSE;
+ while (!xp.get(tag, sizeof(tag), is_tag)) {
+ if (!is_tag) {
+ fprintf(stderr,
+ "%s SCHED_CONFIG::parse(): unexpected text %s\n",
+ boinc_msg_prefix(buf2, sizeof(buf2)), tag
+ );
+ continue;
+ }
+ if (!strcmp(tag, "/job_desc")) {
+ fclose(f);
+ return 0;
+ }
+ if (!strcmp(tag, "vm")) {
+ vm.parse(xp);
+ }
+ }
+ fclose(f);
+ return ERR_XML_PARSE;
+}
+
+int main(int argc, char** argv) {
+ BOINC_OPTIONS boinc_options;
+ BOINC_STATUS boinc_status;
+ char buf[256];
+ int retval;
+
+ memset(&boinc_options, 0, sizeof(boinc_options));
+ boinc_options.main_program = true;
+ boinc_options.check_heartbeat = true;
+ boinc_options.handle_process_control = true;
+ boinc_init_options(&boinc_options);
+
+ fprintf(
+ stderr,
+ "%s vboxwrapper: starting\n",
+ boinc_msg_prefix(buf, sizeof(buf))
+ );
+
+ retval = parse_job_file();
+ if (retval) {
+ fprintf(
+ stderr,
+ "%s can't parse job file: %d\n",
+ boinc_msg_prefix(buf, sizeof(buf)),
+ retval
+ );
+ boinc_finish(retval);
+ }
+
+ retval = vm.run();
+ if (retval) {
+ boinc_finish(retval);
+ }
+
+ while (1) {
+ vm.poll();
+ boinc_get_status(&boinc_status);
+ if (boinc_status.no_heartbeat || boinc_status.quit_request) {
+ vm.stop();
+ boinc_temporary_exit(0);
+ }
+ if (boinc_status.abort_request) {
+ vm.cleanup();
+ boinc_finish(EXIT_ABORTED_BY_CLIENT);
+ }
+ if (!vm.is_running()) {
+ vm.cleanup();
+ boinc_finish(0);
+ }
+ if (boinc_status.suspended) {
+ if (!vm.suspended) {
+ vm.pause();
+ }
+ } else {
+ if (vm.suspended) {
+ vm.resume();
+ }
+ }
+ boinc_sleep(POLL_PERIOD);
+ }
+
+ return 0;
+}
+
+#ifdef _WIN32
+
+int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR Args, int WinMode) {
+ LPSTR command_line;
+ char* argv[100];
+ int argc;
+
+ command_line = GetCommandLine();
+ argc = parse_command_line(command_line, argv);
+ return main(argc, argv);
+}
+
+#endif