diff --git a/tools/winapi_check/modules.dat b/tools/winapi_check/modules.dat
index d130c95d5ca65a3f1052c28cf4d599513fe182cd..fc5678178f926241cdd13bfc5266221d6415124d 100644
--- a/tools/winapi_check/modules.dat
+++ b/tools/winapi_check/modules.dat
@@ -26,8 +26,6 @@ dlls/commdlg
 
 % dlls/crtdll/crtdll.spec
 
-dlls/crtdll
-
 % dlls/dciman32/dciman32.spec
 
 dlls/dciman32
@@ -85,8 +83,6 @@ dlls/imagehlp
 
 % dlls/imm32/imm.spec
 
-dlls/imm32
-
 % dlls/imm32/imm32.spec
 
 dlls/imm32
@@ -118,6 +114,10 @@ ole
 scheduler
 win32
 
+% dlls/msvcrt/msvcrt.spec
+
+dlls/msvcrt
+
 % dlls/kernel/stress.spec
 
 dlls/kernel
@@ -292,6 +292,10 @@ dlls/shell32
 
 dlls/shell32
 
+% dlls/shdocvw/shdocvw.spec
+
+dlls/shdocvw
+
 % dlls/shfolder/shfolder.spec
 
 % dlls/shlwapi/shlwapi.spec
@@ -376,6 +380,10 @@ dlls/winaspi
 
 dlls/winaspi
 
+% dlls/winedos/winedos.spec
+
+dlls/winedos
+
 % dlls/wineps/wineps.spec
 
 % dlls/wineps/wineps16.spec
@@ -436,12 +444,8 @@ dlls/winmm
 
 % dlls/winnls/winnls.spec
 
-dlls/winnls
-
 % dlls/winnls/winnls32.spec
 
-dlls/winnls
-
 % dlls/winsock/winsock.spec
 
 dlls/winsock
diff --git a/tools/winapi_check/win16/msacm.api b/tools/winapi_check/win16/msacm.api
index 9b79f940e2552fce17155b98988dcbb7be700a06..921c5aeb7300423a0a19c4ba2d710fd1721293cf 100644
--- a/tools/winapi_check/win16/msacm.api
+++ b/tools/winapi_check/win16/msacm.api
@@ -1,5 +1,6 @@
 %long
 
+BOOL
 DWORD
 LPARAM
 LRESULT
@@ -39,3 +40,4 @@ HACMSTREAM16
 HINSTANCE16
 MMRESULT16
 UINT16
+WORD
diff --git a/tools/winapi_check/win32/crtdll.api b/tools/winapi_check/win32/crtdll.api
index 37fff8c5f8ebb38830c53b874843b54c6bef714f..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/tools/winapi_check/win32/crtdll.api
+++ b/tools/winapi_check/win32/crtdll.api
@@ -1,92 +0,0 @@
-%double
-
-double
-
-%long
-
-BOOL
-CHAR
-DWORD
-HANDLE
-INT
-USHORT
-LONG
-ULONG
-UINT
-WCHAR
-UCHAR
-clock_t
-size_t
-time_t
-
-%long # --forbidden
-
-int
-unsigned int
-unsigned long
-
-%longlong
- 
-LONGLONG
-ULONGLONG
-
-%ptr
-
-CHAR *
-CRTDLL_FILE *
-LPCVOID
-LPDWORD
-LPDWORD *
-LPINT
-LPUINT
-LPSTR *
-LPSTR **
-LPCSTR *
-LPVOID
-PCONTEXT
-PEXCEPTION_FRAME
-PEXCEPTION_FRAME *
-PEXCEPTION_RECORD
-VOID *
-WCHAR *
-_INITTERMFUN *
-char *
-jmp_buf
-find_t *
-struct _stat *
-struct _timeb *
-time_t *
-struct _heapinfo *
-struct _utimbuf *
-struct _exception *
-CRTDLL_fpos_t *
-diskfree_t *
-unsigned char *
-va_list
-void *
-
-%str
-
-LPSTR
-LPCSTR
-
-%void
-
-void
-VOID
-
-%wstr
-
-LPCWSTR
-LPWSTR
-
-%unknown
-
-new_handler_type
-sig_handler_type
-comp_func
-struct complex
-atexit_function
-div_t
-ldiv_t
-
diff --git a/tools/winapi_check/win32/msvcrt.api b/tools/winapi_check/win32/msvcrt.api
new file mode 100644
index 0000000000000000000000000000000000000000..ffbf28c0b2ee209d634a8dfad671786a6e2f9844
--- /dev/null
+++ b/tools/winapi_check/win32/msvcrt.api
@@ -0,0 +1,96 @@
+%double
+
+double
+
+%long
+
+DWORD
+HANDLE
+INT
+LONG
+MSVCRT_complex
+ULONG
+WCHAR
+clock_t
+int
+long
+unsigned int
+unsigned long
+size_t
+time_t
+
+%longlong
+
+LONGLONG
+ULONGLONG
+
+%ptr
+
+CHAR *
+DWORD *
+LPCVOID
+LPDWORD *
+LPINT
+LPTHREAD_START_ROUTINE
+LPVOID
+MSVCRT__INITTERMFUN *
+MSVCRT_EXCEPTION_FRAME *
+MSVCRT_FILE *
+MSVCRT_HEAPINFO *
+MSVCRT_atexit_func
+MSVCRT_atexit_func **
+MSVCRT_comp_func
+MSVCRT_diskfree_t *
+MSVCRT_finddata_t *
+MSVCRT_fpos_t *
+MSVCRT_matherr_func
+MSVCRT_new_handler_func
+MSVCRT_sig_handler_func
+MSVCRT_timeb *
+MSVCRT_wfinddata_t *
+PCONTEXT
+PEXCEPTION_FRAME
+PEXCEPTION_FRAME *
+PEXCEPTION_POINTERS
+PEXCEPTION_RECORD
+WCHAR *
+WCHAR **
+WCHAR ***
+WORD **
+__non_rtti_object *
+bad_cast *
+bad_typeid *
+char *
+char **
+char ***
+exception *
+int *
+jmp_buf
+struct _stat *
+struct _utimbuf *
+time_t *
+type_info *
+unsigned char *
+unsigned int *
+va_list
+void *
+
+%str
+
+LPSTR
+LPCSTR
+
+%unknown
+
+div_t
+ldiv_t
+
+%void
+
+void
+VOID
+
+%wstr
+
+LPCWSTR
+LPWSTR
diff --git a/tools/winapi_check/win32/oleaut32.api b/tools/winapi_check/win32/oleaut32.api
index ec4ff058b0153370d85c14a28f5fd152d428820b..dbe6d6f12f7b93d9685c7ce7407503810da3828d 100644
--- a/tools/winapi_check/win32/oleaut32.api
+++ b/tools/winapi_check/win32/oleaut32.api
@@ -9,6 +9,7 @@ double
 BOOL
 BYTE
 CHAR
+DISPID
 DWORD
 FLOAT
 HCURSOR
@@ -44,6 +45,9 @@ CHAR *
 COLORREF *
 CY *
 DATE *
+DISPID *
+DISPPARAMS *
+EXCEPINFO *
 FLOAT *
 ICreateTypeLib **
 INTERFACEDATA *
@@ -66,18 +70,21 @@ LPUNKNOWN *
 LPVOID
 LPVOID *
 OLECHAR *
+OLECHAR **
 REFCLSID
 REFGUID
 REFIID
 SAFEARRAY *
 SAFEARRAY **
 SAFEARRAYBOUND *
+UINT *
 ULONG *
 USHORT *
 VARIANT *
 VARIANTARG *
 VARIANT_BOOL *
 VARTYPE *
+VOID *
 double *
 short *
 void *
diff --git a/tools/winapi_check/win32/rasapi32.api b/tools/winapi_check/win32/rasapi32.api
index 5af6076322eb2e292548e2aa21ce1dd768c86bed..ef38a616870e780fc19a19e3de20599d058d45e5 100644
--- a/tools/winapi_check/win32/rasapi32.api
+++ b/tools/winapi_check/win32/rasapi32.api
@@ -8,9 +8,10 @@ HRASCONN
 LPBOOL
 LPDWORD
 LPRASCONNA
-LPRASDIALPARAMS
-LPRASENTRYNAME
+LPRASDIALPARAMSA
+LPRASENTRYNAMEA
 
 %str
 
-LPSTR
+LPCSTR
+
diff --git a/tools/winapi_check/win32/setupapi.api b/tools/winapi_check/win32/setupapi.api
index c903db2c8ee89aca51cdb2d883c1740380256075..68736eab971638a92966f5aef05950e467fb4f05 100644
--- a/tools/winapi_check/win32/setupapi.api
+++ b/tools/winapi_check/win32/setupapi.api
@@ -5,6 +5,7 @@ DWORD
 HDEVINFO
 HINF
 HKEY
+HSPFILEQ
 HWND
 UINT
 
diff --git a/tools/winapi_check/win32/shdocvw.api b/tools/winapi_check/win32/shdocvw.api
new file mode 100644
index 0000000000000000000000000000000000000000..c5480c6c4801ca334791153ec78228453fb45c12
--- /dev/null
+++ b/tools/winapi_check/win32/shdocvw.api
@@ -0,0 +1,15 @@
+%long
+
+BOOL
+HRESULT
+
+%ptr
+
+DLLVERSIONINFO *
+LPVOID *
+REFCLSID
+REFIID
+
+%wstr
+
+LPCWSTR
diff --git a/tools/winapi_check/win32/user32.api b/tools/winapi_check/win32/user32.api
index e55df13f9b77db752ee0f3d4aaeb57d70be3f2b6..ed675a4508ccfd96768732f5b3514afe757224d8 100644
--- a/tools/winapi_check/win32/user32.api
+++ b/tools/winapi_check/win32/user32.api
@@ -48,8 +48,10 @@ int
 
 %long --extension
 
+BOOL16
 INT16
 HANDLE16
+HDRVR16
 HMODULE16
 HINSTANCE16
 HTASK16
diff --git a/tools/winapi_check/win32/winedos.api b/tools/winapi_check/win32/winedos.api
new file mode 100644
index 0000000000000000000000000000000000000000..182aa6a68fc6ba4e633880af14ed1d86e450b787
--- /dev/null
+++ b/tools/winapi_check/win32/winedos.api
@@ -0,0 +1,22 @@
+%long
+
+BOOL
+BYTE
+HANDLE
+UINT
+WORD
+int
+
+%ptr
+
+CONTEXT86 *
+LPDOSTASK
+LPVOID
+
+%str
+
+LPCSTR
+
+%void
+
+void
diff --git a/tools/winapi_check/win32/wsock32.api b/tools/winapi_check/win32/wsock32.api
index 3e64a66db29faaf6a7434f5c99374ff30be05d4d..d5b9abc9c7d061571f6b4578360062312d369ab0 100644
--- a/tools/winapi_check/win32/wsock32.api
+++ b/tools/winapi_check/win32/wsock32.api
@@ -21,6 +21,7 @@ long
 FARPROC
 INT *
 LPDWORD
+LPINT
 LPVOID
 LPWSADATA
 ULONG *
diff --git a/tools/winapi_check/winapi.pm b/tools/winapi_check/winapi.pm
index 2af2f4bd447fab8443321442d1c1b17dabd106a2..4026179e0b11ec92935f59b82f70c7999e4b5298 100644
--- a/tools/winapi_check/winapi.pm
+++ b/tools/winapi_check/winapi.pm
@@ -328,7 +328,7 @@ sub parse_spec_file {
 		    }
 		}
 	    }
-	} elsif(/^(\d+|@)\s+stub\s+(\S+)$/) {
+	} elsif(/^(\d+|@)\s+stub(?:\s+(?:-noimport|-norelay|-i386|-ret64))?\s+(\S+)$/) {
 	    my $external_name = $2;
 
 	    $ordinal = $1;
diff --git a/tools/winapi_check/winapi_check b/tools/winapi_check/winapi_check
index 245063ee7d02974ea1a6f43be6107fa593d3576a..f2acfe1eb4a2104ecb1ece07919da1e4d5913d3a 100755
--- a/tools/winapi_check/winapi_check
+++ b/tools/winapi_check/winapi_check
@@ -244,6 +244,8 @@ if($options->headers) {
 }
 
 my %comment_width;
+my %comment_indent;
+my %comment_spacing;
 my %module_pseudo_stub_count16;
 my %module_pseudo_stub_count32;
 
@@ -493,8 +495,24 @@ foreach my $file ($options->c_files) {
 		    $external_name = $internal_name;
 		}
 
-		if($documentation !~ /\b(\Q$external_name\E|$internal_name|$name1|$name2)\b/) {
-		    $output->write("documentation: wrong or missing name \\\n$documentation\n");
+		if($options->documentation_pedantic) {
+		    my $n = 0;
+		    if((++$n && defined($module16) && defined($external_name16) &&
+			$external_name16 ne "@" && $documentation !~ /\b\Q$external_name16\E\b/) ||
+		       (++$n && defined($module16) && defined($external_name16) &&
+			$external_name16 eq "@" && $documentation !~ /\@/) ||
+		       (++$n && defined($module32) && defined($external_name32) &&
+			$external_name32 ne "@" && $documentation !~ /\b\Q$external_name32\E\b/) ||
+		       (++$n && defined($module32) && defined($external_name32) &&
+			$external_name32 eq "@" && $documentation !~ /\@/))
+		    {
+			my $external_name = ($external_name16, $external_name32)[($n-1)/2];
+			$output->write("documentation: wrong or missing name ($external_name) \\\n$documentation\n");
+		    }
+		} else {
+		    if($documentation !~ /\b(?:\Q$external_name\E|$internal_name|$name1|$name2)\b/) {
+			$output->write("documentation: wrong or missing name \\\n$documentation\n");
+		    }
 		}
 
 		if($options->documentation_ordinal) {
@@ -523,7 +541,7 @@ foreach my $file ($options->c_files) {
 			    foreach my $uc_module32 (@uc_modules32) {
 				if($documentation !~ /\b$uc_module32\.\Q$ordinal32\E/) {
 				    $output->write("documentation: wrong or missing ordinal " .
-						   "expected (\U$module32\E.$ordinal32)\\\n$documentation\n");
+						   "expected (\U$module32\E.$ordinal32) \\\n$documentation\n");
 				}
 			    }
 			}
@@ -531,13 +549,35 @@ foreach my $file ($options->c_files) {
 		}
 
 		if($options->documentation_pedantic) {
-		    if($documentation !~ /^ \*\t\t\w+(?: \(\w+\.(?:\@|\d+)\))+/m) {
+		    if($documentation !~ /^ \*\t\t(?:\@|\w+)(?: \(\w+\.(?:\@|\d+)\))+/m) {
 			$output->write("documentation: pedantic check failed \\\n$documentation\n");
 		    }
 		}
 
-		if($options->documentation_width) {		
-		    if($documentation =~ /(\/\**)/) {
+		if($options->documentation_comment_indent) {
+		    if($documentation =~ /^ \*(\s*)\w+(\s*)([\(\[])\s*\w+\.\s*(?:\@|\d+)\s*([\)\]])/m) {
+			my $indent = $1;
+			my $spacing = $2;
+			my $left = $3;
+			my $right = $4;
+
+			$indent =~ s/\t/        /g;
+			$indent = length($indent);
+			
+			$spacing =~ s/\t/        /g;
+			$spacing = length($spacing);
+
+			$comment_indent{$indent}++;
+			if($indent >= 20) {
+			    $output->write("documentation: comment indent is $indent\n");
+			}
+
+			$comment_spacing{$spacing}++;
+		    }
+		}
+
+		if($options->documentation_comment_width) {		
+		    if($documentation =~ /(^\/\*\*+)/) {
 			my $width = length($1);
 			
 			$comment_width{$width}++;
@@ -689,7 +729,14 @@ foreach my $file ($options->c_files) {
 $output->hide_progress;
 
 if($options->global) {
-    if($options->documentation_width) {
+    if($options->documentation_comment_indent) {
+	foreach my $indent (sort(keys(%comment_indent))) {
+	    my $count = $comment_indent{$indent};
+	    $output->write("*.c: $count functions have comment that is indented $indent\n");
+	}
+    }
+
+    if($options->documentation_comment_width) {
 	foreach my $width (sort(keys(%comment_width))) {
 	    my $count = $comment_width{$width};
 	    $output->write("*.c: $count functions have comments of width $width\n");
diff --git a/tools/winapi_check/winapi_options.pm b/tools/winapi_check/winapi_options.pm
index 895bd9193ed53b4d85d087f3a9e3495c10b4d6c7..c0fb0cd074d254504265711cd068906449c7bbdb 100644
--- a/tools/winapi_check/winapi_options.pm
+++ b/tools/winapi_check/winapi_options.pm
@@ -69,15 +69,40 @@ my %options = (
      },
     "cross-call-unicode-ascii" => { 
 	default => 0, parent => "cross-call", description => "check for cross calls between Unicode and ASCII" 
-     },
+    },
     "debug-messages" => { default => 0, parent => "statements", description => "check for debug messages inconsistances" },
-    "documentation" => { default => 1, parent => "local", description => "check for documentation inconsistances\n" },
-    "documentation-pedantic" => { default => 0, parent => "documentation", description => "be pendantic when checking for documentation inconsistances\n" },
-    "documentation-width" => { default => 0, parent => "documentation", description => "check for documentation width inconsistances\n" },
-    "documentation-arguments" => { default => 1, parent => "documentation", description => "check for arguments documentation inconsistances\n" },
-    "documentation-ordinal" => { default => 0, parent => "documentation", description => "check for ordinal documentation inconsistances\n" },
-    "prototype" => { default => 0, parent => ["local", "headers"], description => "prototype checking" },
 
+    "documentation" => {
+	default => 1,
+	parent => "local", 
+	description => "check for documentation inconsistances"
+	},
+    "documentation-pedantic" => { 
+	default => 0, 
+	parent => "documentation", 
+	description => "be pendantic when checking for documentation inconsistances"
+	},
+
+    "documentation-arguments" => {
+	default => 1,
+	parent => "documentation",
+	description => "check for arguments documentation inconsistances\n"
+	},
+    "documentation-comment-indent" => {
+	default => 0, 
+	parent => "documentation", description => "check for documentation comment indent inconsistances"
+	},
+    "documentation-comment-width" => {
+	default => 0, 
+	parent => "documentation", description => "check for documentation comment width inconsistances"
+	},
+    "documentation-ordinal" => {
+	default => 0,
+	parent => "documentation",
+	description => "check for documentation ordinal inconsistances\n"
+	},
+
+    "prototype" => {default => 0, parent => ["local", "headers"], description => "prototype checking" },
     "global" => { default => 1, description => "global checking" },
     "declared" => { default => 1, parent => "global", description => "declared checking" },
     "implemented" => { default => 0, parent => "local", description => "implemented checking" },
diff --git a/tools/winapi_check/winapi_parser.pm b/tools/winapi_check/winapi_parser.pm
index a1a04f9845b9963c18d27ed851d4239e56c35eb4..c45b21de9738e8949e0c65331026aee5f6745276 100644
--- a/tools/winapi_check/winapi_parser.pm
+++ b/tools/winapi_check/winapi_parser.pm
@@ -135,7 +135,9 @@ sub parse_c_file {
 	    if(defined($comments[$n]) && $n >= 0) {
 		$documentation = $comments[$n];
 		for(my $m=$n+1; $m <= $#comments; $m++) {
-		    if($comments[$m] =~ /^\/\*\*+\/$/) {
+		    if($comments[$m] =~ /^\/\*\*+\/$/ ||
+		       $comments[$m] =~ /^\/\*\s*(?:\!)?defined/) # FIXME: Kludge
+		    {
 			@argument_documentations = ();
 			next;
 		    }