diff --git a/src/tools/msvc/Install.pm b/src/tools/msvc/Install.pm
index d109b2c90..75c7446e6 100644
--- a/src/tools/msvc/Install.pm
+++ b/src/tools/msvc/Install.pm
@@ -89,10 +89,10 @@ sub Install
 	my $majorver = DetermineMajorVersion();
 	print "Installing version $majorver for $conf in $target\n";
 
-	my @client_dirs = ('bin', 'lib', 'share', 'symbols');
+	my @client_dirs = ('bin', 'lib', 'share', 'tools', 'share/libpq', 'tools/libpq');
 	my @all_dirs = (
-		@client_dirs, 'doc', 'doc/contrib', 'doc/extension', 'share/contrib',
-		'share/extension', 'share/timezonesets', 'share/tsearch_data');
+		@client_dirs, 'doc', 'doc/libpq', 'doc/libpq/contrib', 'doc/libpq/extension', 'share/libpq/contrib',
+		'share/libpq/extension', 'share/libpq/timezonesets', 'share/libpq/tsearch_data');
 	if ($insttype eq "client")
 	{
 		EnsureDirectories($target, @client_dirs);
@@ -117,7 +117,7 @@ sub Install
 			}
 		},
 		@top_dir);
-	CopySetOfFiles('config files', $sample_files, $target . '/share/');
+	CopySetOfFiles('config files', $sample_files, $target . '/share/libpq/');
 	CopyFiles(
 		'Import libraries',
 		$target . '/lib/',
@@ -131,35 +131,35 @@ sub Install
 		CopySetOfFiles(
 			'timezone names',
 			[ glob('src\timezone\tznames\*.txt') ],
-			$target . '/share/timezonesets/');
+			$target . '/share/libpq/timezonesets/');
 		CopyFiles(
 			'timezone sets',
-			$target . '/share/timezonesets/',
+			$target . '/share/libpq/timezonesets/',
 			'src/timezone/tznames/', 'Default', 'Australia', 'India');
 		CopySetOfFiles(
 			'BKI files',
 			[ glob("src\\backend\\catalog\\postgres.*") ],
-			$target . '/share/');
+			$target . '/share/libpq/');
 		CopySetOfFiles(
 			'SQL files',
 			[ glob("src\\backend\\catalog\\*.sql") ],
-			$target . '/share/');
+			$target . '/share/libpq/');
 		CopyFiles(
-			'Information schema data', $target . '/share/',
+			'Information schema data', $target . '/share/libpq/',
 			'src/backend/catalog/',    'sql_features.txt');
 		CopyFiles(
-			'Error code data',    $target . '/share/',
+			'Error code data',    $target . '/share/libpq/',
 			'src/backend/utils/', 'errcodes.txt');
 		GenerateTimezoneFiles($target, $conf);
 		GenerateTsearchFiles($target);
 		CopySetOfFiles(
 			'Stopword files',
 			[ glob("src\\backend\\snowball\\stopwords\\*.stop") ],
-			$target . '/share/tsearch_data/');
+			$target . '/share/libpq/tsearch_data/');
 		CopySetOfFiles(
 			'Dictionaries sample files',
 			[ glob("src\\backend\\tsearch\\dicts\\*_sample*") ],
-			$target . '/share/tsearch_data/');
+			$target . '/share/libpq/tsearch_data/');
 
 		my $pl_extension_files = [];
 		my @pldirs             = ('src/pl/plpgsql/src');
@@ -178,7 +178,7 @@ sub Install
 			},
 			@pldirs);
 		CopySetOfFiles('PL Extension files',
-			$pl_extension_files, $target . '/share/extension/');
+			$pl_extension_files, $target . '/share/libpq/extension/');
 	}
 
 	GenerateNLSFiles($target, $config->{nls}, $majorver) if ($config->{nls});
@@ -293,23 +293,26 @@ sub CopySolutionOutput
 		{
 			if ($1 == 1)
 			{
-				push(@{ $install_list{'bin'} }, "exe");
+				push(@{ $install_list{'tools\\libpq'} }, "exe");
 			}
 			elsif ($1 == 2)
 			{
-				push(@{ $install_list{'lib'} }, "dll");
+				push(@{ $install_list{'bin'} }, "dll");
 				if ($is_sharedlib)
 				{
 					push(@{ $install_list{'bin'} }, "dll");
 					push(@{ $install_list{'lib'} }, "lib");
 				}
+				else
+				{
+					push(@{ $install_list{'lib'} }, "lib");
+				}
 			}
 			else
 			{
-
+				push(@{ $install_list{'lib'} }, "lib");
 				# Static libraries, such as libpgport, only used internally
 				# during build, don't install.
-				next;
 			}
 		}
 		elsif ($vcproj eq 'vcxproj'
@@ -320,11 +320,11 @@ sub CopySolutionOutput
 		{
 			if ($1 eq 'Application')
 			{
-				push(@{ $install_list{'bin'} }, "exe");
+				push(@{ $install_list{'tools\\libpq'} }, "exe");
 			}
 			elsif ($1 eq 'DynamicLibrary')
 			{
-				push(@{ $install_list{'lib'} }, "dll");
+				push(@{ $install_list{'bin'} }, "dll");
 				if ($is_sharedlib)
 				{
 					push(@{ $install_list{'bin'} }, "dll");
@@ -333,10 +333,9 @@ sub CopySolutionOutput
 			}
 			else    # 'StaticLibrary'
 			{
-
+				push(@{ $install_list{'lib'} }, "lib");
 				# Static lib, such as libpgport, only used internally
 				# during build, don't install.
-				next;
 			}
 		}
 		else
@@ -352,7 +352,7 @@ sub CopySolutionOutput
 				  || croak "Could not copy $pf.$ext\n";
 			}
 		}
-		lcopy("$conf\\$pf\\$pf.pdb", "$target\\symbols\\$pf.pdb")
+		lcopy("$conf\\$pf\\$pf.pdb", "$target\\bin\\$pf.pdb")
 		  || croak "Could not copy $pf.pdb\n";
 		print ".";
 	}
@@ -374,5 +374,5 @@ sub GenerateTimezoneFiles
 	print "Generating timezone files...";
 
-	my @args = ("$conf/zic/zic", '-d', "$target/share/timezone");
+	my @args = ("$conf/zic/zic", '-d', "$target/share/libpq/timezone");
 	foreach (@tzfiles)
 	{
@@ -398,7 +398,7 @@ sub GenerateTsearchFiles
 	$mf =~ /^LANGUAGES\s*=\s*(.*)$/m
 	  || die "Could not find LANGUAGES line in snowball Makefile\n";
 	my @pieces = split /\s+/, $1;
-	open($F, '>', "$target/share/snowball_create.sql")
+	open($F, '>', "$target/share/libpq/snowball_create.sql")
 	  || die "Could not write snowball_create.sql";
 	print $F read_file('src/backend/snowball/snowball_func.sql.in');
 
@@ -483,7 +483,7 @@ sub CopySubdirFiles
 		foreach my $f (split /\s+/, $flist)
 		{
 			lcopy("$subdir/$module/$f.control",
-				"$target/share/extension/$f.control")
+				"$target/share/libpq/extension/$f.control")
 			  || croak("Could not copy file $f.control in contrib $module");
 			print '.';
 		}
@@ -501,7 +501,7 @@ sub CopySubdirFiles
 		foreach my $f (split /\s+/, $flist)
 		{
 			lcopy("$subdir/$module/$f",
-				"$target/share/$moduledir/" . basename($f))
+				"$target/share/libpq/$moduledir/" . basename($f))
 			  || croak("Could not copy file $f in contrib $module");
 			print '.';
 		}
@@ -516,7 +516,7 @@ sub CopySubdirFiles
 		foreach my $f (split /\s+/, $flist)
 		{
 			lcopy("$subdir/$module/$f",
-				"$target/share/tsearch_data/" . basename($f))
+				"$target/share/libpq/tsearch_data/" . basename($f))
 			  || croak("Could not copy file $f in $subdir $module");
 			print '.';
 		}
@@ -579,7 +579,7 @@ sub CopySubdirFiles
 		  if ($module eq 'spi');
 		foreach my $f (split /\s+/, $flist)
 		{
-			lcopy("$subdir/$module/$f", "$target/doc/$moduledir/$f")
+			lcopy("$subdir/$module/$f", "$target/doc/libpq/$moduledir/$f")
 			  || croak("Could not copy file $f in contrib $module");
 			print '.';
 		}
@@ -708,7 +708,7 @@ sub GenerateNLSFiles
 	my $majorver = shift;
 
 	print "Installing NLS files...";
-	EnsureDirectories($target, "share/locale");
+	EnsureDirectories($target, "share/libpq/locale");
 	my @flist;
 	File::Find::find(
 		{
@@ -730,12 +730,12 @@ sub GenerateNLSFiles
 			next unless /([^\/]+)\.po/;
 			$lang = $1;
 
-			EnsureDirectories($target, "share/locale/$lang",
-				"share/locale/$lang/LC_MESSAGES");
+			EnsureDirectories($target, "share/libpq/locale/$lang",
+				"share/libpq/locale/$lang/LC_MESSAGES");
 			my @args = (
 				"$nlspath\\bin\\msgfmt",
 				'-o',
-				"$target\\share\\locale\\$lang\\LC_MESSAGES\\$prgm-$majorver.mo",
+				"$target\\share\\libpq\\locale\\$lang\\LC_MESSAGES\\$prgm-$majorver.mo",
 				$_);
 			system(@args) && croak("Could not run msgfmt on $dir\\$_");
 			print ".";