Merge branch 'develop' into VCL-1093
diff --git a/doap_vcl.rdf b/doap_vcl.rdf
index fee5973..427cafa 100644
--- a/doap_vcl.rdf
+++ b/doap_vcl.rdf
@@ -33,7 +33,7 @@
     <mailing-list rdf:resource="http://vcl.apache.org/comm/index.html#mail-list" />
     <download-page rdf:resource="http://vcl.apache.org/downloads/download.cgi" />
     <programming-language>BASH</programming-language>
-    <programming-language>Javascript</programming-language>
+    <programming-language>JavaScript</programming-language>
     <programming-language>Perl</programming-language>
     <programming-language>PHP</programming-language>
     <programming-language>SQL</programming-language>
@@ -95,10 +95,10 @@
       </Version>
     </release>
     <repository>
-      <SVNRepository>
-        <location rdf:resource="https://svn.apache.org/repos/asf/vcl"/>
-        <browse rdf:resource="http://svn.apache.org/viewvc/vcl/"/>
-      </SVNRepository>
+      <GitRepository>
+        <location rdf:resource="https://git-wip-us.apache.org/repos/asf/vcl"/>
+        <browse rdf:resource="https://git-wip-us.apache.org/repos/asf/vcl"/>
+      </GitRepository>
     </repository>
   </Project>
 </rdf:RDF>
diff --git a/managementnode/bin/install_perl_libs.pl b/managementnode/bin/install_perl_libs.pl
index 812b957..a61042d 100755
--- a/managementnode/bin/install_perl_libs.pl
+++ b/managementnode/bin/install_perl_libs.pl
@@ -85,6 +85,7 @@
 	'LWP::Protocol::https',
 	'Mail::Mailer',
 	'Mo::builder',
+	'Net::Ping::External',
 	'Net::SSH::Expect',
 	'Object::InsideOut',
 	'RPC::XML',
diff --git a/managementnode/bin/monitor_vcld.pl b/managementnode/bin/monitor_vcld.pl
index fa0b796..503df93 100755
--- a/managementnode/bin/monitor_vcld.pl
+++ b/managementnode/bin/monitor_vcld.pl
@@ -170,27 +170,39 @@
 }
 
 my $current_epoch_seconds = convert_to_epoch_seconds();
-my $lastcheckin_epoch_seconds = convert_to_epoch_seconds($lastcheckin_timestamp);
+my $current_timestamp = makedatestring();
+my $lastcheckin_epoch_seconds = $management_node_info->{lastcheckin_epoch};
 my $lastcheckin_seconds_ago = ($current_epoch_seconds - $lastcheckin_epoch_seconds);
 
+# This message displays the timestamp information from the management node and the database
+my $detailed_ts_message = <<"END_MESSAGE";
+	Current Time = $current_timestamp
+	Current epoch = $current_epoch_seconds
+	Last Checkin Time = $lastcheckin_timestamp
+	Last Checkin epoch = $lastcheckin_epoch_seconds
+END_MESSAGE
+
 if ($lastcheckin_seconds_ago < 0) {
-	print_warning("$management_node_name last checkin time is in the future: $lastcheckin_timestamp, exiting");
+	print_warning("$management_node_name last checkin time is in the future: $lastcheckin_timestamp($lastcheckin_epoch_seconds), exiting");
 }
 elsif ($lastcheckin_seconds_ago < $lastcheckin_warning_seconds) {
-	print_message("$management_node_name last checked in $lastcheckin_seconds_ago seconds ago at $lastcheckin_timestamp");
+	print_message("$management_node_name last checked in $lastcheckin_seconds_ago seconds ago at $lastcheckin_timestamp($lastcheckin_epoch_seconds)");
 }
 elsif ($lastcheckin_seconds_ago >= $lastcheckin_critical_seconds) {
-	my $critical_message = "critical threshold exceeded, $management_node_name last checked in $lastcheckin_seconds_ago seconds ago at $lastcheckin_timestamp";
+	my $critical_message = "critical threshold exceeded, $management_node_name last checked in $lastcheckin_seconds_ago seconds ago at $lastcheckin_timestamp($lastcheckin_epoch_seconds)";
 	# Attempt to restart the vcld service
 	if ($mn_os->restart_service($vcld_service_name)) {
 		print_critical("$critical_message, $vcld_service_name service restarted");
+		print_critical($detailed_ts_message);
 	}
 	else {
 		print_critical("$critical_message, failed to restart $vcld_service_name service");
+		print_critical($detailed_ts_message);
 	}
 }
 else {
-	print_critical("last checkin warning threshold exceeded, $management_node_name last checked in $lastcheckin_seconds_ago seconds ago at $lastcheckin_timestamp");
+	print_critical("last checkin warning threshold exceeded, $management_node_name last checked in $lastcheckin_seconds_ago seconds ago at $lastcheckin_timestamp($lastcheckin_epoch_seconds)");
+	print_critical($detailed_ts_message);
 }
 
 print_message('done');
diff --git a/managementnode/lib/VCL/DataStructure.pm b/managementnode/lib/VCL/DataStructure.pm
index dd693e3..3d57fdf 100644
--- a/managementnode/lib/VCL/DataStructure.pm
+++ b/managementnode/lib/VCL/DataStructure.pm
@@ -2804,7 +2804,7 @@
 
 =head2 get_domain_credentials
 
- Parameters  : $domain_identifier
+ Parameters  : $imagedomain_id (optional)
  Returns     : array ($username, $domain_password)
  Description : Attempts to determine and decrypt the username and password for
                the domain specified by the argument. 
@@ -2817,23 +2817,25 @@
 		notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
 		return 0;
 	}
-	
-	my $domain_identifier = shift;
-	if (!defined($domain_identifier)) {
-		notify($ERRORS{'WARNING'}, 0, "domain identifier argument was not supplied");
-		return;
-	}
-	
+
+	my $reservation_id = $self->reservation_id();
 	my $management_node_id = $self->get_management_node_id();
-	
-	my ($username, $secret_id, $encrypted_password) = get_management_node_ad_domain_credentials($management_node_id, $domain_identifier);
-	return unless $username && $secret_id && $encrypted_password;
-	
+
+	my $imagedomain_id = shift || $self->request_data->{reservation}{$reservation_id}{computer}{currentimage}{imagedomain}{id};
+
+	my ($domain_dns_name, $username, $secret_id, $encrypted_password) = get_management_node_ad_domain_credentials($management_node_id, $imagedomain_id);
+	return unless $domain_dns_name && $username && $secret_id && $encrypted_password;
+
 	my $decrypted_password = $self->mn_os->decrypt_cryptsecret($secret_id, $encrypted_password) || return;
 	my $decrypted_password_length = length($decrypted_password);
 	my $decrypted_password_hidden = '*' x $decrypted_password_length;
-	notify($ERRORS{'DEBUG'}, 0, "retrieved credentials for Active Directory domain: '$decrypted_password_hidden' ($decrypted_password_length characters)");
-	return $decrypted_password;
+	notify($ERRORS{'DEBUG'}, 0, "retrieved credentials for Active Directory domain:\n" .
+               "domain ID: $imagedomain_id:\n" .
+               "domain DNS name: $domain_dns_name:\n" .
+               "domain username: $username:\n" .
+               "domain password: $decrypted_password_hidden ($decrypted_password_length characters)"
+        );
+	return ($domain_dns_name, $username, $decrypted_password);
 }
 
 #//////////////////////////////////////////////////////////////////////////////
diff --git a/managementnode/lib/VCL/Module/OS.pm b/managementnode/lib/VCL/Module/OS.pm
index 276a3b7..2b74bf0 100644
--- a/managementnode/lib/VCL/Module/OS.pm
+++ b/managementnode/lib/VCL/Module/OS.pm
@@ -4355,6 +4355,10 @@
 				notify($ERRORS{'DEBUG'}, 0, "ignoring Subversion file: $mn_file_path");
 				next MN_FILE;
 			}
+			elsif ($mn_file_path =~ /\.gitignore/i) {
+				notify($ERRORS{'DEBUG'}, 0, "ignoring .gitignore file: $mn_file_path");
+				next MN_FILE;
+			}
 			elsif ($mn_file_path =~ /\/$other_architecture\//) {
 				notify($ERRORS{'DEBUG'}, 0, "ignoring file intended for different computer architecture: $mn_file_path");
 				next MN_FILE;
diff --git a/managementnode/lib/VCL/Module/OS/Linux/ManagementNode.pm b/managementnode/lib/VCL/Module/OS/Linux/ManagementNode.pm
index 84d3dd0..c3d0b6b 100644
--- a/managementnode/lib/VCL/Module/OS/Linux/ManagementNode.pm
+++ b/managementnode/lib/VCL/Module/OS/Linux/ManagementNode.pm
@@ -509,6 +509,13 @@
 			next;
 		}
 		
+		# Ignore the .gitignore files
+		if ($script_file_path =~ /\.gitignore/i) {
+			my $matching_section = $1;
+			notify($ERRORS{'DEBUG'}, 0, "ignoring gitignore file on management node from script directory '$matching_section': $script_file_path");
+			next;
+		}
+		
 		my $command = "chmod +x $script_file_path && $script_file_path $mn_json_file_path";
 		my ($exit_status, $output) = $self->execute($command);
 		if (!defined($output)) {
diff --git a/managementnode/lib/VCL/Module/OS/Windows.pm b/managementnode/lib/VCL/Module/OS/Windows.pm
index 3de1ad3..479fc22 100644
--- a/managementnode/lib/VCL/Module/OS/Windows.pm
+++ b/managementnode/lib/VCL/Module/OS/Windows.pm
@@ -385,6 +385,25 @@
 
 =item *
 
+ If computer is part of Active Directory Domain, unjoin it
+
+=cut
+
+	if ($self->ad_get_current_domain()) {
+		if (!$self->ad_unjoin()) {
+			notify($ERRORS{'WARNING'}, 0, "failed to remove computer from Active Directory domain");
+			return 0;
+		}
+		notify($ERRORS{'DEBUG'}, 0, "computer successfully unjoined from domain, rebooting for change to take effect");
+		# reboot if unjoin successful
+		if (!$self->reboot()) {
+			notify($ERRORS{'WARNING'}, 0, "failed to reboot after unjoining from domain");
+		}
+	}
+
+
+=item *
+
  Set Administrator account password to known value
 
 =cut
@@ -415,20 +434,6 @@
 	if (!$deleted_user_accounts) {
 		notify($ERRORS{'DEBUG'}, 0, "unable to delete user accounts, will try again after reboot");
 	}
-
-=item *
-
- If computer is part of Active Directory Domain, unjoin it
-
-=cut
-
-	if ($self->ad_get_current_domain()) {
-		if (!$self->ad_unjoin()) {
-			notify($ERRORS{'WARNING'}, 0, "failed to remove computer from Active Directory domain");
-			return 0;
-		}
-	}
-
 =item *
 
  Set root as the owner of /home/root
@@ -672,14 +677,27 @@
 		notify($ERRORS{'WARNING'}, 0, "unable to set sshd service startup mode to manual");
 		return 0;
 	}
-	
+
+=item *
+
+ Unmount any NFS shares
+
+=cut
+
+	if (!$self->unmount_nfs_shares()) {
+		notify($ERRORS{'WARNING'}, 0, "unable to unmount NFS shares");
+		return;
+	}
+	else {
+		notify($ERRORS{'DEBUG'}, 0, "Call to unmount_nfs_shares returned successfully");
+	}
+
 =back
 
 =cut
 
 	notify($ERRORS{'OK'}, 0, "returning 1");
 	return 1;
-
 } ## end sub pre_capture
 
 #//////////////////////////////////////////////////////////////////////////////
@@ -1087,6 +1105,8 @@
 		return 0;
 	}
 	
+	my $computer_name = $self->data->get_computer_short_name();
+	
 	# Check if custom post_reservation script exists in image
 	my $script_path = '$SYSTEMROOT/vcl_post_reservation.cmd';
 	if ($self->file_exists($script_path)) {
@@ -1097,7 +1117,15 @@
 		notify($ERRORS{'DEBUG'}, 0, "custom post_reservation script does NOT exist in image: $script_path");
 	}
 	
-	return $self->SUPER::post_reservation();
+	$self->SUPER::post_reservation();
+	
+	# Check if the computer is joined to any AD domain
+	my $computer_current_domain_name = $self->ad_get_current_domain();
+	if ($computer_current_domain_name) {
+		$self->ad_delete_computer();
+	}
+	
+	return 1;
 }
 
 #//////////////////////////////////////////////////////////////////////////////
@@ -1123,7 +1151,7 @@
 	# Check if the computer is joined to any AD domain
 	my $computer_current_domain_name = $self->ad_get_current_domain();
 	if ($computer_current_domain_name) {
-		$self->ad_delete_computer($computer_name, $computer_current_domain_name);
+		$self->ad_delete_computer();
 	}
 	
 	return $self->SUPER::pre_reload();
@@ -1163,6 +1191,14 @@
 		return 0;
 	}
 	
+	if (!$self->unmount_nfs_shares()) {
+		notify($ERRORS{'WARNING'}, 0, "failed to unmount nfs shares");
+		return 0;
+	}
+	else {
+		notify($ERRORS{'DEBUG'}, 0, "successfully unmounted any NFS shares");
+	}
+
 	notify($ERRORS{'OK'}, 0, "$computer_node_name has been sanitized");
 	return 1;
 } ## end sub sanitize
@@ -7027,7 +7063,12 @@
 	if (!$self->delete_files_by_pattern($NODE_CONFIGURATION_DIRECTORY, '.*\.svn.*')) {
 		notify($ERRORS{'WARNING'}, 0, "unable to delete Subversion files under: $NODE_CONFIGURATION_DIRECTORY");
 	}
-	
+
+	# Delete any GitIgnore files which may have been copied
+	if (!$self->delete_files_by_pattern($NODE_CONFIGURATION_DIRECTORY, '.*\.gitignore.*')) {
+		notify($ERRORS{'WARNING'}, 0, "unable to delete GitIgnore files under: $NODE_CONFIGURATION_DIRECTORY");
+	}
+
 	$self->set_file_owner($NODE_CONFIGURATION_DIRECTORY, 'root');
 	
 	# Find any files containing a 'WINDOWS_ROOT_PASSWORD' string and replace it with the root password
@@ -13780,6 +13821,7 @@
 	my $computer_name	= $self->data->get_computer_short_name();
 	my $image_name	= $self->data->get_image_name();
 	
+	my $image_domain_id = $self->data->get_image_domain_id();
 	my $domain_dns_name = $self->data->get_image_domain_dns_name();
 	my $domain_username = $self->data->get_image_domain_username();
 	my $domain_password = $self->data->get_image_domain_password();
@@ -13812,7 +13854,7 @@
 	notify($ERRORS{'DEBUG'}, 0, "attempting to join $computer_name to AD\n" .
 		"domain DNS name    : $domain_dns_name\n" .
 		"domain user string : $domain_user_string\n" .
-		"domain password    : $domain_password (escaped: $domain_password_escaped)\n" .
+		#"domain password    : $domain_password (escaped: $domain_password_escaped)\n" .
 		"domain computer OU : " . ($computer_ou_dn ? $computer_ou_dn : '<not configured>')
 	);
 	
@@ -13863,12 +13905,17 @@
 \$username = '$domain_user_string'
 \$password = '$domain_password_escaped'
 Write-Host "username (between >*<): `n>\$username<`n"
-Write-Host "password (between >*<): `n>\$password<`n"
 \$ps_credential = New-Object System.Management.Automation.PsCredential(\$username, (ConvertTo-SecureString \$password -AsPlainText -Force))
 Add-Computer -DomainName '$domain_dns_name' -Credential \$ps_credential $domain_computer_command_section -Verbose -ErrorAction Stop
 EOF
+
+# move and uncomment below line to above EOF to include decrypted password in output for debugging
+#Write-Host "password (between >*<): `n>\$password<`n"
+
+	(my $sanitized_password = $domain_password_escaped) =~ s/./*/g;
+	(my $sanitized_script = $ad_powershell_script) =~ s/password = '.*'\n/password = '$sanitized_password'\n/;
 	
-	notify($ERRORS{'DEBUG'}, 0, "attempting to join $computer_name to $domain_dns_name domain using PowerShell script:\n$ad_powershell_script");
+	notify($ERRORS{'DEBUG'}, 0, "attempting to join $computer_name to $domain_dns_name domain using PowerShell script:\n$sanitized_script");
 	my ($exit_status, $output) = $self->run_powershell_as_script($ad_powershell_script, 0, 0); # (path, show output, retain file)
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute PowerShell script to join $computer_name to Active Directory domain");
@@ -13944,6 +13991,8 @@
 		return;
 	}
 	else {
+		$self->set_current_image_tag('addomain_id', $image_domain_id);
+		
 		notify($ERRORS{'DEBUG'}, 0, "successfully joined $computer_name to Active Directory domain: $domain_dns_name, time statistics:\n" .
 			"computer rename reboot : $rename_computer_reboot_duration seconds\n" .
 			"AD join reboot         : $ad_join_reboot_duration seconds\n" .
@@ -14270,7 +14319,7 @@
 	#	
 	#	notify($ERRORS{'OK'}, 0, "removed $computer_name from Active Directory domain, output:\n" . join("\n", @$output));
 	
-	$self->ad_delete_computer($computer_name, $computer_current_domain);
+	$self->ad_delete_computer();
 	return 1;
 }
 
@@ -14388,11 +14437,13 @@
 	my $domain_username;
 	my $domain_password;
 	my $image_domain_dns_name = $self->data->get_image_domain_dns_name(0) || '';
-	if (defined($arguments->{domain_dns_name}) && $arguments->{domain_dns_name} ne $image_domain_dns_name) {
+	if (defined($arguments->{domain_dns_name})) {
 		$domain_dns_name = $arguments->{domain_dns_name};
-		($domain_username, $domain_password) = $self->data->get_domain_credentials($domain_dns_name);
+		$domain_username = $arguments->{domain_username};
+		$domain_password = $arguments->{domain_password};
+		
 		if (!defined($domain_username) || !defined($domain_password)) {
-			notify($ERRORS{'WARNING'}, 0, "unable to search domain: $domain_dns_name, domain DNS name argument was specified but credentials could not be determined from existing 'addomain' table entries");
+			notify($ERRORS{'WARNING'}, 0, "unable to search domain: $domain_dns_name, domain DNS name argument was specified but credentials could not be determined");
 			return;
 		}
 	}
@@ -14458,10 +14509,12 @@
 
 Write-Host "domain: $domain_dns_name"
 Write-Host "domain username (between >*<): >\$domain_username<"
-Write-Host "domain password (between >*<): >\$domain_password<"
-
 EOF
 
+# move and uncomment below line to above EOF to include decrypted password in output for debugging
+#Write-Host "domain password (between >*<): >\$domain_password<"
+
+
 	$powershell_script_contents .= <<'EOF';
 $type = [System.DirectoryServices.ActiveDirectory.DirectoryContextType]"Domain"
 $directory_context = New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext($type, $domain_dns_name, $domain_username, $domain_password)
@@ -14475,7 +14528,7 @@
    else {
       $exception_message = $_.Exception.Message
    }
-   Write-Host "ERROR: failed to connect to $domain_dns_name domain, username: $domain_username, password: $domain_password, error: $exception_message"
+   Write-Host "ERROR: failed to connect to $domain_dns_name domain, username: $domain_username, error: $exception_message"
    exit
 }
 
@@ -14577,16 +14630,11 @@
 
 =head2 ad_delete_computer
 
- Parameters  : $computer_samaccountname (optional), $domain_dns_name (optional)
+ Parameters  : none
  Returns     : boolean
  Description : Deletes a computer object from the active directory domain with a
-               sAMAccountName attribute matching the argument. If no argument is
-               provided, the short name of the reservation computer is used.
-               
-               The sAMAccountName attribute for computers in Active Directory
-               always end with a dollar sign. The trailing dollar sign does not
-               need to be included in the argumenat. One will be added to the
-               LDAP filter used to search for the object to delete.
+					sAMAccountName attribute matching the short name of the
+					reservation computer that is used.
 
 =cut
 
@@ -14596,28 +14644,64 @@
 		notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
 		return;
 	}
+
+	# static variable to track if function being call recursively
+	CORE::state $recursion = 0;
+
+	my $computer_samaccountname = $self->data->get_computer_short_name();
+
+	my ($domain_dns_name, $username, $decrypted_password);
+	my $return;
+
+	if($recursion == 0) {
+		($domain_dns_name, $username, $decrypted_password) = $self->data->get_domain_credentials();
+	}
+	else {
+		my $addomain_id = $self->get_current_image_tag('addomain_id');
+		$addomain_id =~ s/ \(.*$//;
+		if (!defined($addomain_id)) {
+			return 0;
+		}
+		($domain_dns_name, $username, $decrypted_password) = $self->data->get_domain_credentials($addomain_id);
+	}
+	if (!defined($domain_dns_name) || !defined($username) || !defined($decrypted_password)) {
+		notify($ERRORS{'WARNING'}, 0, "failed to get domain credentials for $computer_samaccountname");
+		if ($recursion == 0) {
+			$recursion = 1;
+			$return = $self->ad_delete_computer();
+			$recursion = 0;
+			return $return;
+		}
+		return;
+	}
 	
-	my ($computer_samaccountname, $domain_dns_name) = @_;
-	
-	$computer_samaccountname = $self->data->get_computer_short_name() unless $computer_samaccountname;
-	
-	# Make sure computer samAccountName does not contain a trailing dollar sign
-	# A dollar sign will be present if retrieved directly from AD
 	$computer_samaccountname =~ s/\$*$/\$/g;
-	
 	my $ad_search_arguments = {
 		'ldap_filter' => {
 			'objectClass' => 'computer',
 			'sAMAccountName' => $computer_samaccountname,
-		}
+		},
+		'domain_dns_name' => $domain_dns_name,
+		'domain_username' => $username,
+		'domain_password' => $decrypted_password,
 	};
 	
-	# If a specific domain was specified, retrieve the username and password for that domain
-	if ($domain_dns_name) {
-		$ad_search_arguments->{domain_dns_name} = $domain_dns_name;
-	}
+	#notify($ERRORS{'DEBUG'}, 0, "attempting to delete Active Directory computer object, arguments:\n" . format_data($ad_search_arguments));
 	
-	return $self->ad_search($ad_search_arguments);
+	$return = $self->ad_search($ad_search_arguments);
+	if ($return == 1) {
+		return 1;
+	}
+	elsif ($recursion == 1) {
+		return 0;
+	}
+	else {
+		notify($ERRORS{'DEBUG'}, 0, "Failed to delete computer from AD using AD domain info from image; trying again with info from currentimage.txt");
+		$recursion = 1;
+		$return = $self->ad_delete_computer();
+		$recursion = 0;
+		return $return;
+	}
 }
 
 #//////////////////////////////////////////////////////////////////////////////
@@ -14849,6 +14933,277 @@
 
 #//////////////////////////////////////////////////////////////////////////////
 
+=head2 reserve
+
+ Parameters  : none
+ Returns     : boolean
+ Description : Calls parent OS.pm::reserve then mounts NFS shares.
+
+=cut
+
+sub reserve {
+	my $self = shift;
+	if (ref($self) !~ /Windows/i) {
+		notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
+		return 0;
+	}
+	
+	# Call OS.pm's reserve subroutine
+	$self->SUPER::reserve() || return;
+	
+	notify($ERRORS{'OK'}, 0, "beginning Windows reserve tasks");
+	
+	# Attempt to mount NFS shares configured for the management node (Site Configuration > NFS Mounts)
+	$self->mount_nfs_shares();
+	
+	notify($ERRORS{'OK'}, 0, "Windows reserve tasks complete");
+	return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 nfs_mount_share
+
+ Parameters  : $remote_target
+ Returns     : boolean
+ Description : Prepares a Windows image to automatically mount a user's NFS
+               shares when the user logs in.
+               
+               The Windows image is checked to determine if the required Windows
+               features are installed in the image. If not installed, an attempt
+               is made to install them. If any features are installed, a reboot
+               is performed.
+
+=cut
+
+sub nfs_mount_share {
+	my $self = shift;
+	if (ref($self) !~ /Windows/i) {
+		notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
+		return;
+	}
+	
+	my ($remote_target) = @_;
+	if (!$remote_target) {
+		notify($ERRORS{'WARNING'}, 0, "remote NFS target argument was not supplied");
+		return;
+	}
+	
+	# This subroutine may be called multiple times to allow multiple shares to be mounted
+	# If this is not the first call, append to the batch file instead of recreating it
+	my $previously_called = $self->{nfs_mount_share_called};
+	if ($previously_called && !$self->{nfs_mount_share_preparation_complete}) {
+		notify($ERRORS{'DEBUG'}, 0, "skipping subsequent NFS mount attempt, this subroutine was previously called but the preparation tasks failed to complete");
+		return;
+	}
+	
+	$self->{nfs_mount_share_called} = 1;
+	
+	my $username = $self->data->get_user_login_id();
+	my $uid = $self->data->get_user_uid();
+	my $reservation_id = $self->data->get_reservation_id();
+	my $computer_name = $self->data->get_computer_node_name();
+	my $management_node_id = $self->data->get_management_node_id;
+	
+	my $nfs_mount_batch_file_path = 'C:/mount_nfs.cmd';
+	
+	# Only perform the prep tasks the first time this subroutine is called
+	if ($previously_called) {
+		notify($ERRORS{'DEBUG'}, 0, "Windows NFS preparation tasks not necessary, this subroutine was previously executed");
+	}
+	else {
+		notify($ERRORS{'DEBUG'}, 0, "beginning Windows NFS preparation tasks");
+		
+		$self->delete_file($nfs_mount_batch_file_path);
+		
+		my $windows_product_name = $self->get_product_name();
+		if ($windows_product_name =~ /(Windows.*Professional)/) {
+			notify($ERRORS{'WARNING'}, 0, "Windows NFS share not mounted, Client for NFS is not available on this edition: $windows_product_name");
+			return 0;
+		}
+		
+		# Check if required Windows features are installed in the image
+		# Attempt to install them if missing
+		# A reboot is required if any features are installed
+		my @required_windows_feature_names = (
+			'ServicesForNFS-ClientOnly',
+			'ClientForNFS-Infrastructure',
+		);
+		
+		my $installed_feature_count = 0;
+		for my $required_windows_feature_name (@required_windows_feature_names) {
+			#notify($ERRORS{'DEBUG'}, 0, "sleeping 10 seconds before installing next Windows feature");
+			#sleep_uninterrupted(10) if $installed_feature_count > 0;
+			
+			if (!$self->is_windows_feature_enabled($required_windows_feature_name)) {
+				if ($self->enable_windows_feature($required_windows_feature_name)) {
+					$self->{windows_nfs_reboot_required} = 1;
+				}
+				else {
+					notify($ERRORS{'WARNING'}, 0, "failed to prepare Windows NFS, '$required_windows_feature_name' Windows feature could not be enabled");
+					return;
+				}
+			}
+			$installed_feature_count++;
+		}
+		
+		# Stop and disable the "TCP/IP NetBIOS Helper" service - it causes delays using NFS shares
+		$self->stop_service('lmhosts');
+		$self->set_service_startup_mode('lmhosts', 'disabled');
+		
+		# Set the anonymous UID
+		$self->set_windows_nfs_client_uid($uid) || return;
+		
+		#if ($self->{windows_nfs_reboot_required}) {
+		#	notify($ERRORS{'DEBUG'}, 0, "attempting to reboot $computer_name to complete the configuration of the NFS Client");
+		#	if (!$self->reboot()) {
+		#		notify($ERRORS{'WARNING'}, 0, "failed to prepare Windows NFS, failed to reboot $computer_name after configuring NFS client");
+		#		return;
+		#	}
+		#}
+		
+		# Attempt to start the NFS client or make sure it's already started
+		$self->start_service('NfsClnt') || return;
+		
+		#if (!$self->start_service('NfsClnt')) {
+		#	if ($self->{windows_nfs_reboot_required}) {
+		#		notify($ERRORS{'WARNING'}, 0, "failed to prepare Windows NFS, failed to start the NFS client, $computer_name was already rebooted");
+		#		return;
+		#	}
+		#	else {
+		#		if (!$self->reboot()) {
+		#			notify($ERRORS{'WARNING'}, 0, "failed to prepare Windows NFS, failed to reboot $computer_name after attempting to start the NFS client");
+		#			return;
+		#		}
+		#		
+		#		if (!$self->start_service('NfsClnt')) {
+		#			notify($ERRORS{'WARNING'}, 0, "failed to prepare Windows NFS, failed to start the NFS client on $computer_name after it was rebooted");
+		#			return;
+		#		}
+		#	}
+		#}
+		#notify($ERRORS{'DEBUG'}, 0, "Windows NFS preparation tasks complete");
+		
+		$self->{nfs_mount_share_preparation_complete} = 1;
+	}
+	
+	my $mount_script_contents;
+	if (!$previously_called) {
+		$mount_script_contents = "nfsadmin.exe client start\r\n";
+	}
+	$mount_script_contents .= "C:\\Windows\\system32\\mount.exe -o mtype=hard $remote_target *";
+	
+	if ($previously_called) {
+		notify($ERRORS{'DEBUG'}, 0, "appending line to $nfs_mount_batch_file_path: $mount_script_contents");
+		if (!$self->append_text_file($nfs_mount_batch_file_path, $mount_script_contents)) {
+			notify($ERRORS{'WARNING'}, 0, "failed to append batch file to mount NFS shares: $nfs_mount_batch_file_path");
+			return;
+		}
+	}
+	else {
+		notify($ERRORS{'DEBUG'}, 0, "creating Windows NFS mount batch file: $nfs_mount_batch_file_path, contents:\n$mount_script_contents");
+		if (!$self->create_text_file($nfs_mount_batch_file_path, $mount_script_contents)) {
+			notify($ERRORS{'WARNING'}, 0, "failed to create Windows NFS mount batch file: $nfs_mount_batch_file_path");
+			return;
+		}
+		$self->add_hklm_run_registry_key('VCL Mount NFS', $nfs_mount_batch_file_path) || return;
+		$self->execute("chmod 777 $nfs_mount_batch_file_path");
+	}
+	
+	notify($ERRORS{'DEBUG'}, 0, "finished Windows NFS mount tasks");
+	return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 nfs_unmount_share
+
+ Parameters  : none
+ Returns     : boolean
+ Description : This doesn't actually unmount any shares but deletes the registry
+               key and batch file created to mount NFS shares when a user logs
+               in.
+
+=cut
+
+sub nfs_unmount_share {
+	my $self = shift;
+	if (ref($self) !~ /Windows/i) {
+		notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
+		return;
+	}
+	
+	$self->delete_file('C:/mount_nfs.cmd');
+	$self->delete_hklm_run_registry_key('VCL Mount NFS');
+	return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 set_windows_nfs_client_uid
+
+ Parameters  : $uid_number
+ Returns     : boolean
+ Description : Sets registry values used by the Windows NFS Client to determine
+               which user UID number to use when accessing NFS shares.
+
+=cut
+
+sub set_windows_nfs_client_uid {
+	my $self = shift;
+	if (ref($self) !~ /Windows/i) {
+		notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
+		return;
+	}
+	
+	my $uid = shift || $self->data->get_user_uid();
+	my $computer_name = $self->data->get_computer_node_name();
+	
+	notify($ERRORS{'DEBUG'}, 0, "attempting to configure the Windows NFS Client to use anonymous UID $uid");
+	
+	my $nfs_client_service_name = 'NfsClnt';
+	my $base_key = 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default';
+	my $uid_key = 'AnonymousUid';
+	
+	# Check if UID already set correctly
+	my $existing_uid = $self->reg_query($base_key, $uid_key, 1) || '';
+	if ($existing_uid eq $uid) {
+		notify($ERRORS{'DEBUG'}, 0, "anonymous UID ($existing_uid) value are already set correctly in the registry on $computer_name");
+	}
+	else {
+		# Set the registry keys
+		if (!$self->reg_add($base_key, $uid_key, 'REG_DWORD', $uid)) {
+			notify($ERRORS{'WARNING'}, 0, "failed to set Windows NFS Client anonymous UID in the registry");
+			return;
+		}
+	}
+	
+	# Stop the NFS service, this may fail if something is already mounted
+	if (!$self->{windows_nfs_reboot_required}) {
+		if ($self->stop_service($nfs_client_service_name)) {
+			## Service won't restart immediately after stopping it
+			#sleep_uninterrupted(10);
+			
+			if ($self->start_service($nfs_client_service_name)) {
+				notify($ERRORS{'DEBUG'}, 0, "set Windows NFS Client anonymous UID value in registry and restarted $nfs_client_service_name service");
+			}
+			else {
+				notify($ERRORS{'WARNING'}, 0, "failed to restart Windows NFS Client service, it may be in use, $computer_name will be rebooted");
+				$self->{windows_nfs_reboot_required} = 1;
+			}
+		}
+		else {
+			notify($ERRORS{'WARNING'}, 0, "failed to stop Windows NFS Client service, it may be in use, $computer_name will be rebooted");
+			$self->{windows_nfs_reboot_required} = 1;
+		}
+	}
+	
+	notify($ERRORS{'DEBUG'}, 0, "set Windows NFS Client anonymous UID values in registry");
+	return 1;
+}
+
+#//////////////////////////////////////////////////////////////////////////////
+
 1;
 __END__
 
diff --git a/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm b/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm
index 4e89641..2ec1574 100644
--- a/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm
+++ b/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm
@@ -1945,7 +1945,7 @@
 	}
 	
 	# The vmx file should be set to executable
-	chmod("0755", "/tmp/$vmx_file_name");
+	chmod(0755, "/tmp/$vmx_file_name");
 	
 	# Copy the temporary vmx file the the VM host
 	$self->vmhost_os->copy_file_to($temp_vmx_file_path, $vmx_file_path) || return;
diff --git a/managementnode/lib/VCL/Module/Provisioning/libvirt.pm b/managementnode/lib/VCL/Module/Provisioning/libvirt.pm
index 44691bc..b38ffff 100644
--- a/managementnode/lib/VCL/Module/Provisioning/libvirt.pm
+++ b/managementnode/lib/VCL/Module/Provisioning/libvirt.pm
@@ -1799,6 +1799,13 @@
 	#    Windows, however, expects it to be in so called 'localtime'."
 	my $clock_offset = ($image_os_type =~ /windows/) ? 'localtime' : 'utc';
 	
+	my $cpusockets = $cpu_count;
+	my $cpucores = 1;
+	if($cpu_count > 2) {
+		$cpusockets = 2;
+		$cpucores = ($cpu_count - ($cpu_count % 2)) / 2;
+	}
+
 	my $xml_hashref = {
 		'type' => $domain_type,
 		'description' => [$description],
@@ -1828,14 +1835,11 @@
 				model => {
 					'fallback' => 'allow',
 				},
-				#'topology' => [
-				#	{
-				#		'sockets' => $cpu_count,
-				#		'cores' => '2',
-				#		'threads' => '2',
-				#	}
-				#],
-				
+				topology => {
+					'sockets' => $cpusockets,
+					'cores' => $cpucores,
+					'threads' => 1,
+				},
 			}
 		],
 		'clock' => [
diff --git a/managementnode/lib/VCL/utils.pm b/managementnode/lib/VCL/utils.pm
index 0e9a4ea..2342e37 100644
--- a/managementnode/lib/VCL/utils.pm
+++ b/managementnode/lib/VCL/utils.pm
@@ -58,7 +58,7 @@
 use DBI;
 use DBI::Const::GetInfoType;
 use diagnostics;
-use Net::Ping;
+use Net::Ping::External qw(ping);
 use Fcntl qw(:DEFAULT :flock);
 use FindBin;
 use Getopt::Long;
@@ -1270,7 +1270,7 @@
 	my ($package, $filename, $line,       $sub)  = caller(0);
 
 	# Mail::Mailer relies on sendmail as written, this causes a "die" on Windows
-	# TODO: Reqork this subroutine to not rely on sendmail
+	# TODO: Rework this subroutine to not rely on sendmail
 	my $osname = lc($^O);
 	if ($osname =~ /win/i) {
 		notify($ERRORS{'OK'}, 0, "sending mail from Windows not yet supported\n-----\nTo: $to\nSubject: $subject\nFrom: $from\n$mailstring\n-----");
@@ -2131,8 +2131,8 @@
 
  Parameters  : $node
  Returns     : boolean
- Description : Uses Net::Ping to check if a node is responding to ICMP echo
-               ping.
+ Description : Uses Net::Ping::External to check if a node is responding to ICMP
+               echo ping.
 
 =cut
 
@@ -2156,9 +2156,7 @@
 		}
 	}
 	
-	my $p = Net::Ping->new("icmp");
-	my $result = $p->ping($remote_connection_target, 1);
-	$p->close();
+	my $result = ping(host => $remote_connection_target, timeout => 1);
 
 	if ($result) {
 		#notify($ERRORS{'DEBUG'}, 0, "$node_string is responding to ping");
@@ -4623,6 +4621,7 @@
 	my $select_statement = "
 SELECT
 managementnode.*,
+UNIX_TIMESTAMP(managementnode.lastcheckin) as lastcheckin_epoch,
 resource.id AS resource_id,
 state.name AS statename
 FROM
@@ -4962,22 +4961,46 @@
 	}
 
 	# Get current timestamp
-	my $timestamp = makedatestring();
+	my $timestamp;
 
 	# Construct the update statement
 	my $update_statement = "
       UPDATE
 		managementnode
 		SET
-		lastcheckin = \'$timestamp\'
+		lastcheckin = NOW()
 		WHERE
 		id = $management_node_id
    ";
 
+	my $get_unix_timestamp = "
+	  SELECT
+	    UNIX_TIMESTAMP() as EPOC_TIMESTAMP
+    ";
+
 	# Call the database execute subroutine
 	if (database_execute($update_statement)) {
 		# Update successful, return timestamp
-		return $timestamp;
+		my @selected_rows = database_select($get_unix_timestamp);
+
+		# Check to make sure 1 row was returned
+		if (scalar @selected_rows == 0) {
+			notify($ERRORS{'WARNING'}, 0, "zero rows were returned from database select");
+			return 0;
+		}
+		elsif (scalar @selected_rows > 1) {
+			notify($ERRORS{'WARNING'}, 0, "" . scalar @selected_rows . " rows were returned from database select");
+			return 0;
+		}
+
+		# Make sure we return undef if the column wasn't found
+		if (defined $selected_rows[0]{EPOC_TIMESTAMP}) {
+			$timestamp = $selected_rows[0]{EPOC_TIMESTAMP};
+			return $timestamp;
+		} else {
+			notify($ERRORS{'CRITICAL'}, 0, "unable to get EPOC_TIMESTAMP from database");
+			return 0;
+		}
 	}
 	else {
 		notify($ERRORS{'CRITICAL'}, 0, "unable to update database, management node id $management_node_id");
@@ -15085,8 +15108,8 @@
 
 =head2 get_management_node_ad_domain_credentials
 
- Parameters  : $management_node_id, $domain_dns_name, $no_cache (optional)
- Returns     : ($username, $secret_id, $encrypted_password)
+ Parameters  : $management_node_id, $domain_id, $no_cache (optional)
+ Returns     : ($domain_dns_name, $username, $secret_id, $encrypted_password)
  Description : Attempts to retrieve the username, encrypted password, and secret
                ID for the domain from the addomain table. This is used if a
                computer needs to be removed from a domain but the reservation
@@ -15096,63 +15119,58 @@
 =cut
 
 sub get_management_node_ad_domain_credentials {
-	my ($management_node_id, $domain_identifier, $no_cache) = @_;
+	my ($management_node_id, $domain_id, $no_cache) = @_;
 	if (!defined($management_node_id)) {
 		notify($ERRORS{'WARNING'}, 0, "management node ID argument was not supplied");
 		return;
 	}
-	elsif (!$domain_identifier) {
+	elsif (!$domain_id) {
 		notify($ERRORS{'WARNING'}, 0, "domain identifier name argument was not specified");
 		return;
 	}
 	
-	if (!$no_cache && defined($ENV{management_node_ad_domain_credentials}{$domain_identifier})) {
-		notify($ERRORS{'DEBUG'}, 0, "returning cached Active Directory credentials for domain: $domain_identifier");
-		return @{$ENV{management_node_ad_domain_credentials}{$domain_identifier}};
+	if (!$no_cache && defined($ENV{management_node_ad_domain_credentials}{$domain_id})) {
+		notify($ERRORS{'DEBUG'}, 0, "returning cached Active Directory credentials for domain: $domain_id");
+		return @{$ENV{management_node_ad_domain_credentials}{$domain_id}};
 	}
 	
 	# Construct the select statement
 	my $select_statement = <<EOF;
 SELECT DISTINCT
+domainDNSName,
 username,
 password,
 secretid
 FROM
 addomain
 WHERE
+addomain.id = $domain_id
 EOF
 	
-	if ($domain_identifier =~ /^\d+$/) {
-		$select_statement .= "addomain.id = $domain_identifier";
-	}
-	else {
-		$select_statement .= "addomain.domainDNSName LIKE '$domain_identifier%'";
-	}
-	
 	# Call the database select subroutine
 	my @selected_rows = database_select($select_statement);
 
 	# Check to make sure 1 row was returned
 	if (scalar @selected_rows == 0) {
-		notify($ERRORS{'DEBUG'}, 0, "Active Directory domain does not exist in the database: $domain_identifier");
+		notify($ERRORS{'DEBUG'}, 0, "Active Directory domain does not exist in the database: $domain_id");
 		return ();
 	}
 
 	# Get the single row returned from the select statement
 	my $row = $selected_rows[0];
+	my $domain_dns_name = $row->{domainDNSName};
 	my $username = $row->{username};
 	my $secret_id = $row->{secretid};
 	my $encrypted_password = $row->{password};
 	
-	
-	
-	notify($ERRORS{'DEBUG'}, 0, "retrieved credentials for domain: $domain_identifier\n" .
+	notify($ERRORS{'DEBUG'}, 0, "retrieved credentials for domain: $domain_id\n" .
+		"domain DNS name    : '$domain_dns_name'\n" .
 		"username           : '$username'\n" .
 		"secret ID          : '$secret_id'\n" .
 		"encrypted password : '$encrypted_password'"
 	);
-	$ENV{management_node_ad_domain_credentials}{$domain_identifier} = [$username, $secret_id, $encrypted_password];
-	return @{$ENV{management_node_ad_domain_credentials}{$domain_identifier}};
+	$ENV{management_node_ad_domain_credentials}{$domain_id} = [$domain_dns_name, $username, $secret_id, $encrypted_password];
+	return @{$ENV{management_node_ad_domain_credentials}{$domain_id}};
 }
 
 #//////////////////////////////////////////////////////////////////////////////
diff --git a/managementnode/tools/ESXi/Scripts/post_initial_connection/.gitignore b/managementnode/tools/ESXi/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/ESXi/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/ESXi/Scripts/post_load/.gitignore b/managementnode/tools/ESXi/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/ESXi/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/ESXi/Scripts/post_reservation/.gitignore b/managementnode/tools/ESXi/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/ESXi/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/ESXi/Scripts/post_reserve/.gitignore b/managementnode/tools/ESXi/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/ESXi/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/ESXi/Scripts/pre_capture/.gitignore b/managementnode/tools/ESXi/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/ESXi/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/ESXi/Scripts/pre_reload/.gitignore b/managementnode/tools/ESXi/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/ESXi/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Linux/Scripts/post_initial_connection/.gitignore b/managementnode/tools/Linux/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Linux/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Linux/Scripts/post_load/.gitignore b/managementnode/tools/Linux/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Linux/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Linux/Scripts/post_reservation/.gitignore b/managementnode/tools/Linux/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Linux/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Linux/Scripts/post_reserve/.gitignore b/managementnode/tools/Linux/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Linux/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Linux/Scripts/pre_capture/.gitignore b/managementnode/tools/Linux/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Linux/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Linux/Scripts/pre_reload/.gitignore b/managementnode/tools/Linux/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Linux/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/ManagementNode/Scripts/post_capture/.gitignore b/managementnode/tools/ManagementNode/Scripts/post_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/ManagementNode/Scripts/post_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/ManagementNode/Scripts/post_initial_connection/.gitignore b/managementnode/tools/ManagementNode/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/ManagementNode/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/ManagementNode/Scripts/post_load/.gitignore b/managementnode/tools/ManagementNode/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/ManagementNode/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/ManagementNode/Scripts/post_reservation/.gitignore b/managementnode/tools/ManagementNode/Scripts/post_reservation/.gitignore
new file mode 100755
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/ManagementNode/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/ManagementNode/Scripts/post_reserve/.gitignore b/managementnode/tools/ManagementNode/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/ManagementNode/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/ManagementNode/Scripts/pre_capture/.gitignore b/managementnode/tools/ManagementNode/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/ManagementNode/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/ManagementNode/Scripts/pre_reload/.gitignore b/managementnode/tools/ManagementNode/Scripts/pre_reload/.gitignore
new file mode 100755
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/ManagementNode/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/OSX/Scripts/post_initial_connection/.gitignore b/managementnode/tools/OSX/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/OSX/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/OSX/Scripts/post_load/.gitignore b/managementnode/tools/OSX/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/OSX/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/OSX/Scripts/post_reservation/.gitignore b/managementnode/tools/OSX/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/OSX/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/OSX/Scripts/post_reserve/.gitignore b/managementnode/tools/OSX/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/OSX/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/OSX/Scripts/pre_capture/.gitignore b/managementnode/tools/OSX/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/OSX/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/OSX/Scripts/pre_reload/.gitignore b/managementnode/tools/OSX/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/OSX/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Ubuntu/Scripts/post_initial_connection/.gitignore b/managementnode/tools/Ubuntu/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Ubuntu/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Ubuntu/Scripts/post_load/.gitignore b/managementnode/tools/Ubuntu/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Ubuntu/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Ubuntu/Scripts/post_reservation/.gitignore b/managementnode/tools/Ubuntu/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Ubuntu/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Ubuntu/Scripts/post_reserve/.gitignore b/managementnode/tools/Ubuntu/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Ubuntu/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Ubuntu/Scripts/pre_capture/.gitignore b/managementnode/tools/Ubuntu/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Ubuntu/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Ubuntu/Scripts/pre_reload/.gitignore b/managementnode/tools/Ubuntu/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Ubuntu/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows/Drivers/.gitignore b/managementnode/tools/Windows/Drivers/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows/Drivers/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows/Logs/.gitignore b/managementnode/tools/Windows/Logs/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows/Logs/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows/Scripts/post_initial_connection/.gitignore b/managementnode/tools/Windows/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows/Scripts/post_load/.gitignore b/managementnode/tools/Windows/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows/Scripts/post_reservation/.gitignore b/managementnode/tools/Windows/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows/Scripts/post_reserve/.gitignore b/managementnode/tools/Windows/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows/Scripts/pre_capture/.gitignore b/managementnode/tools/Windows/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows/Scripts/pre_reload/.gitignore b/managementnode/tools/Windows/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows/Updates/x86/.gitignore b/managementnode/tools/Windows/Updates/x86/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows/Updates/x86/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows/Updates/x86_64/.gitignore b/managementnode/tools/Windows/Updates/x86_64/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows/Updates/x86_64/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows/Utilities/WSName/.gitignore b/managementnode/tools/Windows/Utilities/WSName/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows/Utilities/WSName/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_10/Drivers/.gitignore b/managementnode/tools/Windows_10/Drivers/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_10/Drivers/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_10/Scripts/post_initial_connection/.gitignore b/managementnode/tools/Windows_10/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_10/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_10/Scripts/post_load/.gitignore b/managementnode/tools/Windows_10/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_10/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_10/Scripts/post_reservation/.gitignore b/managementnode/tools/Windows_10/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_10/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_10/Scripts/post_reserve/.gitignore b/managementnode/tools/Windows_10/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_10/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_10/Scripts/pre_capture/.gitignore b/managementnode/tools/Windows_10/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_10/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_10/Scripts/pre_reload/.gitignore b/managementnode/tools/Windows_10/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_10/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_10/Updates/.gitignore b/managementnode/tools/Windows_10/Updates/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_10/Updates/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_10/Utilities/.gitignore b/managementnode/tools/Windows_10/Utilities/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_10/Utilities/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_7/Drivers/.gitignore b/managementnode/tools/Windows_7/Drivers/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_7/Drivers/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_7/Scripts/post_initial_connection/.gitignore b/managementnode/tools/Windows_7/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_7/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_7/Scripts/post_load/.gitignore b/managementnode/tools/Windows_7/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_7/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_7/Scripts/post_reservation/.gitignore b/managementnode/tools/Windows_7/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_7/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_7/Scripts/post_reserve/.gitignore b/managementnode/tools/Windows_7/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_7/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_7/Scripts/pre_capture/.gitignore b/managementnode/tools/Windows_7/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_7/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_7/Scripts/pre_reload/.gitignore b/managementnode/tools/Windows_7/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_7/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_7/Updates/x86/.gitignore b/managementnode/tools/Windows_7/Updates/x86/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_7/Updates/x86/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_7/Updates/x86_64/.gitignore b/managementnode/tools/Windows_7/Updates/x86_64/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_7/Updates/x86_64/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_7/Utilities/.gitignore b/managementnode/tools/Windows_7/Utilities/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_7/Utilities/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_8/Drivers/.gitignore b/managementnode/tools/Windows_8/Drivers/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_8/Drivers/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_8/Scripts/post_initial_connection/.gitignore b/managementnode/tools/Windows_8/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_8/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_8/Scripts/post_load/.gitignore b/managementnode/tools/Windows_8/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_8/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_8/Scripts/post_reservation/.gitignore b/managementnode/tools/Windows_8/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_8/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_8/Scripts/post_reserve/.gitignore b/managementnode/tools/Windows_8/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_8/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_8/Scripts/pre_capture/.gitignore b/managementnode/tools/Windows_8/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_8/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_8/Scripts/pre_reload/.gitignore b/managementnode/tools/Windows_8/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_8/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_8/Updates/.gitignore b/managementnode/tools/Windows_8/Updates/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_8/Updates/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_8/Utilities/.gitignore b/managementnode/tools/Windows_8/Utilities/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_8/Utilities/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2003/Drivers/.gitignore b/managementnode/tools/Windows_Server_2003/Drivers/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2003/Drivers/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2003/Scripts/post_initial_connection/.gitignore b/managementnode/tools/Windows_Server_2003/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2003/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2003/Scripts/post_load/.gitignore b/managementnode/tools/Windows_Server_2003/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2003/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2003/Scripts/post_reservation/.gitignore b/managementnode/tools/Windows_Server_2003/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2003/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2003/Scripts/post_reserve/.gitignore b/managementnode/tools/Windows_Server_2003/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2003/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2003/Scripts/pre_capture/.gitignore b/managementnode/tools/Windows_Server_2003/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2003/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2003/Scripts/pre_reload/.gitignore b/managementnode/tools/Windows_Server_2003/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2003/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2003/Updates/x86/.gitignore b/managementnode/tools/Windows_Server_2003/Updates/x86/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2003/Updates/x86/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2003/Updates/x86_64/.gitignore b/managementnode/tools/Windows_Server_2003/Updates/x86_64/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2003/Updates/x86_64/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2003/Utilities/Sysprep/.gitignore b/managementnode/tools/Windows_Server_2003/Utilities/Sysprep/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2003/Utilities/Sysprep/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2008/Drivers/.gitignore b/managementnode/tools/Windows_Server_2008/Drivers/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2008/Drivers/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2008/Scripts/post_initial_connection/.gitignore b/managementnode/tools/Windows_Server_2008/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2008/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2008/Scripts/post_load/.gitignore b/managementnode/tools/Windows_Server_2008/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2008/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2008/Scripts/post_reservation/.gitignore b/managementnode/tools/Windows_Server_2008/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2008/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2008/Scripts/post_reserve/.gitignore b/managementnode/tools/Windows_Server_2008/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2008/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2008/Scripts/pre_capture/.gitignore b/managementnode/tools/Windows_Server_2008/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2008/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2008/Scripts/pre_reload/.gitignore b/managementnode/tools/Windows_Server_2008/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2008/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2008/Updates/x86/.gitignore b/managementnode/tools/Windows_Server_2008/Updates/x86/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2008/Updates/x86/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2008/Updates/x86_64/.gitignore b/managementnode/tools/Windows_Server_2008/Updates/x86_64/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2008/Updates/x86_64/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2008/Utilities/.gitignore b/managementnode/tools/Windows_Server_2008/Utilities/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2008/Utilities/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2012/Drivers/.gitignore b/managementnode/tools/Windows_Server_2012/Drivers/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2012/Drivers/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2012/Scripts/post_initial_connection/.gitignore b/managementnode/tools/Windows_Server_2012/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2012/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2012/Scripts/post_load/.gitignore b/managementnode/tools/Windows_Server_2012/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2012/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2012/Scripts/post_reservation/.gitignore b/managementnode/tools/Windows_Server_2012/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2012/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2012/Scripts/post_reserve/.gitignore b/managementnode/tools/Windows_Server_2012/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2012/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2012/Scripts/pre_capture/.gitignore b/managementnode/tools/Windows_Server_2012/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2012/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2012/Scripts/pre_reload/.gitignore b/managementnode/tools/Windows_Server_2012/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2012/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2012/Updates/.gitignore b/managementnode/tools/Windows_Server_2012/Updates/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2012/Updates/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2012/Utilities/.gitignore b/managementnode/tools/Windows_Server_2012/Utilities/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2012/Utilities/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2016/Drivers/.gitignore b/managementnode/tools/Windows_Server_2016/Drivers/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2016/Drivers/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2016/Scripts/post_initial_connection/.gitignore b/managementnode/tools/Windows_Server_2016/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2016/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2016/Scripts/post_load/.gitignore b/managementnode/tools/Windows_Server_2016/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2016/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2016/Scripts/post_reservation/.gitignore b/managementnode/tools/Windows_Server_2016/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2016/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2016/Scripts/post_reserve/.gitignore b/managementnode/tools/Windows_Server_2016/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2016/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2016/Scripts/pre_capture/.gitignore b/managementnode/tools/Windows_Server_2016/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2016/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2016/Scripts/pre_reload/.gitignore b/managementnode/tools/Windows_Server_2016/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2016/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2016/Updates/.gitignore b/managementnode/tools/Windows_Server_2016/Updates/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2016/Updates/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Server_2016/Utilities/.gitignore b/managementnode/tools/Windows_Server_2016/Utilities/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Server_2016/Utilities/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_5/Drivers/.gitignore b/managementnode/tools/Windows_Version_5/Drivers/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_5/Drivers/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_5/Scripts/post_initial_connection/.gitignore b/managementnode/tools/Windows_Version_5/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_5/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_5/Scripts/post_load/.gitignore b/managementnode/tools/Windows_Version_5/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_5/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_5/Scripts/post_reservation/.gitignore b/managementnode/tools/Windows_Version_5/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_5/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_5/Scripts/post_reserve/.gitignore b/managementnode/tools/Windows_Version_5/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_5/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_5/Scripts/pre_capture/.gitignore b/managementnode/tools/Windows_Version_5/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_5/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_5/Scripts/pre_reload/.gitignore b/managementnode/tools/Windows_Version_5/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_5/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_5/Updates/x86/.gitignore b/managementnode/tools/Windows_Version_5/Updates/x86/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_5/Updates/x86/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_5/Updates/x86_64/.gitignore b/managementnode/tools/Windows_Version_5/Updates/x86_64/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_5/Updates/x86_64/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_6/Drivers/.gitignore b/managementnode/tools/Windows_Version_6/Drivers/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_6/Drivers/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_6/Scripts/post_initial_connection/.gitignore b/managementnode/tools/Windows_Version_6/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_6/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_6/Scripts/post_load/.gitignore b/managementnode/tools/Windows_Version_6/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_6/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_6/Scripts/post_reservation/.gitignore b/managementnode/tools/Windows_Version_6/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_6/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_6/Scripts/post_reserve/.gitignore b/managementnode/tools/Windows_Version_6/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_6/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_6/Scripts/pre_capture/.gitignore b/managementnode/tools/Windows_Version_6/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_6/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_6/Scripts/pre_reload/.gitignore b/managementnode/tools/Windows_Version_6/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_6/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_6/Updates/x86/.gitignore b/managementnode/tools/Windows_Version_6/Updates/x86/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_6/Updates/x86/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Version_6/Updates/x86_64/.gitignore b/managementnode/tools/Windows_Version_6/Updates/x86_64/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Version_6/Updates/x86_64/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Vista/Drivers/.gitignore b/managementnode/tools/Windows_Vista/Drivers/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Vista/Drivers/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Vista/Scripts/post_initial_connection/.gitignore b/managementnode/tools/Windows_Vista/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Vista/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Vista/Scripts/post_load/.gitignore b/managementnode/tools/Windows_Vista/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Vista/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Vista/Scripts/post_reservation/.gitignore b/managementnode/tools/Windows_Vista/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Vista/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Vista/Scripts/post_reserve/.gitignore b/managementnode/tools/Windows_Vista/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Vista/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Vista/Scripts/pre_capture/.gitignore b/managementnode/tools/Windows_Vista/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Vista/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Vista/Scripts/pre_reload/.gitignore b/managementnode/tools/Windows_Vista/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Vista/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Vista/Updates/x86/.gitignore b/managementnode/tools/Windows_Vista/Updates/x86/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Vista/Updates/x86/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_Vista/Updates/x86_64/.gitignore b/managementnode/tools/Windows_Vista/Updates/x86_64/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_Vista/Updates/x86_64/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_XP/Drivers/.gitignore b/managementnode/tools/Windows_XP/Drivers/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_XP/Drivers/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_XP/Scripts/post_initial_connection/.gitignore b/managementnode/tools/Windows_XP/Scripts/post_initial_connection/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_XP/Scripts/post_initial_connection/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_XP/Scripts/post_load/.gitignore b/managementnode/tools/Windows_XP/Scripts/post_load/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_XP/Scripts/post_load/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_XP/Scripts/post_reservation/.gitignore b/managementnode/tools/Windows_XP/Scripts/post_reservation/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_XP/Scripts/post_reservation/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_XP/Scripts/post_reserve/.gitignore b/managementnode/tools/Windows_XP/Scripts/post_reserve/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_XP/Scripts/post_reserve/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_XP/Scripts/pre_capture/.gitignore b/managementnode/tools/Windows_XP/Scripts/pre_capture/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_XP/Scripts/pre_capture/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_XP/Scripts/pre_reload/.gitignore b/managementnode/tools/Windows_XP/Scripts/pre_reload/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_XP/Scripts/pre_reload/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_XP/Updates/x86/.gitignore b/managementnode/tools/Windows_XP/Updates/x86/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_XP/Updates/x86/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_XP/Updates/x86_64/.gitignore b/managementnode/tools/Windows_XP/Updates/x86_64/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_XP/Updates/x86_64/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/managementnode/tools/Windows_XP/Utilities/Sysprep/.gitignore b/managementnode/tools/Windows_XP/Utilities/Sysprep/.gitignore
new file mode 100644
index 0000000..44c6794
--- /dev/null
+++ b/managementnode/tools/Windows_XP/Utilities/Sysprep/.gitignore
@@ -0,0 +1,11 @@
+#
+# The purpose of this file is to keep this directory from being empty so the
+# directory will be retained in the git repository. The directory is used by
+# the backend code for some scripts used during provisioning, and so needs to
+# be retained.
+#
+
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/mysql/update-vcl.sql b/mysql/update-vcl.sql
index ce33548..1dea030 100644
--- a/mysql/update-vcl.sql
+++ b/mysql/update-vcl.sql
@@ -879,10 +879,13 @@
   `password` varchar(256) NOT NULL default '',
   `secretid` smallint(5) unsigned NOT NULL,
   PRIMARY KEY (`id`),
-  UNIQUE KEY `domainDNSName` (`domainDNSName`),
+  KEY `domainDNSName` (`domainDNSName`),
   KEY `secretid` (`secretid`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
+CALL DropExistingIndices('addomain', 'domainDNSName');
+CALL AddIndexIfNotExists('addomain', 'domainDNSName');
+
 -- --------------------------------------------------------
 
 --
@@ -1111,6 +1114,7 @@
 -- Table structure change for table `managementnode`
 -- 
 
+ALTER TABLE `managementnode` CHANGE `lastcheckin` `lastcheckin` timestamp default 0;
 CALL AddColumnIfNotExists('managementnode', 'publicIPconfiguration', "enum('dynamicDHCP','manualDHCP','static') NOT NULL default 'dynamicDHCP'");
 CALL AddColumnIfNotExists('managementnode', 'publicSubnetMask', "varchar(56) default NULL");
 CALL AddColumnIfNotExists('managementnode', 'publicDefaultGateway', "varchar(56) default NULL");
@@ -1544,12 +1548,14 @@
 CREATE TABLE IF NOT EXISTS `vcldsemaphore` (
   `identifier` varchar(256) NOT NULL,
   `reservationid` mediumint(9) unsigned NOT NULL,
-  `pid` smallint(5) unsigned NOT NULL,
+  `pid` mediumint(8) unsigned NOT NULL,
   `expires` datetime NOT NULL,
   PRIMARY KEY (`identifier`),
   KEY `reservationid` (`reservationid`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
+ALTER TABLE `vcldsemaphore` CHANGE `pid` `pid` mediumint(8) unsigned NOT NULL;
+
 -- --------------------------------------------------------
 
 -- 
diff --git a/mysql/vcl.sql b/mysql/vcl.sql
index 95d68ca..a5e41b1 100644
--- a/mysql/vcl.sql
+++ b/mysql/vcl.sql
@@ -39,7 +39,7 @@
   `password` varchar(256) NOT NULL default '',
   `secretid` smallint(5) unsigned NOT NULL,
   PRIMARY KEY (`id`),
-  UNIQUE KEY `domainDNSName` (`domainDNSName`),
+  KEY `domainDNSName` (`domainDNSName`),
   KEY `secretid` (`secretid`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
@@ -682,7 +682,7 @@
   `hostname` varchar(50) NOT NULL default '',
   `ownerid` mediumint(8) unsigned NOT NULL default '1',
   `stateid` tinyint(3) unsigned NOT NULL default '0',
-  `lastcheckin` datetime default NULL,
+  `lastcheckin` timestamp default 0,
   `checkininterval` tinyint(3) unsigned NOT NULL default '12',
   `installpath` varchar(100) NOT NULL default '/install',
   `imagelibenable` tinyint(1) unsigned NOT NULL default '0',
@@ -1481,7 +1481,7 @@
 CREATE TABLE IF NOT EXISTS `vcldsemaphore` (
   `identifier` varchar(256) NOT NULL,
   `reservationid` mediumint(9) unsigned NOT NULL,
-  `pid` smallint(5) unsigned NOT NULL,
+  `pid` mediumint(8) unsigned NOT NULL,
   `expires` datetime NOT NULL,
   PRIMARY KEY (`identifier`),
   KEY `reservationid` (`reservationid`)
@@ -2103,7 +2103,7 @@
 -- 
 
 INSERT IGNORE INTO `user` (`id`, `uid`, `unityid`, `affiliationid`, `firstname`, `lastname`, `preferredname`, `email`, `emailnotices`, `IMtypeid`, `IMid`, `adminlevelid`, `width`, `height`, `bpp`, `audiomode`, `mapdrives`, `mapprinters`, `mapserial`, `showallgroups`, `lastupdated`) VALUES 
-(1, 101, 'admin', 1, 'vcl', 'admin', '', 'root@localhost', 0, NULL, NULL, 3, 1024, 768, 16, 'local', 1, 1, 1, 1, '2007-05-17 09:58:39'),
+(1, NULL, 'admin', 1, 'vcl', 'admin', '', 'root@localhost', 0, NULL, NULL, 3, 1024, 768, 16, 'local', 1, 1, 1, 1, '2007-05-17 09:58:39'),
 (2, NULL, 'vclreload', 1, 'vcl', 'reload', NULL, '', 0, NULL, NULL, 1, 1024, 768, 16, 'local', 1, 1, 0, 0, '0000-00-00 00:00:00'),
 (3, NULL, 'vclsystem', 1, 'vcl', 'system', NULL, '', 0, NULL, NULL, 1, 1024, 768, 16, 'local', 1, 1, 0, 0, '0000-00-00 00:00:00');
 
diff --git a/web/.gitignore b/web/.gitignore
new file mode 100644
index 0000000..54e45b2
--- /dev/null
+++ b/web/.gitignore
@@ -0,0 +1,9 @@
+.ht-inc/conf.php
+.ht-inc/cryptkey/cryptkeyid
+.ht-inc/cryptkey/private.pem
+.ht-inc/keys.pem
+.ht-inc/pubkey.pem
+.ht-inc/secrets.php
+.ht-inc/spyc-0.5.1/
+dojo/
+themes/**/css/dojo
diff --git a/web/.ht-inc/addomain.php b/web/.ht-inc/addomain.php
index e75639d..a7259d5 100644
--- a/web/.ht-inc/addomain.php
+++ b/web/.ht-inc/addomain.php
@@ -204,7 +204,7 @@
 				       . "WHERE cryptkeyid = $cryptkeyid AND "
 				       .       "secretid = $oldsecretid";
 				$qh = doQuery($query);
-				if(! ($row = mysql_fetch_assoc($qh))) {
+				if(! ($row = mysqli_fetch_assoc($qh))) {
 					# generate a new secret
 					$newsecretid = getSecretKeyID('addomain', 'secretid', 0);
 					$delids = array($oldsecretid);
@@ -221,7 +221,7 @@
 					       . "WHERE cs.secretid = $oldsecretid AND "
 					       .       "ck.hosttype = 'managementnode'";
 					$qh = doQuery($query);
-					while($row = mysql_fetch_assoc($qh))
+					while($row = mysqli_fetch_assoc($qh))
 						$secretidset[$row['mnid']][$newsecretid] = 1;
 					$values = getMNcryptkeyUpdates($secretidset, $cryptkeyid);
 					addCryptSecretKeyUpdates($values);
@@ -586,7 +586,7 @@
 		       .       "ia.imageid = i.id";
 		$qh = doQuery($query);
 		$images = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$images[] = $row['prettyname'];
 		if(count($images))
 			$msg = "This AD Domain cannot be deleted because the following <strong>images</strong> are using it:<br><br>\n" . implode("<br>\n", $images);
diff --git a/web/.ht-inc/authentication.php b/web/.ht-inc/authentication.php
index 5c933aa..7a93cc0 100644
--- a/web/.ht-inc/authentication.php
+++ b/web/.ht-inc/authentication.php
@@ -91,7 +91,7 @@
 		# check to see if shibauth entry still exists for $shibauthed
 		$query = "SELECT ts FROM shibauth WHERE id = $shibauthed";
 		$qh = doQuery($query, 101);
-		if($row = mysql_fetch_assoc($qh)) {
+		if($row = mysqli_fetch_assoc($qh)) {
 			$shibstart = $row['ts'];
 			# TODO if $shibstart is too old, expire the login session
 		}
@@ -363,7 +363,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 function ldapLogin($authtype, $userid, $passwd) {
 	global $HTMLheader, $printedHTMLheader, $authMechs, $phpVer;
-	$esc_userid = mysql_real_escape_string($userid);
+	$esc_userid = vcl_mysql_escape_string($userid);
 	if(! $fh = fsockopen($authMechs[$authtype]['server'], 636, $errno, $errstr, 5)) {
 		printLoginPageWithSkin($authtype, 1);
 		return;
@@ -435,7 +435,7 @@
 		       . "WHERE unityid = '$esc_userid' AND "
 		       .       "affiliationid = {$authMechs[$authtype]['affiliationid']}";
 		$qh = doQuery($query, 101);
-		if(! mysql_num_rows($qh)) {
+		if(! mysqli_num_rows($qh)) {
 			// if not, add user
 			$newid = updateLDAPUser($authtype, $userid);
 			if(is_null($newid))
@@ -514,7 +514,7 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function validateLocalAccount($user, $pass) {
-	$user = mysql_real_escape_string($user);
+	$user = vcl_mysql_escape_string($user);
 	$query = "SELECT l.salt "
 	       . "FROM localauth l, "
 	       .      "user u, "
@@ -524,8 +524,8 @@
 	       .       "a.name = 'Local' AND "
 	       .       "l.userid = u.id";
 	$qh = doQuery($query, 101);
-	if(mysql_num_rows($qh) != 1 ||
-	   (! ($row = mysql_fetch_assoc($qh))))
+	if(mysqli_num_rows($qh) != 1 ||
+	   (! ($row = mysqli_fetch_assoc($qh))))
 		return 0;
 
 	$passhash = sha1("$pass{$row['salt']}");
@@ -539,7 +539,7 @@
 	       .       "u.affiliationid = a.id AND "
 	       .       "a.name = 'Local'";
 	$qh = doQuery($query, 101);
-	if(mysql_num_rows($qh) == 1)
+	if(mysqli_num_rows($qh) == 1)
 		return 1;
 	else
 		return 0;
@@ -559,8 +559,8 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function addLoginLog($login, $mech, $affiliationid, $passfail, $code='none') {
-	$login = mysql_real_escape_string($login);
-	$mech = mysql_real_escape_string($mech);
+	$login = vcl_mysql_escape_string($login);
+	$mech = vcl_mysql_escape_string($mech);
 	$query = "INSERT INTO loginlog "
 	       .        "(user, "
 	       .        "authmech, "
@@ -613,8 +613,8 @@
 	       . "LIMIT 3";
 	$qh = doQuery($query, 101);
 	$expire = time() - (SECINDAY * 3);
-	$rows = mysql_num_rows($qh);
-	if($row = mysql_fetch_assoc($qh)) {
+	$rows = mysqli_num_rows($qh);
+	if($row = mysqli_fetch_assoc($qh)) {
 		if($rows >= 3 || datetimeToUnix($row['start']) < $expire) {
 			if(in_array($mode, $noHTMLwrappers))
 				# do a redirect and handle removal on next page load so user can
diff --git a/web/.ht-inc/authmethods/itecsauth.php b/web/.ht-inc/authmethods/itecsauth.php
index ccdb9a4..be9b537 100644
--- a/web/.ht-inc/authmethods/itecsauth.php
+++ b/web/.ht-inc/authmethods/itecsauth.php
@@ -35,10 +35,10 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function addITECSUser($loginid) {
-	global $mysql_link_vcl, $ENABLE_ITECSAUTH;
+	global $mysqli_link_vcl, $ENABLE_ITECSAUTH;
 	if(! $ENABLE_ITECSAUTH)
 		return NULL;
-	$esc_loginid = mysql_real_escape_string($loginid);
+	$esc_loginid = vcl_mysql_escape_string($loginid);
 	$query = "SELECT id AS uid, "
 	       .        "first, " 
 	       .        "last, "
@@ -49,13 +49,13 @@
 	       . "FROM user "
 	       . "WHERE email = '$esc_loginid'";
 	$qh = doQuery($query, 101, "accounts");
-	if($row = mysql_fetch_assoc($qh)) {
+	if($row = mysqli_fetch_assoc($qh)) {
 		// FIXME test replacing ''s
 		// FIXME do we care if the account is active?
-		$first = mysql_real_escape_string($row['first']);
-		$last = mysql_real_escape_string($row['last']);
-		$loweruser = mysql_real_escape_string(strtolower($row['email']));
-		$email = mysql_real_escape_string($row['email']);
+		$first = vcl_mysql_escape_string($row['first']);
+		$last = vcl_mysql_escape_string($row['last']);
+		$loweruser = vcl_mysql_escape_string(strtolower($row['email']));
+		$email = vcl_mysql_escape_string($row['email']);
 		$query = "INSERT INTO user ("
 		       .        "uid, "
 		       .        "unityid, "
@@ -79,9 +79,9 @@
 		// FIXME might want this logged
 		doQuery($query, 101, 'vcl', 1);
 	}
-	if(mysql_affected_rows($mysql_link_vcl)) {
+	if(mysqli_affected_rows($mysqli_link_vcl)) {
 		$qh = doQuery("SELECT LAST_INSERT_ID() FROM user", 101);
-		if(! $row = mysql_fetch_row($qh)) {
+		if(! $row = mysqli_fetch_row($qh)) {
 			abort(101);
 		}
 		return $row[0];
@@ -104,14 +104,14 @@
 	global $ENABLE_ITECSAUTH;
 	if(! $ENABLE_ITECSAUTH)
 		return 0;
-	$loginid = mysql_real_escape_string($loginid);
+	$loginid = vcl_mysql_escape_string($loginid);
 	$query = "SELECT email "
 	       . "FROM user "
 	       . "WHERE email = '$loginid' AND "
 	       .       "(active = 1 OR "
 	       .       "activated = 0)";
 	$qh = doQuery($query, 101, "accounts");
-	if(mysql_num_rows($qh))
+	if(mysqli_num_rows($qh))
 		return 1;
 	return 0;
 }
@@ -160,7 +160,7 @@
 	       . "FROM user "
 	       . "WHERE email = '$userid'";
 	$qh = doQuery($query, 101, "accounts");
-	if(! ($userData = mysql_fetch_assoc($qh)))
+	if(! ($userData = mysqli_fetch_assoc($qh)))
 		return NULL;
 
 	$now = unixToDatetime(time());
@@ -191,11 +191,11 @@
 	// if get a row
 	//    update db
 	//    update results from select
-	$esc_userid = mysql_real_escape_string($userid);
-	$first = mysql_real_escape_string($userData['first']);
-	$last = mysql_real_escape_string($userData['last']);
-	$email = mysql_real_escape_string($userData['email']);
-	if($user = mysql_fetch_assoc($qh)) {
+	$esc_userid = vcl_mysql_escape_string($userid);
+	$first = vcl_mysql_escape_string($userData['first']);
+	$last = vcl_mysql_escape_string($userData['last']);
+	$email = vcl_mysql_escape_string($userData['email']);
+	if($user = mysqli_fetch_assoc($qh)) {
 		$user["unityid"] = $userid;
 		$user["firstname"] = $userData['first'];
 		$user["lastname"] = $userData["last"];
@@ -240,7 +240,7 @@
 		       . "WHERE u.affiliationid = af.id AND "
 		       .       "u.id = $id";
 		$qh = doQuery($query, 101);
-		$user = mysql_fetch_assoc($qh);
+		$user = mysqli_fetch_assoc($qh);
 
 		# add account to demo group
 		#$demoid = getUserGroupID('demo', getAffiliationID('ITECS'));
diff --git a/web/.ht-inc/authmethods/ldapauth.php b/web/.ht-inc/authmethods/ldapauth.php
index cf415c3..8aa53c6 100644
--- a/web/.ht-inc/authmethods/ldapauth.php
+++ b/web/.ht-inc/authmethods/ldapauth.php
@@ -34,13 +34,13 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function addLDAPUser($authtype, $userid) {
-	global $authMechs, $mysql_link_vcl;
+	global $authMechs, $mysqli_link_vcl;
 	$data = getLDAPUserData($authtype, $userid);
 	if(is_null($data))
 		return NULL;
 
 	$loweruserid = strtolower($userid);
-	$loweruserid = mysql_real_escape_string($loweruserid);
+	$loweruserid = vcl_mysql_escape_string($loweruserid);
 
 	# check for existance of an expired user if a numericid exists
 	if(array_key_exists('numericid', $data)) {
@@ -53,7 +53,7 @@
 		       .       "unityid != '$loweruserid'";
 		       #.       "affiliationid = {$authMechs[$authtype]['affiliationid']}";
 		$qh = doQuery($query, 101);
-		if($row = mysql_fetch_assoc($qh)) {
+		if($row = mysqli_fetch_assoc($qh)) {
 			# find the authtype for this user
 			foreach($authMechs as $index => $auth) {
 				if($auth['affiliationid'] == $row['affiliationid'] &&
@@ -95,9 +95,9 @@
 	       .        "'{$data['emailnotices']}', "
 	       .        "NOW())";
 	doQuery($query, 101, 'vcl', 1);
-	if(mysql_affected_rows($mysql_link_vcl)) {
+	if(mysqli_affected_rows($mysqli_link_vcl)) {
 		$qh = doQuery("SELECT LAST_INSERT_ID() FROM user", 101);
-		if(! $row = mysql_fetch_row($qh)) {
+		if(! $row = mysqli_fetch_row($qh)) {
 			abort(101);
 		}
 		return $row[0];
@@ -171,7 +171,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 function updateLDAPUser($authtype, $userid) {
 	global $authMechs;
-	$esc_userid = mysql_real_escape_string($userid);
+	$esc_userid = vcl_mysql_escape_string($userid);
 	$userData = getLDAPUserData($authtype, $userid);
 	if(is_null($userData))
 		return NULL;
@@ -213,7 +213,7 @@
 	# check to see if there is a matching entry where uid is NULL but unityid and affiliationid match
 	if(array_key_exists('numericid', $userData) &&
 	   is_numeric($userData['numericid']) &&
-	   ! mysql_num_rows($qh)) {
+	   ! mysqli_num_rows($qh)) {
 		$updateuid = 1;
 		$query = $qbase . "u.unityid = '$esc_userid' AND "
 		       .          "u.affiliationid = $affilid";
@@ -222,7 +222,7 @@
 	// if get a row
 	//    update db
 	//    update results from select
-	if($user = mysql_fetch_assoc($qh)) {
+	if($user = mysqli_fetch_assoc($qh)) {
 		$user["unityid"] = $userid;
 		$user["firstname"] = $userData['first'];
 		$user["lastname"] = $userData["last"];
@@ -277,7 +277,7 @@
 		       . "WHERE u.affiliationid = af.id AND "
 		       .       "u.id = $id";
 		$qh = doQuery($query, 101);
-		if(! $user = mysql_fetch_assoc($qh))
+		if(! $user = mysqli_fetch_assoc($qh))
 			return NULL;
 		$user['sshpublickeys'] = htmlspecialchars($user['sshpublickeys']);
 	}
@@ -305,9 +305,9 @@
 /// \param $userid - a userid without the affiliation part
 ///
 /// \return an array of user information with the following keys:\n
-/// \b first - first name of user (escaped with mysql_real_escape_string)\n
-/// \b last - last name of user (escaped with mysql_real_escape_string)\n
-/// \b email - email address of user (escaped with mysql_real_escape_string)\n
+/// \b first - first name of user (escaped with vcl_mysql_escape_string)\n
+/// \b last - last name of user (escaped with vcl_mysql_escape_string)\n
+/// \b email - email address of user (escaped with vcl_mysql_escape_string)\n
 /// \b emailnotices - 0 or 1, whether or not emails should be sent to user\n
 /// \b numericid - numeric id of user if $authtype is configured to include it
 ///
@@ -315,7 +315,7 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function getLDAPUserData($authtype, $userid) {
-	global $authMechs, $mysql_link_vcl;
+	global $authMechs, $mysqli_link_vcl;
 	$auth = $authMechs[$authtype];
 	$donumericid = 0;
 	if(array_key_exists('numericid', $auth))
@@ -392,16 +392,16 @@
 		}
 
 		if(array_key_exists(strtolower($auth['firstname']), $data))
-			$return['first'] = mysql_real_escape_string($data[strtolower($auth['firstname'])]);
+			$return['first'] = vcl_mysql_escape_string($data[strtolower($auth['firstname'])]);
 		else
 			$return['first'] = '';
 		if(array_key_exists(strtolower($auth['lastname']), $data))
-			$return['last'] = mysql_real_escape_string($data[strtolower($auth['lastname'])]);
+			$return['last'] = vcl_mysql_escape_string($data[strtolower($auth['lastname'])]);
 		else
 			$return['last'] = '';
 		if($donumericid && is_numeric($data[strtolower($auth['numericid'])]))
 			$return['numericid'] = $data[strtolower($auth['numericid'])];
-		$return['email'] = mysql_real_escape_string($data[strtolower($auth['email'])]);
+		$return['email'] = vcl_mysql_escape_string($data[strtolower($auth['email'])]);
 
 		return $return;
 	}
diff --git a/web/.ht-inc/authmethods/shibauth.php b/web/.ht-inc/authmethods/shibauth.php
index c814925..33d7b5d 100644
--- a/web/.ht-inc/authmethods/shibauth.php
+++ b/web/.ht-inc/authmethods/shibauth.php
@@ -39,7 +39,7 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function updateShibUser($userid) {
-	global $mysql_link_vcl;
+	global $mysqli_link_vcl;
 	$rc = getAffilidAndLogin($userid, $affilid);
 	if($rc == -1)
 		return NULL;
@@ -83,7 +83,7 @@
 	       . "WHERE unityid = '$userid' AND "
 	       .       "affiliationid = $affilid";
 	$qh = doQuery($query, 101);
-	if(! $row = mysql_fetch_assoc($qh)) {
+	if(! $row = mysqli_fetch_assoc($qh)) {
 		# add user to our db
 		$user['id'] = addShibUser($user);
 		return $user;
@@ -91,13 +91,13 @@
 
 	# update user's data in db
 	$user['id'] = $row['id'];
-	$first = mysql_real_escape_string($user['firstname']);
-	$last = mysql_real_escape_string($user['lastname']);
+	$first = vcl_mysql_escape_string($user['firstname']);
+	$last = vcl_mysql_escape_string($user['lastname']);
 	$query = "UPDATE user "
 	       . "SET firstname = '$first', "
 	       .     "lastname = '$last', ";
 	if(array_key_exists('email', $user)) {
-		$email = mysql_real_escape_string($user['email']);
+		$email = vcl_mysql_escape_string($user['email']);
 		$query .= "email = '$email', ";
 	}
     $query .=    "lastupdated = NOW(), "
@@ -124,10 +124,10 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function addShibUser($user) {
-	global $mysql_link_vcl;
-	$unityid = mysql_real_escape_string($user['unityid']);
-	$first = mysql_real_escape_string($user['firstname']);
-	$last = mysql_real_escape_string($user['lastname']);
+	global $mysqli_link_vcl;
+	$unityid = vcl_mysql_escape_string($user['unityid']);
+	$first = vcl_mysql_escape_string($user['firstname']);
+	$last = vcl_mysql_escape_string($user['lastname']);
 	$query = "INSERT INTO user "
 	       .        "(unityid, "
 	       .        "affiliationid, "
@@ -143,14 +143,14 @@
 	       .        "'$first', "
 	       .        "'$last', ";
 	if(array_key_exists('email', $user)) {
-		$email = mysql_real_escape_string($user['email']);
+		$email = vcl_mysql_escape_string($user['email']);
 		$query .=    "'$email', ";
 	}
 	$query .=       "0, "
 	       .        "NOW())";
 	doQuery($query, 101, 'vcl', 1);
-	if(mysql_affected_rows($mysql_link_vcl)) {
-		$user['id'] = mysql_insert_id($mysql_link_vcl);
+	if(mysqli_affected_rows($mysqli_link_vcl)) {
+		$user['id'] = mysqli_insert_id($mysqli_link_vcl);
 		return $user['id'];
 	}
 	else
@@ -188,18 +188,18 @@
 		# get id for the group's affiliation
 		$query = "SELECT id FROM affiliation WHERE shibname = '$shibaffil'";
 		$qh = doQuery($query, 101);
-		$row = mysql_fetch_assoc($qh);
+		$row = mysqli_fetch_assoc($qh);
 		$affilid = $row['id'];
 		# prepend shib- and escape it for mysql
-		$grp = mysql_real_escape_string("shib-" . $name);
+		$grp = vcl_mysql_escape_string("shib-" . $name);
 		array_push($newusergroups, getUserGroupID($grp, $affilid));
 	}
 
 	$query = "SELECT id, name FROM affiliation WHERE shibname = '$shibaffil'";
 	$qh = doQuery($query, 101);
-	$row = mysql_fetch_assoc($qh);
+	$row = mysqli_fetch_assoc($qh);
 	$affilid = $row['id'];
-	$grp = mysql_real_escape_string("All {$row['name']} Users");
+	$grp = vcl_mysql_escape_string("All {$row['name']} Users");
 	array_push($newusergroups, getUserGroupID($grp, $affilid));
 
 	$newusergroups = array_unique($newusergroups);
@@ -224,7 +224,7 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function addShibUserStub($affilid, $userid) {
-	global $mysql_link_vcl;
+	global $mysqli_link_vcl;
 	$query = "INSERT INTO user "
 	       .        "(unityid, "
 	       .        "affiliationid, "
@@ -238,7 +238,7 @@
 	       .        "0, "
 	       .        "0)";
 	doQuery($query);
-	if(mysql_affected_rows($mysql_link_vcl))
+	if(mysqli_affected_rows($mysqli_link_vcl))
 		return dbLastInsertID();
 	else
 		return NULL;
diff --git a/web/.ht-inc/blockallocations.php b/web/.ht-inc/blockallocations.php
index 66ee16f..9bf25e2 100644
--- a/web/.ht-inc/blockallocations.php
+++ b/web/.ht-inc/blockallocations.php
@@ -75,7 +75,7 @@
 	       . "WHERE id in ($inids) AND "
 	       .       "status = 'accepted'";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$blocks[$row['id']] = $row['name'];
 	print "<hr>\n";
 	print "<h2>" . i("Your Active Block Allocations") . "</h2>\n";
@@ -606,7 +606,7 @@
 			return;
 		}
 		$mnid = array_rand($managementnodes);
-		$escname = mysql_real_escape_string($data['name']);
+		$escname = vcl_mysql_escape_string($data['name']);
 		$query = "INSERT INTO blockRequest "
 		       .        "(name, "
 		       .        "imageid, "
@@ -644,7 +644,7 @@
 		       .       "end > NOW() AND "
 		       .       "blockRequestid = $blockreqid";
 		$qh = doQuery($query, 101);
-		if($row = mysql_fetch_assoc($qh)) {
+		if($row = mysqli_fetch_assoc($qh)) {
 			$checkCurBlockTime = 1;
 			$curBlockTime = $row;
 		}
@@ -660,7 +660,7 @@
 		$query = "DELETE FROM blockWebTime WHERE blockRequestid = $blockreqid";
 		doQuery($query, 101);
 
-		$escname = mysql_real_escape_string($data['name']);
+		$escname = vcl_mysql_escape_string($data['name']);
 		$query = "UPDATE blockRequest "
 		       . "SET name = '$escname', " 
 		       .     "imageid = {$data['imageid']}, "
@@ -673,7 +673,7 @@
 		doQuery($query, 101);
 	}
 	elseif($method == 'request') {
-		$esccomments = mysql_real_escape_string($data['comments']);
+		$esccomments = vcl_mysql_escape_string($data['comments']);
 		$query = "INSERT INTO blockRequest "
 		       .        "(name, "
 		       .        "imageid, "
@@ -811,7 +811,7 @@
 		       .       "blockRequestid = $blockreqid AND "
 		       .       "id != {$curBlockTime['id']}";
 		$qh = doQuery($query, 101);
-		if($row = mysql_fetch_assoc($qh)) {
+		if($row = mysqli_fetch_assoc($qh)) {
 			if($curBlockTime['end'] != $row['end']) {
 				# update old end time
 				$query = "UPDATE blockTimes "
@@ -1093,7 +1093,7 @@
 	       .       "u.email != ''";
 	$qh = doQuery($query);
 	$addrs = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$addrs[] = $row['email'];
 	return implode(',', $addrs);
 }
@@ -1119,7 +1119,7 @@
 	$qh = doQuery($query, 101);
 	$skips = array();
 	$noskips = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$key = "{$row['start']}:{$row['end']}";
 		if($row['skip'])
 			$skips[$key] = $row['id'];
@@ -1181,11 +1181,11 @@
 	       . "ORDER BY b.name";
 	$allblockids = array();
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if($row['group'] == '') {
 			$query3 = "SELECT name FROM usergroup WHERE id = {$row['usergroupid']}";
 			$qh3 = doQuery($query3, 101);
-			if($row3 = mysql_fetch_assoc($qh3))
+			if($row3 = mysqli_fetch_assoc($qh3))
 				$row['group'] = $row3['name'];
 		}
 		$allblockids[] = $row['id'];
@@ -1200,7 +1200,7 @@
 		        . "ORDER BY start "
 		        . "LIMIT 1";
 		$qh2 = doQuery($query2, 101);
-		if($row2 = mysql_fetch_assoc($qh2)) {
+		if($row2 = mysqli_fetch_assoc($qh2)) {
 			if(array_key_exists('tzoffset', $_SESSION['persistdata'])) {
 				$tmp = date('n/j/y+g:i=A=T', $row2['unixstart']);
 				$blocks[$row['id']]['nextstart'] = str_replace(array('+', '='), array('<br>', '&nbsp;'), $tmp);
@@ -1229,7 +1229,7 @@
 			       . "FROM blockWebDate "
 			       . "WHERE blockRequestid = $id";
 			$qh = doQuery($query, 101);
-			if(! $row = mysql_fetch_assoc($qh))
+			if(! $row = mysqli_fetch_assoc($qh))
 				abort(101);
 			$blocks[$id] = array_merge($request, $row);
 			$wdays = array();
@@ -1250,7 +1250,7 @@
 			       . "WHERE blockRequestid = {$request['id']} "
 			       . "ORDER BY startmeridian, starthour, startminute";
 			$qh = doQuery($query, 101);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				$blocks[$id]['swhour'][$row['order']] = $row['starthour'];
 				$blocks[$id]['swminute'][$row['order']] = $row['startminute'];
 				$blocks[$id]['swmeridian'][$row['order']] = $row['startmeridian'];
@@ -1267,7 +1267,7 @@
 			       . "FROM blockWebDate "
 			       . "WHERE blockRequestid = $id";
 			$qh = doQuery($query, 101);
-			if(! $row = mysql_fetch_assoc($qh))
+			if(! $row = mysqli_fetch_assoc($qh))
 				abort(101);
 			$blocks[$id] = array_merge($request, $row);
 			$query = "SELECT starthour, "
@@ -1281,7 +1281,7 @@
 			       . "WHERE blockRequestid = {$request['id']} "
 			       . "ORDER BY startmeridian, starthour, startminute";
 			$qh = doQuery($query, 101);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				$blocks[$id]['smhour'][$row['order']] = $row['starthour'];
 				$blocks[$id]['smminute'][$row['order']] = $row['startminute'];
 				$blocks[$id]['smmeridian'][$row['order']] = $row['startmeridian'];
@@ -1297,7 +1297,7 @@
 			       . "WHERE blockRequestid = $id "
 			       . "ORDER BY start";
 			$qh = doQuery($query, 101);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				if($row['date'] == '00/00/00')
 					$blocks[$id]['date'][$row['order']] = '';
 				else
@@ -1313,7 +1313,7 @@
 			       . "FROM blockWebTime "
 			       . "WHERE blockRequestid = {$request['id']}";
 			$qh = doQuery($query, 101);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				$blocks[$id]['slhour'][$row['order']] = $row['starthour'];
 				$blocks[$id]['slminute'][$row['order']] = $row['startminute'];
 				$blocks[$id]['slmeridian'][$row['order']] = $row['startmeridian'];
@@ -1528,7 +1528,7 @@
 	       . "ORDER BY b.name";
 	$qh = doQuery($query, 101);
 	$blocks = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$blocks[$row['id']] = $row;
 	if(empty($blocks))
 		return;
@@ -1543,7 +1543,7 @@
 			       . "FROM blockWebDate "
 			       . "WHERE blockRequestid = $id";
 			$qh = doQuery($query, 101);
-			if(! $row = mysql_fetch_assoc($qh))
+			if(! $row = mysqli_fetch_assoc($qh))
 				abort(101);
 			$blocks[$id] = array_merge($request, $row);
 			$wdays = array();
@@ -1564,7 +1564,7 @@
 			       . "WHERE blockRequestid = {$request['id']} "
 			       . "ORDER BY startmeridian, starthour, startminute";
 			$qh = doQuery($query, 101);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				$blocks[$id]['swhour'][$row['order']] = $row['starthour'];
 				$blocks[$id]['swminute'][$row['order']] = $row['startminute'];
 				$blocks[$id]['swmeridian'][$row['order']] = $row['startmeridian'];
@@ -1581,7 +1581,7 @@
 			       . "FROM blockWebDate "
 			       . "WHERE blockRequestid = $id";
 			$qh = doQuery($query, 101);
-			if(! $row = mysql_fetch_assoc($qh))
+			if(! $row = mysqli_fetch_assoc($qh))
 				abort(101);
 			$blocks[$id] = array_merge($request, $row);
 			$query = "SELECT starthour, "
@@ -1595,7 +1595,7 @@
 			       . "WHERE blockRequestid = {$request['id']} "
 			       . "ORDER BY startmeridian, starthour, startminute";
 			$qh = doQuery($query, 101);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				$blocks[$id]['smhour'][$row['order']] = $row['starthour'];
 				$blocks[$id]['smminute'][$row['order']] = $row['startminute'];
 				$blocks[$id]['smmeridian'][$row['order']] = $row['startmeridian'];
@@ -1611,7 +1611,7 @@
 			       . "WHERE blockRequestid = $id "
 			       . "ORDER BY start";
 			$qh = doQuery($query, 101);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				if($row['date'] == '00/00/00')
 					$blocks[$id]['date'][$row['order']] = '';
 				else
@@ -1627,7 +1627,7 @@
 			       . "FROM blockWebTime "
 			       . "WHERE blockRequestid = {$request['id']}";
 			$qh = doQuery($query, 101);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				$blocks[$id]['slhour'][$row['order']] = $row['starthour'];
 				$blocks[$id]['slminute'][$row['order']] = $row['startminute'];
 				$blocks[$id]['slmeridian'][$row['order']] = $row['startmeridian'];
@@ -1823,7 +1823,7 @@
 	$h .= "  </tr>\n";
 	$d = '';
 	$groups = getUserGroups(0, $user['affiliationid']);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if($row['repeating'] == 'weekly') {
 			$query2 = "SELECT DATE_FORMAT(start, '%m/%d/%y') AS swdate, "
 			        .        "DATE_FORMAT(end, '%m/%d/%y')AS ewdate, " 
@@ -1833,7 +1833,7 @@
 			        . "FROM blockWebDate "
 			        . "WHERE blockRequestid = {$row['id']}";
 			$qh2 = doQuery($query2, 101);
-			if(! $row2 = mysql_fetch_assoc($qh2))
+			if(! $row2 = mysqli_fetch_assoc($qh2))
 				abort(101);
 			$row = array_merge($row, $row2);
 			$wdays = array();
@@ -1854,7 +1854,7 @@
 			        . "ORDER BY startmeridian, starthour, startminute";
 			$qh2 = doQuery($query2, 101);
 			$row['times'] = array();
-			while($row2 = mysql_fetch_assoc($qh2)) {
+			while($row2 = mysqli_fetch_assoc($qh2)) {
 				$row['swhour'][$row2['order']] = $row2['starthour'];
 				$row['swminute'][$row2['order']] = $row2['startminute'];
 				$row['swmeridian'][$row2['order']] = $row2['startmeridian'];
@@ -1878,7 +1878,7 @@
 			        . "FROM blockWebDate "
 			        . "WHERE blockRequestid = {$row['id']}";
 			$qh2 = doQuery($query2, 101);
-			if(! $row2 = mysql_fetch_assoc($qh2))
+			if(! $row2 = mysqli_fetch_assoc($qh2))
 				abort(101);
 			$row = array_merge($row, $row2);
 			$query2 = "SELECT starthour, "
@@ -1893,7 +1893,7 @@
 			        . "ORDER BY startmeridian, starthour, startminute";
 			$qh2 = doQuery($query2, 101);
 			$row['times'] = array();
-			while($row2 = mysql_fetch_assoc($qh2)) {
+			while($row2 = mysqli_fetch_assoc($qh2)) {
 				$row['smhour'][$row2['order']] = $row2['starthour'];
 				$row['smminute'][$row2['order']] = $row2['startminute'];
 				$row['smmeridian'][$row2['order']] = $row2['startmeridian'];
@@ -1916,7 +1916,7 @@
 			        . "WHERE blockRequestid = {$row['id']} "
 			        . "ORDER BY start";
 			$qh2 = doQuery($query2, 101);
-			while($row2 = mysql_fetch_assoc($qh2)) {
+			while($row2 = mysqli_fetch_assoc($qh2)) {
 				if($row2['date'] == '00/00/00')
 					$row['date'][$row2['order']] = '';
 				else
@@ -1934,7 +1934,7 @@
 			        . "WHERE blockRequestid = {$row['id']}";
 			$qh2 = doQuery($query2, 101);
 			$row['slots'] = array(); # yyyy-mm-dd|hh:mm|hh:mm
-			while($row2 = mysql_fetch_assoc($qh2)) {
+			while($row2 = mysqli_fetch_assoc($qh2)) {
 				$row['slhour'][$row2['order']] = $row2['starthour'];
 				$row['slminute'][$row2['order']] = $row2['startminute'];
 				$row['slmeridian'][$row2['order']] = $row2['startmeridian'];
@@ -2467,7 +2467,7 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function AJacceptBlockAllocationSubmit() {
-	global $mysql_link_vcl, $user;
+	global $mysqli_link_vcl, $user;
 	$blockid = getContinuationVar('blockid');
 	$comments = getContinuationVar('comments');
 	$validemail = getContinuationVar('validemail');
@@ -2523,9 +2523,9 @@
 	if(! $err) {
 		# update values for block allocation
 		if($validemail)
-			$esccomments = mysql_real_escape_string("COMMENTS: $comments|EMAIL: $emailtext");
+			$esccomments = vcl_mysql_escape_string("COMMENTS: $comments|EMAIL: $emailtext");
 		else
-			$esccomments = mysql_real_escape_string("COMMENTS: $comments|USER NOT EMAILED");
+			$esccomments = vcl_mysql_escape_string("COMMENTS: $comments|USER NOT EMAILED");
 		$query = "UPDATE blockRequest "
 				 . "SET name = '$name', ";
 		if($setusergroup)
@@ -2535,7 +2535,7 @@
 			    .     "managementnodeid = '$mnid' "
 		       . "WHERE id = $blockid";
 		doQuery($query, 101);
-		if(! mysql_affected_rows($mysql_link_vcl)) {
+		if(! mysqli_affected_rows($mysqli_link_vcl)) {
 			$errmsg = i("Error encountered while updating status of block allocation.");
 			$err = 1;
 		}
@@ -2694,7 +2694,7 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function AJrejectBlockAllocationSubmit() {
-	global $mysql_link_vcl;
+	global $mysqli_link_vcl;
 	$blockid = getContinuationVar('blockid');
 	$comments = getContinuationVar('comments');
 	$validemail = getContinuationVar('validemail');
@@ -2727,16 +2727,16 @@
 	if(! $err) {
 		# update values for block allocation
 		if($validemail)
-			$esccomments = mysql_real_escape_string("COMMENTS: $comments|EMAIL: $emailtext");
+			$esccomments = vcl_mysql_escape_string("COMMENTS: $comments|EMAIL: $emailtext");
 		else
-			$esccomments = mysql_real_escape_string("COMMENTS: $comments|REJECTREASON: $emailtext");
+			$esccomments = vcl_mysql_escape_string("COMMENTS: $comments|REJECTREASON: $emailtext");
 		$query = "UPDATE blockRequest "
 				 . "SET name = 'rejected', "
 				 .     "status = 'rejected', "
 				 .     "comments = '$esccomments' "
 				 . "WHERE id = $blockid";
 		doQuery($query, 101);
-		if(! mysql_affected_rows($mysql_link_vcl)) {
+		if(! mysqli_affected_rows($mysqli_link_vcl)) {
 			$errmsg = i("Error encountered while updating status of block allocation.");
 			$err = 1;
 		}
@@ -2785,7 +2785,7 @@
 	$qh = doQuery($query, 101);
 	$data = array();
 	$items = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$items[] = $row;
 	$cont = addContinuationsEntry('AJtoggleBlockTime', array('blockid' => $blockid));
 	$data['cont'] = $cont;
@@ -2809,7 +2809,7 @@
 	       . "FROM blockTimes "
 	       . "WHERE id = $timeid";
 	$qh = doQuery($query, 101);
-	if(! ($row = mysql_fetch_assoc($qh)) || $row['blockRequestid'] != $blockid) {
+	if(! ($row = mysqli_fetch_assoc($qh)) || $row['blockRequestid'] != $blockid) {
 		$data['error'] = i("Invalid block time submitted");
 		sendJSON($data);
 		return;
@@ -3347,7 +3347,7 @@
 	       . "ORDER BY t.start "
 	       . "LIMIT 1";
 	$qh = doQuery($query, 101);
-	if($data = mysql_fetch_assoc($qh)) {
+	if($data = mysqli_fetch_assoc($qh)) {
 		if(! is_numeric($data['subimages']))
 			$data['subimages'] = 0;
 		$query = "SELECT c.id, "
@@ -3370,7 +3370,7 @@
 		       .       "c.stateid = s.id";
 		$qh = doQuery($query, 101);
 		$data['comps'] = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$data['comps'][$row['id']] = $row;
 		return $data;
 	}
@@ -3454,7 +3454,7 @@
 	       . "WHERE b.id = d.blockRequestid AND "
 	       .       "b.id = $blockid";
 	$qh = doQuery($query, 101);
-	$row = mysql_fetch_assoc($qh);
+	$row = mysqli_fetch_assoc($qh);
 	if(empty($row))
 		return $rt;
 	$row['wdayschecked'] = $rt['wdayschecked'];
@@ -3505,7 +3505,7 @@
 	$blockid = getContinuationVar('blockid');
 	$query = "SELECT repeating FROM blockRequest WHERE id = $blockid";
 	$qh = doQuery($query, 101);
-	if(! ($row = mysql_fetch_assoc($qh))) {
+	if(! ($row = mysqli_fetch_assoc($qh))) {
 		sendJSON(array('error' => i("Error: Failed to fetch start/end times for block allocation.")));
 		return;
 	}
@@ -3524,7 +3524,7 @@
 		$startms = array();
 		$endhs = array();
 		$endms = array();
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			$starth = hour12to24($row['starthour'], $row['startmeridian']);
 			$endh = hour12to24($row['endhour'], $row['endmeridian']);
 			$starths[] = $starth;
@@ -3550,7 +3550,7 @@
 		       . "WHERE blockRequestid = $blockid";
 		$qh = doQuery($query, 101);
 		$data = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$data[$row['order']] = $row;
 		$query = "SELECT MONTH(start) AS month, "
 		       .        "DAY(start) AS day, "
@@ -3566,7 +3566,7 @@
 		$startms = array();
 		$endhs = array();
 		$endms = array();
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			$id = $row['days'];
 			$months[] = $row['month'];
 			$days[] = $row['day'];
@@ -3696,7 +3696,7 @@
 		       . "WHERE stateid IN (2, 3, 6, 8, 11) AND "
 		       .       "type = 'blade'";
 		$qh = doQuery($query, 101);
-		if($row = mysql_fetch_row($qh))
+		if($row = mysqli_fetch_row($qh))
 			$data['total'] = $row[0];
 	}
 	else
@@ -3743,7 +3743,7 @@
 		       .       "u.affiliationid = {$user['affiliationid']}";
 	}
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		for($binstart = $start, $binend = $start + 900, $binindex = 0; 
 		   $binend <= $end;
 		   $binstart += 900, $binend += 900, $binindex++) {
@@ -3770,7 +3770,7 @@
 		       . "WHERE stateid IN (2, 3, 6, 8, 11) AND "
 		       .       "type = 'virtualmachine'";
 		$qh = doQuery($query, 101);
-		if($row = mysql_fetch_row($qh))
+		if($row = mysqli_fetch_row($qh))
 			$data['total'] = $row[0];
 	}
 	else
@@ -3817,7 +3817,7 @@
 		       .       "u.affiliationid = {$user['affiliationid']}";
 	}
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		for($binstart = $start, $binend = $start + 900, $binindex = 0; 
 		   $binend <= $end;
 		   $binstart += 900, $binend += 900, $binindex++) {
@@ -3869,15 +3869,14 @@
 	$first = 1;
 	$firststart = '';
 	$laststart = '';
-	while($row = mysql_fetch_assoc($qh)) {
-		if($first && ! is_null($row['blockStart'])) {
+	while($row = mysqli_fetch_assoc($qh)) {
+		if(is_null($row['blockStart']))
+			continue;
+		if($first) {
 			$firststart = datetimeToUnix($row['blockStart']);
 			$first = 0;
 		}
-		elseif(! is_null($row['blockStart']))
-			$laststart = datetimeToUnix($row['blockStart']);
-		if(is_null($row['blockStart']))
-			continue;
+		$laststart = datetimeToUnix($row['blockStart']);
 		$percent = (int)($row['used'] / $row['allocated'] * 100);
 		$startts = datetimeToUnix($row['blockStart']);
 		$usage[$startts] = array('percent' => $percent,
diff --git a/web/.ht-inc/computer.php b/web/.ht-inc/computer.php
index 6c6668d..3a9e117 100644
--- a/web/.ht-inc/computer.php
+++ b/web/.ht-inc/computer.php
@@ -821,7 +821,7 @@
 		       . "ORDER BY rq.start "
 		       . "LIMIT 1";
 		$qh = doQuery($query);
-		if($row = mysql_fetch_assoc($qh)) {
+		if($row = mysqli_fetch_assoc($qh)) {
 			$cdata = $this->basecdata;
 			$cdata['compid'] = $rscid;
 			$cont = addContinuationsEntry('AJcanceltovmhostinuse', $cdata, 300, 1, 0);
@@ -973,7 +973,7 @@
 				       .       "vm.stateid = 10";
 				$qh = doQuery($query);
 				$vmids = array();
-				while($row = mysql_fetch_assoc($qh))
+				while($row = mysqli_fetch_assoc($qh))
 					$vmids[] = $row['id'];
 				$allids = implode(',', $vmids);
 				if($data['provisioning'] != 'none')  {
@@ -1235,7 +1235,7 @@
 					       .       "vm.vmhostid = v.id";
 					$qh = doQuery($query);
 					$fail = 0;
-					while($row = mysql_fetch_assoc($qh)) {
+					while($row = mysqli_fetch_assoc($qh)) {
 						if(! simpleAddRequest($row['id'], $imageid, $revid, $startdt,
 						                      $enddt, 18, $vclreloadid)) {
 							$fail = 1;
@@ -1357,7 +1357,7 @@
 					       .       "vm.vmhostid = v.id";
 					$qh = doQuery($query);
 					$fails = array();
-					while($row = mysql_fetch_assoc($qh)) {
+					while($row = mysqli_fetch_assoc($qh)) {
 						if(! simpleAddRequest($row['id'], $imageid, $revid, $startdt,
 						                      $enddt, 18, $vclreloadid)) {
 							$fails[] = $row['id'];
@@ -1451,7 +1451,7 @@
 							$qh = doQuery($query);
 							$fails = array();
 							$cnt = 0;
-							while($row = mysql_fetch_assoc($qh)) {
+							while($row = mysqli_fetch_assoc($qh)) {
 								$cnt++;
 								if(! simpleAddRequest($row['id'], $imageid, $revid, $startdt,
 								                      $enddt, 18, $vclreloadid)) {
@@ -1781,7 +1781,7 @@
 			       .       "deleted = 0";
 			$qh = doQuery($query);
 			$exists = array();
-			while($row = mysql_fetch_assoc($qh))
+			while($row = mysqli_fetch_assoc($qh))
 				$exists[] = $row['hostname'];
 			if(count($exists)) {
 				$hosts = implode(', ', $exists);
@@ -2049,7 +2049,7 @@
 				       .       "rq.laststateid NOT IN (1,5,11,12) AND "
 				       .       "rq.userid != $vclreloadid";
 				$qh = doQuery($query);
-				if(mysql_num_rows($qh)) {
+				if(mysqli_num_rows($qh)) {
 					$return['error'] = 1;
 					$errormsg[] = "This computer has an active reservation. NAT settings cannot be changed for computers having<br>active reservations.";
 				}
@@ -2099,7 +2099,7 @@
 				       .       "rq.laststateid NOT IN (1,5,11,12) AND "
 				       .       "rq.userid != $vclreloadid";
 				$qh = doQuery($query);
-				if(mysql_num_rows($qh)) {
+				if(mysqli_num_rows($qh)) {
 					$return['error'] = 1;
 					$errormsg[] = "This computer is the NAT host for other computers that have active reservations. NAT host<br>settings cannot be changed while providing NAT for active reservations.";
 				}
@@ -2140,7 +2140,7 @@
 		if(! empty($compid))
 			$query .= " AND id != $compid";
 		$qh = doQuery($query);
-		if(mysql_num_rows($qh))
+		if(mysqli_num_rows($qh))
 			return 1;
 		return 0;
 	}
@@ -2170,7 +2170,7 @@
 		if(! empty($compid))
 			$query .= " AND id != $compid";
 		$qh = doQuery($query);
-		if(mysql_num_rows($qh))
+		if(mysqli_num_rows($qh))
 			return 1;
 		return 0;
 	}
@@ -2199,7 +2199,7 @@
 		if(! empty($compid))
 			$query .= " AND id != $compid";
 		$qh = doQuery($query);
-		if(mysql_num_rows($qh))
+		if(mysqli_num_rows($qh))
 			return 1;
 		return 0;
 	}
@@ -2377,7 +2377,7 @@
 	///
 	////////////////////////////////////////////////////////////////////////////////
 	function AJcanceltovmhostinuse() {
-		global $mysql_link_vcl;
+		global $mysqli_link_vcl;
 		$compid = getContinuationVar('compid');
 		$type = 'none';
 		$query = "DELETE FROM request "
@@ -2387,7 +2387,7 @@
 		       .              "FROM reservation "
 		       .              "WHERE computerid = $compid)";
 		doQuery($query);
-		if(mysql_affected_rows($mysql_link_vcl))
+		if(mysqli_affected_rows($mysqli_link_vcl))
 			$type = 'future';
 		$query = "UPDATE request rq, "
 		       .         "reservation rs, "
@@ -2399,7 +2399,7 @@
 		       .       "rq.laststateid = ls.id AND "
 		       .       "ls.name = 'tovmhostinuse'";
 		doQuery($query);
-		if(mysql_affected_rows($mysql_link_vcl))
+		if(mysqli_affected_rows($mysqli_link_vcl))
 			$type = 'current';
 		$query = "SELECT rq.start "
 		       . "FROM request rq, "
@@ -2415,7 +2415,7 @@
 		       .       "rq.end > NOW() "
 		       . "ORDER BY rq.start";
 		$qh = doQuery($query);
-		if(mysql_num_rows($qh))
+		if(mysqli_num_rows($qh))
 			$arr = array('status' => 'failed');
 		else {
 			if($type == 'now')
@@ -2477,7 +2477,7 @@
 		       . "ORDER BY rq.start "
 		       . "LIMIT 1";
 		$qh = doQuery($query);
-		if($row = mysql_fetch_assoc($qh)) {
+		if($row = mysqli_fetch_assoc($qh)) {
 			if(! retryGetSemaphore($imageid, $revid, $mnid, $compid, $startdt, $enddt, $row['id']))
 				return 0;
 			# update existing reservation
@@ -2720,7 +2720,7 @@
 			       .       "vm.vmhostid = v.id";
 			$qh = doQuery($query);
 			$fail = 0;
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				if(! simpleAddRequest($row['id'], $imageid, $revid, $startdt,
 				                      $enddt, 18, $vclreloadid)) {
 					$fail = 1;
@@ -2811,7 +2811,7 @@
 			       . "WHERE v.computerid = $compid AND "
 			       .       "vm.vmhostid = v.id";
 			$qh = doQuery($query);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				$checkstart = getExistingChangeStateStartTime($row['id'], 18);
 				if($checkstart) {
 					if($checkstart > $start)
@@ -3069,7 +3069,7 @@
 							 .       "rq.end > '$startstamp' AND "
 							 .       "s.name NOT IN ('complete', 'deleted', 'failed', 'timeout')";
 					$qh = doQuery($query);
-					if(! mysql_num_rows($qh))
+					if(! mysqli_num_rows($qh))
 						$reloadnow[] = $compid;
 					else
 						$reloadasap[] = $compid;
@@ -3160,7 +3160,7 @@
 		       .       "s.name NOT IN ('deleted', 'failed', 'complete') AND "
 		       .       "rq.end > NOW()";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$skipcompids[] = $row['computerid'];
 		$query = "SELECT DISTINCT bc.computerid "
 		       . "FROM blockTimes bt, "
@@ -3173,7 +3173,7 @@
 		       .       "bt.skip = 0 AND "
 		       .       "br.status = 'accepted'";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$skipcompids[] = $row['computerid'];
 		$delids = array_diff($compids, $skipcompids);
 		$msg = '';
@@ -3254,7 +3254,7 @@
 		       .       "s.name NOT IN ('deleted', 'failed', 'complete') AND "
 		       .       "rq.end > NOW()";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$fails[] = $row['computerid'];
 		$delids = array_diff($compids, $fails);
 
@@ -3429,7 +3429,7 @@
 			       .       "rq.stateid NOT IN (1, 5, 11, 12) AND " # TODO might not want 11 (timeout)
 			       .       "rs.computerid IN ($allids)";
 			$qh = doQuery($query);
-			while($row = mysql_fetch_assoc($qh))
+			while($row = mysqli_fetch_assoc($qh))
 				$inusecompids[$row['computerid']] = 1;
 
 			# check initial conditions
@@ -3491,7 +3491,7 @@
 				       . "WHERE h.id IN ($ids) "
 				       . "GROUP BY vh.computerid";
 				$qh = doQuery($query);
-				while($row = mysql_fetch_assoc($qh)) {
+				while($row = mysqli_fetch_assoc($qh)) {
 					if($row['count'])
 						$fails['hasvms'][] = $row['id'];
 					else
@@ -3507,7 +3507,7 @@
 				       . "LEFT JOIN computer h ON (vh.computerid = h.id) "
 				       . "WHERE vm.id IN ($ids)";
 				$qh = doQuery($query);
-				while($row = mysql_fetch_assoc($qh)) {
+				while($row = mysqli_fetch_assoc($qh)) {
 					if($row['stateid'] != 20)
 						$fails['hostfail'][] = $row['id'];
 					else
@@ -3578,7 +3578,7 @@
 				$notes = processInputVar('notes', ARG_STRING);
 				if(get_magic_quotes_gpc())
 					$notes = stripslashes($notes);
-				$notes = mysql_real_escape_string($notes);
+				$notes = vcl_mysql_escape_string($notes);
 				$notes = $user["unityid"] . " " . unixToDatetime(time()) . "@"
 				       . $notes;
 			}
@@ -3634,7 +3634,7 @@
 						       .       "vm.vmhostid = v.id";
 						$qh = doQuery($query);
 						$setnoteids = array();
-						while($row = mysql_fetch_assoc($qh)) {
+						while($row = mysqli_fetch_assoc($qh)) {
 							$checkstart = getExistingChangeStateStartTime($row['id'], 18);
 							if($checkstart) {
 								if($checkstart > $reloadstart)
@@ -3865,7 +3865,7 @@
 			       . "WHERE v.computerid IN ($allids) AND "
 			       .       "vm.vmhostid = v.id";
 			$qh = doQuery($query);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				if(! array_key_exists($row['compid'], $maintvmids))
 					$maintvmids[$row['compid']] = array();
 				if($row['vmstateid'] == 10 &&
@@ -4000,8 +4000,8 @@
 								       . "GROUP BY rs.computerid "
 								       . "ORDER BY start";
 								$qh = doQuery($query);
-								if(mysql_num_rows($qh) == count($allvmids)) {
-									while($row = mysql_fetch_assoc($qh)) {
+								if(mysqli_num_rows($qh) == count($allvmids)) {
+									while($row = mysqli_fetch_assoc($qh)) {
 										$times[$row['start']] = 1;
 										$reqids[] = $row['id'];
 									}
@@ -4022,7 +4022,7 @@
 										       .       "rs.imageid = '{$profiles[$profileid]['imageid']}' AND "
 										       .       "rq.stateid = 21";
 										$qh = doQuery($query);
-										if($row = mysql_fetch_assoc($qh)) {
+										if($row = mysqli_fetch_assoc($qh)) {
 											# node was previously scheduled to be reloaded for vmhostinuse
 											if($times[0] > $start) {
 												# update existing reservations
@@ -4286,7 +4286,7 @@
 		       .       "rq.start <= '$startcheckdt' AND "
 		       .       "rq.end > NOW()";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$fails[] = $row['computerid'];
 
 		$nowids = array_diff($compids, $fails);
@@ -4454,7 +4454,7 @@
 		       .       "rq.laststateid NOT IN (1,5,11,12) AND "
 		       .       "rq.userid != $vclreloadid";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$inusecompids[] = $row['computerid'];
 
 		$tmp = getUserResources(array($this->restype . "Admin"), array("administer"), 0, 1);
@@ -4799,7 +4799,7 @@
 		       .       "s.name NOT IN ('timedout','deleted','complete')";
 		$qh = doQuery($query);
 		$data = array();
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			$msg = "<strong>{$row['hostname']}</strong><br>";
 			if($row['start'] == '') {
 				$msg .= "(No reservations)<br><hr>";
@@ -4888,7 +4888,7 @@
 		       .          "l.start DESC";
 		$qh = doQuery($query);
 		$data = array();
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			if(! is_numeric($row['end']))
 				continue;
 			$msg = "<strong>{$row['hostname']}</strong><br>";
@@ -5076,7 +5076,7 @@
 		       .       "eth1macaddress IN ('$ineth1s')";
 		$qh = doQuery($query);
 		$errmsg = '';
-		if(mysql_num_rows($qh)) {
+		if(mysqli_num_rows($qh)) {
 			$errmsg .= "The specified starting MAC address combined with the number ";
 			$errmsg .= "of computers entered will result in a MAC address already ";
 			$errmsg .= "assigned to another computer.";
diff --git a/web/.ht-inc/conf-default.php b/web/.ht-inc/conf-default.php
index 255991b..e64ea50 100644
--- a/web/.ht-inc/conf-default.php
+++ b/web/.ht-inc/conf-default.php
@@ -56,11 +56,15 @@
 
 
 #######################   end required modifications ###########################
+$host = $_SERVER['HTTP_HOST'];
+if (strpos($host, ':')) {
+	$host = substr($host, 0, strpos($host, ':'));
+}
 
 define("BASEURL", "https://{$_SERVER['HTTP_HOST']}/vcl");   // no trailing slash - all of the URL except /index.php
 define("SCRIPT", "/index.php");                 // this should only be "/index.php" unless you rename index.php to something else
 define("HOMEURL", "https://{$_SERVER['HTTP_HOST']}/vcl/"); // url to go to when someone clicks HOME or Logout
-define("COOKIEDOMAIN", "{$_SERVER['HTTP_HOST']}");       // domain in which cookies are set
+define("COOKIEDOMAIN", "$host");       // domain in which cookies are set
 
 define("DEFAULTGROUP", "adminUsers"); // if a user is in no groups, use reservation
 										  //   length attriubtes from this group
diff --git a/web/.ht-inc/config.php b/web/.ht-inc/config.php
index 3ed2cb2..531424d 100644
--- a/web/.ht-inc/config.php
+++ b/web/.ht-inc/config.php
@@ -65,7 +65,7 @@
 		$query .= "ORDER BY cv.configid, cv.name";
 		$variables = array();
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$variables[$row['configid']][$row['id']] = $row;
 
 		# config subimages
@@ -85,7 +85,7 @@
 			$query .= "AND configid = $id ";
 		$query .= "ORDER BY s.configid, i.prettyname";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$variables[$row['configid']][$row['id']] = $row;
 
 		# configs
@@ -121,7 +121,7 @@
 			$query .= " AND c.deleted = 0";
 		$qh = doQuery($query);
 		$configs = array();
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			if(array_key_exists($row['id'], $variables))
 				$row['variables'] = $variables[$row['id']];
 			else
@@ -166,7 +166,7 @@
 		       .       "c.configtypeid = ct.id AND "
 		       .       "c.deleted = 0";
 		$qh = doQuery($query);
-		if($row = mysql_fetch_assoc($qh))
+		if($row = mysqli_fetch_assoc($qh))
 			return $row;
 		else
 			return NULL;
@@ -245,11 +245,11 @@
 		}
 		$sets = array();
 		if($curdata['name'] != $vars['name']) {
-			$name = mysql_real_escape_string($vars['name']);
+			$name = vcl_mysql_escape_string($vars['name']);
 			$sets[] = "name = '$name'";
 		}
 		if($curdata['data'] != $vars['data']) {
-			$data = mysql_real_escape_string($vars['data']);
+			$data = vcl_mysql_escape_string($vars['data']);
 			$sets[] = "data = '$data'";
 		}
 		if($curdata['ownerid'] != $vars['ownerid'])
@@ -319,11 +319,11 @@
 				}
 				$sets = array();
 				if($vardata['name'] != $newvars[$id]['name']) {
-					$name = mysql_real_escape_string($newvars[$id]['name']);
+					$name = vcl_mysql_escape_string($newvars[$id]['name']);
 					$sets[] = "name = '$name'";
 				}
 				if($vardata['identifier'] != $newvars[$id]['identifier']) {
-					$identifier = mysql_real_escape_string($newvars[$id]['identifier']);
+					$identifier = vcl_mysql_escape_string($newvars[$id]['identifier']);
 					$sets[] = "identifier = '$identifier'";
 				}
 				if($vardata['datatypeid'] != $newvars[$id]['datatypeid']) {
@@ -332,7 +332,7 @@
 					$sets[] = "datatypeid = '{$newvars[$id]['datatypeid']}'";
 				}
 				if($vardata['defaultvalue'] != $newvars[$id]['defaultvalue']) {
-					$defaultvalue = mysql_real_escape_string($newvars[$id]['defaultvalue']);
+					$defaultvalue = vcl_mysql_escape_string($newvars[$id]['defaultvalue']);
 					$sets[] = "defaultvalue = '$defaultvalue'";
 				}
 				if($vardata['required'] != $newvars[$id]['required']) {
@@ -377,9 +377,9 @@
 		$inserts = array();
 		$datatypes = getConfigDataTypes();
 		foreach($newvars as $var) {
-			$name = mysql_real_escape_string($var['name']);
-			$identifier = mysql_real_escape_string($var['identifier']);
-			$defaultvalue = mysql_real_escape_string($var['defaultvalue']);
+			$name = vcl_mysql_escape_string($var['name']);
+			$identifier = vcl_mysql_escape_string($var['identifier']);
+			$defaultvalue = vcl_mysql_escape_string($var['defaultvalue']);
 			if(! array_key_exists($var['datatypeid'], $datatypes))
 				$var['datatypeid'] = $this->findDataTypeID($var['defaultvalue'], $datatypes);
 			$inserts[] = "('$name', "
@@ -407,7 +407,7 @@
 	///
 	////////////////////////////////////////////////////////////////////////////////
 	function addResource($vars) {
-		$name = mysql_real_escape_string($vars['name']);
+		$name = vcl_mysql_escape_string($vars['name']);
 		if($vars['type'] == 'Cluster') {
 			$query = "INSERT INTO config "
 			       .        "(name, "
@@ -436,7 +436,7 @@
 			doQuery($query);
 		}
 		else {
-			$data = mysql_real_escape_string($vars['data']);
+			$data = vcl_mysql_escape_string($vars['data']);
 			$query = "INSERT INTO config "
 			       .        "(name, "
 			       .        "configtypeid, "
@@ -501,10 +501,10 @@
 			return 0;
 		}
 		# check for existance of name
-		$name = mysql_real_escape_string($return['name']);
+		$name = vcl_mysql_escape_string($return['name']);
 		$query = "SELECT id FROM config WHERE name = '$name' AND id != $configid";
 		$qh = doQuery($query);
-		if(mysql_num_rows($qh)) {
+		if(mysqli_num_rows($qh)) {
 			$this->errmsg = "Another config with this name already exists.";
 			return 0;
 		}
@@ -1152,7 +1152,7 @@
 		       .       "c.deleted = 0";
 		$configmaps = array();
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			switch($row['configmaptype']) {
 				case "Image":
 					$row['mapto'] = $row['image'];
@@ -1478,7 +1478,7 @@
 		       .       "configstageid = {$return['stageid']} AND "
 		       .       "id != $configmapid";
 		$qh = doQuery($query);
-		if(mysql_num_rows($qh)) {
+		if(mysqli_num_rows($qh)) {
 			$this->errmsg = "The specified mapping already exists.";
 			return 0;
 		}
@@ -1526,7 +1526,7 @@
 		       .       "c.id in ($inlist)";
 		$configs = array();
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$configs[$row['id']] = $row['name'];
 		return $configs;
 	}
@@ -1542,7 +1542,7 @@
 		$query = "SELECT id, name FROM configstage ORDER BY name";
 		$stages = array();
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$stages[$row['id']] = $row['name'];
 		return $stages;
 	}
@@ -1597,7 +1597,7 @@
 			       .       "ct.prettyname = 'Config' AND "
 			       .       "cm.configid = c.id";
 			$qh = doQuery($query);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				if($row['subid'] == $configid)
 					return $row['config'];
 				if($reccnt < 20) {
@@ -1624,7 +1624,7 @@
 			       .       "ct.prettyname = 'Subimage' AND "
 			       .       "cm.configid = c.id";
 			$qh = doQuery($query);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				if($row['configid'] == $configid)
 					return $row['config'];
 				if($reccnt < 20) {
diff --git a/web/.ht-inc/dashboard.php b/web/.ht-inc/dashboard.php
index 78e469c..3c2df3f 100644
--- a/web/.ht-inc/dashboard.php
+++ b/web/.ht-inc/dashboard.php
@@ -193,22 +193,22 @@
 				 .       "rq.end > NOW()";
 	}
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_row($qh))
+	if($row = mysqli_fetch_row($qh))
 		$data[0]['val'] = $row[0];
 
 	$query = "SELECT COUNT(id) FROM computer WHERE stateid IN (2, 3, 6, 8, 11)";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_row($qh))
+	if($row = mysqli_fetch_row($qh))
 		$data[1]['val'] = $row[0];
 
 	$query = "SELECT COUNT(id) FROM computer WHERE stateid = 8";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_row($qh))
+	if($row = mysqli_fetch_row($qh))
 		$data[2]['val'] = $row[0];
 
 	$query = "SELECT COUNT(id) FROM computer WHERE stateid = 5";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_row($qh))
+	if($row = mysqli_fetch_row($qh))
 		$data[3]['val'] = $row[0];
 	return $data;
 }
@@ -259,7 +259,7 @@
 	}
 	$data = array();
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$data[] = $row;
 	return $data;
 }
@@ -310,7 +310,7 @@
 	}
 	$data = array();
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$data[] = $row;
 	return $data;
 }
@@ -360,7 +360,7 @@
 	}
 	$data = array();
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$data[] = $row;
 	return $data;
 }
@@ -407,7 +407,7 @@
 	}
 	$data = array();
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$data[] = $row;
 	return $data;
 }
@@ -458,7 +458,7 @@
 	}
 	$data = array();
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$data[] = $row;
 	return $data;
 }
@@ -522,7 +522,7 @@
 		       .       "l.userid != $reloadid";
 	}
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if($row['stateid'] == 14)
 			$row['stateid'] = $row['laststateid'];
 		if($row['end'] > time() &&
@@ -583,7 +583,7 @@
 				 .       "bt.end > NOW()";
 	}
 	$qh = doQuery($query, 101);
-	$row = mysql_fetch_row($qh);
+	$row = mysqli_fetch_row($qh);
 	$blockcount = $row[0];
 	# computers in blockComputers for active allocations
 	if($affilid == 0) {
@@ -612,7 +612,7 @@
 	$qh = doQuery($query, 101);
 	$total = 0;
 	$used = 0;
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$total++;
 		if($row['stateid'] == 3 || $row['stateid'] == 8)
 			$used++;
@@ -642,7 +642,7 @@
 	}
 	$alloc = 0;
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$alloc += $row['numMachines'];
 	if($alloc)
 		$failed = sprintf('%d / %d (%0.2f %%)', ($alloc - $total), $alloc, (($alloc - $total) / $alloc * 100));
@@ -700,7 +700,7 @@
 	$query .= "ORDER BY rq.start";
 	$qh = doQuery($query, 101);
 	$data = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$tmp = explode('.', $row['computer']);
 		$row['computer'] = $tmp[0];
 		$row['start'] = date('D h:i', $row['start']);
@@ -758,7 +758,7 @@
 	$query .= "ORDER BY rq.start";
 	$qh = doQuery($query, 101);
 	$data = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if(is_null($row['revisioncomments']))
 			$row['revisioncomments'] = '(none)';
 		$tmp = explode('.', $row['computer']);
@@ -816,7 +816,7 @@
 	$current = array();
 	$old = array();
 	$never = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$tmp = explode('.', $row['hostname']);
 		$row['hostname'] = $tmp[0];
 		if($row['checkin'] < 0)
diff --git a/web/.ht-inc/groups.php b/web/.ht-inc/groups.php
index 29ae0f4..306395e 100644
--- a/web/.ht-inc/groups.php
+++ b/web/.ht-inc/groups.php
@@ -1102,7 +1102,7 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function checkForGroupName($name, $type, $id, $extraid) {
-	$name = mysql_real_escape_string($name);
+	$name = vcl_mysql_escape_string($name);
 	if($type == "user")
 		$query = "SELECT id FROM usergroup "
 		       . "WHERE name = '$name' AND "
@@ -1114,7 +1114,7 @@
 	if(! empty($id))
 		$query .= " AND id != $id";
 	$qh = doQuery($query, 101);
-	if(mysql_num_rows($qh))
+	if(mysqli_num_rows($qh))
 		return 1;
 	return 0;
 }
@@ -1162,7 +1162,7 @@
 		       . "WHERE id = {$data['groupid']}";
 	}
 	doQuery($query, 300);
-	return mysql_affected_rows($GLOBALS['mysql_link_vcl']);
+	return mysqli_affected_rows($GLOBALS['mysqli_link_vcl']);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -1221,7 +1221,7 @@
 	}
 	$qh = doQuery($query, 305);
 	clearPrivCache();
-	return mysql_affected_rows($GLOBALS['mysql_link_vcl']);
+	return mysqli_affected_rows($GLOBALS['mysqli_link_vcl']);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -1254,7 +1254,7 @@
 		       .       "rg.resourcetypeid = rt.id";
 		$usedby = array();
 		$qh = doQuery($query, 310);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$usedby[] = $row['name'];
 		if(count($usedby)) {
 			$msgs[] = "<h3>Owning User Group for Resource Groups</h3>\n"
@@ -1269,7 +1269,7 @@
 				 .       "ug.affiliationid = a.id";
 		$usedby = array();
 		$qh = doQuery($query, 313);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$usedby[] = $row['name'];
 		if(count($usedby)) {
 			$msgs[] = "<h3>'Editable by' Group for User Groups</h3>\n"
@@ -1281,7 +1281,7 @@
 		       . "WHERE usergroupid = $groupid";
 		$qh = doQuery($query);
 		$usedby = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$usedby[] = getNodePath($row['privnodeid']);
 		if(count($usedby)) {
 			$msgs[] = "<h3>Assigned at Privilege Nodes</h3>\n"
@@ -1294,7 +1294,7 @@
 		       .   "AND status IN ('requested', 'accepted')";
 		$qh = doQuery($query, 311);
 		$usedby = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$usedby[] = $row['name'];
 		if(count($usedby)) {
 			$msgs[] = "<h3>Assigned for Block Allocations</h3>\n"
@@ -1304,7 +1304,7 @@
 		$query = "SELECT name FROM serverprofile WHERE admingroupid = $groupid";
 		$qh = doQuery($query);
 		$usedby = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$usedby[] = $row['name'];
 		if(count($usedby)) {
 			$msgs[] = "<h3>Admin User Group for Server Profiles</h3>\n"
@@ -1314,7 +1314,7 @@
 		$query = "SELECT name FROM serverprofile WHERE logingroupid = $groupid";
 		$qh = doQuery($query);
 		$usedby = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$usedby[] = $row['name'];
 		if(count($usedby)) {
 			$msgs[] = "<h3>Access User Group for Server Profiles</h3>\n"
@@ -1328,7 +1328,7 @@
 		       .       "s.requestid = rq.id";
 		$qh = doQuery($query);
 		$usedby = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$usedby[] = $row['name'];
 		if(count($usedby)) {
 			$msgs[] = "<h3>Admin User Group for Server Requests</h3>\n"
@@ -1342,7 +1342,7 @@
 		       .       "s.requestid = rq.id";
 		$qh = doQuery($query);
 		$usedby = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$usedby[] = $row['name'];
 		if(count($usedby)) {
 			$msgs[] = "<h3>Access User Group for Server Requests</h3>\n"
@@ -1366,7 +1366,7 @@
 	$query = "SELECT hostname FROM managementnode WHERE imagelibgroupid = $groupid";
 	$qh = doQuery($query);
 	$usedby = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$usedby[] = $row['hostname'];
 	if(count($usedby)) {
 		$msgs[] = "<h3>Management Node Image Library Group</h3>\n"
@@ -1376,7 +1376,7 @@
 	$query = "SELECT DISTINCT privnodeid FROM resourcepriv WHERE resourcegroupid = $groupid";
 	$qh = doQuery($query);
 	$usedby = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$usedby[] = getNodePath($row['privnodeid']);
 	if(count($usedby)) {
 		$msgs[] = "<h3>Assigned at Privilege Nodes</h3>\n"
diff --git a/web/.ht-inc/help.php b/web/.ht-inc/help.php
index dd73adb..f632f6b 100644
--- a/web/.ht-inc/help.php
+++ b/web/.ht-inc/help.php
@@ -168,7 +168,7 @@
 	       . "ORDER BY l.finalend DESC "
 	       . "LIMIT 5";
 	$qh = doQuery($query, 290);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		# only include 1 computer from cluster reservations
 		if(array_key_exists($row['id'], $requests))
 			continue;
diff --git a/web/.ht-inc/image.php b/web/.ht-inc/image.php
index 9447aea..8f7bc88 100644
--- a/web/.ht-inc/image.php
+++ b/web/.ht-inc/image.php
@@ -96,6 +96,7 @@
 				$w = 12;
 				break;
 			case 'adauthenabled':
+			case 'maxinitialtime':
 				$w = 9;
 				break;
 			default:
@@ -146,7 +147,7 @@
 			case 'forcheckout':
 				return i("Available for Checkout");
 			case 'maxinitialtime':
-				return i("Max Initial Time");
+				return i("Max Reservation Duration");
 			case 'checkuser':
 				return i("Check Logged in User");
 			case 'rootaccess':
@@ -187,7 +188,7 @@
 		       . "ORDER BY rq.end DESC "
 		       . "LIMIT 1";
 		$qh = doQuery($query);
-		if($row = mysql_fetch_assoc($qh))
+		if($row = mysqli_fetch_assoc($qh))
 			$msgs[] = sprintf(i("There is at least one <strong>reservation</strong> for this image. The latest end time is %s."), prettyDatetime($row['end'], 1));;
 
 		# check blockComputers
@@ -205,7 +206,7 @@
 		       . "ORDER BY bt.end DESC "
 		       . "LIMIT 1";
 		$qh = doQuery($query);
-		if($row = mysql_fetch_assoc($qh))
+		if($row = mysqli_fetch_assoc($qh))
 			$msgs[] = sprintf(i("There is at least one <strong>Block Allocation</strong> with computers currently allocated with this image. Block Allocation %s has the latest end time which is %s."), $row['name'], prettyDatetime($row['end'], 1));
 
 		# check blockRequest
@@ -221,7 +222,7 @@
 		       . "ORDER BY bt.end DESC "
 		       . "LIMIT 1";
 		$qh = doQuery($query);
-		if($row = mysql_fetch_assoc($qh))
+		if($row = mysqli_fetch_assoc($qh))
 			$msgs[] = sprintf(i("There is at least one <strong>Block Allocation</strong> configured to use this image. Block Allocation %s has the latest end time which is %s."), $row['name'], prettyDatetime($row['end'], 1));
 
 		# check serverprofile
@@ -230,7 +231,7 @@
 		       . "WHERE imageid = $rscid";
 		$qh = doQuery($query);
 		$profiles = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$profiles[] = $row['name'];
 		if(count($profiles))
 			$msgs[] = i("The following <strong>Server Profiles</strong> are configured to use this image:") . "<br><br>\n" . implode("<br>\n", $profiles);
@@ -245,7 +246,7 @@
 		       .       "s.imagemetaid = im.id AND "
 		       .       "s.imageid = $rscid";
 		$images = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$images[] = $row['prettyname'];
 		if(count($images))
 			$msgs[] = i("The following <strong>images</strong> have the selected image assigned as a <strong>subimage</strong>:") . "<br><br>\n" . implode("<br>\n", $images);
@@ -255,7 +256,7 @@
 		       . "FROM vmprofile "
 		       . "WHERE imageid = $rscid";
 		$profiles = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$profiles[] = $row['profilename'];
 		if(count($profiles))
 			$msgs[] = i("The following <strong>VM Host Profiles</strong> have the this image selected:") . "<br><br>\n" . implode("<br>\n", $profiles);
@@ -431,6 +432,10 @@
 		$h .= "<div id=\"sethostnamediv\">\n";
 		$h .= labeledFormItem('sethostname', i('Set Computer Hostname'), 'select', $yesno);
 		$h .= "</div>\n";
+		# Max reservation time
+		$tmp = array('0' => 'Default for User');
+		$lengths = $tmp + getReservationLengths(201600);
+		$h .= labeledFormItem('maxinitialtime', i('Max Reservation Duration'), 'select', $lengths);
 		# sysprep
 		if($add) {
 			$h .= "<div id=\"sysprepdiv\">\n";
@@ -799,14 +804,17 @@
 		# forcheckout
 		if($data['checkout'] != $olddata['forcheckout'])
 			$updates[] = "forcheckout = {$data['checkout']}";
+		# maxinitialtime
+		if($data['maxinitialtime'] != $olddata['maxinitialtime'])
+			$updates[] = "maxinitialtime = {$data['maxinitialtime']}";
 		# description
 		if($data['desc'] != $olddata['description']) {
-			$escdesc = mysql_real_escape_string($data['desc']);
+			$escdesc = vcl_mysql_escape_string($data['desc']);
 			$updates[] = "description = '$escdesc'";
 		}
 		# usage
 		if($data['usage'] != $olddata['usage']) {
-			$escusage = mysql_real_escape_string($data['usage']);
+			$escusage = vcl_mysql_escape_string($data['usage']);
 			$updates[] = "`usage` = '$escusage'";
 		}
 
@@ -821,7 +829,7 @@
 		if($olddata['ostype'] == 'windows') {
 			if($data['adauthenabled'] != $olddata['adauthenabled']) {
 				if($data['adauthenabled']) {
-					$esc_baseou = mysql_real_escape_string($data['baseou']);
+					$esc_baseou = vcl_mysql_escape_string($data['baseou']);
 					$query = "INSERT INTO imageaddomain "
 					       .        "(imageid, "
 					       .        "addomainid, "
@@ -841,7 +849,7 @@
 			elseif($data['adauthenabled'] &&
 			       ($data['addomainid'] != $olddata['addomainid'] ||
 			       $data['baseou'] != $olddata['baseOU'])) {
-				$esc_baseou = mysql_real_escape_string($data['baseou']);
+				$esc_baseou = vcl_mysql_escape_string($data['baseou']);
 				$query = "UPDATE imageaddomain "
 				       . "SET addomainid = {$data['addomainid']}, "
 				       .     "baseOU = '$esc_baseou' "
@@ -868,7 +876,7 @@
 					 .        "{$data['sethostname']})";
 			doQuery($query, 101);
 			$qh = doQuery("SELECT LAST_INSERT_ID() FROM imagemeta", 101);
-			if(! $row = mysql_fetch_row($qh))
+			if(! $row = mysqli_fetch_row($qh))
 				abort(101);
 			$imagemetaid = $row[0];
 			$query = "UPDATE image "
@@ -979,7 +987,7 @@
 		       .       "rq.id = rs.requestid";
 		doQuery($query, 101);
 
-		$agree = mysql_real_escape_string(getContinuationVar('agree'));
+		$agree = vcl_mysql_escape_string(getContinuationVar('agree'));
 		$query = "INSERT INTO clickThroughs "
 		       .        "(userid, "
 		       .        "imageid, "
@@ -1095,10 +1103,10 @@
 		       . "ORDER BY revision DESC "
 		       . "LIMIT 1";
 		$qh = doQuery($query, 101);
-		$row = mysql_fetch_assoc($qh);
+		$row = mysqli_fetch_assoc($qh);
 		$newrevision = $row['revision'] + 1;
 		$newname = preg_replace("/{$row['revision']}$/", $newrevision, $row['imagename']);
-		$comments = mysql_real_escape_string($comments);
+		$comments = vcl_mysql_escape_string($comments);
 		$query = "INSERT INTO imagerevision "
 		       .        "(imageid, "
 		       .        "revision, "
@@ -1155,7 +1163,7 @@
 		if($autocaptured)
 			return 1;
 	
-		$agree = mysql_real_escape_string(getContinuationVar('agree'));
+		$agree = vcl_mysql_escape_string(getContinuationVar('agree'));
 		$query = "INSERT INTO clickThroughs "
 		       .        "(userid, "
 		       .        "imageid, "
@@ -1188,9 +1196,9 @@
 	/////////////////////////////////////////////////////////////////////////////
 	function addResource($data) {
 		global $user;
-		$data['desc'] = mysql_real_escape_string($data['desc']);
-		$data['usage'] = mysql_real_escape_string($data['usage']);
-		$data['comments'] = mysql_real_escape_string($data['comments']);
+		$data['desc'] = vcl_mysql_escape_string($data['desc']);
+		$data['usage'] = vcl_mysql_escape_string($data['usage']);
+		$data['comments'] = vcl_mysql_escape_string($data['comments']);
 	
 		# get architecture of base image
 		$query = "SELECT i.architecture "
@@ -1199,7 +1207,7 @@
 		       . "WHERE ir.imageid = i.id AND "
 		       .       "ir.id = {$data['basedoffrevisionid']}";
 		$qh = doQuery($query);
-		$row = mysql_fetch_assoc($qh);
+		$row = mysqli_fetch_assoc($qh);
 		$arch = $row['architecture'];
 	
 		$ownerdata = getUserInfo($data['owner'], 1);
@@ -1244,7 +1252,7 @@
 
 		# ad authentication
 		if($data['adauthenabled']) {
-			$esc_baseou = mysql_real_escape_string($data['baseou']);
+			$esc_baseou = vcl_mysql_escape_string($data['baseou']);
 			$query = "INSERT INTO imageaddomain "
 			       .        "(imageid, "
 			       .        "addomainid, "
@@ -1554,7 +1562,7 @@
 				 . "FROM subimages "
 				 . "WHERE imagemetaid = $imagemetaid";
 		$qh = doQuery($query, 101);
-		$row = mysql_fetch_row($qh);
+		$row = mysqli_fetch_row($qh);
 		if($row[0] == 0) {
 			$rc = checkClearImageMeta($imagemetaid, $imageid, 'subimages');
 			if($rc)
@@ -1570,7 +1578,7 @@
 			$query = "SELECT imageid FROM subimages WHERE imagemetaid = $imagemetaid";
 			$qh = doQuery($query, 101);
 			$subimages = array();
-			while($row = mysql_fetch_assoc($qh))
+			while($row = mysqli_fetch_assoc($qh))
 				$subimages[] = $row['imageid'];
 		}
 	
@@ -1604,6 +1612,7 @@
 	/// \b checkuser - reservations should be checked for a logged in user\n
 	/// \b rootaccess\n
 	/// \b sysprep - use sysprep when capturing revisions of this image\n
+	/// \b maxinitialtime - max time in minutes reservation can be used\n
 	/// \b connectmethodids - ids of assigned connect methods\n
 	/// \b requestid - requestid associated with image capture\n
 	/// \b imageid - id of base image\n
@@ -1635,6 +1644,7 @@
 		$return["checkuser"] = processInputVar("checkuser", ARG_NUMERIC);
 		$return["rootaccess"] = processInputVar("rootaccess", ARG_NUMERIC);
 		$return["sethostname"] = processInputVar("sethostname", ARG_NUMERIC);
+		$return["maxinitialtime"] = processInputVar("maxinitialtime", ARG_NUMERIC);
 		$return["sysprep"] = processInputVar("sysprep", ARG_NUMERIC); # only in add
 		$return["connectmethodids"] = processInputVar("connectmethodids", ARG_STRING); # only in add
 		$return["adauthenabled"] = processInputVar("adauthenabled", ARG_NUMERIC);
@@ -1741,6 +1751,10 @@
 			$return['error'] = 1;
 			$errormsg[] = i("Set Computer Hostname must be Yes or No");
 		}
+		if($return['maxinitialtime'] < 0 || $return['maxinitialtime'] > 201600) {
+			$return['error'] = 1;
+			$errormsg[] = i("Invalid Max Reservation Duration selected");
+		}
 		if($return['mode'] == 'add' && $return['sysprep'] != 0 &&
 		   $return['sysprep'] != 1) {
 			$return['error'] = 1;
@@ -1827,7 +1841,7 @@
 		if(! empty($id))
 			$query .= " AND id != $id";
 		$qh = doQuery($query, 101);
-		if(mysql_num_rows($qh))
+		if(mysqli_num_rows($qh))
 			return 1;
 		return 0;
 	}
@@ -1857,7 +1871,7 @@
 		        . "WHERE name = '$nodename' AND "
 		        .       "parent = 3";
 		$qh = doQuery($query, 101);
-		if(! $row = mysql_fetch_assoc($qh)) {
+		if(! $row = mysqli_fetch_assoc($qh)) {
 			$query2 = "INSERT INTO privnode "
 			        .        "(parent, "
 			        .        "name) "
@@ -1866,7 +1880,7 @@
 			        .        "'$nodename')";
 			doQuery($query2, 101);
 			$qh = doQuery($query, 101);
-			$row = mysql_fetch_assoc($qh);
+			$row = mysqli_fetch_assoc($qh);
 		}
 		$parent = $row['id'];
 		$query = "SELECT id "
@@ -1874,7 +1888,7 @@
 		        . "WHERE name = '{$ownerdata['login']}-$ownerid' AND "
 		        .       "parent = $parent";
 		$qh = doQuery($query, 101);
-		if($row = mysql_fetch_assoc($qh))
+		if($row = mysqli_fetch_assoc($qh))
 			$newnode = $row['id'];
 		else {
 			$query = "INSERT INTO privnode "
@@ -1882,7 +1896,7 @@
 			       . "VALUES ($parent, '{$ownerdata['login']}-$ownerid')";
 			doQuery($query, 101);
 			$qh = doQuery("SELECT LAST_INSERT_ID() FROM privnode", 101);
-			$row = mysql_fetch_row($qh);
+			$row = mysqli_fetch_row($qh);
 			$newnode = $row[0];
 		}
 	
@@ -1895,7 +1909,7 @@
 		        . "FROM usergroup "
 		        . "WHERE name = 'manageNewImages'";
 		$qh = doQuery($query, 101);
-		$row = mysql_fetch_assoc($qh);
+		$row = mysqli_fetch_assoc($qh);
 		$ownergroupid = $row['id'];
 		if($virtual)
 			$prefix = 'newvmimages';
@@ -1907,7 +1921,7 @@
 		       .       "ownerusergroupid = $ownergroupid AND "
 		       .       "resourcetypeid = 13";
 		$qh = doQuery($query, 101);
-		if($row = mysql_fetch_assoc($qh))
+		if($row = mysqli_fetch_assoc($qh))
 			$resourcegroupid = $row['id'];
 		else {
 			$query = "INSERT INTO resourcegroup "
@@ -1919,7 +1933,7 @@
 			       .         "13)";
 			doQuery($query, 305);
 			$qh = doQuery("SELECT LAST_INSERT_ID() FROM resourcegroup", 101);
-			$row = mysql_fetch_row($qh);
+			$row = mysqli_fetch_row($qh);
 			$resourcegroupid = $row[0];
 	
 			// map group to newimages/newvmimages comp group
@@ -1932,7 +1946,7 @@
 			       . "WHERE name = '$rgroupname' AND "
 			       .       "resourcetypeid = 12";
 			$qh = doQuery($query, 101);
-			$row = mysql_fetch_assoc($qh);
+			$row = mysqli_fetch_assoc($qh);
 			$compResGrpid = $row['id'];
 			$query = "INSERT INTO resourcemap "
 			       .        "(resourcegroupid1, "
@@ -1980,7 +1994,7 @@
 		       . "WHERE resourcetypeid = 13 AND "
 		       .       "subid = $imageid";
 		$qh = doQuery($query);
-		if(! ($row = mysql_fetch_assoc($qh)))
+		if(! ($row = mysqli_fetch_assoc($qh)))
 			return;
 		$resid = $row['id'];
 		$olduserdata = getUserInfo($oldownerid, 1, 1);
@@ -1994,7 +2008,7 @@
 		       .       "rgm.resourcegroupid = rg.id AND "
 		       .       "rg.name IN ($oldgroups)";
 		$qh = doQuery($query);
-		if(! ($row = mysql_fetch_assoc($qh)))
+		if(! ($row = mysqli_fetch_assoc($qh)))
 			return;
 		$oldgroup = $row['name'];
 		$oldgroupid = $row['id'];
@@ -2108,7 +2122,7 @@
 			       .       "(cm.OStypeid = ot.id OR "
 			       .        "cm.OSid = o.id)";
 			$qh = doQuery($query, 101);
-			if(! (mysql_num_rows($qh))) {
+			if(! (mysqli_num_rows($qh))) {
 				# not enabled, add entry for method and image revision
 				$query = "INSERT INTO connectmethodmap "
 				       .        "(connectmethodid, "
@@ -2157,7 +2171,7 @@
 		$methods = getContinuationVar('methods');
 		$revids = getContinuationVar('revids');
 		$curmethods = getImageConnectMethods($imageid);
-		$remidlist = mysql_real_escape_string(processInputVar('ids', ARG_STRING));
+		$remidlist = vcl_mysql_escape_string(processInputVar('ids', ARG_STRING));
 		$remids = explode(',', $remidlist);
 		$revid = processInputVar('revid', ARG_NUMERIC);
 		$newimage = getContinuationVar('newimage');
@@ -2199,7 +2213,7 @@
 				       .       "(cm.OStypeid = ot.id OR "
 				       .        "cm.OSid = o.id)";
 				$qh = doQuery($query, 101);
-				if(mysql_num_rows($qh))
+				if(mysqli_num_rows($qh))
 					# if so, add disabled entry for image revision and method
 					$insvals[] = "($id, $revid, 1)";
 			}
@@ -2246,7 +2260,7 @@
 		$comments = htmlspecialchars($comments);
 		if(get_magic_quotes_gpc())
 			$comments = stripslashes($comments);
-		$comments = mysql_real_escape_string($comments);
+		$comments = vcl_mysql_escape_string($comments);
 		$query = "UPDATE imagerevision "
 		       . "SET comments = '$comments' "
 		       . "WHERE id = $revisionid";
@@ -2306,9 +2320,9 @@
 		       .       "rs.imagerevisionid IN ($checkedids) AND "
 		       .       "rq.stateid NOT IN (1, 5, 11, 12)";
 		$qh = doQuery($query);
-		if(mysql_num_rows($qh)) {
+		if(mysqli_num_rows($qh)) {
 			$inuseids = array();
-			while($row = mysql_fetch_assoc($qh))
+			while($row = mysqli_fetch_assoc($qh))
 				$inuseids[] = $row['revision'];
 			$inuseids = implode(',', $inuseids);
 			$rc = array('status' => 'error',
diff --git a/web/.ht-inc/managementnode.php b/web/.ht-inc/managementnode.php
index 2b5b08e..dd49e2c 100644
--- a/web/.ht-inc/managementnode.php
+++ b/web/.ht-inc/managementnode.php
@@ -203,7 +203,7 @@
 		       . "ORDER BY rq.end DESC "
 		       . "LIMIT 1";
 		$qh = doQuery($query);
-		if($row = mysql_fetch_assoc($qh))
+		if($row = mysqli_fetch_assoc($qh))
 			$msgs[] = "There is at least one <strong>reservation</strong> being processed by this management node. The latest end time is " . prettyDatetime($row['end'], 1) . '.';
 
 		# check blockRequest
@@ -219,7 +219,7 @@
 		       . "ORDER BY bt.end DESC "
 		       . "LIMIT 1";
 		$qh = doQuery($query);
-		if($row = mysql_fetch_assoc($qh))
+		if($row = mysqli_fetch_assoc($qh))
 			$msgs[] = "There is at least one <strong>Block Allocation</strong> being handled by this management node. Block Allocation \"{$row['name']}\" has the latest end time which is " . prettyDatetime($row['end'], 1) . '.';
 
 
@@ -246,7 +246,7 @@
 	function toggleDeleteResource($rscid) {
 		$query = "SELECT stateid FROM managementnode WHERE id = $rscid";
 		$qh = doQuery($query);
-		if($row = mysql_fetch_assoc($qh)) {
+		if($row = mysqli_fetch_assoc($qh)) {
 			if($row['stateid'] == 1)
 				$query = "UPDATE managementnode SET stateid = 10 WHERE id = $rscid";
 			else
@@ -514,8 +514,8 @@
 			}
 		}
 		else {
-			$esc = array('sysadminemail' => mysql_real_escape_string($data['sysadminemail']),
-			             'sharedmailbox' => mysql_real_escape_string($data['sharedmailbox']));
+			$esc = array('sysadminemail' => vcl_mysql_escape_string($data['sysadminemail']),
+			             'sharedmailbox' => vcl_mysql_escape_string($data['sharedmailbox']));
 
 			$olddata = getContinuationVar('olddata');
 			$updates = array();
@@ -992,7 +992,7 @@
 				       .       "rq.laststateid NOT IN (1,5,11,12) AND "
 				       .       "rq.userid != $vclreloadid";
 				$qh = doQuery($query);
-				if(mysql_num_rows($qh)) {
+				if(mysqli_num_rows($qh)) {
 					$return['error'] = 1;
 					$errormsg[] = "This management node is the NAT host for computers that have active reservations. NAT host<br>settings cannot be changed while providing NAT for active reservations.";
 				}
@@ -1020,8 +1020,8 @@
 	function addResource($data) {
 		global $user;
 		$ownerid = getUserlistID($data['owner']);
-		$esc = array('sysadminemail' => mysql_real_escape_string($data['sysadminemail']),
-		             'sharedmailbox' => mysql_real_escape_string($data['sharedmailbox']));
+		$esc = array('sysadminemail' => vcl_mysql_escape_string($data['sysadminemail']),
+		             'sharedmailbox' => vcl_mysql_escape_string($data['sharedmailbox']));
 		$keys = array('IPaddress',            'hostname',
 		              'ownerid',              'stateid',
 		              'checkininterval',      'installpath',
@@ -1116,7 +1116,7 @@
 		if($id != 0)
 			$query .= " AND id != $id";
 		$qh = doQuery($query);
-		return mysql_num_rows($qh);
+		return mysqli_num_rows($qh);
 	}
 }
 ?>
diff --git a/web/.ht-inc/oneclick.php b/web/.ht-inc/oneclick.php
index e478fcd..d8b62c9 100755
--- a/web/.ht-inc/oneclick.php
+++ b/web/.ht-inc/oneclick.php
@@ -57,7 +57,7 @@
 	       .       "o.userid = {$user['id']}";
 	$oneclicks = array();
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$oneclicks[$row['id']] = $row;
 
 	print "<H2>" . i("VCL go Configurator") . "</H2>\n";
@@ -322,7 +322,7 @@
 	$qh = doQuery($query, 101);
 	print "<form action=\"" . BASEURL . SCRIPT . "\" method=\"post\" style=\"display: inline;\" onsubmit=\"return validateForm(this);\">\n";
 
-	if(! ($row = mysql_fetch_assoc($qh))) {
+	if(! ($row = mysqli_fetch_assoc($qh))) {
 		print i("VCL go not found") . "\n";
 		return NULL;
 	}
diff --git a/web/.ht-inc/privileges.php b/web/.ht-inc/privileges.php
index 92f6ee3..165e14b 100644
--- a/web/.ht-inc/privileges.php
+++ b/web/.ht-inc/privileges.php
@@ -256,7 +256,7 @@
 		       . "ORDER BY name";
 		$qh = doQuery($query);
 		$orderedgroups = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$orderedgroups[] = $row['id'];
 		foreach($orderedgroups as $id) {
 			printUserPrivRow($id, $i, $privs["usergroups"], $usertypes["users"],
@@ -965,7 +965,7 @@
 		       . "ORDER BY name";
 		$qh = doQuery($query);
 		$orderedgroups = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$orderedgroups[] = $row['id'];
 		foreach($orderedgroups as $id) {
 			$tmpArr = getUserPrivRowHTML($id, $i, $privs["usergroups"],
@@ -1125,7 +1125,7 @@
 	$query = "SELECT id, parent FROM privnode WHERE id > " . DEFAULT_PRIVNODE;
 	$qh = doQuery($query);
 	$data = 'nodedropdata = {';
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		if(checkUserHasPriv('nodeAdmin', $user['id'], $row['id']) &&
 		   ($row['parent'] == DEFAULT_PRIVNODE || checkUserHasPriv('nodeAdmin', $user['id'], $row['parent'])))
 			$data .= "{$row['id']}: '1',";
@@ -1183,7 +1183,7 @@
 	       . "WHERE name = '$newnode' AND "
 	       .       "parent = $parent";
 	$qh = doQuery($query, 335);
-	if(mysql_num_rows($qh)) {
+	if(mysqli_num_rows($qh)) {
 		$text = "A node of that name already exists "
 		      . "under " . $nodeInfo["name"];
 		print "dojo.byId('addChildNodeStatus').innerHTML = '$text';";
@@ -1198,7 +1198,7 @@
 	doQuery($query, 336);
 
 	$qh = doQuery("SELECT LAST_INSERT_ID() FROM privnode", 101);
-	if(! $row = mysql_fetch_row($qh))
+	if(! $row = mysqli_fetch_row($qh))
 		abort(101);
 	$nodeid = $row[0];
 
@@ -1228,7 +1228,7 @@
 function nodeExists($node) {
 	$query = "SELECT id FROM privnode WHERE id = $node";
 	$qh = doQuery($query, 101);
-	if(mysql_num_rows($qh))
+	if(mysqli_num_rows($qh))
 		return 1;
 	else
 		return 0;
@@ -1313,13 +1313,13 @@
 		return;
 	}
 	# check if node matching new name already exists at parent
-	$_newname = mysql_real_escape_string($newname);
+	$_newname = vcl_mysql_escape_string($newname);
 	$query = "SELECT id "
 	       . "FROM privnode "
 	       . "WHERE parent = (SELECT parent FROM privnode WHERE id = $activeNode) AND "
 	       .       "name = '$_newname'";
 	$qh = doQuery($query, 101);
-	if(mysql_num_rows($qh)) {
+	if(mysqli_num_rows($qh)) {
 		$msg = i("A sibling node of that name currently exists");
 		$arr = array('error' => 2, 'message' => $msg);
 		sendJSON($arr);
@@ -1372,7 +1372,7 @@
 	       .       "p2.parent = $newparentid AND "
 	       .       "p2.name = p1.name";
 	$qh = doQuery($query);
-	if($row = mysql_num_rows($qh)) {
+	if($row = mysqli_num_rows($qh)) {
 		$arr = array('status' => 'collision',
 		             'moveid' => $moveid,
 		             'oldparentid' => $oldparentid,
@@ -1494,7 +1494,7 @@
 	print "<INPUT type=hidden name=continuation value=\"$cont\">\n";
 	print "</FORM><br>\n";
 	if(! empty($userid)) {
-		$esc_userid = mysql_real_escape_string($userid);
+		$esc_userid = vcl_mysql_escape_string($userid);
 		if(preg_match('/,/', $userid)) {
 			$mode = 'name';
 			$force = 0;
@@ -1517,8 +1517,8 @@
 		}
 		else {
 			$tmp = explode(',', $userid);
-			$last = mysql_real_escape_string(trim($tmp[0]));
-			$first = mysql_real_escape_string(trim($tmp[1]));
+			$last = vcl_mysql_escape_string(trim($tmp[0]));
+			$first = vcl_mysql_escape_string(trim($tmp[1]));
 			$query = "SELECT CONCAT(u.unityid, '@', a.name) AS unityid "
 			       . "FROM user u, "
 			       .      "affiliation a "
@@ -1528,7 +1528,7 @@
 			       .       "a.id = $affilid";
 		}
 		$qh = doQuery($query, 101);
-		if(! mysql_num_rows($qh)) {
+		if(! mysqli_num_rows($qh)) {
 			if($mode == 'name') {
 				print "<font color=red>User not found</font><br>\n";
 				return;
@@ -1538,13 +1538,13 @@
 		}
 		elseif($force) {
 			$_SESSION['userresources'] = array();
-			$row = mysql_fetch_assoc($qh);
+			$row = mysqli_fetch_assoc($qh);
 			$newtime = unixToDatetime(time() - SECINDAY - 5);
 			$query = "UPDATE user SET lastupdated = '$newtime' WHERE id = {$row['id']}";
 			doQuery($query, 101);
 		}
 		elseif($mode == 'name') {
-			$row = mysql_fetch_assoc($qh);
+			$row = mysqli_fetch_assoc($qh);
 			$userid = $row['unityid'];
 			$esc_userid = $row['unityid'];
 		}
@@ -1659,11 +1659,11 @@
 		       . "ORDER BY p.name, "
 		       .          "upt.name";
 		$qh = doQuery($query, 101);
-		if(mysql_num_rows($qh)) {
+		if(mysqli_num_rows($qh)) {
 			print "Nodes where user is granted privileges:<br>\n";
 			print "<TABLE>\n";
 			$privnodeid = 0;
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				if($privnodeid != $row['privnodeid']) {
 					if($privnodeid) {
 						print "    </TD>\n";
@@ -1699,11 +1699,11 @@
 			       . "ORDER BY p.name, "
 			       .          "upt.name";
 			$qh = doQuery($query, 101);
-			if(mysql_num_rows($qh)) {
+			if(mysqli_num_rows($qh)) {
 				print "Nodes where user's groups are granted privileges:<br>\n";
 				print "<TABLE>\n";
 				$privnodeid = 0;
-				while($row = mysql_fetch_assoc($qh)) {
+				while($row = mysqli_fetch_assoc($qh)) {
 					if($privnodeid != $row['privnodeid']) {
 						if($privnodeid) {
 							print "    </TD>\n";
@@ -1749,7 +1749,7 @@
 		       . "LIMIT 8";
 		$logins = array();
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$logins[] = $row;
 		if(count($logins)) {
 			$logins = array_reverse($logins);
@@ -1814,7 +1814,7 @@
 		       . "ORDER BY l.start DESC "
 		       . "LIMIT 5";
 		$qh = doQuery($query, 290);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			array_push($requests, $row);
 		$requests = array_reverse($requests);
 		if(! empty($requests)) {
@@ -1924,7 +1924,7 @@
 		       . "GROUP BY rq.id "
 		       . "ORDER BY rq.start";
 		$qh = doQuery($query, 290);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			array_push($requests, $row);
 		$requests = array_reverse($requests);
 		if(! empty($requests)) {
@@ -2054,7 +2054,7 @@
 			       . "GROUP BY rq.id "
 			       . "ORDER BY rq.start";
 			$qh = doQuery($query, 290);
-			while($row = mysql_fetch_assoc($qh))
+			while($row = mysqli_fetch_assoc($qh))
 				array_push($requests, $row);
 			$requests = array_reverse($requests);
 			if(! empty($requests)) {
@@ -2156,7 +2156,7 @@
 function recurseGetChildren($node) {
 	$children = array();
 	$qh = doQuery("SELECT id FROM privnode WHERE parent = $node", 340);
-	while($row = mysql_fetch_row($qh)) {
+	while($row = mysqli_fetch_row($qh)) {
 		array_push($children, $row[0]);
 		$children = array_merge($children, recurseGetChildren($row[0]));
 	}
@@ -2444,7 +2444,7 @@
 	       . "LEFT JOIN usergroup g2 ON (g.editusergroupid = g2.id) "
 	       . "WHERE g.id = $usergrpid";
 	$qh = doQuery($query, 101);
-	if(! ($grpdata = mysql_fetch_assoc($qh))) {
+	if(! ($grpdata = mysqli_fetch_assoc($qh))) {
 		# problem getting group members
 		$msg = 'failed to fetch group members';
 		$arr = array('members' => $msg, 'domid' => $domid);
@@ -2620,7 +2620,7 @@
 	       . "WHERE rg.id = $resgrpid AND "
 	       .       "rg.resourcetypeid = rt.id";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh)) {
+	if($row = mysqli_fetch_assoc($qh)) {
 		$type = $row['name'];
 		if($type == 'computer' || $type == 'managementnode')
 			$field = 'hostname';
@@ -2639,7 +2639,7 @@
 			$query .= " AND t.deleted = 0";
 		$qh = doQuery($query, 101);
 		$members = '';
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$members .= "{$row['item']}<br>";
 		if($members == '')
 			$members = '(empty group)';
@@ -2719,7 +2719,7 @@
 		       .       "g.resourcetypeid = t.id "
 		       . "ORDER BY p.privnodeid";
 		$qh = doQuery($query, 350);
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			$resourcedata[$row['privnodeid']][] = $row;
 		}
 	}
@@ -2746,7 +2746,7 @@
 		       .       "u.affiliationid = a.id "
 		       . "ORDER BY u.unityid";
 		$qh = doQuery($query, 351);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$privs['users'][$row['unityid']][$row['name']] = 1;
 	}
 	if($type == "usergroups" || $type == "all") {
@@ -2766,7 +2766,7 @@
 		       .       "up.usergroupid IS NOT NULL "
 		       . "ORDER BY g.name";
 		$qh = doQuery($query, 352);
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			if(isset($privs["usergroups"][$row["id"]]))
 				$privs["usergroups"][$row["id"]]['privs'][$row['priv']] = 1;
 			else
@@ -2849,7 +2849,7 @@
 		       .       "g.resourcetypeid = t.id AND "
 		       .       "p.type = 'block'";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			if(! isset($allblockdata[$row['privnodeid']]))
 				$allblockdata[$row['privnodeid']] = array();
 			# TODO adding the id at the end will fix the bug where blocking cascaded resource
@@ -2888,7 +2888,7 @@
 		       .       "p.privnodeid = p2.privnodeid AND "
 		       .       "p2.type = 'cascade'";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			if(! isset($allcascadedata[$row['privnodeid']]))
 				$allcascadedata[$row['privnodeid']] = array();
 			$allcascadedata[$row['privnodeid']][] =
@@ -2939,7 +2939,7 @@
 			       .       "t.name = 'block' AND "
 			       .       "u.affiliationid = a.id";
 			$qh = doQuery($query, 355);
-			while($row = mysql_fetch_row($qh))
+			while($row = mysqli_fetch_row($qh))
 				$nodeuserblock[$row[0]][$row[1]] = 1;
 		}
 		static $nodeusercasade;
@@ -2967,7 +2967,7 @@
 			       . 		"up.userid = Cup.userid "
 			       . "ORDER BY up.privnodeid, u.unityid, t.name";
 			$qh = doQuery($query, 356);
-			while($row = mysql_fetch_row($qh))
+			while($row = mysqli_fetch_row($qh))
 				$nodeusercascade[$row[0]][$row[1]][$row[2]] = 1;
 		}
 		$mynodelist = $nodelist;
@@ -3005,7 +3005,7 @@
 			       .       "up.usergroupid IS NOT NULL AND "
 			       .       "t.name = 'block'";
 			$qh = doQuery($query, 357);
-			while($row = mysql_fetch_row($qh))
+			while($row = mysqli_fetch_row($qh))
 				$nodegroupblock[$row[0]][$row[1]] = 1;
 		}
 		static $nodegroupcascade;
@@ -3035,7 +3035,7 @@
 			       . 		"up.usergroupid = Cup.usergroupid "
 			       . "ORDER BY up.privnodeid, g.id, t.name";
 			$qh = doQuery($query, 356);
-			while($row = mysql_fetch_row($qh)) {
+			while($row = mysqli_fetch_row($qh)) {
 				if(! isset($nodegroupcascade[$row[0]][$row[1]])) {
 					$nodegroupcascade[$row[0]][$row[1]] = array('id' => $row[1],
 						                                         'name' => $row[2],
diff --git a/web/.ht-inc/requests.php b/web/.ht-inc/requests.php
index 9d8d8ce..565c53c 100644
--- a/web/.ht-inc/requests.php
+++ b/web/.ht-inc/requests.php
@@ -380,12 +380,12 @@
 			if(checkUserHasPerm('View Debug Information')) {
 				if(! is_null($requests[$i]['vmhostid'])) {
 					$query = "SELECT c.hostname "
-					       . "FROM computer c, " 
+					       . "FROM computer c, "
 					       .      "vmhost v "
 					       . "WHERE v.id = {$requests[$i]['vmhostid']} AND "
 					       .       "v.computerid = c.id";
 					$qh = doQuery($query, 101);
-					$row = mysql_fetch_assoc($qh);
+					$row = mysqli_fetch_assoc($qh);
 					$vmhost = $row['hostname'];
 				}
 				$text .= "    <TD align=center><a id=\"req{$requests[$i]['id']}\" ";
@@ -1329,7 +1329,7 @@
 						$subowner = 1;
 				}
 			}
-			if($subowner || 
+			if($subowner ||
 			   (array_key_exists($id, $imagedata) &&
 			   count($imagedata[$id]['imagerevision']) > 1 &&
 			   ($imagedata[$id]['ownerid'] == $user['id'] ||
@@ -1339,7 +1339,7 @@
 			}
 		}
 	}
-	if(in_array('serverCheckOut', $user['privileges']) && 
+	if(in_array('serverCheckOut', $user['privileges']) &&
 	   count($checkout['image'])) {
 		$serveraccess = 1;
 		/*$extraimages = getServerProfileImages($user['id']);
@@ -1369,7 +1369,7 @@
 							$subowner = 1;
 					}
 				}
-				if($subowner || 
+				if($subowner ||
 				   (array_key_exists($id, $imagedata) &&
 				   count($imagedata[$id]['imagerevision']) > 1 &&
 				   ($imagedata[$id]['ownerid'] == $user['id'] ||
@@ -1884,7 +1884,7 @@
 			$start = unixFloor15($now);
 		if($type == 'basic' || $type == 'imaging') {
 			# compute maxstart based on 11:45 pm on start day
-			$tmp = $now + DAYSAHEAD * SECINDAY; 
+			$tmp = $now + DAYSAHEAD * SECINDAY;
 			$maxstart = mktime(23, 45, 0, date('n', $tmp), date('j', $tmp), date('Y', $tmp));
 			if($start > $maxstart)
 				return;
@@ -1986,7 +1986,7 @@
 	$rc = isAvailable($images, $imageid, $imagerevisionid, $start, $end, 0, 0, 0, 0, $imaging, $fixedIP);
 	if($rc < 1) {
 		$cdata = array('now' => 0,
-		               'start' => $start, 
+		               'start' => $start,
 		               'end' => $end,
 		               'server' => 0,
 		               'imageid' => $imageid);
@@ -2410,7 +2410,7 @@
 		}
 		else {
 			$fields[] = 'name';
-			$name = mysql_real_escape_string($data['name']);
+			$name = vcl_mysql_escape_string($data['name']);
 			$values[] = "'$name'";
 		}
 		if($data['ipaddr'] != '') {
@@ -2472,7 +2472,7 @@
 	       . "ORDER BY id";
 	$qh = doQuery($query);
 	$resids = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if(! array_key_exists($row['imageid'], $resids))
 			$resids[$row['imageid']] = array();
 		$resids[$row['imageid']][] = $row['id'];
@@ -2488,7 +2488,7 @@
 		}
 	}
 	$qbase = "INSERT INTO configinstance "
-	       .        "(reservationid, " 
+	       .        "(reservationid, "
 	       .        "configid, "
 	       .        "configmapid, "
 	       .        "configinstancestatusid) "
@@ -2528,7 +2528,7 @@
 			if(array_key_exists("$cfgsubimgid/$mapid", $vars)) {
 				$sets = array();
 				foreach($vars["$cfgsubimgid/$mapid"] as $varid => $varval) {
-					$_val = mysql_real_escape_string($varval['value']);
+					$_val = vcl_mysql_escape_string($varval['value']);
 					$sets[] = "($instid, $varid, '$_val')";
 				}
 				$query = $qbase2 . implode(',', $sets);
@@ -2706,8 +2706,8 @@
 
 	if($request['currstateid'] == 11 ||
 	   ($request['currstateid'] == 12 && $request['laststateid'] == 11))
-		return "<br><span class=\"rederrormsg\">" . 
-		       i("The selected reservation has timed out and is no longer available.") . 
+		return "<br><span class=\"rederrormsg\">" .
+		       i("The selected reservation has timed out and is no longer available.") .
 		       "</span>";
 
 	if($request['imageid'] == $request['compimageid'])
@@ -2781,7 +2781,7 @@
 			       .       "reservationid = {$request['resid']} AND "
 			       .       "timestamp = '" . unixToDatetime($data['ts']) . "'";
 			$qh = doQuery($query, 101);
-			if($row = mysql_fetch_assoc($qh)) {
+			if($row = mysqli_fetch_assoc($qh)) {
 				$reason = $row['additionalinfo'];
 				$text .= "<br>" . i("retrying at state") . " \"$reason\"";
 			}
@@ -2865,7 +2865,7 @@
 				       . "ORDER BY id "
 				       . "LIMIT 1";
 				$qh = doQuery($query, 101);
-				if($row = mysql_fetch_assoc($qh)) {
+				if($row = mysqli_fetch_assoc($qh)) {
 					$reason = $row['additionalInfo'];
 					if(! empty($data))
 						$currtime = $row['ts'] - $data['ts'];
@@ -2954,7 +2954,7 @@
 	print "  </TR>\n";
 	print "  <TR>\n";
 	print "    <TH align=right>Start&nbsp;Time:</TH>\n";
-	if(datetimeToUnix($request["start"]) < 
+	if(datetimeToUnix($request["start"]) <
 	   datetimeToUnix($request["daterequested"])) {
 		print "    <TD>" . prettyDatetime($request["daterequested"]) . "</TD>\n";
 	}
@@ -3092,7 +3092,7 @@
 	$request = getRequestInfo($requestid, 1);
 	# check to see if reservation exists
 	if(is_null($request) || $request['stateid'] == 11 || $request['stateid'] == 12 ||
-	   ($request['stateid'] == 14 && 
+	   ($request['stateid'] == 14 &&
 	   ($request['laststateid'] == 11 || $request['laststateid'] == 12))) {
 		sendJSON(array('status' => 'resgone'));
 		return;
@@ -3208,14 +3208,14 @@
 	if($unixstart > $now) {
 		$tzunixstart = $unixstart + ($_SESSION['persistdata']['tzoffset'] * 60);
 		$cdata['modifystart'] = 1;
-		$txt  = i("Modify reservation for") . " <b>{$request['reservations'][0]['prettyimage']}</b> "; 
+		$txt  = i("Modify reservation for") . " <b>{$request['reservations'][0]['prettyimage']}</b> ";
 		$txt .= i("starting") . " " . prettyDatetime($request["start"]) . ": <br>";
 		$h .= preg_replace("/(.{1,60}([ \n]|$))/", '\1<br>', $txt);
 		$days = array();
 		$startday = date('l', $tzunixstart);
 		$cur = time() + ($_SESSION['persistdata']['tzoffset'] * 60);
-		for($end = $cur + DAYSAHEAD * SECINDAY; 
-		    $cur < $end; 
+		for($end = $cur + DAYSAHEAD * SECINDAY;
+		    $cur < $end;
 		    $cur += SECINDAY) {
 			$index = date('Ymd', $cur);
 			$days[$index] = date('l', $cur);
@@ -3353,8 +3353,12 @@
 		return;
 	}
 	# check for max time being reached
+	$imgdata = getImages(1, $request['reservations'][0]['imageid']);
+	$maximglen = $imgdata[$request['reservations'][0]['imageid']]['maxinitialtime'];
 	if($request['forimaging'] && $maxtimes['total'] < 720)
 		$maxcheck = 720;
+	elseif(! $request['forimaging'] && $maximglen)
+		$maxcheck = $maximglen;
 	else
 		$maxcheck = $maxtimes['total'];
 	if(! $openend && ($reslen >= $maxcheck)) {
@@ -3367,13 +3371,13 @@
 	// if started, only allow end to be modified
 	# check for following reservations
 	$timeToNext = timeToNextReservation($request);
-	# check for 30 minutes because need 15 minute buffer and min can 
+	# check for 30 minutes because need 15 minute buffer and min can
 	# extend by is 15 min
 	if($timeToNext < 30) {
 		$movedall = 1;
 		$lockedall = 1;
 		if(count($request['reservations']) > 1) {
-			# get semaphore on each existing node in cluster so that nothing 
+			# get semaphore on each existing node in cluster so that nothing
 			# can get moved to the nodes during this process
 
 			$semimageid = getImageId('noimage');
@@ -3410,6 +3414,11 @@
 	$lengths = array();
 	if($request['forimaging'] && $maxtimes['total'] < 720) # make sure at least 12 hours available for imaging reservations
 		$maxtimes['total'] = 720;
+	elseif(! $request['forimaging'] && $maximglen) {
+		$maxtimes['total'] = $maximglen;
+		$currduration = (datetimeToUnix($request['end']) - datetimeToUnix($request['start'])) / 60;
+		$maxtimes['extend'] = $maximglen - $currduration;
+	}
 	if($timeToNext == -1) {
 		if($nousercheck)
 			$lengths["0"] = "No change";
@@ -3732,7 +3741,7 @@
 			return;
 		}
 		if($servername != $request['servername']) {
-			$servername = mysql_real_escape_string($servername);
+			$servername = vcl_mysql_escape_string($servername);
 			$updateservername = 1;
 		}
 	}
@@ -3826,9 +3835,9 @@
 	$rc = isAvailable($images, $imageid, $revisions, $startts,
 	                  $endts, 1, $requestid, 0, 0, 0, $ip, $mac);
 	$data = array();
-	if($rc < 1) { 
+	if($rc < 1) {
 		$cdata = array('now' => 0,
-		               'start' => $startts, 
+		               'start' => $startts,
 		               'end' => $endts,
 		               'server' => $allowindefiniteend,
 		               'imageid' => $imageid,
@@ -3936,7 +3945,7 @@
 		return;
 	}
 	if($request['stateid'] == 11 || $request['stateid'] == 12 ||
-	   ($request['stateid'] == 14 && 
+	   ($request['stateid'] == 14 &&
 	   ($request['laststateid'] == 11 || $request['laststateid'] == 12))) {
 		$data = array('error' => 1,
 		              'refresh' => 1,
@@ -4132,7 +4141,7 @@
 	if($request['serverrequest']) {
 		$query = "SELECT id FROM serverrequest WHERE requestid = $requestid";
 		$qh = doQuery($query);
-		if($row = mysql_fetch_assoc($qh)) {
+		if($row = mysqli_fetch_assoc($qh)) {
 			$query = "DELETE FROM serverrequest WHERE requestid = $requestid";
 			doQuery($query, 152);
 			deleteVariable("fixedIPsr{$row['id']}");
@@ -4160,7 +4169,7 @@
 	$requestid = getContinuationVar('requestid');
 	$reqdata = getRequestInfo($requestid, 1);
 	if(is_null($reqdata) || $reqdata['stateid'] == 11 || $reqdata['stateid'] == 12 ||
-	   ($reqdata['stateid'] == 14 && 
+	   ($reqdata['stateid'] == 14 &&
 	   ($reqdata['laststateid'] == 11 || $reqdata['laststateid'] == 12))) {
 		print "resGone('reboot'); ";
 		print "dijit.byId('editResDlg').show();";
@@ -4192,7 +4201,7 @@
 	$requestid = getContinuationVar('requestid');
 	$reqdata = getRequestInfo($requestid, 1);
 	if(is_null($reqdata) || $reqdata['stateid'] == 11 || $reqdata['stateid'] == 12 ||
-	   ($reqdata['stateid'] == 14 && 
+	   ($reqdata['stateid'] == 14 &&
 	   ($reqdata['laststateid'] == 11 || $reqdata['laststateid'] == 12))) {
 		sendJSON(array('status' => 'resgone'));
 		return;
@@ -4301,7 +4310,7 @@
 		return;
 	}
 	if($requestData['stateid'] == 11 || $requestData['stateid'] == 12 ||
-	   ($requestData['stateid'] == 14 && 
+	   ($requestData['stateid'] == 14 &&
 	   ($requestData['laststateid'] == 11 || $requestData['laststateid'] == 12))) {
 		$h = i("This reservation has timed out due to lack of user activity and is no longer available.");
 		sendJSON(array('html' => $h, 'refresh' => 1));
@@ -4374,6 +4383,8 @@
 				$conuser = $user['unityid'];
 			if($requestData['reservations'][0]['domainDNSName'] != '' && ! strlen($passwd))
 				$conuser .= "@" . $requestData['reservations'][0]['domainDNSName'];
+			elseif($requestData['reservations'][0]['OStype'] == 'windows')
+				$conuser = ".\\$conuser";
 			if(! strlen($passwd))
 				$passwd = i('(use your campus password)');
 			if($cluster)
@@ -4400,17 +4411,17 @@
 			$tos = array($conuser,
 			             $passwd,
 			             $res['connectIP']);
-			$msg = preg_replace($froms, $tos, $method['connecttext']); 
+			$msg = preg_replace($froms, $tos, $method['connecttext']);
 			foreach($method['ports'] as $port) {
 				if($usenat && array_key_exists($port['key'], $natports[$cmid]))
-					$msg = preg_replace("/{$port['key']}/", $natports[$cmid][$port['key']]['publicport'], $msg); 
+					$msg = preg_replace("/{$port['key']}/", $natports[$cmid][$port['key']]['publicport'], $msg);
 				else {
 					if((preg_match('/remote desktop/i', $method['description']) ||
-					   preg_match('/RDP/i', $method['description'])) && 
+					   preg_match('/RDP/i', $method['description'])) &&
 					   $port['key'] == '#Port-TCP-3389#')
-						$msg = preg_replace("/{$port['key']}/", $user['rdpport'], $msg); 
+						$msg = preg_replace("/{$port['key']}/", $user['rdpport'], $msg);
 					else
-						$msg = preg_replace("/{$port['key']}/", $port['port'], $msg); 
+						$msg = preg_replace("/{$port['key']}/", $port['port'], $msg);
 				}
 			}
 			#$h .= preg_replace("/(.{1,120}([ ]|$))/", '\1<br>', $msg);
@@ -4421,7 +4432,8 @@
 				#$h .= "<div id=\"connectdiv\">\n";
 				$h .= "<FORM action=\"" . BASEURL . SCRIPT . "\" method=post>\n";
 				$cdata = array('requestid' => $requestid,
-				               'resid' => $res['reservationid']);
+				               'resid' => $res['reservationid'],
+				               'cmid' => $cmid);
 				$expire = datetimeToUnix($requestData['end']) - $now + 1800; # remaining reservation time plus 30 min
 				$cont = addContinuationsEntry('sendRDPfile', $cdata, $expire);
 				$h .= "<INPUT type=hidden name=continuation value=\"$cont\">\n";
@@ -4619,7 +4631,7 @@
 	$images = removeNoCheckout($resources["image"]);
 	#$extraimages = getServerProfileImages($user['id']);
 	if((! array_key_exists($return['imageid'], $images) &&
-	   /*($return['type'] != 'server' || 
+	   /*($return['type'] != 'server' ||
 		! array_key_exists($return['imageid'], $extraimages)) &&*/
 	   ($return['type'] != 'imaging' ||
 	   ! array_key_exists($return['imageid'], $withnocheckout))) ||
@@ -4660,7 +4672,7 @@
 		$return['revisionids'][$return['imageid']][] = $revids[0];
 	else
 		$return['revisionids'][$return['imageid']][] = getProductionRevisionid($return['imageid']);
-	
+
 	# duration
 	if($return['ending'] == 'duration') {
 		$return['duration'] = processInputVar('duration', ARG_NUMERIC, 0);
@@ -4757,7 +4769,7 @@
 				$return['dnsArr'][] = $dnsaddr;
 				$cnt++;
 			}
-	
+
 			# check that a management node can handle the network
 			$mappedmns = getMnsFromImage($return['imageid']);
 			$mnnets = checkAvailableNetworks($return['ipaddr']);
@@ -4952,7 +4964,7 @@
 	       . "ORDER BY cll.timestamp DESC "
 	       . "LIMIT 1";
 	$qh = doQuery($query);
-	if($row = mysql_fetch_assoc($qh)) {
+	if($row = mysqli_fetch_assoc($qh)) {
 		if(! is_numeric($row['timestamp']))
 			return NULL;
 		if($row['loadstatename'] == 'acknowledgetimeout')
@@ -5008,8 +5020,8 @@
 	$cur = time();
 	if(array_key_exists('tzoffset', $_SESSION['persistdata']))
 		$cur += $_SESSION['persistdata']['tzoffset'] * 60;
-	for($end = $cur + DAYSAHEAD * SECINDAY; 
-	    $cur < $end; 
+	for($end = $cur + DAYSAHEAD * SECINDAY;
+	    $cur < $end;
 	    $cur += SECINDAY) {
 		$tmp = getdate($cur);
 		$index = $cur;
diff --git a/web/.ht-inc/resource.php b/web/.ht-inc/resource.php
index cecd2bb..cc55d09 100644
--- a/web/.ht-inc/resource.php
+++ b/web/.ht-inc/resource.php
@@ -574,7 +574,7 @@
 			       . "FROM `{$this->restype}` "
 			       . "WHERE id = $rscid";
 			$qh = doQuery($query);
-			if($row = mysql_fetch_assoc($qh)) {
+			if($row = mysqli_fetch_assoc($qh)) {
 				$newval = (int)(! (int)$row['deleted']);
 				$query = "UPDATE {$this->restype} "
 				       . "SET deleted = $newval "
@@ -1628,7 +1628,7 @@
 		if($id)
 			$query .= " AND id != $id";
 		$qh = doQuery($query);
-		if(mysql_num_rows($qh))
+		if(mysqli_num_rows($qh))
 			return 1;
 		return 0;
 	}
diff --git a/web/.ht-inc/schedule.php b/web/.ht-inc/schedule.php
index 57da520..d0760e8 100644
--- a/web/.ht-inc/schedule.php
+++ b/web/.ht-inc/schedule.php
@@ -188,7 +188,7 @@
 		       .       "deleted = 0";
 		$qh = doQuery($query);
 		$comps = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$comps[] = $row['hostname'];
 		if(count($comps))
 			$msg = "This schedule cannot be deleted because the following <strong>computers</strong> have it selected as their schedule:<br><br>\n" . implode("<br>\n", $comps);
@@ -445,7 +445,7 @@
 		if(! empty($id))
 			$query .= " AND id != $id";
 		$qh = doQuery($query, 101);
-		if(mysql_num_rows($qh))
+		if(mysqli_num_rows($qh))
 			return 1;
 		return 0;
 	}
diff --git a/web/.ht-inc/serverprofiles.php b/web/.ht-inc/serverprofiles.php
index 951789e..2de4826 100644
--- a/web/.ht-inc/serverprofiles.php
+++ b/web/.ht-inc/serverprofiles.php
@@ -523,10 +523,10 @@
 		sendJSON($data);
 		return;
 	}
-	$name = mysql_real_escape_string($data['name']);
-	$desc = mysql_real_escape_string($data['desc']);
-	$fixedIP = mysql_real_escape_string($data['fixedIP']);
-	$fixedMAC = mysql_real_escape_string($data['fixedMAC']);
+	$name = vcl_mysql_escape_string($data['name']);
+	$desc = vcl_mysql_escape_string($data['desc']);
+	$fixedIP = vcl_mysql_escape_string($data['fixedIP']);
+	$fixedMAC = vcl_mysql_escape_string($data['fixedMAC']);
 	$ret = array();
 	if($data['profileid'] == 70000) {
 		$query = "INSERT INTO serverprofile "
@@ -626,7 +626,7 @@
 	}
 	$query = "DELETE FROM serverprofile WHERE id = $profileid";
 	doQuery($query, 101);
-	$rows = mysql_affected_rows();
+	$rows = mysqli_affected_rows();
 	if($rows == 0) {
 		$data = array('error' => 1,
 		              'msg' => 'Failed to delete selected server profile');
@@ -864,7 +864,7 @@
 	}
 	$qh = doQuery($query, 101);
 	$groups = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$groups[$row['id']] = $row['name'];
 	$_SESSION['usersessiondata'][$key] = $groups;
 	return $groups;
diff --git a/web/.ht-inc/siteconfig.php b/web/.ht-inc/siteconfig.php
index 96aedda..a8f5d39 100644
--- a/web/.ht-inc/siteconfig.php
+++ b/web/.ht-inc/siteconfig.php
@@ -1292,7 +1292,7 @@
 		$this->values = array();
 		$query = "SELECT id, helpaddress FROM affiliation ORDER BY name";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$this->values[$row['id']] = $row['helpaddress'];
 	}
 
@@ -1310,18 +1310,18 @@
 	///
 	/////////////////////////////////////////////////////////////////////////////
 	function setValue($affilid, $value) {
-		global $mysql_link_vcl;
+		global $mysqli_link_vcl;
 		if($value === NULL)
 			$newval = 'NULL';
 		else {
-			$esc_value = mysql_real_escape_string($value);
+			$esc_value = vcl_mysql_escape_string($value);
 			$newval = "'$esc_value'";
 		}
 		$query = "UPDATE affiliation "
 		       . "SET helpaddress = $newval "
 		       . "WHERE id = $affilid";
 		doQuery($query);
-		$rc = mysql_affected_rows($mysql_link_vcl);
+		$rc = mysqli_affected_rows($mysqli_link_vcl);
 		if($rc == 1)
 			return 1;
 		return 0;
@@ -1339,12 +1339,12 @@
 	///
 	/////////////////////////////////////////////////////////////////////////////
 	function deleteValue($affilid) {
-		global $mysql_link_vcl;
+		global $mysqli_link_vcl;
 		$query = "UPDATE affiliation "
 		       . "SET helpaddress = NULL "
 		       . "WHERE id = $affilid";
 		doQuery($query);
-		$rc = mysql_affected_rows($mysql_link_vcl);
+		$rc = mysqli_affected_rows($mysqli_link_vcl);
 		if($rc == 1)
 			return 1;
 		return 0;
@@ -1391,7 +1391,7 @@
 		$this->values = array();
 		$query = "SELECT id, sitewwwaddress FROM affiliation ORDER BY name";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$this->values[$row['id']] = $row['sitewwwaddress'];
 	}
 
@@ -1409,18 +1409,18 @@
 	///
 	/////////////////////////////////////////////////////////////////////////////
 	function setValue($affilid, $value) {
-		global $mysql_link_vcl;
+		global $mysqli_link_vcl;
 		if($value === NULL)
 			$newval = 'NULL';
 		else {
-			$esc_value = mysql_real_escape_string($value);
+			$esc_value = vcl_mysql_escape_string($value);
 			$newval = "'$esc_value'";
 		}
 		$query = "UPDATE affiliation "
 		       . "SET sitewwwaddress = $newval "
 		       . "WHERE id = $affilid";
 		doQuery($query);
-		$rc = mysql_affected_rows($mysql_link_vcl);
+		$rc = mysqli_affected_rows($mysqli_link_vcl);
 		if($rc == 1)
 			return 1;
 		return 0;
@@ -1438,12 +1438,12 @@
 	///
 	/////////////////////////////////////////////////////////////////////////////
 	function deleteValue($affilid) {
-		global $mysql_link_vcl;
+		global $mysqli_link_vcl;
 		$query = "UPDATE affiliation "
 		       . "SET sitewwwaddress = NULL "
 		       . "WHERE id = $affilid";
 		doQuery($query);
-		$rc = mysql_affected_rows($mysql_link_vcl);
+		$rc = mysqli_affected_rows($mysqli_link_vcl);
 		if($rc == 1)
 			return 1;
 		return 0;
@@ -1498,7 +1498,7 @@
 		       . "LEFT JOIN winKMS k ON (k.affiliationid = a.id) "
 		       . "ORDER BY a.id";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			if(is_null($row['address']) && is_null($row['port'])) {
 				$this->values[$row['id']] = NULL;
 				continue;
@@ -1529,7 +1529,7 @@
 	///
 	/////////////////////////////////////////////////////////////////////////////
 	function setValue($affilid, $value) {
-		global $mysql_link_vcl;
+		global $mysqli_link_vcl;
 		$this->getValues();
 		$values = explode(',', $value);
 		# create datastructure of newly submitted hosts
@@ -1588,7 +1588,7 @@
 		# insert new hosts
 		$values = array();
 		foreach($adds as $host => $port) {
-			$esc_host = mysql_real_escape_string($host);
+			$esc_host = vcl_mysql_escape_string($host);
 			$values[] = "($affilid, '$esc_host', $port)";
 		}
 		$rc1 = 1;
@@ -1597,25 +1597,25 @@
 			       . "(affiliationid, address, port) "
 			       . "VALUES " . implode(',', $values);
 			doQuery($query);
-			$rc1 = mysql_affected_rows($mysql_link_vcl);
+			$rc1 = mysqli_affected_rows($mysqli_link_vcl);
 		}
 		# make changes
 		$rc2 = 1;
 		foreach($changes as $host => $port) {
-			$esc_host = mysql_real_escape_string($host);
+			$esc_host = vcl_mysql_escape_string($host);
 			$query = "UPDATE winKMS "
 			       . "SET port = $port "
 			       . "WHERE address = '$esc_host' AND "
 			       .       "affiliationid = $affilid";
 			doQuery($query);
-			$tmp = mysql_affected_rows($mysql_link_vcl);
+			$tmp = mysqli_affected_rows($mysqli_link_vcl);
 			if($rc2)
 				$rc2 = $tmp;
 		}
 		# delete old hosts
 		$values = array();
 		foreach($rems as $host => $port) {
-			$esc_host = mysql_real_escape_string($host);
+			$esc_host = vcl_mysql_escape_string($host);
 			$values[] = "(affiliationid = $affilid AND "
 			          . "address = '$esc_host' AND "
 			          . "port = $port)";
@@ -1625,7 +1625,7 @@
 			$query = "DELETE FROM winKMS "
 			       . "WHERE " . implode(' OR ', $values);
 			doQuery($query);
-			$rc3 = mysql_affected_rows($mysql_link_vcl);
+			$rc3 = mysqli_affected_rows($mysqli_link_vcl);
 		}
 		if($rc1 == 0 || $rc2 == 0 || $rc3 == 0)
 			return 0;
@@ -1644,11 +1644,11 @@
 	///
 	/////////////////////////////////////////////////////////////////////////////
 	function deleteValue($affilid) {
-		global $mysql_link_vcl;
+		global $mysqli_link_vcl;
 		$query = "DELETE FROM winKMS "
 		       . "WHERE affiliationid = $affilid";
 		doQuery($query);
-		$rc = mysql_affected_rows($mysql_link_vcl);
+		$rc = mysqli_affected_rows($mysqli_link_vcl);
 		if($rc == 1)
 			return 1;
 		return 0;
@@ -1715,7 +1715,7 @@
 		$this->values = array();
 		$query = "SELECT id, theme FROM affiliation ORDER BY name";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$this->values[$row['id']] = $row['theme'];
 	}
 
@@ -1733,13 +1733,13 @@
 	///
 	/////////////////////////////////////////////////////////////////////////////
 	function setValue($affilid, $value) {
-		global $mysql_link_vcl;
-		$esc_value = mysql_real_escape_string($value);
+		global $mysqli_link_vcl;
+		$esc_value = vcl_mysql_escape_string($value);
 		$query = "UPDATE affiliation "
 		       . "SET theme = '$esc_value' "
 		       . "WHERE id = $affilid";
 		doQuery($query);
-		$rc = mysql_affected_rows($mysql_link_vcl);
+		$rc = mysqli_affected_rows($mysqli_link_vcl);
 		if($rc == 1)
 			return 1;
 		return 0;
@@ -1757,12 +1757,12 @@
 	///
 	/////////////////////////////////////////////////////////////////////////////
 	function deleteValue($affilid) {
-		global $mysql_link_vcl;
+		global $mysqli_link_vcl;
 		$query = "UPDATE affiliation "
 		       . "SET theme = NULL "
 		       . "WHERE id = $affilid";
 		doQuery($query);
-		$rc = mysql_affected_rows($mysql_link_vcl);
+		$rc = mysqli_affected_rows($mysqli_link_vcl);
 		if($rc == 1)
 			return 1;
 		return 0;
@@ -1834,7 +1834,7 @@
 		       . "WHERE name NOT IN ('Global', 'Local') "
 		       . "ORDER BY name";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$this->values[$row['id']] = (int)(! $row['shibonly']);
 	}
 
@@ -1852,13 +1852,13 @@
 	///
 	/////////////////////////////////////////////////////////////////////////////
 	function setValue($affilid, $value) {
-		global $mysql_link_vcl;
+		global $mysqli_link_vcl;
 		$value = (int)(! $value);
 		$query = "UPDATE affiliation "
 		       . "SET shibonly = $value "
 		       . "WHERE id = $affilid";
 		doQuery($query);
-		$rc = mysql_affected_rows($mysql_link_vcl);
+		$rc = mysqli_affected_rows($mysqli_link_vcl);
 		if($rc == 1)
 			return 1;
 		return 0;
@@ -1944,7 +1944,7 @@
 		       . "WHERE name NOT IN ('Global', 'Local') "
 		       . "ORDER BY name";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$this->values[$row['id']] = $row['shibname'];
 	}
 
@@ -1962,18 +1962,18 @@
 	///
 	/////////////////////////////////////////////////////////////////////////////
 	function setValue($affilid, $value) {
-		global $mysql_link_vcl;
+		global $mysqli_link_vcl;
 		if($value === NULL)
 			$newval = 'NULL';
 		else {
-			$esc_value = mysql_real_escape_string($value);
+			$esc_value = vcl_mysql_escape_string($value);
 			$newval = "'$esc_value'";
 		}
 		$query = "UPDATE affiliation "
 		       . "SET shibname = $newval "
 		       . "WHERE id = $affilid";
 		doQuery($query);
-		$rc = mysql_affected_rows($mysql_link_vcl);
+		$rc = mysqli_affected_rows($mysqli_link_vcl);
 		if($rc == 1)
 			return 1;
 		return 0;
@@ -1991,12 +1991,12 @@
 	///
 	/////////////////////////////////////////////////////////////////////////////
 	function deleteValue($affilid) {
-		global $mysql_link_vcl;
+		global $mysqli_link_vcl;
 		$query = "UPDATE affiliation "
 		       . "SET shibname = NULL "
 		       . "WHERE id = $affilid";
 		doQuery($query);
-		$rc = mysql_affected_rows($mysql_link_vcl);
+		$rc = mysqli_affected_rows($mysqli_link_vcl);
 		if($rc == 1)
 			return 1;
 		return 0;
@@ -2973,7 +2973,7 @@
 			sendJSON($arr);
 			return;
 		}
-		$_newval = mysql_real_escape_string($newval);
+		$_newval = vcl_mysql_escape_string($newval);
 		$query = "INSERT INTO affiliation (name) VALUES ('$_newval')";
 		doQuery($query);
 		$arr = array('status' => 'success',
@@ -2998,7 +2998,7 @@
 		foreach($tables as $table) {
 			$query = "SELECT affiliationid FROM $table WHERE affiliationid = $key LIMIT 1";
 			$qh = doQuery($query);
-			if(mysql_num_rows($qh)) {
+			if(mysqli_num_rows($qh)) {
 				$used = 1;
 				break;
 			}
@@ -3052,7 +3052,7 @@
 	function updateValue($key, $val) {
 		$tmp = explode('|', $key);
 		$key = $tmp[1];
-		$_val = mysql_real_escape_string($val);
+		$_val = vcl_mysql_escape_string($val);
 		$query = "UPDATE affiliation SET name = '$_val' WHERE id = $key";
 		doQuery($query);
 	}
@@ -3395,7 +3395,7 @@
 		       .       "value LIKE '%invalidfields%'";
 		$qh = doQuery($query);
 		$invalids = array();
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			$data = Spyc::YAMLLoad($row['value']);
 			if(array_key_exists('invalidfields', $data)) {
 				$invalids[$row['name']] = $data['invalidfields'];
diff --git a/web/.ht-inc/sitemaintenance.php b/web/.ht-inc/sitemaintenance.php
index 6dad773..fe833dc 100644
--- a/web/.ht-inc/sitemaintenance.php
+++ b/web/.ht-inc/sitemaintenance.php
@@ -279,8 +279,8 @@
 		return;
 	}
 
-	$reason = mysql_real_escape_string($data['reason']);
-	$usermessage = mysql_real_escape_string($data['usermessage']);
+	$reason = vcl_mysql_escape_string($data['reason']);
+	$usermessage = vcl_mysql_escape_string($data['usermessage']);
 	$query = "INSERT INTO sitemaintenance "
 	       .        "(start, "
 	       .        "end, "
@@ -413,8 +413,8 @@
 		return;
 	}
 
-	$reason = mysql_real_escape_string($data['reason']);
-	$usermessage = mysql_real_escape_string($data['usermessage']);
+	$reason = vcl_mysql_escape_string($data['reason']);
+	$usermessage = vcl_mysql_escape_string($data['usermessage']);
 	$query = "UPDATE sitemaintenance "
 	       . "SET start = '{$data['startdt']}', "
 	       .     "end = '{$data['enddt']}', "
diff --git a/web/.ht-inc/statistics.php b/web/.ht-inc/statistics.php
index ca81b8b..f30998f 100644
--- a/web/.ht-inc/statistics.php
+++ b/web/.ht-inc/statistics.php
@@ -110,7 +110,7 @@
 		       . "ORDER BY prettyname";
 		$qh = doQuery($query);
 		$provs = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$provs[$row['id']] = $row['prettyname'];
 		$cdata = array('mode' => 'provisioning',
 		               'provs' => $provs);
@@ -292,7 +292,7 @@
 	                 "10hrsplus" => 0);
 	$totalhours = 0;
 	$osusers = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if(! array_key_exists($row["prettyname"], $imageload2less))
 			$imageload2less[$row["prettyname"]] = 0;
 		if(! array_key_exists($row["prettyname"], $imageload2to6))
@@ -665,6 +665,8 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function getStatGraphDayData($start, $end, $affilid, $mode, $provid) {
+	$tz = date_default_timezone_get();
+	date_default_timezone_set('UTC');
 	$startunix = datetimeToUnix($start . " 00:00:00");
 	$endunix = datetimeToUnix($end . " 23:59:59");
 
@@ -676,6 +678,9 @@
 	$addcache = array();
 	$reloadid = getUserlistID('vclreload@Local');
 	$cnt = 0;
+	$prov = "provisioningid = $provid";
+	if($provid == 0)
+		$prov = "(provisioningid IS NULL OR provisioningid = 0)";
 	$query = "SELECT statdate, "
 	       .        "value "
 	       . "FROM statgraphcache "
@@ -683,9 +688,9 @@
 			 .       "affiliationid = $affilid AND "
 	       .       "statdate >= '$start' AND "
 	       .       "statdate <= '$end' AND "
-	       .       "provisioningid = $provid";
+	       .       "$prov";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$cachepts[$row['statdate']] = $row['value'];
 	for($i = $startunix; $i < $endunix; $i += SECINDAY) {
 		$cnt++;
@@ -735,7 +740,7 @@
 				}
 			}
 			$qh = doQuery($query, 295);
-			if($row = mysql_fetch_row($qh))
+			if($row = mysqli_fetch_row($qh))
 				$value = $row[0];
 			else
 				$value = 0;
@@ -749,6 +754,7 @@
 	}
 	if(count($addcache))
 		addToStatGraphCache('totalres', $addcache, $affilid, $provid);
+	date_default_timezone_set($tz);
 	return($data);
 }
 
@@ -843,7 +849,7 @@
 		}
 	}
 	$qh = doQuery($query, 296);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$startmin = ($row['shour'] * 60) + $row['smin'];
 		$endmin = ($row['ehour'] * 60) + $row['emin'];
 
@@ -920,6 +926,8 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function getStatGraphDayConUsersData($start, $end, $affilid, $mode, $provid) {
+	$tz = date_default_timezone_get();
+	date_default_timezone_set('UTC');
 	$startdt = $start . " 00:00:00";
 	$enddt = $end . " 23:59:59";
 	$startunix = datetimeToUnix($startdt);
@@ -942,6 +950,9 @@
 
 	$reloadid = getUserlistID('vclreload@Local');
 	$cnt = 0;
+	$prov = "provisioningid = $provid";
+	if($provid == 0)
+		$prov = "(provisioningid IS NULL OR provisioningid = 0)";
 	$query = "SELECT statdate, "
 	       .        "value "
 	       . "FROM statgraphcache "
@@ -949,12 +960,13 @@
 			 .       "affiliationid = $affilid AND "
 	       .       "statdate >= '$start' AND "
 	       .       "statdate <= '$end' AND "
-	       .       "provisioningid = $provid";
+	       .       "$prov";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$cachepts[$row['statdate']] = $row['value'];
 	if((count($cachepts) + 31) < $daycnt) {
 		$data = array('nodata' => i('(too much computational time required to generate this graph)'));
+		date_default_timezone_set($tz);
 		return $data;
 	}
 	for($daystart = $startunix; $daystart < $endunix; $daystart += SECINDAY) {
@@ -1008,7 +1020,7 @@
 				}
 			}
 			$qh = doQuery($query, 101);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				$unixstart = $row["start"];
 				$unixend = $row["end"];
 				for($binstart = $daystart, $binend = $daystart + 3600, $binindex = 0;
@@ -1038,6 +1050,7 @@
 	}
 	if(count($addcache))
 		addToStatGraphCache('concurres', $addcache, $affilid, $provid);
+	date_default_timezone_set($tz);
 	return($data);
 }
 
@@ -1064,6 +1077,8 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function getStatGraphConBladeUserData($start, $end, $affilid, $mode, $provid) {
+	$tz = date_default_timezone_get();
+	date_default_timezone_set('UTC');
 	$startdt = $start . " 00:00:00";
 	$enddt = $end . " 23:59:59";
 	$startunix = datetimeToUnix($startdt);
@@ -1086,6 +1101,9 @@
 
 	$reloadid = getUserlistID('vclreload@Local');
 	$cnt = 0;
+	$prov = "provisioningid = $provid";
+	if($provid == 0)
+		$prov = "(provisioningid IS NULL OR provisioningid = 0)";
 	$query = "SELECT statdate, "
 	       .        "value "
 	       . "FROM statgraphcache "
@@ -1093,12 +1111,13 @@
 			 .       "affiliationid = $affilid AND "
 	       .       "statdate >= '$start' AND "
 	       .       "statdate <= '$end' AND "
-	       .       "provisioningid = $provid";
+	       .       "$prov";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$cachepts[$row['statdate']] = $row['value'];
 	if((count($cachepts) + 31) < $daycnt) {
 		$data = array('nodata' => i('(too much computational time required to generate this graph)'));
+		date_default_timezone_set($tz);
 		return $data;
 	}
 	for($daystart = $startunix; $daystart < $endunix; $daystart += SECINDAY) {
@@ -1180,7 +1199,7 @@
 			}
 			$qh = doQuery($query, 101);
 			$comps = array();
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				$unixstart = datetimeToUnix($row["start"]);
 				$unixend = datetimeToUnix($row["end"]);
 				for($binstart = $daystart, $binend = $daystart + 3600, $binindex = 0;
@@ -1216,6 +1235,7 @@
 	}
 	if(count($addcache))
 		addToStatGraphCache('concurblade', $addcache, $affilid, $provid);
+	date_default_timezone_set($tz);
 	return($data);
 }
 
@@ -1242,6 +1262,8 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function getStatGraphConVMUserData($start, $end, $affilid, $mode, $provid) {
+	$tz = date_default_timezone_get();
+	date_default_timezone_set('UTC');
 	$startdt = $start . " 00:00:00";
 	$enddt = $end . " 23:59:59";
 	$startunix = datetimeToUnix($startdt);
@@ -1264,6 +1286,9 @@
 
 	$reloadid = getUserlistID('vclreload@Local');
 	$cnt = 0;
+	$prov = "provisioningid = $provid";
+	if($provid == 0)
+		$prov = "(provisioningid IS NULL OR provisioningid = 0)";
 	$query = "SELECT statdate, "
 	       .        "value "
 	       . "FROM statgraphcache "
@@ -1271,12 +1296,13 @@
 			 .       "affiliationid = $affilid AND "
 	       .       "statdate >= '$start' AND "
 	       .       "statdate <= '$end' AND "
-	       .       "provisioningid = $provid";
+	       .       "$prov";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$cachepts[$row['statdate']] = $row['value'];
 	if((count($cachepts) + 31) < $daycnt) {
 		$data = array('nodata' => i('(too much computational time required to generate this graph)'));
+		date_default_timezone_set($tz);
 		return $data;
 	}
 	for($daystart = $startunix; $daystart < $endunix; $daystart += SECINDAY) {
@@ -1348,7 +1374,7 @@
 				}
 			}
 			$qh = doQuery($query, 101);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				$unixstart = datetimeToUnix($row["start"]);
 				$unixend = datetimeToUnix($row["end"]);
 				for($binstart = $daystart, $binend = $daystart + 3600, $binindex = 0;
@@ -1378,6 +1404,7 @@
 	}
 	if(count($addcache))
 		addToStatGraphCache('concurvm', $addcache, $affilid, $provid);
+	date_default_timezone_set($tz);
 	return($data);
 }
 
diff --git a/web/.ht-inc/userpreferences.php b/web/.ht-inc/userpreferences.php
index 3838c99..fcdc6f7 100644
--- a/web/.ht-inc/userpreferences.php
+++ b/web/.ht-inc/userpreferences.php
@@ -490,7 +490,7 @@
 		       . "WHERE u.id = '{$user['id']}' AND "
 		       .       "l.userid = u.id";
 		$qh = doQuery($query, 101);
-		if(! ($row = mysql_fetch_assoc($qh)))
+		if(! ($row = mysqli_fetch_assoc($qh)))
 			abort();
 		$passhash = sha1("{$data['newpassword']}{$row['salt']}");
 		$query = "UPDATE localauth "
@@ -564,7 +564,7 @@
 	if($pubkeyauth == 2 && preg_match('|^[-a-zA-Z0-9\+/ @=\.\n\r]*$|', $pubkeys)) {
 		if(get_magic_quotes_gpc())
 			$pubkeys = stripslashes($pubkeys);
-		$_pubkeys = mysql_real_escape_string($pubkeys);
+		$_pubkeys = vcl_mysql_escape_string($pubkeys);
 		$query = "UPDATE user SET sshpublickeys = '$_pubkeys' WHERE id = {$user['id']}";
 		doQuery($query);
 		$_SESSION['user']['sshpublickeys'] = htmlspecialchars($pubkeys);
diff --git a/web/.ht-inc/utils.php b/web/.ht-inc/utils.php
index feaabef..763e4b2 100644
--- a/web/.ht-inc/utils.php
+++ b/web/.ht-inc/utils.php
@@ -125,7 +125,12 @@
 	$days = array(i('Sunday'), i('Monday'), i('Tuesday'), i('Wednesday'), i('Thursday'), i('Friday'), i('Saturday'));
 	$phpVerArr = explode('.', phpversion());
 	$phpVer = $phpVerArr[0];
-	$uniqid = uniqid($_SERVER['HTTP_HOST'] . "-" . getmypid() . "-");
+	
+	$host = $_SERVER['HTTP_HOST'];
+	if(strpos($host, ':')) {
+		$host = substr($host, 0, strpos($host, ':'));
+	}
+	$uniqid = uniqid($host . "-" . getmypid() . "-");
 
 	$passwdArray = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
 	                     'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
@@ -264,7 +269,7 @@
 	# set up $affilValFunc, $addUserFunc, $updateUserFunc for any shibonly affiliations
 	$query = "SELECT id FROM affiliation WHERE shibonly = 1";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$id = $row['id'];
 		if(! array_key_exists($id, $affilValFunc)) {
 			if(ALLOWADDSHIBUSERS)
@@ -448,7 +453,7 @@
 						exit;
 					}
 					$search = ldap_search($ds,
-					                      $auth['binddn'], 
+					                      $auth['binddn'],
 					                      "{$auth['lookupuserfield']}={$user['unityid']}",
 					                      array('dn'), 0, 3, 15);
 					if($search) {
@@ -498,7 +503,7 @@
 			elseif($authMechs[$authtype]['type'] == 'redirect') {
 				$affilid = $authMechs[$authtype]['affiliationid'];
 				if(!(isset($apiValidateFunc) && is_array($apiValidateFunc) &&
-				   array_key_exists($affilid, $apiValidateFunc) && 
+				   array_key_exists($affilid, $apiValidateFunc) &&
 				   $apiValidateFunc[$affilid]($xmluser, $xmlpass))) {
 					printXMLRPCerror(3);    # access denied
 					dbDisconnect();
@@ -635,13 +640,13 @@
 		$fh = fopen($idfile, 'r');
 		$id = fread($fh, 50);
 		fclose($fh);
-		$_id = mysql_real_escape_string($id);
-	
+		$_id = vcl_mysql_escape_string($id);
+
 		$query = "SELECT id "
 		       . "FROM cryptkey  "
 		       . "WHERE id = '$_id'";
 		$qh = doQuery($query);
-		if($row = mysql_fetch_assoc($qh))
+		if($row = mysqli_fetch_assoc($qh))
 			return;
 	}
 
@@ -732,7 +737,7 @@
 		       .       "end > NOW()";
 		$qh = doQuery($query);
 		$ids = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$ids[] = $row['id'];
 		if(empty($ids)) {
 			dbDisconnect();
@@ -745,7 +750,7 @@
 		doQuery($query, 101, 'vcl', 1);
 		dbDisconnect();
 		return;
-	}  
+	}
 	$inmaintenance = 0;
 	$skin = '';
 	foreach($files as $file) {
@@ -1002,7 +1007,7 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function abort($errcode, $query="") {
-	global $mysql_link_vcl, $mysql_link_acct, $ERRORS, $user, $mode;
+	global $mysqli_link_vcl, $mysqli_link_acct, $ERRORS, $user, $mode;
 	global $ENABLE_ITECSAUTH, $requestInfo, $aborting;
 	if(! isset($aborting))
 		$aborting = 1;
@@ -1012,11 +1017,11 @@
 		xmlRPCabort($errcode, $query);
 	if(ONLINEDEBUG && checkUserHasPerm('View Debug Information')) {
 		if($errcode >= 100 && $errcode < 400) {
-			print "<font color=red>" . mysql_error($mysql_link_vcl) . "</font><br>\n";
-			error_log(mysql_error($mysql_link_vcl));
+			print "<font color=red>" . mysqli_error($mysqli_link_vcl) . "</font><br>\n";
+			error_log(mysqli_error($mysqli_link_vcl));
 			if($ENABLE_ITECSAUTH) {
-				print "<font color=red>" . mysql_error($mysql_link_acct) . "</font><br>\n";
-				error_log(mysql_error($mysql_link_acct));
+				print "<font color=red>" . mysqli_error($mysqli_link_acct) . "</font><br>\n";
+				error_log(mysqli_error($mysqli_link_acct));
 			}
 			print "$query<br>\n";
 			error_log($query);
@@ -1033,9 +1038,9 @@
 	else {
 		$message = "";
 		if($errcode >= 100 && $errcode < 400) {
-			$message .= mysql_error($mysql_link_vcl) . "\n";
+			$message .= mysqli_error($mysqli_link_vcl) . "\n";
 			if($ENABLE_ITECSAUTH)
-				$message .= mysql_error($mysql_link_acct) . "\n";
+				$message .= mysqli_error($mysqli_link_acct) . "\n";
 			$message .= $query . "\n";
 		}
 		$message .= "ERROR($errcode): " . $ERRORS["$errcode"] . "\n";
@@ -1104,7 +1109,7 @@
 	global $affilValFuncArgs, $affilValFunc;
 	if(empty($loginid))
 		return 0;
-	
+
 	$rc = getAffilidAndLogin($loginid, $affilid);
 	if($rc == -1)
 		return 0;
@@ -1112,25 +1117,25 @@
 	if(empty($affilid))
 		return 0;
 
-	$escloginid = mysql_real_escape_string($loginid);
+	$escloginid = vcl_mysql_escape_string($loginid);
 	$query = "SELECT id "
 	       . "FROM user "
 	       . "WHERE unityid = '$escloginid' AND "
 	       .       "affiliationid = $affilid";
 	$qh = doQuery($query, 101);
-	if(mysql_num_rows($qh))
+	if(mysqli_num_rows($qh))
 		return 1;
 
 	if($rc == 0 &&
-	   ALLOWADDSHIBUSERS == 1 && 
+	   ALLOWADDSHIBUSERS == 1 &&
 	   strpos($loginid, '@')) {
 		$query = "SELECT shibonly "
 		       . "FROM affiliation "
 		       . "WHERE id = " . DEFAULT_AFFILID;
-		$qh = doQuery($query); 
-		$row = mysql_fetch_assoc($qh);
+		$qh = doQuery($query);
+		$row = mysqli_fetch_assoc($qh);
 		if($row['shibonly'] == 1)
-			return 0;           
+			return 0;
 	}
 
 	$valfunc = $affilValFunc[$affilid];
@@ -1184,11 +1189,12 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 ///
-/// \fn mysql_connect_plus($host, $user, $pwd)
+/// \fn mysql_connect_plus($host, $user, $pwd, $db)
 ///
 /// \param $host - mysql host
 /// \param $user - userid to use for connection
 /// \param $pwd - password to use for connection
+/// \param $db - database to use after connecting
 ///
 /// \return mysql resource identifier, 0 if failure to connect
 ///
@@ -1197,12 +1203,12 @@
 /// and returns the identifier
 ///
 ////////////////////////////////////////////////////////////////////////////////
-function mysql_connect_plus($host, $user, $pwd) {
+function mysql_connect_plus($host, $user, $pwd, $db) {
 	$timeout = 5;             /* timeout in seconds */
 
 	if($fp = @fsockopen($host, 3306, $errno, $errstr, $timeout)) {
 		fclose($fp);
-		return $link = mysql_connect($host, $user, $pwd);
+		return $link = mysqli_connect($host, $user, $pwd, $db);
 	} else {
 		#print "ERROR: socket timeout<BR>\n";
 		return 0;
@@ -1214,29 +1220,25 @@
 /// \fn dbConnect()
 ///
 /// \brief opens connections to database, the resource identifiers are\n
-/// \b $mysql_link_vcl - for vcl database\n
-/// \b $mysql_link_acct - for accounts database\n
+/// \b $mysqli_link_vcl - for vcl database\n
+/// \b $mysqli_link_acct - for accounts database\n
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function dbConnect() {
-	global $vclhost, $vcldb, $vclusername, $vclpassword, $mysql_link_vcl;
-	global $accthost, $acctusername, $acctpassword, $mysql_link_acct;
+	global $vclhost, $vcldb, $vclusername, $vclpassword, $mysqli_link_vcl;
+	global $accthost, $acctusername, $acctpassword, $mysqli_link_acct;
 	global $ENABLE_ITECSAUTH;
 
 	if($ENABLE_ITECSAUTH) {
 		// open a connection to mysql server for accounts
-		if($mysql_link_acct = mysql_connect_plus($accthost, $acctusername, $acctpassword))
-			mysql_select_db("accounts", $mysql_link_acct);
-		else
+		if(! ($mysqli_link_acct = mysql_connect_plus($accthost, $acctusername, $acctpassword, 'accounts')))
 			$ENABLE_ITECSAUTH = 0;
 	}
 
 	// open a connection to mysql server for vcl
-	if(! $mysql_link_vcl = mysql_connect_plus($vclhost, $vclusername, $vclpassword)) {
+	if(! $mysqli_link_vcl = mysql_connect_plus($vclhost, $vclusername, $vclpassword, $vcldb)) {
 		die("Error connecting to $vclhost.<br>\n");
 	}
-	// select the vcl database
-	mysql_select_db($vcldb, $mysql_link_vcl) or abort(104);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -1247,10 +1249,10 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function dbDisconnect() {
-	global $mysql_link_vcl, $mysql_link_acct, $ENABLE_ITECSAUTH;
-	mysql_close($mysql_link_vcl);
+	global $mysqli_link_vcl, $mysqli_link_acct, $ENABLE_ITECSAUTH;
+	mysqli_close($mysqli_link_vcl);
 	if($ENABLE_ITECSAUTH)
-		mysql_close($mysql_link_acct);
+		mysqli_close($mysqli_link_acct);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -1268,9 +1270,9 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function doQuery($query, $errcode=101, $db="vcl", $nolog=0) {
-	global $mysql_link_vcl, $mysql_link_acct, $user, $mode, $ENABLE_ITECSAUTH;
+	global $mysqli_link_vcl, $mysqli_link_acct, $user, $mode, $ENABLE_ITECSAUTH;
 	if($db == "vcl") {
-		if(QUERYLOGGING != 0 && (! $nolog) && 
+		if(QUERYLOGGING != 0 && (! $nolog) &&
 		   preg_match('/^(UPDATE|INSERT|DELETE)/', $query) &&
 		   strpos($query, 'UPDATE continuations SET expiretime = ') === FALSE) {
 			$logquery = str_replace("'", "\'", $query);
@@ -1289,10 +1291,10 @@
 			   .        "NOW(), "
 			   .        "'$mode', "
 			   .        "'$logquery')";
-			mysql_query($q, $mysql_link_vcl);
+			mysqli_query($mysqli_link_vcl, $q);
 		}
-		for($i = 0; ! ($qh = mysql_query($query, $mysql_link_vcl)) && $i < 3; $i++) {
-			if(mysql_errno() == '1213') # DEADLOCK, sleep and retry
+		for($i = 0; ! ($qh = mysqli_query($mysqli_link_vcl, $query)) && $i < 3; $i++) {
+			if(mysqli_errno() == '1213') # DEADLOCK, sleep and retry
 				usleep(50);
 			else
 				abort($errcode, $query);
@@ -1300,7 +1302,7 @@
 	}
 	elseif($db == "accounts") {
 		if($ENABLE_ITECSAUTH)
-			$qh = mysql_query($query, $mysql_link_acct) or abort($errcode, $query);
+			$qh = mysqli_query($mysqli_link_acct, $query) or abort($errcode, $query);
 		else
 			$qh = NULL;
 	}
@@ -1311,14 +1313,31 @@
 ///
 /// \fn dbLastInsertID()
 ///
-/// \return last insert id for $mysql_link_vcl
+/// \return last insert id for $mysqli_link_vcl
 ///
-/// \brief calls mysql_insert_id for $mysql_link_vcl
+/// \brief calls mysqli_insert_id for $mysqli_link_vcl
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function dbLastInsertID() {
-	global $mysql_link_vcl;
-	return mysql_insert_id($mysql_link_vcl);
+	global $mysqli_link_vcl;
+	return mysqli_insert_id($mysqli_link_vcl);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+///
+/// \fn vcl_mysql_escape_string($string) {
+///
+/// \param $string - string to be escaped
+///
+/// \return escaped string
+///
+/// \brief wrapper for mysqli_real_escape_string so that $mysqli_link_vcl global
+/// variable doesn't have to be included in every function needing to call it
+///
+////////////////////////////////////////////////////////////////////////////////
+function vcl_mysql_escape_string($string) {
+	global $mysqli_link_vcl;
+	return mysqli_real_escape_string($mysqli_link_vcl, $string);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -1334,7 +1353,7 @@
 	$query = "SELECT id, name, prettyname, type, installtype FROM OS ORDER BY prettyname";
 	$qh = doQuery($query, "115");
 	$oslist = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$oslist[$row['id']] = $row;
 	return $oslist;
 }
@@ -1373,7 +1392,7 @@
 ///                  checked out\n
 /// \b maxinitialtime - maximum time (in minutes) to be shown when requesting
 ///                     a reservation that the image can reserved for\n
-/// \b imagemetaid - NULL or corresponding id from imagemeta table and the 
+/// \b imagemetaid - NULL or corresponding id from imagemeta table and the
 /// following additional information:\n
 /// \b checkuser - whether or not vcld should check for a logged in user\n
 /// \b sysprep - whether or not to use sysprep on creation of the image\n
@@ -1406,7 +1425,7 @@
 	       .        "id "
 	       . "FROM imagemeta";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$allmetadata[$row['id']] = $row;
 
 	# get all image revision data
@@ -1430,7 +1449,7 @@
 		$query .=   "i.deleted = 0 AND ";
 	$query .=      "u.affiliationid = a.id";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$id = $row['imageid'];
 		unset($row['imageid']);
 		$allrevisiondata[$id][$row['id']] = $row;
@@ -1485,7 +1504,7 @@
 		$query .= "AND i.deleted = 0 ";
    $query .= "ORDER BY i.prettyname";
 	$qh = doQuery($query, 120);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if(is_null($row['maxconcurrent']))
 			$row['maxconcurrent'] = 0;
 		$imagelist[$includedeleted][$row["id"]] = $row;
@@ -1512,7 +1531,7 @@
 				        . "FROM subimages "
 				        . "WHERE imagemetaid = $metaid";
 					$qh2 = doQuery($query2, 101);
-					while($row2 = mysql_fetch_assoc($qh2))
+					while($row2 = mysqli_fetch_assoc($qh2))
 						$imagelist[$includedeleted][$row["id"]]["subimages"][] =  $row2["imageid"];
 				}
 			}
@@ -1562,7 +1581,7 @@
 	$fixeddata = array();
 	$query = "SELECT name, value FROM variable WHERE name LIKE 'fixedIPsp%'";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$spid = str_replace('fixedIPsp', '', $row['name']);
 		$fixeddata[$spid] = Spyc::YAMLLoad($row['value']);
 	}
@@ -1598,7 +1617,7 @@
 		$query .= "ORDER BY name";
 	$qh = doQuery($query, 101);
 	$profiles = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$profiles[$row['id']] = $row;
 		if(isset($fixeddata[$row['id']])) {
 			$profiles[$row['id']]['netmask'] = $fixeddata[$row['id']]['netmask'];
@@ -1647,7 +1666,7 @@
 	       .       "s.id IN ($inids)";
 	$qh = doQuery($query, 101);
 	$profiles = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$profiles[$row['id']] = $row['image'];
 	$_SESSION['usersessiondata'][$key] = $profiles;
 	return $profiles;
@@ -1696,7 +1715,7 @@
 	$query .= " ORDER BY revision";
 	$qh = doQuery($query, 101);
 	$return = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$return[$row['id']] = $row;
 	return $return;
 }
@@ -1723,7 +1742,7 @@
 	       . "FROM image "
 	       . "WHERE id = $imageid";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh))
+	if($row = mysqli_fetch_assoc($qh))
 		return $row;
 	else
 		return array('description' => '', 'usage' => '');
@@ -1807,7 +1826,7 @@
 		       .          "disabled";
 
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			if($row['disabled'] &&
 			   isset($allmethods[$row['imageid']][$row['imagerevisionid']][$row['connectmethodid']]))
 				unset($allmethods[$row['imageid']][$row['imagerevisionid']][$row['connectmethodid']]);
@@ -1844,7 +1863,7 @@
 	if(! preg_match('/^en/', $locale)) {
 		$query = "DESC connectmethod";
 		$qh = doQuery($query, 101);
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			if($row['Field'] == "description_$locale")
 				$descfield = "description_$locale";
 			if($row['Field'] == "connecttext_$locale")
@@ -1858,7 +1877,7 @@
 	       .        "protocol "
 	       . "FROM connectmethodport";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$row['key'] = "#Port-{$row['protocol']}-{$row['port']}#";
 		$cmports[$row['connectmethodid']][] = $row;
 	}
@@ -1883,7 +1902,7 @@
 	       .          "c.`$descfield`";
 	$methods = array();
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if($row['disabled']) {
 		  if(isset($methods[$row['id']]))
 			unset($methods[$row['id']]);
@@ -1910,7 +1929,7 @@
 	$query = "SELECT id, name FROM imagetype ORDER BY name";
 	$qh = doQuery($query);
 	$data = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$data[$row['id']] = $row['name'];
 	return $data;
 }
@@ -1935,14 +1954,14 @@
 	$query = "DESC imagemeta";
 	$qh = doQuery($query, 101);
 	$defaults = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$defaults[$row['Field']] = $row['Default'];
 	# get imagemeta data
 	$query = "SELECT * FROM imagemeta WHERE id = $imagemetaid";
 	$qh = doQuery($query, 101);
-	$row = mysql_fetch_assoc($qh);
+	$row = mysqli_fetch_assoc($qh);
 	$alldefaults = 1;
-	if(mysql_num_rows($qh) == 0)
+	if(mysqli_num_rows($qh) == 0)
 		# it is possible that the imagemeta record could have been deleted before
 		#   this was submitted
 		return 1;
@@ -1990,10 +2009,10 @@
 			return '';
 	$query = "SELECT id, "
 	       .        "imageid "
-	       . "FROM imagerevision  " 
+	       . "FROM imagerevision  "
 	       . "WHERE production = 1";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$alldata[$row['imageid']] = $row['id'];
 	return $alldata[$imageid];
 }
@@ -2094,7 +2113,7 @@
 	else
 		$query .=   "u.usergroupid = $groupid";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		array_push($startnodes, $row["privnodeid"]);
 	}
 	# build data array from userprivtype and userpriv tables to reduce queries
@@ -2109,7 +2128,7 @@
 	       .       "u.userid = $userid AND "
 	       .       "t.name IN ('block','cascade',$inlist)";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$privdataset['user'][$row['privnodeid']][] = $row['name'];
 	$query = "SELECT t.name, "
 	       .        "u.usergroupid, "
@@ -2128,7 +2147,7 @@
 	       . "ORDER BY u.privnodeid, "
 	       .          "u.usergroupid";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$privdataset['usergroup'][$row['privnodeid']][] = array('name' => $row['name'], 'groupid' => $row['usergroupid']);
 
 	# travel up tree looking at privileges granted at parent nodes
@@ -2190,7 +2209,7 @@
 
 	$resources = array();
 	foreach(array_keys($resourcegroups) as $type) {
-		$resources[$type] = 
+		$resources[$type] =
 		   getResourcesFromGroups($resourcegroups[$type], $type, $includedeleted);
 	}
 	if(! $bygroup)
@@ -2220,7 +2239,7 @@
 /// \brief adds resource privileges to $nodeprivs for the parents of $nodeid
 ///
 ////////////////////////////////////////////////////////////////////////////////
-function getUserResourcesUp(&$nodeprivs, $nodeid, $userid, 
+function getUserResourcesUp(&$nodeprivs, $nodeid, $userid,
                             $resourceprivs, $privdataset) {
 	# build list of parent nodes
 	# starting at top, get images available at that node and user privs there and
@@ -2257,7 +2276,7 @@
 /// of $nodeid
 ///
 ////////////////////////////////////////////////////////////////////////////////
-function getUserResourcesDown(&$nodeprivs, $nodeid, $userid, 
+function getUserResourcesDown(&$nodeprivs, $nodeid, $userid,
                               $resourceprivs, $privdataset) {
 	# FIXME can we check for cascading and if not there, don't descend?
 	$children = getChildNodes($nodeid);
@@ -2283,11 +2302,11 @@
 ///
 /// \return modifies $nodeprivs, but doesn't return anything
 ///
-/// \brief for $id, gets privileges and cascaded privileges the user and any 
+/// \brief for $id, gets privileges and cascaded privileges the user and any
 /// groups the user is and adds them to $nodeprivs
 ///
 ////////////////////////////////////////////////////////////////////////////////
-function addNodeUserResourcePrivs(&$nodeprivs, $id, $lastid, $userid, 
+function addNodeUserResourcePrivs(&$nodeprivs, $id, $lastid, $userid,
                                   $resourceprivs, $privdataset) {
 	$nodeprivs[$id]["user"] = array("cascade" => 0);
 	foreach($resourceprivs as $priv) {
@@ -2358,9 +2377,9 @@
 			if($noprivs)
 				$nodeprivs[$id][$groupid]["cascade"] = 0;
 		}
-		// if group not blocking at this node, and group had cascade at previous 
+		// if group not blocking at this node, and group had cascade at previous
 		# node
-		if($lastid && ! $nodeprivs[$id][$groupid]["block"] && 
+		if($lastid && ! $nodeprivs[$id][$groupid]["block"] &&
 		   isset($nodeprivs[$lastid][$groupid]) &&
 		   $nodeprivs[$lastid][$groupid]["cascade"]) {
 			# set cascade = 1
@@ -2468,7 +2487,7 @@
 		if(! $includedeleted && $type == 'managementnode')
 			$query .= " AND stateid != (SELECT id FROM state WHERE name = 'deleted') ";
 		$qh = doQuery($query, 101);
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			if(! isset($resources[$type][$row["id"]]))
 				$resources[$type][$row["id"]] = $row[$field];
 		}
@@ -2502,7 +2521,7 @@
 	       . "WHERE g.resourcetypeid = t.id AND "
 	       .       "g.ownerusergroupid IN ($groupids)";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if(! isset($resourcegroups[$row["type"]][$row["id"]]))
 			$resourcegroups[$row["type"]][$row["id"]] = $row["name"];
 	}
@@ -2563,7 +2582,7 @@
 		$query .= "AND test = 0 ";*/
 	$query .= "ORDER BY t.$field";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$return[$row["id"]] = $row["name"];
 	}
 	return $return;
@@ -2644,7 +2663,7 @@
 	else
 		$groupid = getResourceGroupID($group);
 	foreach($adds as $type) {
-		$type = mysql_real_escape_string($type);
+		$type = vcl_mysql_escape_string($type);
 		$query = "INSERT IGNORE INTO resourcepriv ("
 		       .        "resourcegroupid, "
 		       .        "privnodeid, "
@@ -2656,7 +2675,7 @@
 		doQuery($query, 377);
 	}
 	foreach($removes as $type) {
-		$type = mysql_real_escape_string($type);
+		$type = vcl_mysql_escape_string($type);
 		$query = "DELETE FROM resourcepriv "
 		       . "WHERE resourcegroupid = $groupid AND "
 		       .       "privnodeid = $node AND "
@@ -2725,7 +2744,7 @@
 	$cryptdata = $iv . $cryptdata;
 	return trim(base64_encode($cryptdata));
 }
- 
+
 ////////////////////////////////////////////////////////////////////////////////
 ///
 /// \fn decryptData($data, $cryptkey, $algo, $option, $keylength)
@@ -2799,7 +2818,7 @@
 	       . "WHERE cryptkeyid = $cryptkeyid AND "
 	       .       "secretid = $secretid";
 	$qh = doQuery($query);
-	if(! ($row = mysql_fetch_assoc($qh)))
+	if(! ($row = mysqli_fetch_assoc($qh)))
 		return NULL;
 	$secret = decryptSecretKey($row['cryptsecret']);
 	if($secret === NULL)
@@ -2828,7 +2847,7 @@
 		       . "FROM cryptkey "
 		       . "WHERE id = $cryptkey";
 		$qh = doQuery($query);
-		if(! ($row = mysql_fetch_assoc($qh)))
+		if(! ($row = mysqli_fetch_assoc($qh)))
 			return NULL;
 		$cryptkey = $row['pubkey'];
 		if($row['algorithmoption'] == 'OAEP' || 1) # OAEP only currently supported option
@@ -2896,7 +2915,7 @@
 function getSecretKeyID($table, $field, $recordid) {
 	$query = "SELECT $field FROM $table WHERE id = $recordid";
 	$qh = doQuery($query);
-	if(($row = mysql_fetch_row($qh)) && $row[0] != 0)
+	if(($row = mysqli_fetch_row($qh)) && $row[0] != 0)
 		return $row[0];
 
 	# generate secret key
@@ -2935,7 +2954,7 @@
 		return NULL;
 	$query = "SELECT secretid FROM cryptsecret WHERE id = $id";
 	$qh = doQuery($query);
-	if(! ($row = mysql_fetch_assoc($qh)))
+	if(! ($row = mysqli_fetch_assoc($qh)))
 		return NULL;
 	# encrypt with all other public keys and write to cryptsecret
 	encryptWebSecretKeys($key, $row['secretid'], $cryptkeyid);
@@ -2970,6 +2989,7 @@
 function getCryptKeyID() {
 	$reg = "|" . SCRIPT . "$|";
 	$filebase = preg_replace($reg, '', $_SERVER['SCRIPT_FILENAME']);
+	$filebase = preg_replace('|/shibauth|', '', $filebase);
 	$filebase .= "/.ht-inc/cryptkey";
 	$idfile = "$filebase/cryptkeyid";
 
@@ -2988,13 +3008,13 @@
 	$fh = fopen($idfile, 'r');
 	$id = fread($fh, 50);
 	fclose($fh);
-	$_id = mysql_real_escape_string($id);
+	$_id = vcl_mysql_escape_string($id);
 
 	$query = "SELECT id "
 	       . "FROM cryptkey  "
 	       . "WHERE id = '$_id'";
 	$qh = doQuery($query);
-	if($row = mysql_fetch_assoc($qh))
+	if($row = mysqli_fetch_assoc($qh))
 		return $row['id'];
 
 	if($create) {
@@ -3026,7 +3046,7 @@
 	       .       "hosttype = 'web'";
 	$qh = doQuery($query);
 	$values = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$cryptsecret = encryptSecretKey($secret, $row['pubkey']);
 		if($cryptsecret === NULL)
 			continue;
@@ -3073,7 +3093,7 @@
 	       .       "cs.secretid IS NULL AND "
 	       .       "ck.id != $mycryptkeyid";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$secret = decryptSecretKey($row['mycryptsecret']);
 		$encsecret = encryptSecretKey($secret, $row['cryptkey']);
 		$values[] = "({$row['cryptkeyid']}, {$row['secretid']}, '$encsecret', '"
@@ -3116,7 +3136,7 @@
 	       . "WHERE rs.requestid = $requestid AND "
 	       .       "ad.secretid IS NOT NULL";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$secretids[$row['managementnodeid']][$row['secretid']] = 1;
 	# determine any secretids needed from vmprofile
 	$query = "SELECT vp.secretid, "
@@ -3128,7 +3148,7 @@
 	       . "WHERE rs.requestid = $requestid AND "
 	       .       "vp.secretid IS NOT NULL";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$secretids[$row['managementnodeid']][$row['secretid']] = 1;
 
 	$mycryptkeyid = getCryptKeyID();
@@ -3185,7 +3205,7 @@
 		       .       "s.id in ($allsecretids) AND "
 		       .       "cs.secretid IS NULL";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			$secret = decryptSecretKey($row['mycryptsecret']);
 			$encsecret = encryptSecretKey($secret, $row['cryptkey']);
 			$values[] = "({$row['cryptkeyid']}, {$row['secretid']}, '$encsecret', '"
@@ -3349,7 +3369,7 @@
 		$query .= "AND ug.affiliationid = $affiliationid ";
 	$query .= "ORDER BY name";
 	$qh = doQuery($query, 280);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if(! empty($row["owner"]) && ! empty($row['affiliation']))
 			$row['owner'] = "{$row['owner']}@{$row['affiliation']}";
 		if($user['showallgroups'] || $affiliationid == 0)
@@ -3392,13 +3412,13 @@
 		       . "FROM `usergroup` u, "
 		       .      "`usergroupmembers` m "
 		       . "WHERE u.editusergroupid = m.usergroupid AND "
-		       .       "(u.ownerid = $id OR m.userid = $id) AND " 
+		       .       "(u.ownerid = $id OR m.userid = $id) AND "
 		       .       "u.affiliationid = {$user['affiliationid']} "
 		       . "ORDER BY name";
 	}
 	$qh = doQuery($query, 101);
 	$groups = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$groups[$row['id']] = $row['name'];
 	}
 	return $groups;
@@ -3438,7 +3458,7 @@
 	$query .= "ORDER BY ug.name, "
 	       .           "ugpt.name";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$data[] = $row;
 	return $data;
 }
@@ -3460,7 +3480,7 @@
 	$data = array();
 	$query = "SELECT id, name, help FROM usergroupprivtype ORDER BY name";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$data[$row['id']] = $row;
 	return $data;
 }
@@ -3505,7 +3525,7 @@
 
 	$query .= "ORDER BY t.name, g.name";
 	$qh = doQuery($query, 281);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if(empty($type))
 			$return[$row["id"]]["name"] = $row["type"] . "/" . $row["name"];
 		else
@@ -3549,7 +3569,7 @@
 		       .       "gm.resourceid = r.id AND "
 		       .       "r.resourcetypeid = t.id";
 		$qh = doQuery($query, 282);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$return[$type][$row["id"]][] = $row["groupid"];
 	}
 	return $return;
@@ -3653,7 +3673,7 @@
 	       .          "rgm.resourcegroupid, "
 	       .          $orders;
 	$qh = doQuery($query, 282);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if(isset($row['deleted']) && $row['deleted'] == 1)
 			continue;
 		if(isset($row['deleted2']) && $row['deleted2'] == 1)
@@ -3690,7 +3710,7 @@
 	       .       "u.affiliationid = a.id "
 	       . "ORDER BY u.unityid";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$return[$row["id"]] = $row['user'];
 	}
 	return $return;
@@ -3714,7 +3734,7 @@
 		return;
 
 	$query = "INSERT INTO usergroupmembers "
-	       .        "(userid, " 
+	       .        "(userid, "
 	       .        "usergroupid) "
 	       . "VALUES "
 	       .        "($userid, "
@@ -3767,8 +3787,8 @@
 	       . "WHERE unityid = '$loginid' AND "
 	       .       "affiliationid = $affilid";
 	$qh = doQuery($query, 140);
-	if(mysql_num_rows($qh)) {
-		$row = mysql_fetch_row($qh);
+	if(mysqli_num_rows($qh)) {
+		$row = mysqli_fetch_row($qh);
 		return $row[0];
 	}
 	if($noadd)
@@ -3795,7 +3815,7 @@
 	       . "ORDER BY id DESC "
 	       . "LIMIT 1";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh))
+	if($row = mysqli_fetch_assoc($qh))
 		return $row['imageid'];
 	return NULL;
 }
@@ -3814,7 +3834,7 @@
 	$query = "SELECT id, name FROM affiliation ORDER BY name";
 	$qh = doQuery($query, 101);
 	$return = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$return[$row['id']] = $row['name'];
 	return $return;
 }
@@ -3838,8 +3858,8 @@
 		return $cache['unityids'][$userid];
 	$query = "SELECT unityid FROM user WHERE id = $userid";
 	$qh = doQuery($query, 101);
-	if(mysql_num_rows($qh)) {
-		$row = mysql_fetch_row($qh);
+	if(mysqli_num_rows($qh)) {
+		$row = mysqli_fetch_row($qh);
 		$cache['unityids'][$userid] = $row[0];
 		return $row[0];
 	}
@@ -3858,11 +3878,11 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function getAffiliationID($affil) {
-	$affil = mysql_real_escape_string($affil);
+	$affil = vcl_mysql_escape_string($affil);
 	$query = "SELECT id FROM affiliation WHERE name = '$affil'";
 	$qh = doQuery($query, 101);
-	if(mysql_num_rows($qh)) {
-		$row = mysql_fetch_row($qh);
+	if(mysqli_num_rows($qh)) {
+		$row = mysqli_fetch_row($qh);
 		return $row[0];
 	}
 	return NULL;
@@ -3882,8 +3902,8 @@
 function getAffiliationName($affilid) {
 	$query = "SELECT name FROM affiliation WHERE id = $affilid";
 	$qh = doQuery($query, 101);
-	if(mysql_num_rows($qh)) {
-		$row = mysql_fetch_row($qh);
+	if(mysqli_num_rows($qh)) {
+		$row = mysqli_fetch_row($qh);
 		return $row[0];
 	}
 	return NULL;
@@ -3907,7 +3927,7 @@
 	if($affilid)
 		$query .= " WHERE id = $affilid";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$return[$row['id']] = $row['dataUpdateText'];
 	return $return;
 }
@@ -3935,7 +3955,7 @@
 	  	       .       "a2.name = 'Global'";
 	}
 	$qh = doQuery($query);
-	if(($row = mysql_fetch_assoc($qh)) && ! empty($row['theme']))
+	if(($row = mysqli_fetch_assoc($qh)) && ! empty($row['theme']))
 		return $row['theme'];
 	else
 		return DEFAULTTHEME;
@@ -3966,7 +3986,7 @@
 	   strncmp("{$_POST[$vartag]}", "0", 1) == 0 &&
 	   $type == ARG_NUMERIC &&
 		strncmp("{$_POST[$vartag]}", "0x0", 3) != 0) ||
-	   (array_key_exists($vartag, $_GET) && 
+	   (array_key_exists($vartag, $_GET) &&
 	   ! is_array($_GET[$vartag]) &&
 	   strncmp("{$_GET[$vartag]}", "0", 1) == 0 &&
 	   $type == ARG_NUMERIC &&
@@ -4165,7 +4185,7 @@
 			if(! is_string($value))
 				$return[$index] = $defaultvalue;
 			elseif($addslashes)
-				$return[$index] = mysql_real_escape_string($value);
+				$return[$index] = vcl_mysql_escape_string($value);
 		}
 		return $return;
 	}
@@ -4174,7 +4194,7 @@
 		if(strlen($return) == 0)
 			$return = $defaultvalue;
 		elseif($addslashes)
-			$return = mysql_real_escape_string($return);
+			$return = vcl_mysql_escape_string($return);
 	}
 
 	return $return;
@@ -4267,7 +4287,7 @@
 		$query .= "u.unityid = '$id' AND af.id = $affilid";
 
 	$qh = doQuery($query, "105");
-	if($user = mysql_fetch_assoc($qh)) {
+	if($user = mysqli_fetch_assoc($qh)) {
 		$user['sshpublickeys'] = htmlspecialchars($user['sshpublickeys']);
 		if((datetimeToUnix($user["lastupdated"]) > time() - SECINDAY) ||
 		   $user['unityid'] == 'vclreload' ||
@@ -4343,7 +4363,7 @@
 	}
 	$qh = doQuery($query, "101");
 	$groups = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$groups[$row["usergroupid"]] = $row["name"];
 	}
 	if($includeowned) {
@@ -4362,7 +4382,7 @@
 			       . "WHERE ownerid = $userid";
 		}
 		$qh = doQuery($query, "101");
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			$groups[$row["usergroupid"]] = $row["name"];
 		}
 	}
@@ -4398,7 +4418,7 @@
 	       . "ORDER BY t.name";
 	$perms = array();
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$perms[$row['id']] = $row['name'];
 	return $perms;
 }
@@ -4468,7 +4488,7 @@
 		       . "FROM user "
 		       . "WHERE id = $id";
 		$qh = doQuery($query, 101);
-		if($row = mysql_fetch_assoc($qh)) {
+		if($row = mysqli_fetch_assoc($qh)) {
 			$id = $row['unityid'];
 			$type = 'loginid';
 			$affilid = $row['affiliationid'];
@@ -4530,9 +4550,9 @@
 ////////////////////////////////////////////////////////////////////////////////
 function updateUserPrefs($userid, $preferredname, $width, $height, $bpp, $audio,
                          $mapdrives, $mapprinters, $mapserial, $rdpport) {
-	global $mysql_link_vcl;
-	$preferredname = mysql_real_escape_string($preferredname);
-	$audio = mysql_real_escape_string($audio);
+	global $mysqli_link_vcl;
+	$preferredname = vcl_mysql_escape_string($preferredname);
+	$audio = vcl_mysql_escape_string($audio);
 	if($rdpport == 3389)
 		$rdpport = 'NULL';
 	$query = "UPDATE user SET "
@@ -4547,7 +4567,7 @@
 	       .        "rdpport = $rdpport "
 	       . "WHERE id = $userid";
 	doQuery($query, 270);
-	return mysql_affected_rows($mysql_link_vcl);
+	return mysqli_affected_rows($mysqli_link_vcl);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -4556,7 +4576,7 @@
 ///
 /// \param $userid - an id from the user table
 ///
-/// \return an array of privileges types that the user has somewhere in the 
+/// \return an array of privileges types that the user has somewhere in the
 /// privilege tree
 ///
 /// \brief get the privilege types that the user has somewhere in the
@@ -4578,7 +4598,7 @@
 	       .                         "WHERE ownerid = $userid))";
 	$qh = doQuery($query, 107);
 	$privileges = array();
-	while($row = mysql_fetch_row($qh))
+	while($row = mysqli_fetch_row($qh))
 		$privileges[] = $row[0];
 	if(in_array("mgmtNodeAdmin", $privileges))
 		$privileges[] = 'managementnodeAdmin';
@@ -4613,7 +4633,7 @@
 	       .       "r.groupid IN ($inids)";
 	$ids = array();
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$ids[] = $row['id'];
 	return $ids;
 }
@@ -4734,7 +4754,7 @@
 			$query .=   "AND rq.id != $requestid ";
 		$query .= "LIMIT 1";
 		$qh = doQuery($query, 101);
-		if(mysql_num_rows($qh)) {
+		if(mysqli_num_rows($qh)) {
 			return debugIsAvailable(-3, 2, $start, $end, $imagerevisionid);
 		}
 
@@ -4744,7 +4764,7 @@
 		       . "WHERE IPaddress = '$ip' AND "
 		       .       "stateid != 1";
 		$qh = doQuery($query, 101);
-		if(mysql_num_rows($qh)) {
+		if(mysqli_num_rows($qh)) {
 			return debugIsAvailable(-4, 16, $start, $end, $imagerevisionid);
 		}
 	}
@@ -4761,7 +4781,7 @@
 
 	foreach($requestInfo["images"] as $key => $imageid) {
 		# check for max concurrent usage of image
-		if(! $skipconcurrentcheck && 
+		if(! $skipconcurrentcheck &&
 		   $images[$imageid]['maxconcurrent'] != NULL) {
 			if($userid == 0)
 				$usersgroups = $user['groups'];
@@ -4785,7 +4805,7 @@
 			       .       "rq.stateid NOT IN (1,5,11,12,16,17) AND "
 			       .       "rq.userid != $reloadid";
 			$qh = doQuery($query, 101);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				$compids[] = $row['computerid'];
 				if($row['reqid'] == $requestid)
 					$decforedit = 1;
@@ -4807,7 +4827,7 @@
 			       .       "bt.skip != 1 AND "
 			       .       "br.status != 'deleted'";
 			$qh = doQuery($query);
-			if(! $row = mysql_fetch_assoc($qh)) {
+			if(! $row = mysqli_fetch_assoc($qh)) {
 				cleanSemaphore();
 				return debugIsAvailable(0, 3, $start, $end, $imagerevisionid);
 			}
@@ -4877,7 +4897,7 @@
 			       . "FROM computer "
 			       . "WHERE id = $compid";
 			$qh = doQuery($query, 128);
-			$row = mysql_fetch_row($qh);
+			$row = mysqli_fetch_row($qh);
 			if(! in_array($row[0], $scheduleids)) {
 				cleanSemaphore();
 				return debugIsAvailable(0, 7, $start, $end, $imagerevisionid, $computerids, $currentids, $blockids);
@@ -4893,7 +4913,7 @@
 			       . "LEFT JOIN OS ON (i.OSid = OS.id) "
 			       . "WHERE i.id = $imageid";
 			$qh = doQuery($query, 101);
-			if(! ($row = mysql_fetch_assoc($qh))) {
+			if(! ($row = mysqli_fetch_assoc($qh))) {
 				cleanSemaphore();
 				return debugIsAvailable(0, 8, $start, $end, $imagerevisionid, $computerids, $currentids, $blockids);
 			}
@@ -4952,7 +4972,7 @@
 			       .          "network";
 
 			$qh = doQuery($query, 129);
-			while($row = mysql_fetch_assoc($qh)) {
+			while($row = mysqli_fetch_assoc($qh)) {
 				array_push($computerids, $row['id']);
 				if($row['currentimageid'] == $imageid &&
 				   $row['imagerevisionid'] == $requestInfo['imagerevisions'][$key]) {
@@ -4981,7 +5001,7 @@
 		       .       "rq.stateid NOT IN (5, 12, 19) AND " # failed, complete, reload
 		       .       "(rq.stateid != 14 OR rq.laststateid != 19)"; # pending/reload
 		$qh = doQuery($query, 130);
-		while($row = mysql_fetch_row($qh)) {
+		while($row = mysqli_fetch_row($qh)) {
 			array_push($usedComputerids, $row[0]);
 		}
 
@@ -5056,7 +5076,7 @@
 			       .          "c.network";
 			$qh = doQuery($query, 101);
 			$newcompids = array();
-			while($row = mysql_fetch_assoc($qh))
+			while($row = mysqli_fetch_assoc($qh))
 				$newcompids[] = $row['id'];
 			$computerids = $newcompids;
 		}
@@ -5078,7 +5098,7 @@
 			       .       "(type != 'virtualmachine' OR "
 			       .       "vmhostid IS NOT NULL)";
 			$qh = doQuery($query);
-			if(mysql_num_rows($qh)) {
+			if(mysqli_num_rows($qh)) {
 				if($now)
 					return debugIsAvailable(-4, 18, $start, $end, $imagerevisionid, $computerids, $currentids, $blockids, array(), $virtual);
 				$requestInfo['ipwarning'] = 1;
@@ -5090,14 +5110,14 @@
 			if($requestid)
 				$query .= " AND id != $compid"; # TODO test this
 			$qh = doQuery($query);
-			$cnt = mysql_num_rows($qh);
+			$cnt = mysqli_num_rows($qh);
 			if($cnt > 1) {
 				if($now)
 					return debugIsAvailable(-4, 22, $start, $end, $imagerevisionid, $computerids, $currentids, $blockids, array(), $virtual);
 				$requestInfo['ipwarning'] = 1;
 			}
 			elseif($cnt == 1) {
-				$row = mysql_fetch_assoc($qh);
+				$row = mysqli_fetch_assoc($qh);
 				$computerids = array($row['id']);
 				$blockids = array();
 			}
@@ -5302,7 +5322,7 @@
 
 	$scheduleids = array();
 	$qh = doQuery($query, 127);
-	while($row = mysql_fetch_row($qh)) {
+	while($row = mysqli_fetch_row($qh)) {
 		array_push($scheduleids, $row[0]);
 	}
 	return $scheduleids;
@@ -5322,7 +5342,7 @@
 function getImagePlatform($imageid) {
 	$query = "SELECT platformid FROM image WHERE id = $imageid";
 	$qh = doQuery($query, 125);
-	if(! $row = mysql_fetch_assoc($qh))
+	if(! $row = mysqli_fetch_assoc($qh))
 		return NULL;
 	return $row['platformid'];
 }
@@ -5350,7 +5370,7 @@
 	       .       "(('$startdt' > (start - INTERVAL 30 MINUTE)) AND ('$startdt' < end))) AND "
 	       .       "end > NOW()";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_row($qh))
+	if($row = mysqli_fetch_row($qh))
 		return true;
 	return false;
 }
@@ -5453,7 +5473,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 function getSemaphore($imageid, $imagerevisionid, $mgmtnodeid, $compid, $start,
                       $end, $requestid=0) {
-	global $mysql_link_vcl, $uniqid;
+	global $mysqli_link_vcl, $uniqid;
 	$query = "INSERT INTO semaphore "
 	       . "SELECT c.id, "
 	       .        "$imageid, "
@@ -5467,7 +5487,7 @@
 	       .       "(s.expires IS NULL OR s.expires < NOW()) "
 	       . "LIMIT 1";
 	doQuery($query);
-	$rc = mysql_affected_rows($mysql_link_vcl);
+	$rc = mysqli_affected_rows($mysqli_link_vcl);
 
 	# check to see if another process allocated this one
 	if($rc) {
@@ -5483,7 +5503,7 @@
 		if($requestid)
 			$query .= " AND rq.id != $requestid";
 		$qh = doQuery($query);
-		$rc2 = mysql_num_rows($qh);
+		$rc2 = mysqli_num_rows($qh);
 		if($rc2) {
 			$query = "DELETE FROM semaphore "
 			       . "WHERE computerid = $compid AND "
@@ -5561,7 +5581,7 @@
 	       .       "l.wasavailable = 1 AND "
 	       .       "l.ending != 'failed'";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$comps[] = $row['computerid'];
 	return $comps;
 }
@@ -5576,7 +5596,7 @@
 ///
 /// \return an array of resource ids of type $resourcetype2
 ///
-/// \brief gets a list of resources of type $resourcetype2 that $resourcesubid 
+/// \brief gets a list of resources of type $resourcetype2 that $resourcesubid
 /// of type $resourcetype1 maps to based on the resourcemap table
 ///
 ////////////////////////////////////////////////////////////////////////////////
@@ -5592,7 +5612,7 @@
 	       . "WHERE subid = $resourcesubid AND "
 	       .       "resourcetypeid = $resourcetype1";
 	$qh = doQuery($query, 101);
-	$row = mysql_fetch_row($qh);
+	$row = mysqli_fetch_row($qh);
 	$resourceid = $row[0];
 
 	# get groups $resourceid is in
@@ -5601,7 +5621,7 @@
 	       . "FROM resourcegroupmembers "
 	       . "WHERE resourceid = $resourceid";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_row($qh)) {
+	while($row = mysqli_fetch_row($qh)) {
 		array_push($resourcegroupids, $row[0]);
 	}
 
@@ -5619,7 +5639,7 @@
 	       .       "resourcetypeid1 = $resourcetype1 AND "
 	       .       "resourcetypeid2 = $resourcetype2";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_row($qh)) {
+	while($row = mysqli_fetch_row($qh)) {
 		array_push($type2groupids, $row[0]);
 	}
 
@@ -5631,7 +5651,7 @@
 	       .       "resourcetypeid2 = $resourcetype1 AND "
 	       .       "resourcetypeid1 = $resourcetype2";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_row($qh)) {
+	while($row = mysqli_fetch_row($qh)) {
 		array_push($type2groupids, $row[0]);
 	}
 
@@ -5646,7 +5666,7 @@
 	       . "WHERE m.resourcegroupid IN ($inlist) AND "
 	       .       "m.resourceid = r.id";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_row($qh)) {
+	while($row = mysqli_fetch_row($qh)) {
 		array_push($mappedresources, $row[0]);
 	}
 	return $mappedresources;
@@ -5733,7 +5753,7 @@
 	       .       "r.imageid != $imageid) AND "
 	       .       "r.status = 'accepted'";
 	$qh = doQuery($query, 101);
-	return(mysql_num_rows($qh));
+	return(mysqli_num_rows($qh));
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -5784,7 +5804,7 @@
 	       . "ORDER BY u.overlapResCount DESC "
 	       . "LIMIT 1";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh))
+	if($row = mysqli_fetch_assoc($qh))
 		return $row['overlapResCount'];
 	else
 		return 1;
@@ -5806,7 +5826,7 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function addRequest($forimaging=0, $revisionid=array(), $checkuser=1) {
-	global $requestInfo, $user, $uniqid, $mysql_link_vcl;
+	global $requestInfo, $user, $uniqid, $mysqli_link_vcl;
 	$startstamp = unixToDatetime($requestInfo["start"]);
 	$endstamp = unixToDatetime($requestInfo["end"]);
 	$now = time();
@@ -5823,7 +5843,7 @@
 	addLogEntry($nowfuture, $start, $endstamp, 1, $requestInfo["imageid"]);
 
 	$qh = doQuery("SELECT LAST_INSERT_ID() FROM log", 131);
-	if(! $row = mysql_fetch_row($qh)) {
+	if(! $row = mysqli_fetch_row($qh)) {
 		abort(132);
 	}
 	$logid = $row[0];
@@ -5852,7 +5872,7 @@
 	$qh = doQuery($query, 136);
 
 	$qh = doQuery("SELECT LAST_INSERT_ID() FROM request", 134);
-	if(! $row = mysql_fetch_row($qh)) {
+	if(! $row = mysqli_fetch_row($qh)) {
 		abort(135);
 	}
 	$requestid = $row[0];
@@ -5894,12 +5914,12 @@
 	       .        "computerid, "
 	       .        "imageid, "
 	       .        "imagerevisionid, "
-	       .        "managementnodeid " 
+	       .        "managementnodeid "
 	       . "FROM semaphore "
 	       . "WHERE expires > NOW() AND "
 	       .       "procid = '$uniqid'";
 	doQuery($query);
-	$cnt = mysql_affected_rows($mysql_link_vcl);
+	$cnt = mysqli_affected_rows($mysqli_link_vcl);
 	if($cnt == 0) {
 		# reached this point SEMTIMEOUT seconds after getting semaphore, clean up and abort
 		$query = "DELETE FROM request WHERE id = $requestid";
@@ -6036,7 +6056,7 @@
 	       . "GROUP BY rs.managementnodeid "
 	       . "ORDER BY count";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$mgmtnodecnt[$row["mnid"]] = $row["count"];
 	}
 	uasort($mgmtnodecnt, "sortKeepIndex");
@@ -6113,11 +6133,11 @@
 	       . "FROM request "
 	       . "WHERE id = $id";
 	$qh = doQuery($query, 165);
-	if(! ($data = mysql_fetch_assoc($qh))) {
+	if(! ($data = mysqli_fetch_assoc($qh))) {
 		if($returnNULL)
 			return NULL;
 		# FIXME handle XMLRPC cases
-		if(! $printedHTMLheader) 
+		if(! $printedHTMLheader)
 			print $HTMLheader;
 		print "<h1>" . i("OOPS! - Reservation Has Expired") . "</h1>\n";
 		$h = i("The selected reservation is no longer available. Go to <a>Reservations</a> to request a new reservation or select another one that is available.");
@@ -6163,7 +6183,7 @@
 	$data["reservations"] = array();
 	$data['passwds'] = array();
 	$resids = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		array_push($data["reservations"], $row);
 		$resids[] = $row['reservationid'];
 		$data['passwds'][$row['reservationid']][$data['userid']] = $row['password'];
@@ -6177,7 +6197,7 @@
 	       . "FROM serverrequest "
 	       . "WHERE requestid = $id";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh)) {
+	if($row = mysqli_fetch_assoc($qh)) {
 		$data['serverrequest'] = 1;
 		$data['servername'] = $row['name'];
 		$data['admingroupid'] = $row['admingroupid'];
@@ -6191,7 +6211,7 @@
 		       . "FROM reservationaccounts "
 		       . "WHERE reservationid IN ($inids)";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$data['passwds'][$row['reservationid']][$row['userid']] = $row['password'];
 	}
 	else
@@ -6204,7 +6224,7 @@
 /// \fn updateRequest($requestid, $nowfuture)
 ///
 /// \param $requestid - the id of the request to be updated
-/// \param $nowfuture (optional) - "now" or "future"; whether the 
+/// \param $nowfuture (optional) - "now" or "future"; whether the
 ///
 /// \brief updates an entry to the request and reservation tables
 ///
@@ -6216,7 +6236,7 @@
 
 	$query = "SELECT logid FROM request WHERE id = $requestid";
 	$qh = doQuery($query, 146);
-	if(! $row = mysql_fetch_row($qh)) {
+	if(! $row = mysqli_fetch_row($qh)) {
 		abort(148);
 	}
 	$logid = $row[0];
@@ -6256,7 +6276,7 @@
 		                    # could be updated, which would end up setting both
 		                    # rows to the same computer
 		doQuery($query, 147);
-		addChangeLogEntry($logid, NULL, $endstamp, $startstamp, $computerid, NULL, 
+		addChangeLogEntry($logid, NULL, $endstamp, $startstamp, $computerid, NULL,
 		                  1);
 		$query = "UPDATE sublog "
 		       . "SET computerid = $computerid "
@@ -6343,7 +6363,7 @@
 	if($request['serverrequest']) {
 		$query = "SELECT id FROM serverrequest WHERE requestid = {$request['id']}";
 		$qh = doQuery($query);
-		if($row = mysql_fetch_assoc($qh)) {
+		if($row = mysqli_fetch_assoc($qh)) {
 			$query = "DELETE FROM serverrequest WHERE requestid = {$request['id']}";
 			doQuery($query, 152);
 			deleteVariable("fixedIPsr{$row['id']}");
@@ -6394,7 +6414,7 @@
 		       . "ORDER BY reservations "
 		       . "LIMIT 1";
 		$qh = doQuery($query, 101);
-		if($row = mysql_fetch_assoc($qh))
+		if($row = mysqli_fetch_assoc($qh))
 			$compid = $row["computerid"];
 		else
 			return -1;
@@ -6418,7 +6438,7 @@
 	if($count)
 		$query .= " LIMIT $count";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$resInfo[$row["id"]] = $row;
 	}
 	if(! count($resInfo))
@@ -6430,7 +6450,7 @@
 	# a reservation is reassigned to meets the same restrictions
 	foreach($resInfo as $res) {
 		// pass forimaging = 1 so that isAvailable only looks at one computer
-		$rc = isAvailable($images, $res["imageid"], $res['imagerevisionid'], 
+		$rc = isAvailable($images, $res["imageid"], $res['imagerevisionid'],
 		      datetimeToUnix($res["start"]), datetimeToUnix($res["end"]), 0,
 		      0, $res["userid"], 0, 1);
 		if($rc < 1) {
@@ -6442,7 +6462,7 @@
 		return 0;
 	foreach($resInfo as $res) {
 		$rc = isAvailable($images, $res["imageid"], $res['imagerevisionid'],
-		      datetimeToUnix($res["start"]), datetimeToUnix($res["end"]), 1, 
+		      datetimeToUnix($res["start"]), datetimeToUnix($res["end"]), 1,
 		      0, $res["userid"], 0, 1);
 		if($rc > 0) {
 			$newcompid = array_shift($requestInfo["computers"]);
@@ -6500,7 +6520,7 @@
 	       . "WHERE v.computerid = $compid AND "
 	       .       "vm.vmhostid = v.id";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$rc = moveReservationsOffComputer($row['id']);
 		if($rc != 0)
 			# lock computer so that reservations on other VMs on this host do not get moved to it
@@ -6535,7 +6555,7 @@
 	       . "ORDER BY rq.end DESC "
 	       . "LIMIT 1";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh))
+	if($row = mysqli_fetch_assoc($qh))
 		$end = $row['end'];
 	$query = "SELECT UNIX_TIMESTAMP(t.end) as end "
 	       . "FROM blockComputers c, "
@@ -6546,7 +6566,7 @@
 	       . "ORDER BY t.end DESC "
 	       . "LIMIT 1";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh))
+	if($row = mysqli_fetch_assoc($qh))
 		if($row['end'] > $end)
 			$end = $row['end'];
 	return $end;
@@ -6572,7 +6592,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 function getCompFinalVMReservationTime($hostid, $addsemaphores=0,
                                        $notomaintenance=0) {
-	global $uniqid, $mysql_link_vcl;
+	global $uniqid, $mysqli_link_vcl;
 	if($addsemaphores) {
 		$query = "SELECT vm.id "
 		       . "FROM computer vm, "
@@ -6581,7 +6601,7 @@
 		       .       "vm.vmhostid = v.id";
 		$qh = doQuery($query);
 		$compids = array();
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$compids[] = $row['id'];
 		if(empty($compids))
 			return 0;
@@ -6604,7 +6624,7 @@
 		       .       "(s.expires IS NULL OR s.expires < NOW()) "
 		       . "GROUP BY c.id";
 		doQuery($query);
-		$cnt = mysql_affected_rows($mysql_link_vcl);
+		$cnt = mysqli_affected_rows($mysqli_link_vcl);
 		if($cnt != count($compids))
 			return -1;
 	}
@@ -6626,7 +6646,7 @@
 	       . "ORDER BY rq.end DESC "
 	       . "LIMIT 1";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh))
+	if($row = mysqli_fetch_assoc($qh))
 		$end = $row['end'];
 	$query = "SELECT UNIX_TIMESTAMP(t.end) as end "
 	       . "FROM blockComputers c, "
@@ -6641,7 +6661,7 @@
 	       . "ORDER BY t.end DESC "
 	       . "LIMIT 1";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh))
+	if($row = mysqli_fetch_assoc($qh))
 		if($row['end'] > $end)
 			$end = $row['end'];
 	return $end;
@@ -6671,7 +6691,7 @@
 	       . "ORDER BY rq.start "
 	       . "LIMIT 1";
 	$qh = doQuery($query);
-	if($row = mysql_fetch_assoc($qh))
+	if($row = mysqli_fetch_assoc($qh))
 		return datetimeToUnix($row['start']);
 	return 0;
 }
@@ -6856,7 +6876,7 @@
 	$data = array();
 	$foundids = array();
 	$lastreqid = 0;
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if($row['id'] != $lastreqid) {
 			$lastreqid = $row['id'];
 			$count++;
@@ -6894,7 +6914,7 @@
 			}
 			else {
 				$data[$count]['serverowner'] = 0;
-				if(! empty($row['serveradmingroupid']) && 
+				if(! empty($row['serveradmingroupid']) &&
 				   array_key_exists($row['serveradmingroupid'], $user['groups']))
 					$data[$count]['serveradmin'] = 1;
 				else
@@ -6983,7 +7003,7 @@
 	$tmp = explode(' ', $datetime);
 	list($year, $month, $day) = explode('-', $tmp[0]);
 	list($hour, $min, $sec) = explode(':', $tmp[1]);
-	return mktime($hour, $min, $sec, $month, $day, $year, -1);
+	return mktime($hour, $min, $sec, $month, $day, $year);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -7170,7 +7190,7 @@
 function getDepartmentName($id) {
 	$query = "SELECT name FROM department WHERE id = '$id'";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_row($qh)) {
+	if($row = mysqli_fetch_row($qh)) {
 		return $row[0];
 	}
 	else {
@@ -7182,7 +7202,7 @@
 ///
 /// \fn getImageId($image)
 ///
-/// \param $image - name of an image (must match name (not prettyname) in the 
+/// \param $image - name of an image (must match name (not prettyname) in the
 /// image table)
 ///
 /// \return the id of matching $image in the image table or 0 if lookup fails
@@ -7192,7 +7212,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 function getImageId($image) {
 	$qh = doQuery("SELECT id FROM image WHERE name = '$image'", 170);
-	if($row = mysql_fetch_row($qh)) {
+	if($row = mysqli_fetch_row($qh)) {
 		return $row[0];
 	}
 	return 0;
@@ -7211,7 +7231,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 function getOSId($os) {
 	$qh = doQuery("SELECT id FROM OS WHERE name = '$os'", 175);
-	if($row = mysql_fetch_row($qh)) {
+	if($row = mysqli_fetch_row($qh)) {
 		return $row[0];
 	}
 	return 0;
@@ -7229,7 +7249,7 @@
 function getStates() {
 	$qh = doQuery("SELECT id, name FROM state", 176);
 	$states = array();
-	while($row = mysql_fetch_row($qh)) {
+	while($row = mysqli_fetch_row($qh)) {
 		$states[$row[0]] = $row[1];
 	}
 	return $states;
@@ -7247,7 +7267,7 @@
 function getPlatforms() {
 	$qh = doQuery("SELECT id, name FROM platform", 178);
 	$platforms = array();
-	while($row = mysql_fetch_row($qh)) {
+	while($row = mysqli_fetch_row($qh)) {
 		$platforms[$row[0]] = $row[1];
 	}
 	return $platforms;
@@ -7275,7 +7295,7 @@
 	       . "ORDER BY p.prettyname";
 	$qh = doQuery($query, 101);
 	$provisioning = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$provisioning[$row['id']] = $row;
 	return $provisioning;
 }
@@ -7299,7 +7319,7 @@
 function getProvisioningTypes() {
 	$query = "SELECT id, prettyname FROM provisioning WHERE name = 'none'";
 	$qh = doQuery($query);
-	$none = mysql_fetch_assoc($qh);
+	$none = mysqli_fetch_assoc($qh);
 	$query = "SELECT p.id, "
 	       .        "p.prettyname, "
 	       .        "o.name AS `type` "
@@ -7313,7 +7333,7 @@
 	$types = array('blade' => array($none['id'] => $none['prettyname']),
 	               'lab' => array(),
 	               'virtualmachine' => array());
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if($row['type'] == 'kickstart' || $row['type'] == 'partimage')
 			$types['blade'][$row['id']] = $row['prettyname'];
 		elseif($row['type'] == 'none')
@@ -7358,7 +7378,7 @@
 	       . "ORDER BY s.name";
 	$qh = doQuery($query, 179);
 	$schedules = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$schedules[$row["id"]] = $row;
 		$schedules[$row["id"]]["times"] = array();
 	}
@@ -7369,7 +7389,7 @@
 	       . "ORDER BY scheduleid, "
 	       .          "start";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		array_push($schedules[$row["scheduleid"]]["times"],
 		           array("start" => $row["start"], "end" => $row["end"]));
 	}
@@ -7493,7 +7513,7 @@
 	}
 	$qh = doQuery($query, 101);
 	$return = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if(is_null($row['natpublicIPaddress'])) {
 			$row['nathostenabled'] = 0;
 			$row['natpublicIPaddress'] = '';
@@ -7519,7 +7539,7 @@
 			$return[$mn_id]['timeservers'] = $timeservers;
 		}
 	}
-	
+
 	return $return;
 }
 
@@ -7551,7 +7571,7 @@
 	       .       "c.id in ($inlist)";
 	$qh = doQuery($query);
 	$compgroups = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$compgroups[] = $row['resourcegroupid'];
 	$mngrps = array();
 	foreach($compgroups as $grpid) {
@@ -7644,7 +7664,7 @@
 	       . "WHERE perlpackage LIKE 'VCL::Module::Predictive::%'";
 	$qh = doQuery($query, 101);
 	$modules = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$modules[$row['id']] = $row;
 	return $modules;
 }
@@ -7660,7 +7680,7 @@
 /// \return array of free/used timeslotes
 ///
 /// \brief generates an array of availability for computers where index is a
-/// computerid with a value that is an array whose indexes are unix timestamps 
+/// computerid with a value that is an array whose indexes are unix timestamps
 /// that increment by 15 minutes with a value that is an array with 2 indexes:
 /// 'scheduleclosed' and 'available' that tell if the computer's schedule is
 /// closed at that moment and if the computer is available at that moment\n
@@ -7716,7 +7736,7 @@
 		       .  "AND platformid IN ($platinlist)";
 	}
 	$qh = doQuery($query, 155);
-	while($row = mysql_fetch_row($qh)) {
+	while($row = mysqli_fetch_row($qh)) {
 		array_push($computerids, $row[0]);
 		$times[$row[0]] = array();
 		$scheduleids[$row[0]] = $row[1];
@@ -7764,7 +7784,7 @@
 	$qh = doQuery($query, 156);
 
 	$id = "";
-	while($row = mysql_fetch_row($qh)) {
+	while($row = mysqli_fetch_row($qh)) {
 		if($row[3] == $requestid) {
 			continue;
 		}
@@ -7855,7 +7875,7 @@
 				continue;
 			}
 			//if between a start and end time
-			if($current >= $times[$id][$count]["start"] && 
+			if($current >= $times[$id][$count]["start"] &&
 			   $current <  $times[$id][$count]["end"]) {
 				if($first) {
 					# set the previous 15 minute block to show as busy to allow for load time
@@ -7874,7 +7894,7 @@
 				continue;
 			}
 			//if after previous end but before this start
-			if($current >= $times[$id][$count - 1]["end"] && 
+			if($current >= $times[$id][$count - 1]["end"] &&
 			   $current <  $times[$id][$count]["start"]) {
 				$reserveInfo[$id][$current]["available"] = 1;
 				continue;
@@ -7928,8 +7948,7 @@
 	              0,
 	              $timeval["mon"],
 	              $timeval["mday"],
-	              $timeval["year"],
-	              -1);
+	              $timeval["year"]);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -8010,11 +8029,11 @@
 		$usercomputerids = array_keys($resources["computer"]);
 		# get list of computers' platformids
 		$qh = doQuery("SELECT platformid FROM image WHERE id = $imageid", 110);
-		$row = mysql_fetch_row($qh);
+		$row = mysqli_fetch_row($qh);
 		$platformid = $row[0];
 		$computer_platformids = array();
 		$qh = doQuery("SELECT id, platformid FROM computer", 111);
-		while($row = mysql_fetch_row($qh)) {
+		while($row = mysqli_fetch_row($qh)) {
 			$computer_platformids[$row[0]] = $row[1];
 		}
 		$mappedcomputers = getMappedResources($imageid, "image", "computer");
@@ -8304,7 +8323,7 @@
 /// \param $ip - (optional, default='') desired IP address
 /// \param $mac - (optional, default='') desired MAC address
 ///
-/// \return an array where each key is a unix timestamp for the start time of 
+/// \return an array where each key is a unix timestamp for the start time of
 /// the available slot and each element is an array with these items:\n
 /// \b start - start of slot in datetime format\n
 /// \b startts - start of slot in unix timestamp format\n
@@ -8399,7 +8418,7 @@
 	       .          "(c.procspeed * c.procnumber), "
 	       .          "network";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$row['duration'] = $reqduration;
 		$row['startts'] = $start;
 		$row['start'] = $startdt;
@@ -8453,7 +8472,7 @@
 		       . "GROUP BY rq1.id ";
 		$query .= "ORDER BY rs1.computerid, rq1.start, rq1.end";
 		$qh = doQuery($query, 101);
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			$row['startts'] = datetimeToUnix($row['start']);
 			if($row['startts'] % 900) {
 				$row['startts'] = $row['startts'] - ($row['startts'] % 900) + 900;
@@ -8512,7 +8531,7 @@
 	$query .=      "(c.type != 'virtualmachine' OR c.vmhostid IS NOT NULL) "
 	       . "GROUP BY rs.computerid";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if($row['endts'] % 900) {
 			$row['endts'] = $row['endts'] - ($row['endts'] % 900);
 			$row['duration'] -= 900;
@@ -8568,7 +8587,7 @@
 	if($extendonly)
 		$query .= " HAVING start = '$startdt'";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if($usedaysahead && $row['startts'] > $daysahead)
 			continue;
 		if($row['startts'] % 900) {
@@ -8605,7 +8624,7 @@
 		       .    "br.imageid != $imageid) AND ";
 	$query .=      "bc.computerid IN ($newincompids)";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if(isset($slots[$row['compid']]))
 			fATremoveOverlaps($slots, $row['compid'], $row['start'], $row['end'], 0);
 	}
@@ -8634,7 +8653,7 @@
 		elseif(! empty($mac))
 			$query .=   "s.fixedIP = '$mac'";
 		$qh = doQuery($query);
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			if(isset($slots[$row['compid']]))
 				fATremoveOverlaps($slots, $row['compid'], $row['start'], $row['end'], 0);
 		}
@@ -8648,7 +8667,7 @@
 	       . "WHERE start < '$maxenddt' AND "
 	       .       "end > '$minstartdt'";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		foreach(array_keys($slots) AS $compid)
 			fATremoveOverlaps($slots, $compid, $row['start'], $row['end'],
 			                  $row['allowreservations']);
@@ -8804,7 +8823,7 @@
 	if($extendonly)
 		$query .= " AND rq.id != $reqid";
 	$qh = doQuery($query);
-	if(mysql_num_rows($qh) >= $maxoverlap)
+	if(mysqli_num_rows($qh) >= $maxoverlap)
 		return 1;
 	return 0;
 }
@@ -8957,7 +8976,7 @@
 		$query .= "AND c.id = $compid ";
 	$query .= "ORDER BY c.hostname";
 	$qh = doQuery($query, 180);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if(is_null($row['nathostid'])) {
 			$row['natenabled'] = 0;
 			$row['nathost'] = '';
@@ -8993,7 +9012,7 @@
 	if(isset($_SESSION['usersessiondata'][$key]))
 		return $_SESSION['usersessiondata'][$key];
 	$computers = getComputers();
-	$resources = getUserResources(array("computerAdmin"), 
+	$resources = getUserResources(array("computerAdmin"),
 	                              array("administer", "manageGroup"), 0, 1);
 	$return = array("platforms" => array(),
 	                "schedules" => array());
@@ -9026,7 +9045,7 @@
 /// they occur\n
 /// \b nextstates - array where each key is a computerloadstate id and its value
 /// is that state's following state; the last state has a NULL value\n
-/// \b totaltime - estimated time (in seconds) it takes for all states to 
+/// \b totaltime - estimated time (in seconds) it takes for all states to
 /// complete\n
 /// \b data - array where each key is is a computerloadstate id and each value
 /// is an array with these elements:\n
@@ -9048,13 +9067,13 @@
 	#   need this information
 	$query = "SELECT id FROM computerloadstate WHERE loadstatename = 'repeat'";
 	$qh = doQuery($query, 101);
-	if(! $row = mysql_fetch_assoc($qh))
+	if(! $row = mysqli_fetch_assoc($qh))
 		return array();
 	$loadstates['repeatid'] = $row['id'];
 
 	$query = "SELECT `type` FROM computer WHERE id = $compid";
 	$qh = doQuery($query, 101);
-	if(! $row = mysql_fetch_assoc($qh))
+	if(! $row = mysqli_fetch_assoc($qh))
 		return array();
 
 	$type = $row['type'];
@@ -9073,7 +9092,7 @@
 	        . "(SELECT nextstateid FROM computerloadflow WHERE `type` = '$type' "
 	        . "AND nextstateid IS NOT NULL)";
 	$qh = doQuery($query2, 101);
-	if(! $row = mysql_fetch_assoc($qh))
+	if(! $row = mysqli_fetch_assoc($qh))
 		return array();
 	$loadstates['data'][$row['stateid']] = $row;
 	$loadstates['stateids'] = array($row['stateid']);
@@ -9083,7 +9102,7 @@
 		$query2 = $query . "AND cf.computerloadstateid = {$row['nextstateid']} "
 		        . "AND `type` = '$type'";
 		$qh = doQuery($query2, 101);
-		if(! $row = mysql_fetch_assoc($qh)) {
+		if(! $row = mysqli_fetch_assoc($qh)) {
 			$_SESSION['compstateflow'][$key] = $loadstates;
 			return $loadstates;
 		}
@@ -9128,7 +9147,7 @@
 	       .       "rs.requestid = rq.id "
 	       . "LIMIT 1";
 	$qh = doQuery($query, 101);
-	if(! $row = mysql_fetch_assoc($qh))
+	if(! $row = mysqli_fetch_assoc($qh))
 		abort(113);
 	if($row['start'] < $row['reqtime']) {
 		# now
@@ -9151,7 +9170,7 @@
 	$qh = doQuery($query, 101);
 	$last = array();
 	$data = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$data[$row['id']] = $row;
 		if(empty($last)) {
 			if($future)
@@ -9191,7 +9210,7 @@
 	       .        "start > (NOW() - INTERVAL 12 MONTH) AND "
 	       .        "UNIX_TIMESTAMP(loaded) - UNIX_TIMESTAMP(start) < 1800";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh)) {
+	if($row = mysqli_fetch_assoc($qh)) {
 		if(! empty($row['avgloadtime']))
 			return (int)$row['avgloadtime'];
 		else
@@ -9217,7 +9236,7 @@
 		       . "FROM sublog "
 		       . "WHERE computerid = $compid";
 		$qh = doQuery($query, 101);
-		if($row = mysql_fetch_row($qh))
+		if($row = mysqli_fetch_row($qh))
 			$computers[$compid]["counts"] = $row[0];
 		else
 			$computers[$compid]["counts"] = 0;
@@ -9344,7 +9363,7 @@
 	       .       "c2.id NOT IN ($alloccompids) "
 	       . "ORDER BY s.name";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$data['compids'][] = $row['computerid'];
 		$data[$row['computerid']] = $row;
 	}
@@ -9375,7 +9394,7 @@
 	       .       "t.start < '$enddt' AND "
 	       .       "c.blockTimeid = t.id";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		array_push($compids, $row['computerid']);
 	}
 	return $compids;
@@ -9411,7 +9430,7 @@
 	if($id)
 		$query .= " WHERE n.id = $id";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$nathosts[$row['id']] = $row;
 	if($sort)
 		uasort($nathosts, "sortKeepIndex");
@@ -9440,8 +9459,8 @@
 function getNATports($resid) {
 	$ports = array();
 	$query = "SELECT n.publicport, "
-	       .        "n.connectmethodportid, " 
-	       .        "c.port AS privateport, " 
+	       .        "n.connectmethodportid, "
+	       .        "c.port AS privateport, "
 	       .        "c.protocol, "
 	       .        "c.connectmethodid "
 	       . "FROM natport n, "
@@ -9449,7 +9468,7 @@
 	       . "WHERE n.connectmethodportid = c.id AND "
 	       .       "n.reservationid = $resid";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$ports[$row['connectmethodid']]["#Port-{$row['protocol']}-{$row['privateport']}#"] = $row;
 	return $ports;
 }
@@ -9499,7 +9518,7 @@
 
 	$qh = doQuery($query);
 	$addomainlist = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$addomainlist[$row['id']] = $row;
 	return $addomainlist;
 }
@@ -9562,7 +9581,7 @@
 		$query .= " AND t.end > '" . unixToDatetime($start) . "'";
 	$query .= " ORDER BY t.start, t.end";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$return[$row['timeid']] = $row;
 		$return[$row['timeid']]['unixstart'] = datetimeToUnix($row['start']);
 		$return[$row['timeid']]['unixend'] = datetimeToUnix($row['end']);
@@ -9571,7 +9590,7 @@
 		        . "FROM blockComputers "
 		        . "WHERE blockTimeid = {$row['timeid']}";
 		$qh2 = doQuery($query2, 101);
-		while($row2 = mysql_fetch_assoc($qh2))
+		while($row2 = mysqli_fetch_assoc($qh2))
 			array_push($return[$row['timeid']]['computerids'], $row2['computerid']);
 	}
 	return $return;
@@ -9625,7 +9644,7 @@
 	       .       "bt.end > '$nowdt' AND "
 	       .       "br.imageid = $imageid";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh))
+	if($row = mysqli_fetch_assoc($qh))
 		return 1;
 	return 0;
 }
@@ -9648,7 +9667,7 @@
 /// \param $extra - (optional) any extra attributes that need to be set
 ///
 /// \brief prints out a select input part of a form\n
-/// it is assumed that if $selectedid is left off, we assume $dataArr has no 
+/// it is assumed that if $selectedid is left off, we assume $dataArr has no
 /// index '-1'\n
 /// each OPTION's value is the index of that element of the array
 ///
@@ -9707,7 +9726,7 @@
 /// multiple tag set
 ///
 /// \brief generates HTML for select input
-/// it is assumed that if $selectedid is left off, we assume $dataArr has no 
+/// it is assumed that if $selectedid is left off, we assume $dataArr has no
 /// index '-1'\n
 /// each OPTION's value is the index of that element of the array
 ///
@@ -9941,12 +9960,12 @@
 ///
 /// \fn requestIsReady($request)
 ///
-/// \param $request - a request element from the array returned by 
+/// \param $request - a request element from the array returned by
 /// getUserRequests
 ///
 /// \return 1 if request is ready for a user to connect, 0 if not
 ///
-/// \brief checks to see if a request is 
+/// \brief checks to see if a request is
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function requestIsReady($request) {
@@ -9954,7 +9973,7 @@
 		if($res["computerstateid"] != 3 && $res["computerstateid"] != 8)
 			return 0;
 	}
-	if(($request["currstateid"] == 14 &&      // request current state pending 
+	if(($request["currstateid"] == 14 &&      // request current state pending
 	   $request["laststateid"] == 3 &&        //   and last state reserved and
 	   $request["computerstateid"] == 3) ||   //   computer reserved
 	   ($request["currstateid"] == 8 &&       // request current state inuse
@@ -10171,7 +10190,7 @@
 ///
 /// \return 1 if schedule is closed at $timestamp, 0 if it is open
 ///
-/// \brief checks to see if the computer's schedule is open or closed at 
+/// \brief checks to see if the computer's schedule is open or closed at
 /// $timestamp
 ///
 ////////////////////////////////////////////////////////////////////////////////
@@ -10228,7 +10247,7 @@
 	       .       "u.courseroll = 0";
 	$qh = doQuery($query, 305);
 	$oldusergroups = array();
-	while($row = mysql_fetch_row($qh)) {
+	while($row = mysqli_fetch_row($qh)) {
 		array_push($oldusergroups, $row[0]);
 	}
 	if(count(array_diff($oldusergroups, $newusergroups)) ||
@@ -10276,7 +10295,7 @@
 	       . "WHERE name = '$name' AND "
 	       .       "affiliationid = $affilid";
 	$qh = doQuery($query, 300);
-	if($row = mysql_fetch_row($qh))
+	if($row = mysqli_fetch_row($qh))
 		return $row[0];
 	elseif($noadd)
 		return NULL;
@@ -10292,7 +10311,7 @@
 	       .        "0)";
 	doQuery($query, 301);
 	$qh = doQuery("SELECT LAST_INSERT_ID() FROM usergroup", 302);
-	if(! $row = mysql_fetch_row($qh)) {
+	if(! $row = mysqli_fetch_row($qh)) {
 		abort(303);
 	}
 	return $row[0];
@@ -10303,7 +10322,7 @@
 /// \fn getUserGroupName($id, $incAffil)
 ///
 /// \param $id - id of a user group
-/// \param $incAffil - 0 or 1 (optional, defaults to 0); include @ and 
+/// \param $incAffil - 0 or 1 (optional, defaults to 0); include @ and
 /// affiliation at the end
 ///
 /// \return name for $id from usergroup table or 0 if name not found
@@ -10325,7 +10344,7 @@
 		       . "WHERE id = $id";
 	}
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_row($qh))
+	if($row = mysqli_fetch_row($qh))
 		return $row[0];
 	return 0;
 }
@@ -10402,7 +10421,7 @@
 	$query .= "ORDER BY m.start";
 	$qh = doQuery($query, 101);
 	$data = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$data[$row['id']] = $row;
 	$_SESSION['usersessiondata'][$key] = $data;
 	return $data;
@@ -10437,7 +10456,7 @@
 	       . "ORDER BY start";
 	$qh = doQuery($query, 101);
 	$data = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$data[] = $row;
 	$_SESSION['usersessiondata'][$key] = $data;
 	return $data;
@@ -10454,7 +10473,7 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function unset_by_val($needle, &$haystack) {
-	while(($gotcha = array_search($needle,$haystack)) > -1) { 
+	while(($gotcha = array_search($needle,$haystack)) > -1) {
 		unset($haystack[$gotcha]);
 	}
 }
@@ -10468,13 +10487,16 @@
 ////////////////////////////////////////////////////////////////////////////////
 function sendRDPfile() {
 	global $user;
-	# for more info on this file, see 
+	# for more info on this file, see
 	# http://dev.remotenetworktechnology.com/ts/rdpfile.htm
 	$requestid = getContinuationVar("requestid");
 	$resid = getContinuationVar("resid");
+
+	$cmid = getContinuationVar('cmid');
+
 	$request = getRequestInfo("$requestid");
 	if($request['stateid'] == 11 || $request['stateid'] == 12 ||
-	   ($request['stateid'] == 14 && 
+	   ($request['stateid'] == 14 &&
 	   ($request['laststateid'] == 11 || $request['laststateid'] == 12))) {
 		$cont = addContinuationsEntry('viewRequests');
 		header("Location: " . BASEURL . SCRIPT . "?continuation=$cont");
@@ -10494,20 +10516,19 @@
 	                                          $res['imagerevisionid']);
 	$natports = getNATports($resid);
 	$port = '';
-	foreach($connectData as $cmid => $method) {
-		if(preg_match('/remote desktop/i', $method['description']) ||
-		   preg_match('/RDP/i', $method['description'])) {
-			# assume index 0 of ports for nat
-			if(! empty($natports) && array_key_exists($method['ports'][0]['key'], $natports[$cmid]))
-				$port = ':' . $natports[$cmid][$method['ports'][0]['key']]['publicport'];
-			else {
-				if($method['ports'][0]['key'] == '#Port-TCP-3389#' &&
-				   $user['rdpport'] != 3389)
-					$port = ':' . $user['rdpport'];
-				else
-					$port = ':' . $method['ports'][0]['port'];
-			}
-			break;
+
+	$method = $connectData[$cmid];
+	if(preg_match('/remote desktop/i', $method['description']) ||
+	   preg_match('/RDP/i', $method['description'])) {
+		# assume index 0 of ports for nat
+		if(! empty($natports) && array_key_exists($method['ports'][0]['key'], $natports[$cmid]))
+			$port = ':' . $natports[$cmid][$method['ports'][0]['key']]['publicport'];
+		else {
+			if($method['ports'][0]['key'] == '#Port-TCP-3389#' &&
+			   $user['rdpport'] != 3389)
+				$port = ':' . $user['rdpport'];
+			else
+				$port = ':' . $method['ports'][0]['port'];
 		}
 	}
 
@@ -10542,15 +10563,15 @@
 	print "desktopwidth:i:$width\r\n";
 	print "desktopheight:i:$height\r\n";
 	print "session bpp:i:$bpp\r\n";
-	
+
 	print "winposstr:s:0,1,0,0,5000,4000\r\n";
-	# 0: 
+	# 0:
 	# 1:    use coordinates for the window position, as opposed to 3 - maximized
 	# 0:    left position in client coordinates
 	# 0:    top position in client coordinates
 	# 5000: width in pixels - set large to avoid scrollbars
 	# 4000: height in pixels - set large to avoid scrollbars
-	
+
 	print "full address:s:$ipaddress$port\r\n";
 	print "compression:i:1\r\n";
 	print "keyboardhook:i:2\r\n";
@@ -10567,6 +10588,8 @@
 		$userid = $user["unityid"];
 	if($request['reservations'][0]['domainDNSName'] != '' && ! strlen($passwd))
 		$userid .= "@" . $request['reservations'][0]['domainDNSName'];
+	elseif($request['reservations'][0]['OStype'] == 'windows')
+		$userid = ".\\$userid";
 	print "username:s:$userid\r\n";
 	print "clear password:s:$passwd\r\n";
 	print "domain:s:\r\n";
@@ -10634,16 +10657,16 @@
 /// available; \b NOTE: pass -1 instead of NULL if you don't want this field
 /// to be updated
 ///
-/// \brief adds an entry to the changelog table and updates information in 
+/// \brief adds an entry to the changelog table and updates information in
 /// the log table
 ///
 ////////////////////////////////////////////////////////////////////////////////
-function addChangeLogEntry($logid, $remoteIP, $end=NULL, $start=NULL, 
+function addChangeLogEntry($logid, $remoteIP, $end=NULL, $start=NULL,
                            $computerid=NULL, $ending=NULL, $wasavailable=-1) {
 	if($logid == 0) {
 		return;
 	}
-	$query = "SELECT computerid, " 
+	$query = "SELECT computerid, "
 	       .        "start, "
 	       .        "initialend, "
 	       .        "remoteIP, "
@@ -10652,13 +10675,13 @@
 	       . "FROM log "
 	       . "WHERE id = $logid";
 	$qh = doQuery($query, 265);
-	if(! $log = mysql_fetch_assoc($qh)) {
+	if(! $log = mysqli_fetch_assoc($qh)) {
 		abort(30);
 	}
 	$log["computerid"] = array();
 	$query = "SELECT computerid FROM sublog WHERE logid = $logid";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		array_push($log["computerid"], $row["computerid"]);
 	}
 	$changed = 0;
@@ -10760,7 +10783,7 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function addChangeLogEntryOther($logid, $data) {
-	$data = mysql_real_escape_string($data);
+	$data = vcl_mysql_escape_string($data);
 	$query = "INSERT INTO changelog "
 	       .        "(logid, "
 	       .        "timestamp, "
@@ -10796,7 +10819,7 @@
 	       . "FROM computer "
 	       . "WHERE id = $computerid";
 	$qh = doQuery($query, 101);
-	$row = mysql_fetch_assoc($qh);
+	$row = mysqli_fetch_assoc($qh);
 	$predictiveid = $row['predictivemoduleid'];
 	$query = "SELECT c.type, "
 	       .        "v.computerid AS hostid "
@@ -10804,7 +10827,7 @@
 	       . "LEFT JOIN vmhost v ON (c.vmhostid = v.id) "
 	       . "WHERE c.id = $computerid";
 	$qh = doQuery($query, 101);
-	$row = mysql_fetch_assoc($qh);
+	$row = mysqli_fetch_assoc($qh);
 	if($row['type'] == 'virtualmachine')
 		$hostcomputerid = $row['hostid'];
 	else
@@ -10856,7 +10879,7 @@
 	if($subtype == "users" || $subtype == "both") {
 		$query = "SELECT id, name FROM userprivtype WHERE name NOT IN ('configAdmin', 'serverProfileAdmin')";
 		$qh = doQuery($query, 365);
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			if($row["name"] == "block" || $row["name"] == "cascade")
 				continue;
 			$types["users"][$row["id"]] = $row["name"];
@@ -10865,7 +10888,7 @@
 	if($subtype == "resources" || $subtype == "both") {
 		$query = "SELECT id, name FROM resourcetype";
 		$qh = doQuery($query, 366);
-		while($row = mysql_fetch_assoc($qh))
+		while($row = mysqli_fetch_assoc($qh))
 			$types["resources"][$row["id"]] = $row["name"];
 	}
 	return $types;
@@ -10885,7 +10908,7 @@
 function getUserPrivTypeID($type) {
 	$query = "SELECT id FROM userprivtype WHERE name = '$type'";
 	$qh = doQuery($query, 370);
-	if($row = mysql_fetch_row($qh))
+	if($row = mysqli_fetch_row($qh))
 		return $row[0];
 	else
 		return NULL;
@@ -10934,8 +10957,8 @@
 ///
 /// \param $max - max allowed length in minutes
 ///
-/// \return array of lengths up to $max starting with 30 minutes, 1 hour, 
-/// 2 hours, then increasing by 2 hours up to 47 hours, then 2 days, then 
+/// \return array of lengths up to $max starting with 30 minutes, 1 hour,
+/// 2 hours, then increasing by 2 hours up to 47 hours, then 2 days, then
 /// increasing by 1 day; indexes are the duration in minutes
 ///
 /// \brief generates an array of reservation lengths
@@ -11057,8 +11080,8 @@
 ////////////////////////////////////////////////////////////////////////////////
 function getResourceGroupID($groupname) {
 	list($type, $name) = explode('/', $groupname);
-	$type = mysql_real_escape_string($type);
-	$name = mysql_real_escape_string($name);
+	$type = vcl_mysql_escape_string($type);
+	$name = vcl_mysql_escape_string($name);
 	$query = "SELECT g.id "
 	       . "FROM resourcegroup g, "
 	       .      "resourcetype t "
@@ -11066,7 +11089,7 @@
 	       .       "t.name = '$type' AND "
 	       .       "g.resourcetypeid = t.id";
 	$qh = doQuery($query, 371);
-	if($row = mysql_fetch_row($qh))
+	if($row = mysqli_fetch_row($qh))
 		return $row[0];
 	else
 		return NULL;
@@ -11089,7 +11112,7 @@
 	       . "FROM resourcegroup "
 	       . "WHERE id = $groupid";
 	$qh = doQuery($query);
-	if($row = mysql_fetch_assoc($qh))
+	if($row = mysqli_fetch_assoc($qh))
 		return $row['name'];
 	else
 		return NULL;
@@ -11107,12 +11130,12 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function getResourceTypeID($name) {
-	$name = mysql_real_escape_string($name);
+	$name = vcl_mysql_escape_string($name);
 	$query = "SELECT id "
 	       . "FROM resourcetype "
 	       . "WHERE name = '$name'";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_row($qh))
+	if($row = mysqli_fetch_row($qh))
 		return $row[0];
 	else
 		return NULL;
@@ -11131,7 +11154,7 @@
 function getResourcePrivs() {
 	$query = "show columns from resourcepriv where field = 'type'";
 	$qh = doQuery($query, 101);
-	$row = mysql_fetch_assoc($qh);
+	$row = mysqli_fetch_assoc($qh);
 	preg_match("/^enum\(([a-zA-Z0-9,']+)\)$/", $row['Type'], $matches);
 	$tmp = str_replace("'", '', $matches[1]);
 	return explode(',', $tmp);
@@ -11151,7 +11174,7 @@
 	$query = "SELECT id, prettyname FROM configtype ORDER BY name";
 	$qh = doQuery($query);
 	$types = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$types[$row['id']] = $row['prettyname'];
 	return $types;
 }
@@ -11170,7 +11193,7 @@
 	$query = "SELECT id, name FROM datatype ORDER BY name";
 	$qh = doQuery($query);
 	$types = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$types[$row['id']] = $row['name'];
 	return $types;
 }
@@ -11195,7 +11218,7 @@
 	$query .= "ORDER BY prettyname";
 	$qh = doQuery($query);
 	$types = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$types[$row['id']] = $row['prettyname'];
 	return $types;
 }
@@ -11240,7 +11263,7 @@
 	       .      "user u, "
 	       .      "affiliation ua, "
 	       .      "configtype ct, "
-	       .      "configmaptype cmt, " 
+	       .      "configmaptype cmt, "
 	       .      "affiliation a, "
 	       .      "configstage cs "
 	       . "WHERE cm.configid = c.id AND "
@@ -11261,7 +11284,7 @@
 	$qh = doQuery($query);
 	$configs = array();
 	$configids = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$row['configmapid'] = $row['id'];
 		if(is_null($row['subimageid']))
 			$configids[] = $row['configid'];
@@ -11345,7 +11368,7 @@
 	       .      "user u, "
 	       .      "affiliation ua, "
 	       .      "configtype ct, "
-	       .      "configmaptype cmt, " 
+	       .      "configmaptype cmt, "
 	       .      "affiliation a, "
 	       .      "configstage cs "
 	       . "WHERE cm.configid = c.id AND "
@@ -11372,7 +11395,7 @@
 	$qh = doQuery($query);
 	$configs = array();
 	$configids = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$row['configmapid'] = $row['id'];
 		if(is_null($row['subimageid']))
 			$configids[] = $row['configid'];
@@ -11442,7 +11465,7 @@
 	       . "ORDER BY cv.configid";
 	$data = array();
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$row['required'] = (int)$row['required'];
 		$row['ask'] = (int)$row['ask'];
 		#$row['defaultvalue'] = htmlspecialchars($row['defaultvalue']);
@@ -11515,7 +11538,7 @@
 	$qh = doQuery($query);
 	$clusters = array();
 	$subimageids = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$children = getConfigClustersRec($row['configsubimageid'], $flat);
 		if(! empty($children)) {
 			if($flat)
@@ -11578,7 +11601,7 @@
 	       .        "a.name = 'Global')";
 	$qh = doQuery($query);
 	$clusters = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if($rec < 20)
 			$children = getConfigClustersRec($row['configsubimageid'], $flat, ++$rec);
 		if($rec < 20 && ! empty($children)) {
@@ -11606,7 +11629,7 @@
 	$query = "SELECT id, name FROM OStype ORDER BY name";
 	$qh = doQuery($query);
 	$types = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$types[$row['id']] = $row['name'];
 	return $types;
 }
@@ -11639,7 +11662,7 @@
 	       .       "c.id IN ($inlist)";
 	$configs = array();
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$configs[$row['id']] = $row['name'];
 	return $configs;
 }
@@ -11662,7 +11685,7 @@
 	if(isset($cache['nodes'][$nodeid]))
 		return $cache['nodes'][$nodeid];
 	$qh = doQuery("SELECT id, parent, name FROM privnode", 330);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$cache['nodes'][$row['id']] = $row;
 	if(isset($cache['nodes'][$nodeid]))
 		return $cache['nodes'][$nodeid];
@@ -11749,7 +11772,7 @@
 ///
 /// \return -1, 0, 1 if numerical parts of $a <, =, or > $b
 ///
-/// \brief compares $a and $b to determine which one should be ordered first; 
+/// \brief compares $a and $b to determine which one should be ordered first;
 /// has some understand of numerical order in strings
 ///
 ////////////////////////////////////////////////////////////////////////////////
@@ -11809,8 +11832,8 @@
 /// \param $resource2inlist - (optional) comma delimited list of resource groups
 /// to limit query to
 ///
-/// \return an array of $resourcetype1 group to $resourcetype2 group mappings 
-/// where each index is a group id from $resourcetype1 and each value is an 
+/// \return an array of $resourcetype1 group to $resourcetype2 group mappings
+/// where each index is a group id from $resourcetype1 and each value is an
 /// array of $resourcetype2 group ids
 ///
 /// \brief builds an array of $resourcetype2 group ids for each $resourcetype1
@@ -11839,7 +11862,7 @@
 	if(! empty($resource2inlist))
 		$query .= "AND resourcegroupid2 IN ($resource2inlist) ";
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if($resourcetype1 == $row['resourcetypeid1']) {
 			if(array_key_exists($row["resourcegroupid1"], $return))
 				array_push($return[$row["resourcegroupid1"]], $row["resourcegroupid2"]);
@@ -11891,7 +11914,7 @@
 	       . "ORDER BY c.description";
 	$methods = array();
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$methods[$row['id']] = $row;
 	$_SESSION['usersessiondata'][$key] = $methods;
 	return $methods;
@@ -11929,7 +11952,7 @@
 	       . "ORDER BY start "
 	       . "LIMIT 1";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh)) {
+	if($row = mysqli_fetch_assoc($qh)) {
 		$end = datetimeToUnix($request["end"]);
 		$start = datetimeToUnix($row["start"]);
 		return ($start - $end) / 60;
@@ -11974,8 +11997,8 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function cleanSemaphore() {
-	global $mysql_link_vcl, $uniqid;
-	if(! is_resource($mysql_link_vcl) || ! get_resource_type($mysql_link_vcl) == 'mysql link')
+	global $mysqli_link_vcl, $uniqid;
+	if(! is_resource($mysqli_link_vcl) || ! get_resource_type($mysqli_link_vcl) == 'mysql link')
 		return;
 	$query = "DELETE FROM semaphore "
 	       . "WHERE procid = '$uniqid'";
@@ -12024,7 +12047,7 @@
 /// \param $id (optional) - a profile id; if specified, only data about this
 /// profile will be returned
 ///
-/// \return an array of profiles where each key is the profile id and each 
+/// \return an array of profiles where each key is the profile id and each
 /// element is an array with these keys:\n
 /// \b profilename - name of profile\n
 /// \b name - name of profile (so array can be passed to printSelectInput)\n
@@ -12083,7 +12106,7 @@
 		$query .= " AND vp.id = $id";
 	$qh = doQuery($query, 101);
 	$ret = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$ret[$row['id']] = $row;
 	return $ret;
 }
@@ -12103,7 +12126,7 @@
 function getENUMvalues($table, $field) {
 	$query = "DESC $table";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if($row['Field'] == "$field") {
 			$data = preg_replace(array('/^enum\(/', "/'/", '/\)$/'), array('', '', ''), $row['Type']);
 			$types = explode(',', $data);
@@ -12117,7 +12140,7 @@
 /// \fn addContinuationsEntry($nextmode, $data, $duration, $deleteFromSelf,
 ///                           $multicall, $repeatProtect)
 ///
-/// \param $nextmode - next mode to go in to 
+/// \param $nextmode - next mode to go in to
 /// \param $data (optional, default=array())- array of data to make available
 /// in $nextmode
 /// \param $duration (optional, default=SECINWEEK)- how long this continuation
@@ -12152,7 +12175,7 @@
 		$contid = md5($mode . $nextmode . $serdata . $user['id'] . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']);
 	else
 		$contid = md5($mode . $nextmode . $serdata . $user['id'] . $_SERVER['REMOTE_ADDR']);
-	$serdata = mysql_real_escape_string($serdata);
+	$serdata = vcl_mysql_escape_string($serdata);
 	$expiretime = unixToDatetime(time() + $duration);
 	$query = "SELECT id, "
 	       .        "parentid "
@@ -12160,7 +12183,7 @@
 	       . "WHERE id = '$contid' AND "
 	       .       "userid = {$user['id']}";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh)) {
+	if($row = mysqli_fetch_assoc($qh)) {
 		# update expiretime
 		$query = "UPDATE continuations "
 		       . "SET expiretime = '$expiretime' "
@@ -12183,7 +12206,7 @@
 			       . "WHERE id = '$continuationid' AND "
 			       .       "userid = {$user['id']}";
 			$qh = doQuery($query, 101);
-			if(! $row = mysql_fetch_assoc($qh))
+			if(! $row = mysqli_fetch_assoc($qh))
 				abort(108);
 			$deletefromid = $row['deletefromid'];
 		}
@@ -12267,7 +12290,7 @@
 	$qh = doQuery($query, 101);
 
 	# return error if it is not there
-	if(! ($row = mysql_fetch_assoc($qh)))
+	if(! ($row = mysqli_fetch_assoc($qh)))
 		return array('error' => 'continuation does not exist');
 
 	# return error if it is expired
@@ -12373,7 +12396,7 @@
 	       . "FROM shibauth "
 	       . "WHERE id = $id";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh)) {
+	if($row = mysqli_fetch_assoc($qh)) {
 		$data = unserialize($row['data']);
 		unset($row['data']);
 		$data2 = array_merge($row, $data);
@@ -12412,7 +12435,7 @@
 	$query .= "FROM variable "
 	       .  "WHERE name = '$key'";
 	$qh = doQuery($query);
-	if($row = mysql_fetch_assoc($qh)) {
+	if($row = mysqli_fetch_assoc($qh)) {
 		if($incparams) {
 			switch($row['serialization']) {
 				case 'yaml':
@@ -12451,7 +12474,7 @@
 ///
 /// \return array of values from variable table
 ///
-/// \brief gets data from the variable table for $pattern matches 'name' from 
+/// \brief gets data from the variable table for $pattern matches 'name' from
 /// table
 ///
 ////////////////////////////////////////////////////////////////////////////////
@@ -12463,7 +12486,7 @@
 	       . "WHERE name REGEXP '$pattern'";
 	$qh = doQuery($query);
 	$ret = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		switch($row['serialization']) {
 			case 'none':
 				$ret[$row['name']] = $row['value'];
@@ -12499,7 +12522,7 @@
 	$update = 0;
 	$query = "SELECT serialization FROM variable WHERE name = '$key'";
 	$qh = doQuery($query);
-	if($row = mysql_fetch_assoc($qh)) {
+	if($row = mysqli_fetch_assoc($qh)) {
 		if($serialization == '')
 			$serialization = $row['serialization'];
 		$update = 1;
@@ -12509,19 +12532,19 @@
 	$_SESSION['variables'][$key] = $data;
 	switch($serialization) {
 		case 'none':
-			$qdata = mysql_real_escape_string($data);
+			$qdata = vcl_mysql_escape_string($data);
 			break;
 		case 'yaml':
 			$yaml = Spyc::YAMLDump($data);
-			$qdata = mysql_real_escape_string($yaml);
+			$qdata = vcl_mysql_escape_string($yaml);
 			break;
 		case 'phpserialize':
-			$qdata = mysql_real_escape_string(serialize($data));
+			$qdata = vcl_mysql_escape_string(serialize($data));
 			break;
 	}
 	if($update)
 		$query = "UPDATE variable "
-		       . "SET value = '$qdata', " 
+		       . "SET value = '$qdata', "
 		       .     "serialization = '$serialization', "
 		       .     "setby = 'webcode', "
 		       .     "timestamp = NOW() "
@@ -12727,15 +12750,15 @@
 		$keyid = $user['id'];
 	if(function_exists($function)) {
 		if(! defined('XMLRPCLOGGING') || XMLRPCLOGGING != 0) {
-			$saveargs = mysql_real_escape_string(serialize($args));
+			$saveargs = vcl_mysql_escape_string(serialize($args));
 			$query = "INSERT INTO xmlrpcLog "
-			       .        "(xmlrpcKeyid, " 
+			       .        "(xmlrpcKeyid, "
 			       .        "timestamp, "
 			       .        "IPaddress, "
 			       .        "method, "
 			       .        "apiversion, "
 			       .        "comments) "
-			       . "VALUES " 
+			       . "VALUES "
 			       .        "($keyid, "
 			       .        "NOW(), "
 			       .        "'$remoteIP', "
@@ -12768,13 +12791,13 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function xmlRPCabort($errcode, $query='') {
-	global $mysql_link_vcl, $mysql_link_acct, $ERRORS, $user, $mode;
+	global $mysqli_link_vcl, $mysqli_link_acct, $ERRORS, $user, $mode;
 	global $XMLRPCERRORS;
 	if(ONLINEDEBUG && checkUserHasPerm('View Debug Information')) {
 		$msg = '';
 		if($errcode >= 100 && $errcode < 400) {
-			$msg .= "ERROR (" . mysql_errno($mysql_link_vcl) . ") - ";
-			$msg .= mysql_error($mysql_link_vcl) . " $query ";
+			$msg .= "ERROR (" . mysqli_errno($mysqli_link_vcl) . ") - ";
+			$msg .= mysqli_error($mysqli_link_vcl) . " $query ";
 		}
 		$msg .= $ERRORS["$errcode"];
 		$XMLRPCERRORS[100] = $msg;
@@ -12783,8 +12806,8 @@
 	else {
 		$message = "";
 		if($errcode >= 100 && $errcode < 400) {
-			$message .= mysql_error($mysql_link_vcl) . "\n";
-			$message .= mysql_error($mysql_link_acct) . "\n";
+			$message .= mysqli_error($mysqli_link_vcl) . "\n";
+			$message .= mysqli_error($mysqli_link_acct) . "\n";
 			$message .= $query . "\n";
 		}
 		$message .= "ERROR($errcode): " . $ERRORS["$errcode"] . "\n";
@@ -12934,7 +12957,7 @@
 			             'errormsg' => 'existing user group with submitted name and affiliation');
 		}
 		elseif($exists && $doesexist) {
-			$esc_name = mysql_real_escape_string($items['name']);
+			$esc_name = vcl_mysql_escape_string($items['name']);
 			$items['id'] = getUserGroupID($esc_name, $affilid);
 		}
 	}
@@ -13022,7 +13045,7 @@
 			 // Always use "." for floats.
 			 return floatval(str_replace(",", ".", strval($a)));
 		}
- 
+
 		if (is_string($a)) {
 			 static $jsonReplaces = array(array("\\", "/", "\n", "\t", "\r", "\b", "\f", '"'), array('\\\\', '\\/', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'));
 			return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"';
@@ -14363,7 +14386,7 @@
 		setcookie("VCLLOCALE", $_COOKIE['VCLLOCALE'], (time() + (86400 * 31)), "/", COOKIEDOMAIN);
 		$locale = $_COOKIE['VCLLOCALE'];
 	}
-	
+
 	#putenv('LC_ALL=' . $locale);
 	# use UTF8 encoding for any locales other than English (we may just be able
 	#   to always use UTF8)
diff --git a/web/.ht-inc/vm.php b/web/.ht-inc/vm.php
index 5375cdf..90c96a5 100644
--- a/web/.ht-inc/vm.php
+++ b/web/.ht-inc/vm.php
@@ -47,7 +47,7 @@
 	print "</div>\n";
 
 	$newmsg = "To create a new Virtual Host, change the state of a computer to<br>\n"
-	        . "'vmhostinuse' under Manage Computers-&gt;Computer Utilities.<br><br>\n";
+	        . "'vmhostinuse' under Manage Computers-&gt;Edit Computer Profiles.<br><br>\n";
 	$vmhosts = getVMHostData();
 	$resources = getUserResources(array("computerAdmin"), array("administer"));
 	foreach($vmhosts as $key => $value) {
@@ -380,7 +380,7 @@
 	$currvms = array();
 	$noaccess = array();
 	$freevms = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if($row['vmhostid'] == $vmhostid) {
 			$ids[$row['id']] = $row['hostname'];
 			if(array_key_exists($row['id'], $computers))
@@ -423,7 +423,7 @@
 		       .       "rq.laststateid = 18) AND "
 		       .       "rq.start > NOW()";
 		$qh = doQuery($query, 101);
-		while($row = mysql_fetch_assoc($qh)) {
+		while($row = mysqli_fetch_assoc($qh)) {
 			$movevms[] = array('id' => $row['id'],
 			                 'time' => strtolower($row['start']) . ' ' . date('T'),
 			                 'hostname' => $currvms[$row['computerid']]['name']);
@@ -480,7 +480,7 @@
 		$query .= " AND vh.id = $id";
 	$qh = doQuery($query, 101);
 	$ret = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$ret[$row['id']] = $row;
 		foreach($profiles[$row['vmprofileid']] AS $key => $value) {
 			if(is_null($value))
@@ -524,7 +524,7 @@
 	       . "WHERE id in ($vmlistids)";
 	$qh = doQuery($query, 101);
 	$vmdata = array();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if(! array_key_exists($row['id'], $resources['computer'])) {
 			$fails[] = array('id' => $row['id'], 'name' => $row['hostname'], 'reason' => 'noaccess');
 			unset_by_val($row['id'], $vmids);
@@ -537,7 +537,7 @@
 	$query = "SELECT id FROM vmhost";
 	$vmhosts = array();
 	$qh = doQuery($query, 101);
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$vmhosts[$row['id']] = 1;
 
 	# check to see if there any submitted vms have a hostid of an existing vm host
@@ -616,7 +616,7 @@
 		       . "ORDER BY end DESC "
 		       . "LIMIT 1";
 		$qh = doQuery($query, 101);
-		if($row = mysql_fetch_assoc($qh)) {
+		if($row = mysqli_fetch_assoc($qh)) {
 			$checks[] = array('id' => $compid,
 			                  'hostname' => $compdata[$compid]['hostname'],
 			                  'end' => strtolower($row['end']) . ' ' . date('T'),
@@ -840,11 +840,11 @@
 	else {
 		if(get_magic_quotes_gpc())
 			$newvalue = stripslashes($newvalue);
-		$newvalue2 = mysql_real_escape_string($newvalue);
+		$newvalue2 = vcl_mysql_escape_string($newvalue);
 		$newvalue2 = "'$newvalue2'";
 	}
 
-	$item = mysql_real_escape_string($item);
+	$item = vcl_mysql_escape_string($item);
 	$profile = getVMProfiles($profileid);
 	if($item == 'password') {
 		$pwdlen = strlen($newvalue);
@@ -878,7 +878,7 @@
 			       . "WHERE cryptkeyid = $cryptkeyid AND "
 			       .       "secretid = $secretid";
 			$qh = doQuery($query);
-			if(! ($row = mysql_fetch_assoc($qh))) {
+			if(! ($row = mysqli_fetch_assoc($qh))) {
 				# generate a new secret
 				$newsecretid = getSecretKeyID('vmprofile', 'secretid', 0);
 				$delids = array($secretid);
@@ -895,7 +895,7 @@
 				       . "WHERE cs.secretid = $secretid AND "
 				       .       "ck.hosttype = 'managementnode'";
 				$qh = doQuery($query);
-				while($row = mysql_fetch_assoc($qh))
+				while($row = mysqli_fetch_assoc($qh))
 					$secretidset[$row['mnid']][$newsecretid] = 1;
 				$values = getMNcryptkeyUpdates($secretidset, $cryptkeyid);
 				addCryptSecretKeyUpdates($values);
@@ -946,11 +946,11 @@
 	$newprofile = processInputVar('newname', ARG_STRING);
 	if(get_magic_quotes_gpc()) {
 		$newprofile = stripslashes($newprofile);
-		$newprofile = mysql_real_escape_string($newprofile);
+		$newprofile = vcl_mysql_escape_string($newprofile);
 	}
 	$query = "SELECT id FROM vmprofile WHERE profilename = '$newprofile'";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh)) {
+	if($row = mysqli_fetch_assoc($qh)) {
 		sendJSON(array('failed' => 'exists'));
 		return;
 	}
@@ -994,7 +994,7 @@
 	       .       "s.name IN ('vmhostinuse', 'tovmhostinuse') AND " 
 	       .       "vh.vmprofileid = $profileid";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh)) {
+	if($row = mysqli_fetch_assoc($qh)) {
 		sendJSON(array('failed' => 'inuse'));
 		return;
 	}
diff --git a/web/.ht-inc/xmlrpcWrappers.php b/web/.ht-inc/xmlrpcWrappers.php
index 0ec5c74..33b1587 100644
--- a/web/.ht-inc/xmlrpcWrappers.php
+++ b/web/.ht-inc/xmlrpcWrappers.php
@@ -430,7 +430,7 @@
 			$admingroup = stripslashes($admingroup);
 		if(preg_match('/@/', $admingroup)) {
 			$tmp = explode('@', $admingroup);
-			$escadmingroup = mysql_real_escape_string($tmp[0]);
+			$escadmingroup = vcl_mysql_escape_string($tmp[0]);
 			$affilid = getAffiliationID($tmp[1]);
 			if(is_null($affilid)) {
 				return array('status' => 'error',
@@ -439,7 +439,7 @@
 			}
 		}
 		else {
-			$escadmingroup = mysql_real_escape_string($admingroup);
+			$escadmingroup = vcl_mysql_escape_string($admingroup);
 			$affilid = DEFAULT_AFFILID;
 		}
 		$admingroupid = getUserGroupID($escadmingroup, $affilid, 1);
@@ -457,7 +457,7 @@
 			$logingroup = stripslashes($logingroup);
 		if(preg_match('/@/', $logingroup)) {
 			$tmp = explode('@', $logingroup);
-			$esclogingroup = mysql_real_escape_string($tmp[0]);
+			$esclogingroup = vcl_mysql_escape_string($tmp[0]);
 			$affilid = getAffiliationID($tmp[1]);
 			if(is_null($affilid)) {
 				return array('status' => 'error',
@@ -466,7 +466,7 @@
 			}
 		}
 		else {
-			$esclogingroup = mysql_real_escape_string($logingroup);
+			$esclogingroup = vcl_mysql_escape_string($logingroup);
 			$affilid = DEFAULT_AFFILID;
 		}
 		$logingroupid = getUserGroupID($esclogingroup, $affilid, 1);
@@ -514,7 +514,7 @@
 		                         . "spaces, dashes(-), underscores(_), and periods(.) "
 		                         . "and be up to 255 characters long");
 	}
-	$name = mysql_real_escape_string($name);
+	$name = vcl_mysql_escape_string($name);
 
 	# validate $start
 	if($start != 'now' && ! is_numeric($start)) {
@@ -574,7 +574,7 @@
 	if($userdata != '') {
 		if(get_magic_quotes_gpc())
 			$userdata = stripslashes($userdata);
-		$esc_userdata = mysql_real_escape_string($userdata);
+		$esc_userdata = vcl_mysql_escape_string($userdata);
 		$query = "INSERT INTO variable "
 		       .        "(name, "
 		       .        "serialization, "
@@ -1334,7 +1334,7 @@
 	}
 	$query = "SELECT id FROM request WHERE id = $requestid";
 	$qh = doQuery($query, 101);
-	if(! mysql_num_rows($qh)) {
+	if(! mysqli_num_rows($qh)) {
 		return array('status' => 'error',
 		             'errorcode' => 52,
 		             'errormsg' => 'specified request does not exist');
@@ -1772,13 +1772,13 @@
 		in_array("nodeAdmin", $user["privileges"])) {
 		if(get_magic_quotes_gpc())
 			$nodeName = stripslashes($nodeName);
-		$nodeName = mysql_real_escape_string($nodeName);
+		$nodeName = vcl_mysql_escape_string($nodeName);
 		// does a node with this name already exist?
 		$query = "SELECT id "
 		       . "FROM privnode "
 		       . "WHERE name = '$nodeName' AND parent = $parentNode";
 		$qh = doQuery($query, 335);
-		if(mysql_num_rows($qh))
+		if(mysqli_num_rows($qh))
 			return array('status' => 'success', 'exists' => TRUE);
 		else
 			return array('status' => 'success', 'exists' => FALSE);
@@ -1836,7 +1836,7 @@
 			       . "FROM privnode "
 			       . "WHERE name = '$nodeName' AND parent = $parentNode";
 			$qh = doQuery($query);
-			if(mysql_num_rows($qh)) {
+			if(mysqli_num_rows($qh)) {
 				return array('status' => 'error',
 				             'errorcode' => 82,
 				             'errormsg' => 'A node of that name already exists under ' . $nodeInfo['name']);
@@ -1847,7 +1847,7 @@
 			       .        "($parentNode, '$nodeName')";
 			doQuery($query);
 			$qh = doQuery("SELECT LAST_INSERT_ID() FROM privnode", 101);
-			if(! $row = mysql_fetch_row($qh)) {
+			if(! $row = mysqli_fetch_row($qh)) {
 				return array('status' => 'error',
 				             'errorcode' => 85,
 				             'errormsg' => 'Could not add node to database');
@@ -2470,7 +2470,7 @@
 	       . "LEFT JOIN affiliation euga ON (eug.affiliationid = euga.id) "
 	       . "WHERE ug.id = {$rc['id']}";
 	$qh = doQuery($query, 101);
-	if(! $row = mysql_fetch_assoc($qh)) {
+	if(! $row = mysqli_fetch_assoc($qh)) {
 		return array('status' => 'error',
 		             'errorcode' => 18,
 		             'errormsg' => 'user group with submitted name and affiliation does not exist');
@@ -2607,7 +2607,7 @@
                              $newOwner='', $newManagingGroup='',
                              $newInitialMaxTime='', $newTotalMaxTime='',
                              $newMaxExtendTime='') {
-	global $user, $mysql_link_vcl;
+	global $user, $mysqli_link_vcl;
 	if(! in_array('groupAdmin', $user['privileges'])) {
 		return array('status' => 'error',
 		             'errorcode' => 16,
@@ -2650,7 +2650,7 @@
 	       . "FROM usergroup "
 	       . "WHERE id = {$rc['id']}";
 	$qh = doQuery($query, 101);
-	if(! $row = mysql_fetch_assoc($qh)) {
+	if(! $row = mysqli_fetch_assoc($qh)) {
 		return array('status' => 'error',
 		             'errorcode' => 18,
 		             'errormsg' => 'user group with submitted name and affiliation does not exist');
@@ -2675,7 +2675,7 @@
 			if(get_magic_quotes_gpc())
 				$newName = stripslashes($newName);
 			$validate['name'] = $newName;
-			$tmp = mysql_real_escape_string($newName);
+			$tmp = vcl_mysql_escape_string($newName);
 			$updates[] = "name = '$tmp'";
 		}
 		if(! empty($newAffiliation))
@@ -2694,7 +2694,7 @@
 
 	if($row['custom']) {
 		if(! empty($newOwner)) {
-			$newownerid = getUserlistID(mysql_real_escape_string($newOwner));
+			$newownerid = getUserlistID(vcl_mysql_escape_string($newOwner));
 			$updates[] = "ownerid = $newownerid";
 		}
 		if(! empty($newManagingGroup))
@@ -2732,7 +2732,7 @@
 ///
 ////////////////////////////////////////////////////////////////////////////////
 function XMLRPCremoveUserGroup($name, $affiliation) {
-	global $user, $mysql_link_vcl;
+	global $user, $mysqli_link_vcl;
 	if(! in_array('groupAdmin', $user['privileges'])) {
 		return array('status' => 'error',
 		             'errorcode' => 16,
@@ -2750,7 +2750,7 @@
 	       . "FROM usergroup "
 	       . "WHERE id = {$rc['id']}";
 	$qh = doQuery($query, 101);
-	if(! $row = mysql_fetch_assoc($qh)) {
+	if(! $row = mysqli_fetch_assoc($qh)) {
 		return array('status' => 'error',
 		             'errorcode' => 18,
 		             'errormsg' => 'user group with submitted name and affiliation does not exist');
@@ -2775,7 +2775,7 @@
 	       . "WHERE id = {$rc['id']}";
 	doQuery($query, 101);
 	# validate something deleted
-	if(mysql_affected_rows($mysql_link_vcl) == 0) {
+	if(mysqli_affected_rows($mysqli_link_vcl) == 0) {
 		return array('status' => 'error',
 		             'errorcode' => 30,
 		             'errormsg' => 'failure while deleting group from database');
@@ -2849,7 +2849,7 @@
 	       . "FROM usergroup "
 	       . "WHERE id = {$rc['id']}";
 	$qh = doQuery($query, 101);
-	if(! $row = mysql_fetch_assoc($qh)) {
+	if(! $row = mysqli_fetch_assoc($qh)) {
 		return array('status' => 'error',
 		             'errorcode' => 18,
 		             'errormsg' => 'user group with submitted name and affiliation does not exist');
@@ -2875,7 +2875,7 @@
 	       .       "u.affiliationid = a.id";
 	$qh = doQuery($query, 101);
 	$members = array();
-	while($row = mysql_fetch_assoc($qh))
+	while($row = mysqli_fetch_assoc($qh))
 		$members[] = $row['member'];
 	return array('status' => 'success',
 	             'members' => $members);
@@ -2924,7 +2924,7 @@
 	       . "FROM usergroup "
 	       . "WHERE id = {$rc['id']}";
 	$qh = doQuery($query, 101);
-	if(! $row = mysql_fetch_assoc($qh)) {
+	if(! $row = mysqli_fetch_assoc($qh)) {
 		return array('status' => 'error',
 		             'errorcode' => 18,
 		             'errormsg' => 'user group with submitted name and affiliation does not exist');
@@ -2942,7 +2942,7 @@
 			continue;
 		if(get_magic_quotes_gpc())
 			$_user = stripslashes($_user);
-		$esc_user = mysql_real_escape_string($_user);
+		$esc_user = vcl_mysql_escape_string($_user);
 		if(validateUserid($_user) == 1)
 			addUserGroupMember($esc_user, $rc['id']);
 		else
@@ -3006,7 +3006,7 @@
 	       . "FROM usergroup "
 	       . "WHERE id = {$rc['id']}";
 	$qh = doQuery($query, 101);
-	if(! $row = mysql_fetch_assoc($qh)) {
+	if(! $row = mysqli_fetch_assoc($qh)) {
 		return array('status' => 'error',
 		             'errorcode' => 18,
 		             'errormsg' => 'user group with submitted name and affiliation does not exist');
@@ -3024,7 +3024,7 @@
 			continue;
 		if(get_magic_quotes_gpc())
 			$_user = stripslashes($_user);
-		$esc_user = mysql_real_escape_string($_user);
+		$esc_user = vcl_mysql_escape_string($_user);
 		# check that affiliation of user can be determined because getUserlistID
 		#   will abort if it cannot find it
 		$affilok = 0;
@@ -3135,7 +3135,7 @@
 			             'errorcode' => 87,
 			             'errormsg' => 'Name must be between 3 and 30 characters and can only contain letters, numbers, spaces, and these characters: - . _');
 		}
-		$name = mysql_real_escape_string($name);
+		$name = vcl_mysql_escape_string($name);
 		$data = array('type' => 'resource',
 		              'ownergroup' => $rc['managingGroupID'],
 		              'resourcetypeid' => $typeid,
@@ -3476,7 +3476,7 @@
 	       . "WHERE bt.blockRequestid = br.id AND "
 	       .       "bt.id = $blockTimesid";
 	$qh = doQuery($query, 101);
-	if(! $rqdata = mysql_fetch_assoc($qh)) {
+	if(! $rqdata = mysqli_fetch_assoc($qh)) {
 		return array('status' => 'error',
 		             'errorcode' => 8,
 		             'errormsg' => 'unknown blockTimesid');
@@ -3526,8 +3526,8 @@
 		$blockCompVals = array();
 		$checkstartbase = $unixstart - $imgLoadTime - 300;
 		$reloadstartbase = unixToDatetime($checkstartbase);
-		$rows = mysql_num_rows($qh);
-		while($row = mysql_fetch_assoc($qh)) {
+		$rows = mysqli_num_rows($qh);
+		while($row = mysqli_fetch_assoc($qh)) {
 			if(array_key_exists($row['reqid'], $donereqids))
 				continue;
 			$donereqids[$row['reqid']] = 1;
@@ -3594,7 +3594,7 @@
 	       . "FROM blockComputers "
 	       . "WHERE blockTimeid = $blockTimesid";
 	$qh = doQuery($query, 101);
-	if(! $row = mysql_fetch_assoc($qh)) {
+	if(! $row = mysqli_fetch_assoc($qh)) {
 		return array('status' => 'error',
 		             'errorcode' => 15,
 		             'errormsg' => 'failure to communicate with database');
@@ -3772,7 +3772,7 @@
 	       .       "r.subid = i.id AND "
 	       .       "r.resourcetypeid = 13";
 	$qh = doQuery($query);
-	if(mysql_num_rows($qh) != 1) {
+	if(mysqli_num_rows($qh) != 1) {
 		return array('status' => 'error',
 		             'errorcode' => 91,
 		             'errormsg' => 'Invalid resourceid submitted');
@@ -3823,7 +3823,7 @@
 	# check for existance of $reservationid
 	$query = "SELECT id FROM reservation WHERE id = $reservationid";
 	$qh = doQuery($query);
-	if(! ($row = mysql_fetch_assoc($qh))) {
+	if(! ($row = mysqli_fetch_assoc($qh))) {
 		return array('status' => 'error',
 		             'errorcode' => 101,
 		             'errormsg' => 'Specified reservation does not exist');
@@ -3839,7 +3839,7 @@
 	       . "WHERE rs.id = $reservationid AND "
 	       .       "ad.secretid IS NOT NULL";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$secretids[] = $row['secretid'];
 		$mnid = $row['managementnodeid'];
 	}
@@ -3853,7 +3853,7 @@
 	       . "WHERE rs.id = $reservationid AND "
 	       .       "vp.secretid IS NOT NULL";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		$secretids[] = $row['secretid'];
 		$mnid = $row['managementnodeid'];
 	}
@@ -3884,7 +3884,7 @@
 	       .       "ck.hosttype = 'managementnode' AND "
 	       .       "cs.id IS NULL";
 	$qh = doQuery($query);
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		if($row['mycryptsecret'] == NULL) {
 			$fails[] = $row['secretid'];
 			continue;
@@ -3952,7 +3952,7 @@
 	       .       "o.userid = {$user['id']}";
 	$qh = doQuery($query);
 	//if nothing returned, oneclick does not exist
-	if(! $row = mysql_fetch_assoc($qh)) {
+	if(! $row = mysqli_fetch_assoc($qh)) {
 		return array('status' => 'error',
 		             'errorcode' => 95,
 		             'errormsg' => "The OneClick with ID $oneclickid does not exist.");
@@ -4027,7 +4027,7 @@
 	$result['status'] = 'success';
 	$result['oneclicks'] = array();
 	#$allstates = getStates();
-	while($row = mysql_fetch_assoc($qh)) {
+	while($row = mysqli_fetch_assoc($qh)) {
 		/*if($row['currstateid'] == 14)
 			$state = $allstates[$row['laststateid']];
 		elseif(! is_null($row['currstateid']))
@@ -4208,7 +4208,7 @@
 	       .       "userid = {$user['id']}";
 	$qh = doQuery($query, 101);
 	//if nothing returned, oneclick does not exist or belongs to another user
-	if(! $row = mysql_fetch_assoc($qh)) {
+	if(! $row = mysqli_fetch_assoc($qh)) {
 		return array('status' => 'error',
 		             'errorcode' => 95,
 		             'errormsg' => "The OneClick with ID $oneclickid does not exist.");
@@ -4262,7 +4262,7 @@
 	       .       "userid = {$user['id']}";
 	$qh = doQuery($query, 101);
 	//if nothing returned, oneclick does not exist or belongs to another user
-	if(! $row = mysql_fetch_assoc($qh)) {
+	if(! $row = mysqli_fetch_assoc($qh)) {
 		return array('status' => 'error',
 		             'errorcode' => 95,
 		             'errormsg' => "The OneClick with ID $oneclickid does not exist.");
diff --git a/web/index.php b/web/index.php
index bbdca0a..6ac26f6 100644
--- a/web/index.php
+++ b/web/index.php
@@ -26,8 +26,8 @@
 }
 
 $user = '';
-$mysql_link_vcl = '';
-$mysql_link_acct = '';
+$mysqli_link_vcl = '';
+$mysqli_link_acct = '';
 $mode = '';
 $oldmode = '';
 $submitErr = '';
diff --git a/web/js/resources/image.js b/web/js/resources/image.js
index dad3f47..b710c55 100644
--- a/web/js/resources/image.js
+++ b/web/js/resources/image.js
@@ -36,10 +36,29 @@
 		if(value == "1")
 			return '<span class="ready">' + _('true') + '</span>';
 	}
-	if((obj.field == 'maxinitialtime' && value == 0) ||
-	   (obj.field == 'addomain' && value == null) ||
+	if((obj.field == 'addomain' && value == null) ||
 	   (obj.field == 'baseOU' && value == null))
 		return '(' + _('unset') + ')';
+	if(obj.field == 'maxinitialtime') {
+		if(value == 0) {
+			return _('Default for User');
+		}
+		else if(value < 60) {
+			return value + ' ' + _('minutes');
+		}
+		else if(value == 60) {
+			return _('1 hour');
+		}
+		else if(value < 2880) {
+			return parseInt(value / 60) + ' ' + _('hours');
+		}
+		else if(value <= 64800) {
+			return parseInt(value / 1440) + ' ' + _('days');
+		}
+		else {
+			return parseInt(value / 10080) + ' ' + _('weeks');
+		}
+	}
 	return value;
 }
 
@@ -67,6 +86,7 @@
 		dijit.byId('checkuser').set('value', data.items.data.checkuser);
 		dijit.byId('rootaccess').set('value', data.items.data.rootaccess);
 		dijit.byId('sethostname').set('value', data.items.data.sethostname);
+		dijit.byId('maxinitialtime').set('value', data.items.data.maxinitialtime);
 		if(data.items.data.ostype == 'windows' || data.items.data.ostype == 'linux')
 			dojo.removeClass('sethostnamediv', 'hidden');
 		else
@@ -257,6 +277,11 @@
 			return;
 		}
 	}
+	data['maxinitialtime'] = parseInt(dijit.byId('maxinitialtime').get('value'));
+	if(data['maxinitialtime'] < 0 || data['maxinitialtime'] > 201600) {
+		errobj.innerHTML = _('Invalid Max Reservation Duration selected');
+		return;
+	}
 	if(dijit.byId('sysprep')) {
 		data['sysprep'] = parseInt(dijit.byId('sysprep').get('value'));
 		if(data['sysprep'] != 0 && data['sysprep'] != 1) {
@@ -341,6 +366,7 @@
 					resourcegrid.store.setValue(item, 'checkuser', data.items.data.checkuser);
 					resourcegrid.store.setValue(item, 'rootaccess', parseInt(data.items.data.rootaccess));
 					resourcegrid.store.setValue(item, 'sethostname', parseInt(data.items.data.sethostname));
+					resourcegrid.store.setValue(item, 'maxinitialtime', parseInt(data.items.data.maxinitialtime));
 					resourcegrid.store.setValue(item, 'reloadtime', data.items.data.reloadtime);
 					resourcegrid.store.setValue(item, 'adauthenabled', data.items.data.adauthenabled);
 					resourcegrid.store.setValue(item, 'addomainid', data.items.data.addomainid);
diff --git a/web/shibauth/index.php b/web/shibauth/index.php
index 0ab553d..64c33c5 100644
--- a/web/shibauth/index.php
+++ b/web/shibauth/index.php
@@ -43,7 +43,7 @@
 				 .       "a.shibname = '{$tmp[1]}' AND "
 				 .       "u.affiliationid = a.id";
 		$qh = doQuery($query, 101);
-		if($row = mysql_fetch_assoc($qh)) {
+		if($row = mysqli_fetch_assoc($qh)) {
 			$_SERVER['sn'] = $row['lastname'];
 			$_SERVER['givenName'] = $row['firstname'];
 		}
@@ -103,11 +103,11 @@
 $tmp = explode(';', $_SERVER['eppn']);
 $tmp = explode('@', $tmp[0]);
 $username = strtolower($tmp[0]);
-$tmp1 = mysql_escape_string(strtolower($tmp[1]));
+$tmp1 = vcl_mysql_escape_string(strtolower($tmp[1]));
 $query = "SELECT name, shibonly FROM affiliation WHERE shibname = '$tmp1'";
 $qh = doQuery($query, 101);
 # if shib affiliation not already in VCL, create affiliation
-if(! ($row = mysql_fetch_assoc($qh))) {
+if(! ($row = mysqli_fetch_assoc($qh))) {
 	$affil = strtolower($tmp[1]);
 	$tmp = explode('.', $affil);
 	array_pop($tmp);
@@ -120,7 +120,7 @@
 	       . "ORDER BY name DESC "
 	       . "LIMIT 1";
 	$qh = doQuery($query, 101);
-	if($row = mysql_fetch_assoc($qh)) {
+	if($row = mysqli_fetch_assoc($qh)) {
 		if(preg_match("/$affilname([0-9]+)/", $row['name'], $matches)) {
 			$cnt = $matches[1];
 			$cnt++;
@@ -160,7 +160,7 @@
 	       .        "shibonly) "
 	       . "VALUES "
 	       .        "('$newaffilname', "
-	       .        "'" . mysql_escape_string($affil) . "', "
+	       .        "'" . vcl_mysql_escape_string($affil) . "', "
 	       .        "1)";
 	doQuery($query, 101, 'vcl', 1);
 	unset($row);
@@ -210,12 +210,12 @@
                   'unscoped-affiliation' => $_SERVER['unscoped-affiliation'],
                   'affiliation' => $_SERVER['affiliation'],
 );
-$serdata = mysql_escape_string(serialize($shibdata));
+$serdata = vcl_mysql_escape_string(serialize($shibdata));
 $query = "SELECT id "
        . "FROM shibauth "
        . "WHERE sessid = '{$_SERVER['Shib-Session-ID']}'";
 $qh = doQuery($query, 101);
-if($row = mysql_fetch_assoc($qh)) {
+if($row = mysqli_fetch_assoc($qh)) {
 	$shibauthid = $row['id'];
 }
 else {
@@ -233,7 +233,7 @@
 	       .        "'$serdata')";
 	doQuery($query, 101);
 	$qh = doQuery("SELECT LAST_INSERT_ID() FROM shibauth", 101);
-	if(! $row = mysql_fetch_row($qh)) {
+	if(! $row = mysqli_fetch_row($qh)) {
 		# todo
 	}
 	$shibauthid = $row[0];
diff --git a/web/testsetup.php b/web/testsetup.php
index ba3e5ae..8f384d2 100644
--- a/web/testsetup.php
+++ b/web/testsetup.php
@@ -79,14 +79,18 @@
 
 $includesecrets = 1;
 $includeconf = 1;
+$host = $_SERVER['HTTP_HOST'];
+if (strpos($host, ':')) {
+	$host = substr($host, 0, strpos($host, ':'));
+}
 
-if(! ip2long(getHostbyname($_SERVER['HTTP_HOST']))) {
+if(! ip2long(getHostbyname($host))) {
 	print $header;
 	# php version
 	print "PHP version: " . phpversion() . "<br><br>\n";
-	title("Trying to resolve my hostname ({$_SERVER['HTTP_HOST']})");
+	title("Trying to resolve my hostname ($host)");
 	print "<ul>\n";
-	fail("unable to resolve my hostname; ensure {$_SERVER['HTTP_HOST']} is in DNS or create an entry for it in /etc/hosts");
+	fail("unable to resolve my hostname; ensure $host is in DNS or create an entry for it in /etc/hosts");
 	print "</ul>\n";
 	$includesecrets = 0;
 	$includeconf = 0;
@@ -160,8 +164,7 @@
 
 # conf.php tests
 $createcryptkey = 0;
-if($includeconf && include('.ht-inc/conf.php')) {
-	$host = $_SERVER['HTTP_HOST'];
+if($includeconf && include('.ht-inc/conf.php')) {	
 	if(! defined('COOKIEDOMAIN')) {
 		print $header;
 		# php version