diff --git a/src/tools/msvc/build.pl b/src/tools/msvc/build.pl
new file mode 100644
index 0000000000000000000000000000000000000000..534492b9eb01b549bc0da0786a17728adc5bc2e0
--- /dev/null
+++ b/src/tools/msvc/build.pl
@@ -0,0 +1,67 @@
+
+# -*-perl-*- hey - emacs - this is a perl file
+
+# $PostgreSQL: pgsql/src/tools/msvc/build.pl,v 1.1 2007/09/23 21:52:56 adunstan Exp $
+
+BEGIN
+{
+	
+	chdir("../../..") if  (-d "../msvc" && -d "../../../src");
+	
+}
+
+use lib "src/tools/msvc";
+
+use Cwd;
+
+use Mkvcbuild;
+
+# buildenv.pl is for specifying the build environment settings
+# it should contain lines like:
+# $ENV{PATH} = "c:/path/to/bison/bin;$ENV{PATH}";
+
+if ( -e "src/tools/msvc/buildenv.pl")
+{
+    require "src/tools/msvc/buildenv.pl";
+}
+elsif (-e "./buildenv.pl" )
+{
+    require "./buildenv.pl";
+}
+
+
+# set up the project
+our $config;
+require "config.pl";
+
+Mkvcbuild::mkvcbuild($config);
+
+# check what sort of build we are doing
+
+my $bconf = $ENV{CONFIG} || "Release";
+my $buildwhat = $ARGV[1] || "";
+if ($ARGV[0] eq 'DEBUG')
+{
+    $bconf = "Debug";
+}
+elsif ($ARGV[0] ne "RELEASE")
+{
+    $buildwhat = $ARGV[0] || "";
+}
+
+# ... and do it
+
+if ($buildwhat)
+{
+    system("vcbuild $buildwhat.vcproj $bconf");
+}
+else
+{
+    system("msbuild pgsql.sln /verbosity:detailed /p:Configuration=$bconf");
+}
+
+# report status
+
+$status = $? >> 8;
+
+exit $status;
diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
new file mode 100644
index 0000000000000000000000000000000000000000..1ab0973215fc96d0294bba9b74a0bdb03fec7da0
--- /dev/null
+++ b/src/tools/msvc/vcregress.pl
@@ -0,0 +1,266 @@
+
+# -*-perl-*- hey - emacs - this is a perl file
+
+# $PostgreSQL: pgsql/src/tools/msvc/vcregress.pl,v 1.1 2007/09/23 21:52:56 adunstan Exp $
+
+use strict;
+
+our $config;
+
+use Cwd;
+use File::Copy;
+
+my $startdir = getcwd();
+
+chdir "../../.." if (-d "../../../src/tools/msvc");
+
+# buildenv.pl is for specifying the build environment settings
+# it should contian lines like:
+# $ENV{PATH} = "c:/path/to/bison/bin;$ENV{PATH}";
+
+if ( -e "src/tools/msvc/buildenv.pl")
+{
+    require "src/tools/msvc/buildenv.pl";
+}
+
+my $what = shift || "";
+if ($what =~ /^(check|installcheck|plcheck|contribcheck|ecpgcheck)$/i)
+{
+    $what = uc $what;
+}
+else
+{
+    usage();
+}
+
+# use a capital C here because config.pl has $config
+my $Config = -e "release/postgres/postgres.exe" ? "Release" : "Debug";
+
+copy("$Config/refint/defint.dll","contrib/spi");
+copy("$Config/autoinc/autoinc.dll","contrib/spi");
+copy("$Config/regress/regress.dll","src/test/regress");
+
+$ENV{PATH} = "../../../$Config/libpq;../../$Config/libpq;$ENV{PATH}";
+
+my $schedule = shift;
+unless ($schedule)
+{
+	$schedule = "serial";
+	$schedule = "parallel" if ($what eq 'CHECK' || $what =~ /PARALLEL/);
+}
+
+my $temp_port;
+if (-e "src/tools/msvc/config.pl")
+{
+    eval{
+        require "src/tools/msvc/config.pl";
+        $temp_port = $config->{'--with-pgport'};
+      }
+}
+$temp_port ||= 55432;
+
+my $topdir = getcwd();
+
+$ENV{PERL5LIB} = "$topdir/src/tools/msvc";
+
+my $maxconn = "";
+$maxconn = "--max_connections=$ENV{MAX_CONNECTIONS}"
+  if $ENV{MAX_CONNECTIONS};
+
+my $temp_config = "";
+$temp_config = "--temp-config=\"$ENV{TEMP_CONFIG}\""
+	if $ENV{TEMP_CONFIG};
+
+chdir "src/test/regress";
+
+my %command = (
+    CHECK => \&check,
+    PLCHECK => \&plcheck,
+    INSTALLCHECK => \&installcheck,
+    ECPGCHECK => \&ecpgcheck,
+    CONTRIBCHECK => \&contribcheck
+);
+
+my $proc = $command{$what};
+
+exit 3 unless $proc;
+
+&$proc();
+
+exit 0;
+
+########################################################################
+
+sub installcheck
+{
+    my @args = (
+        "../../../$Config/pg_regress/pg_regress",
+        "--psqldir=../../../$Config/psql",
+        "--schedule=${schedule}_schedule",
+        "--multibyte=SQL_ASCII",
+        "--load-language=plpgsql",
+        "--no-locale"
+    );
+    push(@args,$maxconn) if $maxconn;
+    system(@args);
+    my $status = $? >>8;
+    exit $status if $status;
+}
+
+sub check
+{
+    my @args = (
+        "../../../$Config/pg_regress/pg_regress",
+        "--psqldir=../../../$Config/psql",
+        "--schedule=${schedule}_schedule",
+        "--multibyte=SQL_ASCII",
+        "--load-language=plpgsql",
+        "--no-locale",
+        "--temp-install=./tmp_check",
+        "--top-builddir=\"$topdir\"",
+        "--temp-port=$temp_port"
+    );
+    push(@args,$maxconn) if $maxconn;
+	push(@args,$temp_config) if $temp_config;
+    system(@args);
+    my $status = $? >>8;
+    exit $status if $status;
+}
+
+sub ecpgcheck
+{
+    chdir $startdir;
+    system("msbuild ecpg_regression.proj /p:config=$Config");
+    my $status = $? >>8;
+    exit $status if $status;
+    chdir "$topdir/src/interfaces/ecpg/test";
+    $schedule="ecpg";
+    my @args = (
+        "../../../../$Config/pg_regress_ecpg/pg_regress_ecpg",
+        "--psqldir=../../../$Config/psql",
+        "--dbname=regress1,connectdb",
+        "--createrole=connectuser,connectdb",
+        "--schedule=${schedule}_schedule",
+        "--multibyte=SQL_ASCII",
+        "--load-language=plpgsql",
+        "--no-locale",
+        "--temp-install=./tmp_chk",
+        "--top-builddir=\"$topdir\"",
+        "--temp-port=$temp_port"
+    );
+    push(@args,$maxconn) if $maxconn;
+    system(@args);
+    $status = $? >>8;
+    exit $status if $status;
+}
+
+sub plcheck
+{
+    chdir "../../pl";
+
+    foreach my $pl (glob("*"))
+    {
+        next unless -d "$pl/sql" && -d "$pl/expected";
+        my $lang = $pl eq 'tcl' ? 'pltcl' : $pl;
+        next unless -d "../../$Config/$lang";
+        $lang = 'plpythonu' if $lang eq 'plpython';
+        chdir $pl;
+		print "============================================================\n";
+        print "Checking $lang\n";
+        my @tests = fetchTests();
+        my @args = (
+            "../../../$Config/pg_regress/pg_regress",
+            "--psqldir=../../../$Config/psql",
+            "--dbname=pl_regression","--load-language=$lang",@tests
+        );
+        system(@args);
+        my $status = $? >> 8;
+        exit $status if $status;
+        chdir "..";
+    }
+
+    chdir "../../..";
+}
+
+sub contribcheck
+{
+    chdir "../../../contrib";
+    my $mstat = 0;
+    foreach my $module (glob("*"))
+    {
+        next unless -d "$module/sql" && -d "$module/expected" && -f "Makefile";
+        chdir $module;
+		print "============================================================\n";
+        print "Checking $module\n";
+        my @tests = fetchTests();
+        my @args = (
+            "../../$Config/pg_regress/pg_regress",
+            "--psqldir=../../$Config/psql",
+            "--dbname=contrib_regression",@tests
+        );
+        system(@args);
+        my $status = $? >> 8;
+        $mstat ||= $status;
+        chdir "..";
+    }
+    exit $mstat if $mstat;
+}
+
+sub fetchTests
+{
+
+    my $handle;
+    open($handle,"<Makefile")
+      || open($handle,"<GNUMakefile")
+      || die "Could not open Makefile";
+    local($/) = undef;
+    my $m = <$handle>;
+    close($handle);
+    my $t = "";
+
+    $m =~ s/\\[\r\n]*//gs;
+    if ($m =~ /^REGRESS\s*=\s*(.*)$/gm)
+    {
+        $t = $1;
+        $t =~ s/\s+/ /g;
+
+        if ($m =~ /contrib\/pgcrypto/)
+        {
+
+            # pgcrypto is special since the tests depend on the
+            # configuration of the build
+
+            my $cftests =
+              $config->{openssl}
+              ?GetTests("OSSL_TESTS",$m)
+              : GetTests("INT_TESTS",$m);
+            my $pgptests =
+              $config->{zlib}
+              ?GetTests("ZLIB_TST",$m)
+              : GetTests("ZLIB_OFF_TST",$m);
+            $t =~ s/\$\(CF_TESTS\)/$cftests/;
+            $t =~ s/\$\(CF_PGP_TESTS\)/$pgptests/;
+        }
+    }
+
+    return split(/\s+/,$t);
+}
+
+sub GetTests
+{
+    my $testname = shift;
+    my $m = shift;
+    if ($m =~ /^$testname\s*=\s*(.*)$/gm)
+    {
+        return $1;
+    }
+    return "";
+}
+
+sub usage
+{
+    print STDERR
+		"Usage: vcregress.pl ",
+		"<check|installcheck|plcheck|contribcheck|ecpgcheck> [schedule]\n" ;
+	exit(1);
+}