Several additions and bug fixes.

diff --git a/tools/winapi/config.pm b/tools/winapi/config.pm
index 9b46378..6e7aa8e 100644
--- a/tools/winapi/config.pm
+++ b/tools/winapi/config.pm
@@ -12,7 +12,7 @@
     &file_absolutize &file_normalize
     &file_type &files_filter
     &file_skip &files_skip 
-    &get_spec_files
+    &get_c_files &get_h_files &get_spec_files
 );
 @EXPORT_OK = qw(
     $current_dir $wine_dir $winapi_dir $winapi_check_dir
@@ -98,20 +98,27 @@
     return $_;
 }
 
-sub get_spec_files {
-    $output->progress("$wine_dir: searching for *.spec");
+sub _get_files {
+    my $extension = shift;
+    my $type = shift;
 
-    my @spec_files = map {
+    $output->progress("$wine_dir: searching for *.$extension");
+
+    my @files = map {
 	s%^\./%%;
 	s%^$wine_dir/%%;
-	if(file_type($_) eq "winelib") {
+	if(file_type($_) eq $type) {
 	    $_;
 	} else {
 	    ();
 	}
-    } split(/\n/, `find $wine_dir -name \\*.spec`);
+    } split(/\n/, `find $wine_dir -name \\*.$extension`);
 
-    return @spec_files;
+    return @files;
 }
 
+sub get_c_files { return _get_files("c", @_); }
+sub get_h_files { return _get_files("h", @_); }
+sub get_spec_files { return _get_files("spec", @_); }
+
 1;
diff --git a/tools/winapi/output.pm b/tools/winapi/output.pm
index 6234d6c..1b46172 100644
--- a/tools/winapi/output.pm
+++ b/tools/winapi/output.pm
@@ -34,11 +34,13 @@
 
     my $progress = \${$self->{PROGRESS}};
     my $last_progress = \${$self->{LAST_PROGRESS}};
+    my $last_time = \${$self->{LAST_TIME}};
     my $progress_count = \${$self->{PROGRESS_COUNT}};
     my $prefix = \${$self->{PREFIX}};
 
     $$progress = "";
     $$last_progress = "";
+    $$last_time = 0;
     $$progress_count = 0;
     $$prefix = "";
 
@@ -107,10 +109,26 @@
 sub progress {
     my $self = shift;
     my $progress = \${$self->{PROGRESS}};
+    my $last_time = \${$self->{LAST_TIME}};
 
     $$progress = shift;
 
     $self->update_progress;
+    $$last_time = 0;
+}
+
+sub lazy_progress {
+    my $self = shift;
+    my $progress = \${$self->{PROGRESS}};
+    my $last_time = \${$self->{LAST_TIME}};
+
+    $$progress = shift;
+
+    my $time = time();
+    if($time - $$last_time > 0) {
+	$self->update_progress;
+    	$$last_time = $time;
+    }
 }
 
 sub prefix {
diff --git a/tools/winapi/setup.pm b/tools/winapi/setup.pm
index 15d2e16..9c0961f 100644
--- a/tools/winapi/setup.pm
+++ b/tools/winapi/setup.pm
@@ -50,9 +50,7 @@
 	exit 1;
     }
 
-    push @INC, ($winapi_check_dir, $winapi_dir) if $tool eq "winapi_check";
-    push @INC, ($winapi_dir, $winapi_check_dir) if $tool eq "winapi_extract";
-    push @INC, ($winapi_dir, $winapi_check_dir) if $tool eq "winapi_fixup";
+    push @INC, ($winapi_dir, $winapi_check_dir);
 }
 
 1;
diff --git a/tools/winapi/winapi_extract b/tools/winapi/winapi_extract
index 981a4b4..3680bdb 100755
--- a/tools/winapi/winapi_extract
+++ b/tools/winapi/winapi_extract
@@ -55,7 +55,7 @@
 {
     local $_;
 
-    foreach my $spec_file (get_spec_files) {
+    foreach my $spec_file (get_spec_files("winelib")) {
 	my $module;
 	my $type;
 
@@ -177,13 +177,15 @@
     }
 }
 
-my @files = files_skip($options->c_files);
+my @c_files = $options->c_files;
+@c_files = files_skip(@c_files);
+@c_files = files_filter("winelib", @c_files);
 
 my $progress_output;
 my $progress_current = 0;
-my $progress_max = scalar(@files);
+my $progress_max = scalar(@c_files);
 
-foreach my $file (@files) {
+foreach my $file (@c_files) {
     my %functions;
 
     $progress_current++;