diff --git a/tools/winapi/tests.dat b/tools/winapi/tests.dat
index c1698b293df3bf17a61575e0801479555b4df273..cd43541d4733314d0bba61c23ba3b8b42f4b6815 100644
--- a/tools/winapi/tests.dat
+++ b/tools/winapi/tests.dat
@@ -37,8 +37,8 @@ COLORADJUSTMENT
 # DEVMODEA
 # DEVMODEW
 DIBSECTION
-DISPLAY_DEVICEA
-DISPLAY_DEVICEW
+DISPLAY_DEVICEA: !DeviceID !DeviceKey
+DISPLAY_DEVICEW: !DeviceID !DeviceKey
 DOCINFOA
 DOCINFOW
 EMR
@@ -47,8 +47,8 @@ EMRANGLEARC
 EMRARC
 EMRBITBLT
 EMRCREATEBRUSHINDIRECT
-EMRCREATECOLORSPACE
-EMRCREATECOLORSPACEW
+# EMRCREATECOLORSPACE
+# EMRCREATECOLORSPACEW
 EMRCREATEDIBPATTERNBRUSHPT
 EMRCREATEMONOBRUSH
 # EMRCREATEPALETTE
@@ -91,18 +91,18 @@ EMRSETARCDIRECTION
 EMRSETBKCOLOR
 EMRSETBRUSHORGEX
 EMRSETCOLORADJUSTMENT
-EMRSETDIBITSTODEIVCE
+EMRSETDIBITSTODEVICE
 EMRSETMAPPERFLAGS
 EMRSETMITERLIMIT
 # EMRSETPALETTEENTRIES
 EMRSETPIXELV
-EMRSETTEXTJUSTIFICATION
+# EMRSETTEXTJUSTIFICATION
 EMRSETVIEWPORTEXTEX
 EMRSETWORLDTRANSFORM
 EMRSTRETCHBLT
 EMRSTRETCHDIBITS
 EMRTEXT
-ENHMETAHEADER
+ENHMETAHEADER: !szlMicrometers
 ENHMETARECORD
 ENUMLOGFONTA
 ENUMLOGFONTEXA
@@ -197,8 +197,8 @@ LOAD_DLL_DEBUG_INFO
 MEMORYSTATUS
 OFSTRUCT
 OSVERSIONINFOA
-OSVERSIONINFOEXA
-OSVERSIONINFOEXW
+OSVERSIONINFOEXA: !wSuiteMask !wProductType !wReserved
+OSVERSIONINFOEXW: !wSuiteMask !wProductType !wReserved
 OSVERSIONINFOW
 OUTPUT_DEBUG_STRING_INFO
 OVERLAPPED
@@ -270,7 +270,7 @@ IMAGE_NT_HEADERS
 IMAGE_OPTIONAL_HEADER
 IMAGE_OS2_HEADER
 # IMAGE_RELOCATION
-IMAGE_RESOURCE_DATA_ENTRY
+IMAGE_RESOURCE_DATA_ENTRY: !ResourceHandle
 IMAGE_RESOURCE_DIRECTORY
 IMAGE_RESOURCE_DIRECTORY_ENTRY
 IMAGE_RESOURCE_DIRECTORY_STRING
@@ -408,7 +408,7 @@ STYLESTRUCT
 TOGGLEKEYS
 TPMPARAMS
 TRACKMOUSEEVENT
-WINDOWINFO
+WINDOWINFO: !dwWindowStatus
 # WINDOWPLACEMENT
 WINDOWPOS
 WNDCLASSA
diff --git a/tools/winapi/winapi_test b/tools/winapi/winapi_test
index 81d1d4654cd320a1114f2571a5be7d9cf7cae817..c2c7f66caff71eba4791db4d5b5aef350ee6c713 100755
--- a/tools/winapi/winapi_test
+++ b/tools/winapi/winapi_test
@@ -386,9 +386,11 @@ sub output_header {
 	}
     }
     print OUT " */\n";
-
     print OUT "\n";
+
     print OUT "#define WINVER 0x0501\n";
+    print OUT "#define _WIN32_WINNT 0x0501\n";
+    print OUT "\n";
     print OUT "#define WINE_NOWINSOCK\n";
     print OUT "\n";
     foreach my $test (@tests) {
@@ -401,6 +403,15 @@ sub output_header {
     print OUT "#include \"wine/test.h\"\n";
     print OUT "\n";
 
+    print OUT "/***********************************************************************\n";
+    print OUT " * Compability macros\n";
+    print OUT " */\n";
+    print OUT "\n";
+    print OUT "#define DWORD_PTR UINT_PTR\n";
+    print OUT "#define LONG_PTR INT_PTR\n";
+    print OUT "#define ULONG_PTR UINT_PTR\n";
+    print OUT "\n";
+
     print OUT "/***********************************************************************\n";
     print OUT " * Windows API extension\n";
     print OUT " */\n";
@@ -469,6 +480,65 @@ sub output_footer {
     print OUT "}\n";
 }
 
+########################################################################
+# output_test_pack_type
+
+sub output_test_pack_type {
+    local *OUT = shift;
+
+    my $types = shift;
+    my $type_name = shift;
+    my $type = shift;
+
+    my $type_align = $type->align;
+    my $type_pack = $type->pack;
+    my $type_size = $type->size;
+    
+    print OUT "    /* $type_name (pack $type_pack) */\n";
+    if (defined($type_align) && defined($type_size)) {
+	print OUT "    TEST_TYPE($type_name, $type_size, $type_align);\n";
+    }
+}
+    
+sub output_test_pack_fields {
+    local *OUT = shift;
+
+    my $types = shift;
+    my $type_name = shift;
+    my $type = shift;
+    my $offset = shift;
+    my $optional_field = shift;
+
+    foreach my $field ($type->fields()) {
+	my $field_type_name = $field->type_name;
+	my $field_name = $field->name;
+	my $field_size = $field->size;
+	my $field_offset = $field->offset;
+	my $field_align = $field->align;
+
+	next if $field_name eq "" || (defined($field_size) && $field_size < 0);
+
+	if ($$optional_field{$field_name}) {
+	    # Nothing
+	} elsif (defined($field_size) && defined($field_offset)) {
+	    $field_offset += $offset;
+	    if ($field_name eq "DUMMYSTRUCTNAME") {
+		print OUT "#ifdef NONAMELESSSTRUCT\n";
+		print OUT "    TEST_FIELD($type_name, $field_type_name, $field_name, ";
+		print OUT "$field_offset, $field_size, $field_align);\n";
+		print OUT "#else\n";
+		output_test_pack_fields(\*OUT, $types, $type_name, $$types{$field_type_name}, $field_offset, $optional_field);	
+		print OUT "#endif\n";
+	    } else {
+		print OUT "    TEST_FIELD($type_name, $field_type_name, $field_name, ";
+		print OUT "$field_offset, $field_size, $field_align);\n";
+	    }
+	} else {
+	    $output->write("$type_name: $field_type_name: $field_name: test not generated (offset not defined)\n");
+	}
+    }
+}
+
 ########################################################################
 # output_test_pack
 
@@ -483,51 +553,50 @@ sub output_test_pack {
 
     my %type_name_not_used;
 
-    foreach my $type_name (@type_names) {
+    foreach my $_type_name (@type_names) {
+	my $type_name = $_type_name;
+
+	$type_name =~ s/:.*?$//;
 	$type_name_not_used{$type_name} = 1;
     }
 
     foreach my $header (@headers) {
 	my $types = $file2types{"include/$header"};
 	
-	foreach my $type_name (@type_names) {
+	foreach my $_type_name (@type_names) {
+	    my $type_name = $_type_name;
+
+	    my %optional_field = ();
+	    if ($type_name =~ s/:\s*(.*?)$//) {
+		my @fields = split /\s+/, $1;
+		foreach my $field (@fields) {
+		    if ($field =~ s/^!//) {
+			$optional_field{$field}++;
+		    }
+		}
+	    } 
+
 	    my $type = $$types{$type_name};
 	    if (!defined($type)) {
 		next;
 	    }
 	    $type_name_not_used{$type_name} = 0;
 
-	    my $type_align = $type->align;
-	    my $type_pack = $type->pack;
-	    my $type_size = $type->size;
-
-	    print OUT "    /* $type_name (pack $type_pack) */\n";
-	    if (defined($type_align) && defined($type_size)) {
-		print OUT "    TEST_TYPE($type_name, $type_size, $type_align);\n";
-	    }
-
-	    foreach my $field ($type->fields()) {
-		my $field_type_name = $field->type_name;
-		my $field_name = $field->name;
-		my $field_size = $field->size;
-		my $field_offset = $field->offset;
-		my $field_align = $field->align;
-
-		next if $field_name eq "" || (defined($field_size) && $field_size < 0);
-
-		if (defined($field_size) && defined($field_offset)) {
-		    print OUT "    TEST_FIELD($type_name, $field_type_name, $field_name, $field_offset, $field_size, $field_align);\n";
-		} else {
-		    $output->write("$type_name: $field_type_name: $field_name: test not generated (offset not defined)\n");
-		}
+	    if (!scalar(keys(%optional_field))) {
+		output_test_pack_type(\*OUT, $types, $type_name, $type);
+	    } else {
+		print OUT "    /* $type_name */\n";
 	    }
+	    output_test_pack_fields(\*OUT, $types, $type_name, $type, 0, \%optional_field);
 	    print OUT "\n";
 	}
     }
 
-    foreach my $type_name (@type_names) {
+    foreach my $_type_name (@type_names) {
+	my $type_name = $_type_name;
+	$type_name =~ s/:.*?$//;
 	if ($type_name_not_used{$type_name}) {
-	    $output->write("$test_dir: $test: $type_name: type not found (ignored)\n");
+	    # $output->write("$test_dir: $test: $type_name: type not found (ignored)\n");
 	}
     }
 }
@@ -559,6 +628,8 @@ sub output_file {
     }
 
     output_footer(\*OUT, $test_dir, \@tests);
+
+    return 1;
 }
 
 ########################################################################