--- a/unac/builder.in
+++ b/unac/builder.in
@@ -341,36 +341,50 @@
 		@values = ();
 	    }
 	    $code_value = uc(sprintf("%04x", $code_value));
+            #print "$code_value UNAC ";
 	    if(exists($decomposition->{$code_value})) {
 		push(@values, $decomposition->{$code_value});
+                #print "$decomposition->{$code_value} ";
 	    } else {
 		push(@values, "FFFF");
+                #print "FFFF ";
 	    }
-	    # We also push the case-folded version of the unaccented char
-	    # Note that by pushing the case-folded version of the original
-	    # char, we'd have the possibility of independant unaccenting and
-	    # case folding, but with less performance. 
-	    # We could also keep the three chunks, using a little more memory
+	    # We push both the case-folded version of the unaccented char
+            # and the case-folded version of the original one. This
+            # makes the table a little bigger, but allows
+            # independantly unaccenting, folding or both
+            #print "UNACFOLD ";
 	    if(exists($decomposition->{$code_value})) {
 	      my($cv);
 	      my(@vl);
 	      foreach $cv (split(' ', $decomposition->{$code_value})) {
 		if(exists($casefold->{$cv})) {
 		  push(@vl, $casefold->{$cv});
+                  #print "$casefold->{$cv} ";
 		} else {
 		  push(@vl, $cv);
+                  #print "$cv ";
 		}
 	      }
-	      #print STDERR "Pushing " . join(" ", @vl) . " for " . 
-	      #$code_value . "\n";
 	      push(@values, join(" ", @vl));
 	    } else {
 	      if(exists($casefold->{$code_value})) {
 		push(@values, $casefold->{$code_value});
+                #print "$casefold->{$code_value} ";
 	      } else {
 		push(@values, "FFFF");
+                #print "FFFF ";
 	      }
 	    }
+            #print "FOLD ";
+            if(exists($casefold->{$code_value})) {
+                push(@values, $casefold->{$code_value});
+                #print "$casefold->{$code_value} ";
+            } else {
+		push(@values, "FFFF");
+                #print "FFFF ";
+            }
+            #print "\n";
 	}
 	print STDERR scalar(@blocks) . " blocks of " . $block_count . " entries, factorized $duplicate blocks\n\t" if($verbose);
 	my($block_size) = 0;
@@ -466,7 +480,7 @@
 	$block_number++;
     }
     my($position_type) = $highest_position >= 256 ? "short" : "char";
-    my($positions_out) = "unsigned $position_type unac_positions[UNAC_BLOCK_COUNT][2*UNAC_BLOCK_SIZE + 1] = {\n";
+    my($positions_out) = "unsigned $position_type unac_positions[UNAC_BLOCK_COUNT][3*UNAC_BLOCK_SIZE + 1] = {\n";
 
     $positions_out .= join(",\n", @positions_out);
     $positions_out .= "\n};\n";
@@ -481,7 +495,7 @@
     my($declarations);
     $declarations = <<EOF;
 extern unsigned short unac_indexes[UNAC_INDEXES_SIZE];
-extern unsigned $position_type unac_positions[UNAC_BLOCK_COUNT][2*UNAC_BLOCK_SIZE + 1];
+extern unsigned $position_type unac_positions[UNAC_BLOCK_COUNT][3*UNAC_BLOCK_SIZE + 1];
 extern unsigned short* unac_data_table[UNAC_BLOCK_COUNT];
 EOF
     for($block_number = 0; $block_number < $block_count; $block_number++) {