diff --git a/tools/winapi/winapi_fixup b/tools/winapi/winapi_fixup
index bef5c24f592c60eeac9103df2a44791c3c252637..1a31842f274bfbfddf1fe00807bf6d6ff8c86d04 100755
--- a/tools/winapi/winapi_fixup
+++ b/tools/winapi/winapi_fixup
@@ -38,9 +38,9 @@ my %options_long = (
 
     "local" =>  { default => 1, description => "local fixup" },
     "documentation" => { default => 1, parent => "local", description => "documentation fixup" },
-    "documentation-ordinal" => { default => 1, parent => "documentation", description => "documentation ordinal fixup" },
+    "documentation-ordinal" => { default => 0, parent => "documentation", description => "documentation ordinal fixup" },
     "documentation-missing" => { default => 0, parent => "documentation", description => "documentation missing fixup" },
-    "documentation-name" => { default => 0, parent => "documentation", description => "documentation name fixup" },
+    "documentation-name" => { default => 1, parent => "documentation", description => "documentation name fixup" },
     "stub" => { default => 0, parent => "local", description => "stub fixup" },
 
     "global" => { default => 1, description => "global fixup" },
@@ -104,6 +104,12 @@ sub get_all_module_external_ordinal {
 
     my @entries = ();
     foreach my $winapi (@winapis) {
+	my @name = (); {
+	    my $name = $winapi->function_external_name($external_name);
+	    if(defined($name)) {
+		@name = split(/ & /, $name);
+	    }
+	}
 	my @module = (); {
 	    my $module = $winapi->function_external_module($external_name);
 	    if(defined($module)) {
@@ -117,16 +123,35 @@ sub get_all_module_external_ordinal {
 	    }
 	}
 
+	my $name;
 	my $module;
 	my $ordinal;
-	while(defined($module = shift @module) && defined($ordinal = shift @ordinal)) {
-	    push @entries, [$module, $ordinal];
+	while(# defined($name = shift @name) &&
+	      defined($module = shift @module) &&
+	      defined($ordinal = shift @ordinal)) 
+	{
+	    push @entries, [$name, $module, $ordinal];
 	}
     }
 
     return @entries;
 }
 
+sub normalize_set {
+    local $_ = shift;
+
+    if(!defined($_)) {
+	return undef;
+    }
+    
+    my %hash = ();
+    foreach my $key (split(/\s*&\s*/)) {
+	$hash{$key}++;
+    }
+
+    return join(" & ", sort(keys(%hash)));
+}
+
 my @c_files = options->c_files;
 @c_files = files_skip(@c_files);
 @c_files = files_filter("winelib", @c_files);
@@ -173,11 +198,11 @@ foreach my $file (@c_files) {
 	my $prefix = "";
 	$prefix .= "$file: ";
 	if(defined($module16) && !defined($module32)) {
-	    $prefix .= "$module16: ";
+	    $prefix .= normalize_set($module16) . ": ";
 	} elsif(!defined($module16) && defined($module32)) {
-	    $prefix .= "$module32: ";
+	    $prefix .= normalize_set($module32) . ": ";
 	} elsif(defined($module16) && defined($module32)) {
-	    $prefix .= "$module16 & $module32: ";
+	    $prefix .= normalize_set($module16) . " & " . normalize_set($module32) . ": ";
 	} else {
 	    $prefix .= "<>: ";
 	}
@@ -189,10 +214,18 @@ foreach my $file (@c_files) {
 	my $calling_convention16 = translate_calling_convention16($calling_convention);
 	my $calling_convention32 = translate_calling_convention32($calling_convention);
 
+	my @external_names = ();
+	foreach my $winapi (@winapis) {
+	    my $external_names = $winapi->function_external_name($internal_name);
+	    if(defined($external_names)) { 
+		push @external_names, split(/\s*&\s*/, $external_names);
+	    }
+	}
+
 	if(options->documentation_ordinal && $documentation) {
 	    local $_;
 	    foreach (split(/\n/, $documentation)) {
-		if(/^(\s*\*\s*(\w+)\s*)(\s*(?:[\(\[]\s*\w+(?:\s*\.\s*\S+\s*)?[\)\]])+)(.*?)$/m) {
+		if(/^(\s*\*\s*(\w+)\s*)(\s*(?:[\(\[]\s*\w+(?:\s*\.\s*\S*\s*)?[\)\]])+)(.*?)$/m) {
 		    my $part1 = $1;
 		    my $external_name = $2;
 		    my $part3 = $3;
@@ -201,7 +234,7 @@ foreach my $file (@c_files) {
 		    $part4 =~ s/\s*$//;
 
 		    my @entries = ();
-		    while($part3 =~ s/^\s*([\(\[]\s*(\w+)(?:\s*\.\s*(\S+)\s*)?[\)\]])//) {
+		    while($part3 =~ s/^\s*([\(\[]\s*(\w+)(?:\s*\.\s*(\S*)\s*)?[\)\]])//) {
 			push @entries, [$1, lc($2), $3];
 		    }
 
@@ -210,7 +243,7 @@ foreach my $file (@c_files) {
 		    foreach my $entry (@entries) {
 			(my $part, my $module, my $ordinal) = @$entry;
 			foreach my $entry2 (get_all_module_external_ordinal($external_name)) {
-			    (my $module2, my $ordinal2) = @$entry2;
+			    (my $external_name2, my $module2, my $ordinal2) = @$entry2;
 			    
 			    if(defined($module2) && $module eq $module2 && 
 			       (!defined($ordinal) || (defined($ordinal2) && $ordinal ne $ordinal2)))
@@ -239,8 +272,9 @@ foreach my $file (@c_files) {
 		    my $external_name = $2;
 		    if($internal_name eq $external_name) {
 			foreach my $entry (get_all_module_external_ordinal($external_name)) {
-			    (my $module, my $ordinal) = @$entry;
+			    (my $external_name2, my $module, my $ordinal) = @$entry;
 
+			    # FIXME: Not correct
 			    $substitute_line{$_}{search} = "^\Q$_\E\$";
 			    $substitute_line{$_}{replace} = "$part1$external_name (\U$module\E.$ordinal)";
 			}
@@ -251,25 +285,107 @@ foreach my $file (@c_files) {
 
 	if(options->documentation_name && $documentation) {
 	    local $_;
+
+	    my @entries = ();
 	    foreach (split(/\n/, $documentation)) {
 		if(/^(\s*\*\s*(\w+)\s*)(\s*(?:[\(\[]\s*\w+(?:\s*\.\s*\S+\s*)?[\)\]])+)(.*?)$/m) {
 		    my $part1 = $1;
-		    my $external_name = $2;
+		    my $external_name2 = $2;
 		    my $part3 = $3;
 		    my $part4 = $4;
 
 		    $part4 =~ s/\s*$//;
 
+		    push @entries, [$part1, $external_name2, $part3, $part4];
+		}
+	    }
+	    
+	    my @missing_external_names = ();
+	    foreach my $external_name (@external_names) {
+		my $found = 0;
+		foreach my $entry (@entries) {
+		    my $part1 = $entry->[0];
+		    my $external_name2 = $entry->[1];
+		    my $part3 = $entry->[2];
+		    my $part4 = $entry->[3];
+
+		    if($external_name eq $external_name2) {
+			$found = 1;
+		    }
+		}
+		if(!$found) {
+		    push @missing_external_names, $external_name;
+		}
+	    }
+
+	    foreach my $external_name (@missing_external_names) {
+		my $internal_name2 = $internal_name;
+		my $external_name2 = $external_name;
+
+		if($internal_name =~ /^(.*?)$external_name(.*?)$/) {
+		    my $prefix = $1;
+		    my $suffix = $2;
+
+		    my $part1;
+		    my $part3;
 		    my $external_name2;
-		    foreach my $winapi (@winapis) {
-			$external_name2 = ($winapi->function_external_name($internal_name) || $external_name2);
+		    my $part4;
+
+		    foreach my $entry (@entries) {
+			$part1 = $entry->[0];
+			$external_name2 = $entry->[1];
+			$part3 = $entry->[2];
+			$part4 = $entry->[3];
+
+			if($internal_name =~ /^(.*?)$external_name(.*?)$/) {
+			    last;
+			}
 		    }
 
-		    if(defined($external_name2) && $external_name ne $external_name2) {
-			output->write("$external_name != $external_name2\n");
+		    foreach (split(/\n/, $documentation)) {
+			if(/\Q$external_name\E/) {
+			    if($suffix =~ /^16$/) {
+				$substitute_line{$_}{search} = "\Q$internal_name\E";
+				$substitute_line{$_}{replace} = "$external_name";
+				last;
+			    } elsif($suffix =~ /^[AW]$/) {
+				$substitute_line{$_}{search} = "^\Q$_\E\$";
+
+				# FIXME: Not correct
+				my $replace  = "";
+				
+				$part3 =~ /^\s*[\(\[]\s*(\w+)(?:\s*\.\s*(\S*)\s*)?[\)\]]/;
+				my $module = lc($1);
+				my $ordinal = $2;
+
+				foreach my $entry2 (get_all_module_external_ordinal($external_name)) {
+				    (my $external_name2, my $module2, my $ordinal2) = @$entry2;
+
+				    my $part12 = $part1;
+				    $part12 =~ s/[AW](\s*)$/ $1/;
+
+				    my $part32 = $part3;
+
+				    if($module ne $module2 || $ordinal ne $ordinal2) {
+					$part32 =~ s/\U$module\E\s*.\s*\Q$ordinal\E/\U$module2\E.$ordinal2/;
+					$replace = "$part12$part32$part4";
+				    }
+				}
+
+				if($replace) {
+				    $replace .= "\n$part1$part3$part4";
+				    $substitute_line{$_}{replace} = $replace;
+				    last;
+				}
+			    }
+
+			}
+
 		    }
+		} else {
+		    output->write("$external_name missing\n");
 		}
-	    }	    
+	    }
 	}
 
 	if(options->documentation_missing && !$documentation) {
diff --git a/tools/winapi_check/modules.dat b/tools/winapi_check/modules.dat
index f2391aa3d17e56092255c115a5347c70aab33607..7c273eeb0690b42e8614c8953046db2f763f3f35 100644
--- a/tools/winapi_check/modules.dat
+++ b/tools/winapi_check/modules.dat
@@ -322,7 +322,7 @@ dlls/urlmon
 
 % dlls/user/ddeml.spec
 
-dlls/user
+dlls/user/dde
 
 % dlls/user/display.spec
 
@@ -350,6 +350,7 @@ windows
 
 controls
 dlls/user
+dlls/user/dde
 loader
 windows
 
diff --git a/tools/winapi_check/win32/user32.api b/tools/winapi_check/win32/user32.api
index a7b4f1a6112ef94f14027fd66666486b45c52a7a..56fe1789a5d519c92c1a69b5f1b56e7bb423888c 100644
--- a/tools/winapi_check/win32/user32.api
+++ b/tools/winapi_check/win32/user32.api
@@ -92,6 +92,7 @@ LPDISPLAY_DEVICEW
 LPDRAWTEXTPARAMS
 LPDWORD
 LPINT
+LPINPUT
 LPMENUINFO
 LPMENUITEMINFOA
 LPMENUITEMINFOW
diff --git a/tools/winapi_check/win32/x11drv.api b/tools/winapi_check/win32/x11drv.api
index 3b90022465119ee138e2014b4a73c6356ccdac3f..67a6c9cb51f7af7fc3e3e437f6a465585b4d481f 100644
--- a/tools/winapi_check/win32/x11drv.api
+++ b/tools/winapi_check/win32/x11drv.api
@@ -30,6 +30,7 @@ LPBYTE
 LPDIDEVICEOBJECTDATA
 LPDWORD
 LPMOUSE_EVENT_PROC
+LPPOINT
 LPRECT
 LPVOID
 RECT *
diff --git a/tools/winapi_check/winapi.pm b/tools/winapi_check/winapi.pm
index f462941389bc2905958c6deba29cb8121d2f5170..968a72104aa2561e1cb8a66751da90f61be7f532 100644
--- a/tools/winapi_check/winapi.pm
+++ b/tools/winapi_check/winapi.pm
@@ -286,8 +286,16 @@ sub parse_spec_file {
 	    $ordinal = $1;
 
 	    # FIXME: Internal name existing more than once not handled properly
-	    $$function_internal_name{$external_name} = $internal_name;
-	    $$function_external_name{$internal_name} = $external_name;
+	    if(!$$function_internal_name{$external_name}) {
+		$$function_internal_name{$external_name} = $internal_name;
+	    } else {
+		$$function_internal_name{$external_name} .= " & $internal_name";
+	    }
+	    if(!$$function_external_name{$internal_name}) {
+		$$function_external_name{$internal_name} = $external_name;
+	    } else {
+		$$function_external_name{$internal_name} .= " & $external_name";
+	    }
 	    $$function_internal_arguments{$internal_name} = $arguments;
 	    $$function_external_arguments{$external_name} = $arguments;
 	    if(!$$function_internal_ordinal{$internal_name}) {
@@ -304,12 +312,12 @@ sub parse_spec_file {
 	    $$function_external_calling_convention{$external_name} = $calling_convention;
 	    if(!$$function_internal_module{$internal_name}) {
 		$$function_internal_module{$internal_name} = "$module";
-	    } else { # if($$function_internal_module{$internal_name} !~ /$module/) {
+	    } else {
 		$$function_internal_module{$internal_name} .= " & $module";
 	    }
 	    if(!$$function_external_module{$external_name}) {
 		$$function_external_module{$external_name} = "$module";
-	    } else { # if($$function_external_module{$external_name} !~ /$module/) {
+	    } else {
 		$$function_external_module{$external_name} .= " & $module";
 	    }
 
diff --git a/tools/winapi_check/winapi_check b/tools/winapi_check/winapi_check
index 0a936540883393dffff594e73d2faaddefb9e6bb..1222819878fbf00153f7b31aa22ad81b61832a10 100755
--- a/tools/winapi_check/winapi_check
+++ b/tools/winapi_check/winapi_check
@@ -265,7 +265,13 @@ if($options->headers) {
 		my $module = $winapi->function_internal_module($internal_name);
 		if(!defined($module)) { next }
 
+		# FIXME: Not correct
 		my $external_name = $winapi->function_external_name($internal_name);
+
+		if(defined($external_name)) {
+		    $external_name = (split(/\s*&\s*/, $external_name))[0];
+		}
+
 		# FIXME: Kludge because of the THUNK variants
 		if(!defined($external_name)) {
 		    next;
@@ -411,6 +417,16 @@ foreach my $file (@c_files) {
 	    $prefix .= "$internal_name(" . join(",", @argument_types) . "): ";
 	    $output->prefix($prefix);
 
+	    # FIXME: Not correct
+	    if(defined($external_name16)) {
+		$external_name16 = (split(/\s*&\s*/, $external_name16))[0];
+	    }
+	    
+	    # FIXME: Not correct
+	    if(defined($external_name32)) {
+		$external_name32 = (split(/\s*&\s*/, $external_name32))[0];
+	    }
+
 	    if($options->local && $options->misplaced &&
 	       $linkage ne "extern" && $statements) 
 	    {
diff --git a/tools/winapi_check/winapi_documentation.pm b/tools/winapi_check/winapi_documentation.pm
index a413a00a8ebd98f0f4d504bc5bb1a9c3923b193c..eadcaa90e26b0dbd5b82e6033534ef88ad541a1d 100644
--- a/tools/winapi_check/winapi_documentation.pm
+++ b/tools/winapi_check/winapi_documentation.pm
@@ -21,6 +21,16 @@ sub check_documentation {
     my $documentation = $function->documentation;
     my @argument_documentations = @{$function->argument_documentations};
 
+    # FIXME: Not correct
+    if(defined($external_name16)) {
+	$external_name16 = (split(/\s*&\s*/, $external_name16))[0];
+    }
+    
+    # FIXME: Not correct
+    if(defined($external_name32)) {
+	$external_name32 = (split(/\s*&\s*/, $external_name32))[0];
+    }
+
     my $external_name;
     my $name1;
     my $name2;
diff --git a/tools/winapi_check/winapi_local.pm b/tools/winapi_check/winapi_local.pm
index 86f704263ce205c7145ffdb722fc18728fda6710..ff58b2380a26b2d5740f567f9ebcb2ea99cd76dc 100644
--- a/tools/winapi_check/winapi_local.pm
+++ b/tools/winapi_check/winapi_local.pm
@@ -257,16 +257,20 @@ sub check_statements {
 			    $format =~ s/^\'(.*?)\'$/$1/;
 			    $format =~ s/^\\\"(.*?)\\\"$/$1/;
 
-			    if($argument !~ /$name/) {
-				$output->write("$called_name: argument $n is wrong ($name != '$argument')\n");
-			    } elsif(!$winapi->is_allowed_type_format($module, $type, $format)) {
-				$output->write("$called_name: argument $n ($type $name) has illegal format ($format)\n");
+			    if($options->debug_messages) {
+				if($argument !~ /$name/) {
+				    $output->write("$called_name: argument $n is wrong ($name != '$argument')\n");
+				} elsif(!$winapi->is_allowed_type_format($module, $type, $format)) {
+				    $output->write("$called_name: argument $n ($type $name) has illegal format ($format)\n");
+				}
 			    }
 			}
 
-			my $count = $#{$function->argument_types} + 1; 
-			if($n != $count) {
-			    $output->write("$called_name: argument count mismatch ($n != $count)\n");
+			if($options->debug_messages) {
+			    my $count = $#{$function->argument_types} + 1; 
+			    if($n != $count) {
+				$output->write("$called_name: argument count mismatch ($n != $count)\n");
+			    }
 			}
 		    }
 		}