--- amavisd.orig	2011-08-12 14:40:59.235057825 -0300
+++ amavisd	2011-08-12 17:21:22.464656638 -0300
@@ -7052,7 +7052,7 @@
 }
 
 sub new     # NOTE: this class is a list for historical reasons, not a hash
-  { my($class) = @_; bless [(undef) x 41], $class }
+  { my($class) = @_; bless [(undef) x 42], $class }
 
 # subs to set or access individual elements of a n-tuple by name
 sub recip_addr       # unquoted recipient envelope e-mail address
@@ -7138,6 +7138,8 @@
   { my $self=shift; !@_ ? $$self[39] : ($$self[39]=shift) }
 sub spam_summary    # SA summary of tests hit for standard body reports
   { my $self=shift; !@_ ? $$self[40] : ($$self[40]=shift) }
+sub required_score  # SA personal required score
+  { my $self=shift; !@_ ? $$self[41] : ($$self[41]=shift) }
 
 sub recip_final_addr {  # return recip_addr_modified if set, else recip_addr
   my $self = shift;
@@ -7392,6 +7394,8 @@
   { my $self=shift; !@_ ? $self->{spam_report} :($self->{spam_report}=shift)}
 sub spam_summary    # SA summary of tests hit for standard body reports
   { my $self=shift; !@_ ? $self->{spam_summary}:($self->{spam_summary}=shift)}
+sub required_score    # SA summary of tests hit for standard body reports
+  { my $self=shift; !@_ ? $self->{required_score}:($self->{required_score}=shift)}
 
 # new style of providing additional information from checkers
 sub supplementary_info {  # holds a hash of tag/value pairs, such as SA get_tag
@@ -12460,7 +12464,9 @@
       my($bypassed) = $r->bypass_spam_checks;
       if (!$bypassed) {
         $tag_level  = lookup2(0,$recip, ca('spam_tag_level_maps'));
-        $tag2_level = lookup2(0,$recip, ca('spam_tag2_level_maps'));
+        $tag2_level = defined $r->required_score
+          ? $r->required_score
+	  : lookup2(0,$recip, ca('spam_tag2_level_maps'));
         $tag3_level = lookup2(0,$recip, ca('spam_tag3_level_maps'));
         $kill_level = lookup2(0,$recip, ca('spam_kill_level_maps'));
       }
@@ -13108,7 +13114,9 @@
         my($tag_level,$tag2_level,$kill_level);
         if (!$r->bypass_spam_checks) {
           $tag_level  = lookup2(0,$recip, ca('spam_tag_level_maps'));
-          $tag2_level = lookup2(0,$recip, ca('spam_tag2_level_maps'));
+          $tag2_level = defined $r->required_score
+            ? $r->required_score
+	    : lookup2(0,$recip, ca('spam_tag2_level_maps'));
           $kill_level = lookup2(0,$recip, ca('spam_kill_level_maps'));
         }
         my($is_local) = $r->recip_is_local;
@@ -13722,7 +13730,9 @@
     my($tag_level,$tag2_level,$subject_tag);
     if ($extra_code_antispam && !$bypassed) {
       $tag_level  = lookup2(0,$recip, ca('spam_tag_level_maps'));
-      $tag2_level = lookup2(0,$recip, ca('spam_tag2_level_maps'));
+      $tag2_level = defined $r->required_score
+        ? $r->required_score
+	: lookup2(0,$recip, ca('spam_tag2_level_maps'));
     }
     if ($is_local) {   #  || c('warn_offsite')
       my(@subj_maps_pairs) = $r->setting_by_main_contents_category_all(
@@ -14472,7 +14482,9 @@
     if (!$r->bypass_spam_checks && ($do_tag || $do_tag2 || $do_kill)) {
       # do the more expensive lookups only when needed
       $tag_level  = lookup2(0,$rec, ca('spam_tag_level_maps'));
-      $tag2_level = lookup2(0,$rec, ca('spam_tag2_level_maps'));
+      $tag2_level = defined $r->required_score
+        ? $r->required_score
+	: lookup2(0,$rec, ca('spam_tag2_level_maps'));
       $kill_level = lookup2(0,$rec, ca('spam_kill_level_maps'));
     }
     # summarize
@@ -25103,14 +25115,17 @@
       section_time($which_section);
 
       $which_section = 'SA collect';
-      my($spam_level,$spam_report,$spam_summary,%supplementary_info);
+      my($spam_level,$spam_report,$spam_summary,$required_score,
+        %supplementary_info);
       { local($1,$2,$3,$4,$5,$6);  # avoid Perl 5.8.x taint bug
         if ($sa_version_num < 3) {
           $spam_level = $per_msg_status->get_hits;
+	  $required_score = $per_msg_status->get_required_score;
           $supplementary_info{'TESTSSCORES'} = $supplementary_info{'TESTS'} =
             $per_msg_status->get_names_of_tests_hit;
         } else {
           $spam_level = $per_msg_status->get_score;
+	  $required_score = $per_msg_status->get_required_score;
           for my $t (qw(TESTS TESTSSCORES ADDEDHEADERHAM ADDEDHEADERSPAM
                         AUTOLEARN AUTOLEARNSCORE SC SCRULE SCTYPE
                         LANGUAGES RELAYCOUNTRY ASN ASNCIDR DCCB DCCR DCCREP
@@ -25150,6 +25165,7 @@
         recip_ind_list => $rind_list, user_config => $uconf,
         spam_level => $spam_level,
         spam_report => $spam_report, spam_summary => $spam_summary,
+	required_score => $required_score,
         supplementary_info => \%supplementary_info,
       });
     }
@@ -25181,7 +25197,8 @@
   $self->{initialized_stage} == 4
     or die "Wrong initialization sequence: " . $self->{initialized_stage};
   my($which_section); my($prefix) = '';
-  my($spam_level,$sa_tests,$spam_report,$spam_summary,$supplementary_info_ref);
+  my($spam_level,$sa_tests,$spam_report,$spam_summary,$required_score,
+    $supplementary_info_ref);
   my($fh) = $msginfo->mail_text;
   my($hdr_edits) = $msginfo->header_edits;
   my($score_factor) = $self->{options}->{'score_factor'};
@@ -25271,6 +25288,7 @@
       my($uconf) = $h->{user_config};
       $spam_level = $h->{spam_level};
       $spam_report = $h->{spam_report}; $spam_summary = $h->{spam_summary};
+      $required_score = defined $h->{required_score} ? $h->{required_score} : undef;
       $supplementary_info_ref = $h->{supplementary_info};
       $supplementary_info_ref = {}  if !$supplementary_info_ref;
       $sa_tests = $supplementary_info_ref->{'TESTSSCORES'};
@@ -25297,6 +25315,7 @@
       for my $r (@r_list) {
         $r->spam_level( ($r->spam_level || 0) + $spam_level );
         $r->spam_report($spam_report); $r->spam_summary($spam_summary);
+        $r->required_score($required_score);
         if (!defined($r->spam_tests)) {
           $r->spam_tests([ \$sa_tests ]);
         } else {
