diff --git a/tools/winapi/winapi_extract b/tools/winapi/winapi_extract
index 1fb61901eb43e84d256ac88429f9a55e0d32ab27..e6e6b3195b7fe415c33311a9775c96af2088d5ed 100755
--- a/tools/winapi/winapi_extract
+++ b/tools/winapi/winapi_extract
@@ -118,7 +118,7 @@ foreach my $file (@files) {
 
 	local $_;
 	foreach (split(/\n/, $documentation)) {
-	    if(/^ \*\s*(\w+)\s*[\(\[]\s*(\w+)\.\s*(\@|\d+)\s*[\)\]]/m) {
+	    if(/^\s*\*\s*(\w+|\@)\s*[\(\[]\s*(\w+)\s*\.\s*(\@|\d+)\s*[\)\]]/) {
 		my $external_name = $1;
 		my $module = lc($2);
 		my $ordinal = $3;
diff --git a/tools/winapi/winapi_fixup b/tools/winapi/winapi_fixup
index 1a31842f274bfbfddf1fe00807bf6d6ff8c86d04..3eb4c438d44a075b967ffc61f0eef61d5a5ce786 100755
--- a/tools/winapi/winapi_fixup
+++ b/tools/winapi/winapi_fixup
@@ -38,7 +38,7 @@ my %options_long = (
 
     "local" =>  { default => 1, description => "local fixup" },
     "documentation" => { default => 1, parent => "local", description => "documentation fixup" },
-    "documentation-ordinal" => { default => 0, parent => "documentation", description => "documentation ordinal fixup" },
+    "documentation-ordinal" => { default => 1, parent => "documentation", description => "documentation ordinal fixup" },
     "documentation-missing" => { default => 0, parent => "documentation", description => "documentation missing fixup" },
     "documentation-name" => { default => 1, parent => "documentation", description => "documentation name fixup" },
     "stub" => { default => 0, parent => "local", description => "stub fixup" },
@@ -76,6 +76,12 @@ sub get_all_module_internal_ordinal {
 
     my @entries = ();
     foreach my $winapi (@winapis) {
+	my @name = (); {
+	    my $name = $winapi->function_external_name($internal_name);
+	    if(defined($name)) {
+		@name = split(/ & /, $name);
+	    }
+	}
 	my @module = (); {
 	    my $module = $winapi->function_internal_module($internal_name);
 	    if(defined($module)) {
@@ -89,10 +95,14 @@ sub get_all_module_internal_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];
 	}
     }
 
@@ -105,7 +115,7 @@ sub get_all_module_external_ordinal {
     my @entries = ();
     foreach my $winapi (@winapis) {
 	my @name = (); {
-	    my $name = $winapi->function_external_name($external_name);
+	    my $name = $winapi->function_internal_name($external_name);
 	    if(defined($name)) {
 		@name = split(/ & /, $name);
 	    }
@@ -126,7 +136,7 @@ sub get_all_module_external_ordinal {
 	my $name;
 	my $module;
 	my $ordinal;
-	while(# defined($name = shift @name) &&
+	while(defined($name = shift @name) &&
 	      defined($module = shift @module) &&
 	      defined($ordinal = shift @ordinal)) 
 	{
@@ -188,7 +198,19 @@ foreach my $file (@c_files) {
 	my @argument_documentations = @$refargument_documentations;
 	my $statements = shift;
 
-	if($linkage eq "static" || $linkage eq "extern") {
+	if($linkage eq "static" || $linkage eq "extern" || !defined($statements)) {
+	    return;
+	}
+
+	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($#external_names < 0) {
 	    return;
 	}
 
@@ -214,18 +236,28 @@ 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);
-	    }
-	}
+	my $documention_modified = 0;
 
-	if(options->documentation_ordinal && $documentation) {
+	if(($documentation && !$documention_modified) &&
+	   (options->documentation_name || options->documentation_ordinal)) 
+	{
 	    local $_;
+
+	    my %found_external_names;
+
+	    foreach my $external_name (@external_names) {
+		$found_external_names{$external_name} = 0;
+	    }
+
+	    my $line3;
+	    my $search;
+	    my $replace;
+
+	    my $count = 0;
+	    my $line2 = $line - 1;
 	    foreach (split(/\n/, $documentation)) {
-		if(/^(\s*\*\s*(\w+)\s*)(\s*(?:[\(\[]\s*\w+(?:\s*\.\s*\S*\s*)?[\)\]])+)(.*?)$/m) {
+		$line2++;
+		if(/^(\s*\*\s*(\w+|\@)\s*)((?:\s*[\(\[]\s*\w+(?:\s*\.\s*[^\s\)\]]*\s*)?[\)\]])+)(.*?)$/) {
 		    my $part1 = $1;
 		    my $external_name = $2;
 		    my $part3 = $3;
@@ -234,161 +266,100 @@ foreach my $file (@c_files) {
 		    $part4 =~ s/\s*$//;
 
 		    my @entries = ();
-		    while($part3 =~ s/^\s*([\(\[]\s*(\w+)(?:\s*\.\s*(\S*)\s*)?[\)\]])//) {
-			push @entries, [$1, lc($2), $3];
+		    while($part3 =~ s/^\s*([\(\[]\s*(\w+)(?:\s*\.\s*([^\s\)\]]*)\s*)?[\)\]])//) {
+			push @entries, [$1, $2, $3];
+		    }
+
+		    my $found = 0;
+		    foreach my $external_name2 (@external_names) {
+			if($external_name eq $external_name2) {
+			    $found_external_names{$external_name2} = 1;
+			    $found = 1;
+			    last;
+			}
 		    }
 
 		    my $replaced = 0;
-		    my $replace = "";
+		    my $replace2 = "";
 		    foreach my $entry (@entries) {
-			(my $part, my $module, my $ordinal) = @$entry;
-			foreach my $entry2 (get_all_module_external_ordinal($external_name)) {
+			my $part12 = $part1;
+			(my $part32, my $module, my $ordinal) = @$entry;
+
+			foreach my $entry2 (get_all_module_internal_ordinal($internal_name)) {
 			    (my $external_name2, my $module2, my $ordinal2) = @$entry2;
-			    
-			    if(defined($module2) && $module eq $module2 && 
-			       (!defined($ordinal) || (defined($ordinal2) && $ordinal ne $ordinal2)))
+
+			    if(options->documentation_name && lc($module) eq $module2 && 
+			       $external_name ne $external_name2) 
+			    {
+				if(!$found && $part12 =~ s/\b\Q$external_name\E\b/$external_name2/) {
+				    $external_name = $external_name2;
+				    $replaced++;
+				}
+			    }
+
+			    if(options->documentation_ordinal &&
+			       $external_name eq $external_name2 &&
+			       lc($module) eq $module2 && 
+			       ($#entries > 0 || !defined($ordinal) || ($ordinal ne $ordinal2)))
 			    {
 				if(defined($ordinal)) {
-				    if($part =~ s/\U$module\E\s*.\s*\Q$ordinal\E/\U$module2\E.$ordinal2/) {
+				    if($part32 =~ s/\Q$module\E\s*.\s*\Q$ordinal\E/\U$module2\E.$ordinal2/ || $#entries > 0) {
 					$replaced++;
 				    }
 				} else {
-				    if($part =~ s/\U$module\E/\U$module2\E.$ordinal2/) {
+				    if($part32 =~ s/\Q$module\E/\U$module2\E.$ordinal2/ || $#entries > 0) {
 					$replaced++;
 				    }
 				}
 			    }
+
 			}
-			if($replace) { $replace .= "\n"; }
-			$replace .= "$part1$part$part4";
+			if($replace2) { $replace2 .= "\n"; }
+			$replace2 .= "$part12$part32$part4";
 		    }
 
 		    if($replaced > 0) {
-			$substitute_line{$_}{search} = "^\Q$_\E\$";
-			$substitute_line{$_}{replace} = "$replace";
+			$line3 = $line2;
+			$search = "^\Q$_\E\$";
+			$replace = $replace2;
 		    }
-		} elsif(/^(\s*\*\s*)(\w+)\s*$/m) {
+		    $count++;
+		} elsif(/^(\s*\*\s*)(\w+|\@)\s*$/) {
 		    my $part1 = $1;
 		    my $external_name = $2;
 		    if($internal_name eq $external_name) {
-			foreach my $entry (get_all_module_external_ordinal($external_name)) {
+			foreach my $entry (get_all_module_internal_ordinal($internal_name)) {
 			    (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)";
+			    $line3 = $line2;
+			    $search = "^\Q$_\E\$";
+			    $replace = "$part1$external_name2 (\U$module\E.$ordinal)";
 			}
 		    }
+		    $count++;
 		}
 	    }
-	}
-
-	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_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;
+	    if(defined($line3) && defined($search) && defined($replace)) {
+		if($count > 1 || $#external_names >= 1) {
+		    output->write("multiple entries (fixup not supported)\n");
+		    # output->write("s/$search/$replace/\n");
+		} else {
+		    $substitute_line{$line3}{search} = $search;
+		    $substitute_line{$line3}{replace} = $replace;
 		}
 	    }
 
-	    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;
-		    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(options->documentation_missing) {
+		foreach my $external_name (keys(%found_external_names)) {
+		    if(!$found_external_names{$external_name}) {
+			output->write("$external_name missing (fixup not supported)\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) {
+	if(0 && !$documentation) {
 	    # FIXME: Not correct
 
 	    my $external_name;
@@ -495,22 +466,22 @@ foreach my $file (@c_files) {
 		}
 	    }
 
-	    my $search = $substitute_line{$_}{search};
-	    my $replace = $substitute_line{$_}{replace};
+	    my $search = $substitute_line{$.}{search};
+	    my $replace = $substitute_line{$.}{replace};
 	    
 	    if(defined($search) && defined($replace)) {
 		my $modified2 = 0;
-		if(options->modify) {
-		    if(s/$search/$replace/) {
+		if(s/$search/$replace/) {
+		    if(options->modify) {
 			$modified = 1;
-			$modified2 = 1;
 		    }
+		    $modified2 = 1;
 		}
 
 		if(!options->modify || !$modified2) {
 		    my $search2;
 		    my $replace2;
-		    if(options->modify && !$modified2) {
+		    if(!$modified2) {
 			$search2 = "unmatched search"; 
 			$replace2 = "unmatched replace"; 
 		    } else {
@@ -569,7 +540,7 @@ foreach my $file (@c_files) {
 		    if(s/$search/$replace/) {
 			if(options->modify) {
 			    $modified = 1;
-			} else {    
+			} else {
 			    output->write("$file: search : '$search'\n");
 			    output->write("$file: replace: '$replace'\n");
 			}
diff --git a/tools/winapi_check/modules.dat b/tools/winapi_check/modules.dat
index 7c273eeb0690b42e8614c8953046db2f763f3f35..9dfce9f6cb9c5459d644197614e9d354a6da7298 100644
--- a/tools/winapi_check/modules.dat
+++ b/tools/winapi_check/modules.dat
@@ -195,7 +195,6 @@ dlls/odbc32
 % dlls/ole32/compobj.spec
 
 dlls/ole32
-files
 
 % dlls/ole32/ole2.spec
 
@@ -210,7 +209,6 @@ dlls/ole32
 % dlls/ole32/ole2nls.spec
 
 dlls/ole32
-ole
 
 % dlls/ole32/ole2prox.spec
 
diff --git a/tools/winapi_check/nativeapi.pm b/tools/winapi_check/nativeapi.pm
index 023523a57aed8d857c62b87ba6c0727dc168cb5a..5c5c338b2fe3c551efd4c9b27acc5c17ee4163d5 100644
--- a/tools/winapi_check/nativeapi.pm
+++ b/tools/winapi_check/nativeapi.pm
@@ -76,14 +76,12 @@ sub new {
 	# skip comments
 	if(/^dnl/) { next; }
 
-	if(/^AC_CHECK_HEADERS\(\s*(.*?)\)\s*$/) {
-	    my @arguments = split(/,/,$1);
-	    foreach my $name (split(/\s+/, $arguments[0])) {		
+	if(/^AC_CHECK_HEADERS\(\s*([^,\)]*)(?:,|\))?/) {
+	    foreach my $name (split(/\s+/, $1)) {
 		$$conditional_headers{$name}++;
 	    }
-	} elsif(/^AC_CHECK_FUNCS\(\s*(.*?)\)\s*$/) {
-	    my @arguments = split(/,/,$1);
-	    foreach my $name (split(/\s+/, $arguments[0])) {		
+	} elsif(/^AC_CHECK_FUNCS\(\s*([^,\)]*)(?:,|\))?/) {
+	    foreach my $name (split(/\s+/, $1)) {
 		$$conditional_functions{$name}++;
 	    }
 	} elsif(/^AC_FUNC_ALLOCA/) {
diff --git a/tools/winapi_check/win16/compobj.api b/tools/winapi_check/win16/compobj.api
index 842ff1d335606017c58dd36d172b08c48a86e44c..63e5a08b19f4fc9636b7699263657c8d5bab3c01 100644
--- a/tools/winapi_check/win16/compobj.api
+++ b/tools/winapi_check/win16/compobj.api
@@ -19,7 +19,6 @@ HTASK16 *
 IMalloc16 *
 LPCLSID
 LPDWORD
-LPFILETIME
 LPMALLOC16 *
 LPMESSAGEFILTER
 LPMESSAGEFILTER *
diff --git a/tools/winapi_check/winapi.pm b/tools/winapi_check/winapi.pm
index 968a72104aa2561e1cb8a66751da90f61be7f532..f94fddaec163237d7360bfa44d4b45ed06de790b 100644
--- a/tools/winapi_check/winapi.pm
+++ b/tools/winapi_check/winapi.pm
@@ -694,6 +694,15 @@ sub function_external_calling_convention {
     return $$function_external_calling_convention{$name};
 }
 
+sub function_internal_name {
+    my $self = shift;
+    my $function_internal_name = \%{$self->{FUNCTION_INTERNAL_NAME}};
+
+    my $name = shift;
+
+    return $$function_internal_name{$name};
+}
+
 sub function_external_name {
     my $self = shift;
     my $function_external_name = \%{$self->{FUNCTION_EXTERNAL_NAME}};
diff --git a/tools/winapi_check/winapi_parser.pm b/tools/winapi_check/winapi_parser.pm
index e848ad35f3cf495e214722ee42741a4ff95441c0..b484407b583f08cb1f814a1b65b2bd02e8ed2ddc 100644
--- a/tools/winapi_check/winapi_parser.pm
+++ b/tools/winapi_check/winapi_parser.pm
@@ -46,7 +46,7 @@ sub parse_c_file {
 	    }
 	}
 
-	$statements = "";
+	$statements = undef;
     };
     my $function_end = sub {
 	&$function_found_callback($line_number,$debug_channels,$documentation,$linkage,$return_type,
@@ -55,6 +55,7 @@ sub parse_c_file {
 	$function = "";
     };
     my %regs_entrypoints;
+    my @comment_lines = ();
     my @comments = ();
     my $level = 0;
     my $extern_c = 0;
@@ -72,11 +73,11 @@ sub parse_c_file {
 	    if($lookahead) {
 		$lookahead = 0;
 		$_ .= "\n" . $line;
+		$lookahead_count++;
 	    } else {
 		$_ = $line;
 		$lookahead_count = 0;
 	    }
-	    $lookahead_count++;
 	    print " $level($lookahead_count): $line\n" if $options->debug >= 2;
 	    print "*** $_\n" if $options->debug >= 3;
 	} else {
@@ -91,7 +92,12 @@ sub parse_c_file {
 	}
       
 	# remove C comments
-	if(s/^(.*?)(\/\*.*?\*\/)(.*)$/$1 $3/s) { push @comments, $2; $again = 1; next }
+	if(s/^(.*?)(\/\*.*?\*\/)(.*)$/$1 $3/s) { 
+	    push @comment_lines, $.; 
+	    push @comments, $2; 
+	    $again = 1; 
+	    next;
+	}
 	if(/^(.*?)\/\*/s) {
 	    $lookahead = 1;
 	    next;
@@ -126,6 +132,7 @@ sub parse_c_file {
 	    next; 
 	}
 
+	my $documentation_line;
 	my $documentation;
 	my @argument_documentations = ();
 	{
@@ -137,7 +144,11 @@ sub parse_c_file {
 	    }
 
 	    if(defined($comments[$n]) && $n >= 0) {
+		my @lines = split(/\n/, $comments[$n]);
+
+		$documentation_line = $comment_lines[$n] - scalar(@lines) + 1;
 		$documentation = $comments[$n];
+
 		for(my $m=$n+1; $m <= $#comments; $m++) {
 		    if($comments[$m] =~ /^\/\*\*+\/$/ ||
 		       $comments[$m] =~ /^\/\*\s*(?:\!)?defined/) # FIXME: Kludge
@@ -211,6 +222,10 @@ sub parse_c_file {
 		}
 	    }
 
+	    if(!defined($statements)) {
+		$statements = "";
+	    }
+
 	    if($line !~ /^\s*$/) {
 		$statements .= "$line\n";
 	    }
@@ -223,10 +238,14 @@ sub parse_c_file {
             ((__cdecl|__stdcall|CDECL|VFWAPIV|VFWAPI|WINAPIV|WINAPI|CALLBACK)\s+)?
 	    (\w+(\(\w+\))?)\s*\(([^\)]*)\)\s*(\{|\;)/sx)
         {
-	    $line_number = $. - $lookahead_count;
+	    my @lines = split(/\n/, $&);
+	    my $function_line = $. - scalar(@lines) + 1;
+
+	    # FIXME: Should be separate for documentation and function
+	    $line_number = $documentation_line;
 
 	    $_ = $'; $again = 1;
-	    
+
 	    if($11 eq "{")  {
 		$level++;
 	    }