diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml
index f3b1a12b05f429e325e11a43c2bac1a5dcc4606d..28933b6cf55a65400a2ce34ef344fb348fde220f 100644
--- a/doc/src/sgml/install-windows.sgml
+++ b/doc/src/sgml/install-windows.sgml
@@ -19,12 +19,12 @@
  <para>
   There are several different ways of building PostgreSQL on
   <productname>Windows</productname>. The simplest way to build with
-  Microsoft tools is to install <productname>Visual Studio Express 2012
+  Microsoft tools is to install <productname>Visual Studio Express 2013
   for Windows Desktop</productname> and use the included
   compiler. It is also possible to build with the full
-  <productname>Microsoft Visual C++ 2005, 2008 or 2010</productname>. In some cases
-  that requires the installation of the <productname>Windows SDK</productname>
-  in addition to the compiler.
+  <productname>Microsoft Visual C++ 2005 to 2013</productname>.
+  In some cases that requires the installation of the
+  <productname>Windows SDK</productname> in addition to the compiler.
  </para>
 
  <para>
@@ -77,15 +77,15 @@
   <productname>Visual Studio Express</productname> or some versions of the
   <productname>Microsoft Windows SDK</productname>. If you do not already have a
   <productname>Visual Studio</productname> environment set up, the easiest
-  ways are to use the compilers in the <productname>Windows SDK 7.1</productname>
-  or those from <productname>Visual Studio Express 2012 for Windows
-  Desktop</productname>, which are both free downloads from Microsoft.
+  ways are to use the compilers from <productname>Visual Studio Express 2013
+  for Windows Desktop</productname> or those in the <productname>Windows SDK
+  7.1</productname>, which are both free downloads from Microsoft.
  </para>
 
  <para>
   PostgreSQL is known to support compilation using the compilers shipped with
   <productname>Visual Studio 2005</productname> to
-  <productname>Visual Studio 2012</productname> (including Express editions),
+  <productname>Visual Studio 2013</productname> (including Express editions),
   as well as standalone Windows SDK releases 6.0 to 7.1.
   64-bit PostgreSQL builds are only supported with
   <productname>Microsoft Windows SDK</productname> version 6.0a to 7.1 or
diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c
index e2a0812d194cf2ef3b2eac53f66da786500090c7..774267ed5d25fd77f8716c630c53eeecba8342f2 100644
--- a/src/backend/utils/adt/float.c
+++ b/src/backend/utils/adt/float.c
@@ -111,6 +111,14 @@ get_float8_infinity(void)
 #endif
 }
 
+/*
+* The funny placements of the two #pragmas is necessary because of a
+* long lived bug in the Microsoft compilers.
+* See http://support.microsoft.com/kb/120968/en-us for details
+*/
+#if (_MSC_VER >= 1800)
+#pragma warning(disable:4756)
+#endif
 float
 get_float4_infinity(void)
 {
@@ -118,6 +126,9 @@ get_float4_infinity(void)
 	/* C99 standard way */
 	return (float) INFINITY;
 #else
+#if (_MSC_VER >= 1800)
+#pragma warning(default:4756)
+#endif
 
 	/*
 	 * On some platforms, HUGE_VAL is an infinity, elsewhere it's just the
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index 74b23a4ab56f275dc9ce5245cf3bcdfe4bbff429..8a4a9193bf8ee5ace432d34fdf97ee57be50a483 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -135,6 +135,12 @@ static void print_msg(const char *msg);
 static void adjust_data_dir(void);
 
 #if defined(WIN32) || defined(__CYGWIN__)
+#if (_MSC_VER >= 1800)
+#include <versionhelpers.h>
+#else
+static bool IsWindowsXPOrGreater(void);
+static bool IsWindows7OrGreater(void);
+#endif
 static bool pgwin32_IsInstalled(SC_HANDLE);
 static char *pgwin32_CommandLine(bool);
 static void pgwin32_doRegister(void);
@@ -1226,6 +1232,29 @@ do_kill(pgpid_t pid)
 
 #if defined(WIN32) || defined(__CYGWIN__)
 
+#if (_MSC_VER < 1800)
+static bool
+IsWindowsXPOrGreater(void)
+{
+	OSVERSIONINFO osv;
+	osv.dwOSVersionInfoSize = sizeof(osv);
+
+	 /* Windows XP = Version 5.1 */
+	return (!GetVersionEx(&osv) || /* could not get version */
+			osv.dwMajorVersion > 5 || (osv.dwMajorVersion == 5 && osv.dwMinorVersion >= 1));
+}
+
+static bool IsWindows7OrGreater(void)
+{
+	OSVERSIONINFO osv;
+	osv.dwOSVersionInfoSize = sizeof(osv);
+
+	 /* Windows 7 = Version 6.0 */
+	return (!GetVersionEx(&osv) || /* could not get version */
+			osv.dwMajorVersion > 6 || (osv.dwMajorVersion == 6 && osv.dwMinorVersion >= 0));
+}
+#endif
+
 static bool
 pgwin32_IsInstalled(SC_HANDLE hSCM)
 {
@@ -1655,12 +1684,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_ser
 		 * IsProcessInJob() is not available on < WinXP, so there is no need
 		 * to log the error every time in that case
 		 */
-		OSVERSIONINFO osv;
-
-		osv.dwOSVersionInfoSize = sizeof(osv);
-		if (!GetVersionEx(&osv) ||		/* could not get version */
-			(osv.dwMajorVersion == 5 && osv.dwMinorVersion > 0) ||		/* 5.1=xp, 5.2=2003, etc */
-			osv.dwMajorVersion > 5)		/* anything newer should have the API */
+		if (IsWindowsXPOrGreater())
 
 			/*
 			 * Log error if we can't get version, or if we're on WinXP/2003 or
@@ -1692,7 +1716,6 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_ser
 					JOBOBJECT_BASIC_LIMIT_INFORMATION basicLimit;
 					JOBOBJECT_BASIC_UI_RESTRICTIONS uiRestrictions;
 					JOBOBJECT_SECURITY_LIMIT_INFORMATION securityLimit;
-					OSVERSIONINFO osv;
 
 					ZeroMemory(&basicLimit, sizeof(basicLimit));
 					ZeroMemory(&uiRestrictions, sizeof(uiRestrictions));
@@ -1708,10 +1731,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_ser
 
 					if (as_service)
 					{
-						osv.dwOSVersionInfoSize = sizeof(osv);
-						if (!GetVersionEx(&osv) ||
-							osv.dwMajorVersion < 6 ||
-						(osv.dwMajorVersion == 6 && osv.dwMinorVersion == 0))
+						if (!IsWindows7OrGreater())
 						{
 							/*
 							 * On Windows 7 (and presumably later),
diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32
index 19ef4c1a9fb2e7967797f0882d4784433d7bbf00..006b999a1a0059668aa0d0bbcd9c2ae461919488 100644
--- a/src/include/pg_config.h.win32
+++ b/src/include/pg_config.h.win32
@@ -295,7 +295,10 @@
 /* #undef HAVE_READLINK */
 
 /* Define to 1 if you have the `rint' function. */
-/*#define HAVE_RINT 1*/
+#if (_MSC_VER >= 1800)
+#define HAVE_RINT 1
+#endif
+
 
 /* Define to 1 if you have the global variable
    'rl_completion_append_character'. */
diff --git a/src/include/port/win32.h b/src/include/port/win32.h
index 2c2d93765ee3bffdc7d5e3527be29e1c4a882fd1..974807f5841056ed03ce38ff13dfc3daca6c3ff0 100644
--- a/src/include/port/win32.h
+++ b/src/include/port/win32.h
@@ -427,8 +427,10 @@ typedef unsigned short mode_t;
 #define W_OK 2
 #define R_OK 4
 
+#if (_MSC_VER < 1800)
 #define isinf(x) ((_fpclass(x) == _FPCLASS_PINF) || (_fpclass(x) == _FPCLASS_NINF))
 #define isnan(x) _isnan(x)
+#endif
 
 /* Pulled from Makefile.port in mingw */
 #define DLSUFFIX ".dll"
diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm
index 217c47ab78a1e73aaf27371e2e707f2f5a65e5a5..82337c81744453c095b4ed36ddd2ed947b023bf0 100644
--- a/src/tools/msvc/MSBuildProject.pm
+++ b/src/tools/msvc/MSBuildProject.pm
@@ -18,6 +18,7 @@ sub _new
 	bless($self, $classname);
 
 	$self->{filenameExtension} = '.vcxproj';
+	$self->{ToolsVersion} = '4.0';
 
 	return $self;
 }
@@ -28,7 +29,7 @@ sub WriteHeader
 
 	print $f <<EOF;
 <?xml version="1.0" encoding="Windows-1252"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<Project DefaultTargets="Build" ToolsVersion="$self->{ToolsVersion}" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup Label="ProjectConfigurations">
 EOF
 	$self->WriteConfigurationHeader($f, 'Debug');
@@ -414,6 +415,7 @@ sub new
 	bless($self, $classname);
 
 	$self->{vcver} = '11.00';
+	$self->{PlatformToolset} = 'v110';
 
 	return $self;
 }
@@ -434,9 +436,32 @@ sub WriteConfigurationPropertyGroup
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>$p->{wholeopt}</WholeProgramOptimization>
-    <PlatformToolset>v110</PlatformToolset>
+    <PlatformToolset>$self->{PlatformToolset}</PlatformToolset>
   </PropertyGroup>
 EOF
 }
 
+package VC2013Project;
+
+#
+# Package that encapsulates a Visual C++ 2013 project file
+#
+
+use strict;
+use warnings;
+use base qw(VC2012Project);
+
+sub new
+{
+	my $classname = shift;
+	my $self      = $classname->SUPER::_new(@_);
+	bless($self, $classname);
+
+	$self->{vcver} = '12.00';
+	$self->{PlatformToolset} = 'v120';
+	$self->{ToolsVersion} = '12.0';
+
+	return $self;
+}
+
 1;
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index a8324ff7b20ff2f96a47c9c057e5c9d2df7401d8..308a4b47b998f1416c270afa843fa1568ab86bff 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -70,9 +70,11 @@ sub mkvcbuild
 	  erand48.c snprintf.c strlcat.c strlcpy.c dirmod.c noblock.c path.c
 	  pgcheckdir.c pg_crc.c pgmkdirp.c pgsleep.c pgstrcasecmp.c pqsignal.c
 	  qsort.c qsort_arg.c quotes.c
-	  sprompt.c tar.c thread.c getopt.c getopt_long.c dirent.c rint.c
+	  sprompt.c tar.c thread.c getopt.c getopt_long.c dirent.c
 	  win32env.c win32error.c win32setlocale.c);
 
+	push(@pgportfiles, 'rint.c') if ($vsVersion < '12.00');
+
 	our @pgcommonallfiles = qw(
 	  exec.c pgfnames.c psprintf.c relpath.c rmtree.c username.c wait_error.c);
 
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 3a173a6a0201385fc8b1b6d2cfb13991912294ab..95c6bcbc1bd5e43ec3c5aea0d0226584c736299c 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -19,6 +19,8 @@ sub _new
 		options  => $options,
 		numver   => '',
 		strver   => '',
+		VisualStudioVersion => undef,
+		MinimumVisualStudioVersion => undef,
 		vcver    => undef,
 		platform => undef, };
 	bless($self, $classname);
@@ -59,6 +61,11 @@ sub _new
 	return $self;
 }
 
+sub GetAdditionalHeaders
+{
+	return '';
+}
+
 sub DeterminePlatform
 {
 	my $self = shift;
@@ -541,6 +548,8 @@ Microsoft Visual Studio Solution File, Format Version $self->{solutionFileVersio
 # $self->{visualStudioName}
 EOF
 
+	print SLN $self->GetAdditionalHeaders();
+
 	foreach my $fld (keys %{ $self->{projects} })
 	{
 		foreach my $proj (@{ $self->{projects}->{$fld} })
@@ -723,4 +732,39 @@ sub new
 	return $self;
 }
 
+package VS2013Solution;
+
+#
+# Package that encapsulates a Visual Studio 2013 solution file
+#
+
+use Carp;
+use strict;
+use warnings;
+use base qw(Solution);
+
+sub new
+{
+	my $classname = shift;
+	my $self      = $classname->SUPER::_new(@_);
+	bless($self, $classname);
+
+	$self->{solutionFileVersion}        = '12.00';
+	$self->{vcver}                      = '12.00';
+	$self->{visualStudioName}           = 'Visual Studio 2013';
+	$self->{VisualStudioVersion}        = '12.0.21005.1',
+	$self->{MinimumVisualStudioVersion} = '10.0.40219.1',
+
+	return $self;
+}
+
+sub GetAdditionalHeaders
+{
+	my ($self, $f) = @_;
+
+	return qq|VisualStudioVersion = $self->{VisualStudioVersion}
+MinimumVisualStudioVersion = $self->{MinimumVisualStudioVersion}
+|;
+}
+
 1;
diff --git a/src/tools/msvc/VSObjectFactory.pm b/src/tools/msvc/VSObjectFactory.pm
index 0fbf3faa0eddc7dce5d70d58f42fc5e7bc7b479d..d255becfe8b9751cd0ebe99b990e0cd6a2b9fe38 100644
--- a/src/tools/msvc/VSObjectFactory.pm
+++ b/src/tools/msvc/VSObjectFactory.pm
@@ -45,6 +45,10 @@ sub CreateSolution
 	{
 		return new VS2012Solution(@_);
 	}
+	elsif ($visualStudioVersion eq '12.00')
+	{
+		return new VS2013Solution(@_);
+	}
 	else
 	{
 		croak "The requested Visual Studio version is not supported.";
@@ -76,6 +80,10 @@ sub CreateProject
 	{
 		return new VC2012Project(@_);
 	}
+	elsif ($visualStudioVersion eq '12.00')
+	{
+		return new VC2013Project(@_);
+	}
 	else
 	{
 		croak "The requested Visual Studio version is not supported.";
@@ -115,11 +123,11 @@ sub DetermineVisualStudioVersion
 sub _GetVisualStudioVersion
 {
 	my ($major, $minor) = @_;
-	if ($major > 11)
+	if ($major > 12)
 	{
 		carp
 "The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead.";
-		return '11.00';
+		return '12.00';
 	}
 	elsif ($major < 6)
 	{