diff -rpcd a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml
*** a/doc/src/sgml/install-windows.sgml	2014-01-22 13:17:06.000000000 +0900
--- b/doc/src/sgml/install-windows.sgml	2014-01-24 15:31:05.000000000 +0900
*************** $ENV{CONFIG}="Debug";
*** 410,415 ****
--- 410,423 ----
  <userinput>install c:\destination\directory</userinput>
  </screen>
    </para>
+ 
+   <para>
+    If you want to install only the client applications and
+    interface libraries, then you can use these commands:
+ <screen>
+ <userinput>install c:\destination\directory client</userinput>
+ </screen>
+   </para>
   </sect2>
  
   <sect2>
diff -rpcd a/src/tools/msvc/Install.pm b/src/tools/msvc/Install.pm
*** a/src/tools/msvc/Install.pm	2014-01-22 13:17:06.000000000 +0900
--- b/src/tools/msvc/Install.pm	2014-01-24 15:10:36.000000000 +0900
*************** our (@ISA, @EXPORT_OK);
*** 17,22 ****
--- 17,35 ----
  @ISA       = qw(Exporter);
  @EXPORT_OK = qw(Install);
  
+ my $insttype;
+ my @client_contribs = (
+ 	'oid2name', 'pgbench', 'vacuumlo'
+ );
+ my @client_program_files = (
+ 	'clusterdb', 'createdb', 'createlang', 'createuser', 'dropdb',
+ 	'droplang', 'dropuser', 'ecpg', 'libecpg', 'libecpg_compat',
+ 	'libpgtypes', 'libpq', 'pg_basebackup', 'pg_config', 'pg_dump',
+ 	'pg_dumpall', 'pg_isready', 'pg_receivexlog', 'pg_restore',
+ 	'psql', 'reindexdb', 'vacuumdb',
+ 	@client_contribs
+ );
+ 
  sub lcopy
  {
  	my $src    = shift;
*************** sub Install
*** 37,42 ****
--- 50,57 ----
  	$| = 1;
  
  	my $target = shift;
+ 	$insttype = shift;
+ 	$insttype = "all" unless ($insttype);
  
  	# if called from vcregress, the config will be passed to us
  	# so no need to re-include these
*************** sub Install
*** 65,88 ****
  	my $majorver = DetermineMajorVersion();
  	print "Installing version $majorver for $conf in $target\n";
  
! 	EnsureDirectories(
! 		$target,              'bin',
! 		'lib',                'share',
! 		'share/timezonesets', 'share/extension',
! 		'share/contrib',      'doc',
! 		'doc/extension',      'doc/contrib',
! 		'symbols',            'share/tsearch_data');
  
  	CopySolutionOutput($conf, $target);
  	lcopy($target . '/lib/libpq.dll', $target . '/bin/libpq.dll');
  	my $sample_files = [];
  	File::Find::find(
  		{   wanted => sub {
  				/^.*\.sample\z/s
  				  && push(@$sample_files, $File::Find::name);
  			  }
  		},
! 		"src");
  	CopySetOfFiles('config files', $sample_files, $target . '/share/');
  	CopyFiles(
  		'Import libraries',
--- 80,112 ----
  	my $majorver = DetermineMajorVersion();
  	print "Installing version $majorver for $conf in $target\n";
  
! 	my @client_dirs = ('bin', 'lib', 'share', 'symbols');
! 	my @all_dirs = (@client_dirs,
! 		'doc', 'doc/contrib', 'doc/extension',
! 		'share/contrib', 'share/extension', 'share/timezonesets',
! 		'share/tsearch_data'
! 	);
! 	if ($insttype eq "client")
! 	{
! 		EnsureDirectories($target, @client_dirs);
! 	}
! 	else
! 	{
! 		EnsureDirectories($target, @all_dirs);
! 	}
  
  	CopySolutionOutput($conf, $target);
  	lcopy($target . '/lib/libpq.dll', $target . '/bin/libpq.dll');
  	my $sample_files = [];
+ 	my @top_dir = ("src");
+ 	@top_dir = ("src\\bin", "src\\interfaces") if ($insttype eq "client");
  	File::Find::find(
  		{   wanted => sub {
  				/^.*\.sample\z/s
  				  && push(@$sample_files, $File::Find::name);
  			  }
  		},
! 		@top_dir);
  	CopySetOfFiles('config files', $sample_files, $target . '/share/');
  	CopyFiles(
  		'Import libraries',
*************** sub Install
*** 95,100 ****
--- 119,129 ----
  		"libpgport\\libpgport.lib",
  		"libpgtypes\\libpgtypes.lib",
  		"libecpg_compat\\libecpg_compat.lib");
+ 	CopyContribFiles($config, $target);
+ 	CopyIncludeFiles($target);
+ 
+ 	if ($insttype ne "client")
+ 	{
  	CopySetOfFiles(
  		'timezone names',
  		[ glob('src\timezone\tznames\*.txt') ],
*************** sub Install
*** 125,132 ****
  		'Dictionaries sample files',
  		[ glob("src\\backend\\tsearch\\*_sample.*") ],
  		$target . '/share/tsearch_data/');
- 	CopyContribFiles($config, $target);
- 	CopyIncludeFiles($target);
  
  	my $pl_extension_files = [];
  	my @pldirs             = ('src/pl/plpgsql/src');
--- 154,159 ----
*************** sub Install
*** 142,147 ****
--- 169,175 ----
  		@pldirs);
  	CopySetOfFiles('PL Extension files',
  		$pl_extension_files, $target . '/share/extension/');
+ 	}
  
  	GenerateNLSFiles($target, $config->{nls}, $majorver) if ($config->{nls});
  
*************** sub CopySolutionOutput
*** 218,223 ****
--- 246,253 ----
  
  		$sln =~ s/$rem//;
  
+ 		next if ($insttype eq "client" && !grep { $_ eq $pf } @client_program_files);
+ 
  		my $proj = read_file("$pf.$vcproj")
  		  || croak "Could not open $pf.$vcproj\n";
  		if ($vcproj eq 'vcproj' && $proj =~ qr{ConfigurationType="([^"]+)"})
*************** sub CopyContribFiles
*** 378,383 ****
--- 408,415 ----
  	{
  		next if ($d =~ /^\./);
  		next unless (-f "contrib/$d/Makefile");
+ 		next if ($insttype eq "client" && !grep { $_ eq $d } @client_contribs);
+ 
  		next if ($d eq "uuid-ossp" && !defined($config->{uuid}));
  		next if ($d eq "sslinfo"   && !defined($config->{openssl}));
  		next if ($d eq "xml2"      && !defined($config->{xml}));
diff -rpcd a/src/tools/msvc/install.bat b/src/tools/msvc/install.bat
*** a/src/tools/msvc/install.bat	2014-01-22 13:17:06.000000000 +0900
--- b/src/tools/msvc/install.bat	2014-01-24 15:08:47.000000000 +0900
*************** CALL bldenv.bat
*** 20,26 ****
  del bldenv.bat
  :nobuildenv
  
! perl install.pl "%1"
  
  REM exit fix for pre-2003 shell especially if used on buildfarm
  if "%XP_EXIT_FIX%" == "yes" exit %ERRORLEVEL%
--- 20,26 ----
  del bldenv.bat
  :nobuildenv
  
! perl install.pl "%1" %2
  
  REM exit fix for pre-2003 shell especially if used on buildfarm
  if "%XP_EXIT_FIX%" == "yes" exit %ERRORLEVEL%
diff -rpcd a/src/tools/msvc/install.pl b/src/tools/msvc/install.pl
*** a/src/tools/msvc/install.pl	2014-01-22 13:17:06.000000000 +0900
--- b/src/tools/msvc/install.pl	2014-01-24 15:20:23.000000000 +0900
*************** use warnings;
*** 9,18 ****
  use Install qw(Install);
  
  my $target = shift || Usage();
! Install($target);
  
  sub Usage
  {
! 	print "Usage: install.pl <targetdir>\n";
  	exit(1);
  }
--- 9,20 ----
  use Install qw(Install);
  
  my $target = shift || Usage();
! my $insttype = shift;
! Install($target, $insttype);
  
  sub Usage
  {
! 	print "Usage: install.pl <targetdir> [installtype]\n";
! 	print "installtype: client\n";
  	exit(1);
  }
diff -rpcd a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
*** a/src/tools/msvc/vcregress.pl	2014-01-22 13:17:06.000000000 +0900
--- b/src/tools/msvc/vcregress.pl	2014-01-24 15:08:47.000000000 +0900
*************** sub upgradecheck
*** 252,258 ****
  	(mkdir $tmp_root || die $!) unless -d $tmp_root;
  	my $tmp_install = "$tmp_root/install";
  	print "Setting up temp install\n\n";
! 	Install($tmp_install, $config);
  
  	# Install does a chdir, so change back after that
  	chdir $cwd;
--- 252,258 ----
  	(mkdir $tmp_root || die $!) unless -d $tmp_root;
  	my $tmp_install = "$tmp_root/install";
  	print "Setting up temp install\n\n";
! 	Install($tmp_install, "all", $config);
  
  	# Install does a chdir, so change back after that
  	chdir $cwd;
