promotions validated

git-svn-id: https://svn.apache.org/repos/asf/spamassassin/tags/sa-update_3.4.1_20150601085032@1682837 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/Changes b/Changes
index c7672c5..7fe7eac 100644
--- a/Changes
+++ b/Changes
@@ -1,293 +1,4 @@
 ------------------------------------------------------------------------
-r1675890 | jquinn | 2015-04-24 15:35:28 +0000 (Fri, 24 Apr 2015) | 1 line
- 
- moved EXCUSE_24 to sandbox so it uses AI scoring
-------------------------------------------------------------------------
-r1675688 | jquinn | 2015-04-23 17:41:42 +0000 (Thu, 23 Apr 2015) | 1 line
- 
- Rules file for TxRep
-------------------------------------------------------------------------
-r1675031 | axb | 2015-04-21 05:53:26 +0000 (Tue, 21 Apr 2015) | 3 lines
- 
- # lowered from 1.3 to 0.5 till MS comes to it's senses
- score RCVD_ILLEGAL_IP 0.5
- 
-------------------------------------------------------------------------
-r1674963 | kmcgrail | 2015-04-20 19:14:21 +0000 (Mon, 20 Apr 2015) | 1 
-line
- 
- switch gpg command line to verbose for greater ubiquity accross versions
-------------------------------------------------------------------------
-r1674350 | mmartinec | 2015-04-17 16:31:57 +0000 (Fri, 17 Apr 2015) | 1 
-line
- 
- 3.4.1.txt: more edits, keep most lines under 72 characters
-------------------------------------------------------------------------
-r1674208 | kmcgrail | 2015-04-17 04:45:52 +0000 (Fri, 17 Apr 2015) | 1 
-line
- 
- more tweaks on the announcement
-------------------------------------------------------------------------
-r1674207 | kmcgrail | 2015-04-17 04:42:25 +0000 (Fri, 17 Apr 2015) | 1 
-line
- 
- More preparations for 3.4.1
-------------------------------------------------------------------------
-r1674199 | kmcgrail | 2015-04-17 03:45:42 +0000 (Fri, 17 Apr 2015) | 1 
-line
- 
- 3.4.0-rc2 RELEASED
-------------------------------------------------------------------------
-r1674192 | kmcgrail | 2015-04-17 02:45:28 +0000 (Fri, 17 Apr 2015) | 1 
-line
- 
- preparing to release 3.4.1-rc2
-------------------------------------------------------------------------
-r1674037 | kmcgrail | 2015-04-16 10:26:10 +0000 (Thu, 16 Apr 2015) | 1 
-line
- 
- Might as well test the real rule
-------------------------------------------------------------------------
-r1674036 | kmcgrail | 2015-04-16 10:21:55 +0000 (Thu, 16 Apr 2015) | 1 
-line
- 
- Working on Jenkins issue - Believe it might be a plugin requirement
-------------------------------------------------------------------------
-r1674014 | axb | 2015-04-16 08:09:03 +0000 (Thu, 16 Apr 2015) | 1 line
- 
- added uri_detail      AXB_URIDETAIL_TEST rule to test test/build failure
-------------------------------------------------------------------------
-r1673960 | kmcgrail | 2015-04-15 21:08:32 +0000 (Wed, 15 Apr 2015) | 1 
-line
- 
- Added a debug for tvd_vertical_words
-------------------------------------------------------------------------
-r1673799 | mmartinec | 2015-04-15 14:55:52 +0000 (Wed, 15 Apr 2015) | 1 
-line
- 
- documentation of "perl_version" (wrong version, wrapped long lines)
-------------------------------------------------------------------------
-r1673763 | mmartinec | 2015-04-15 13:43:41 +0000 (Wed, 15 Apr 2015) | 1 
-line
- 
- more 3.4.1-rc2.txt edits
-------------------------------------------------------------------------
-r1673756 | mmartinec | 2015-04-15 13:22:47 +0000 (Wed, 15 Apr 2015) | 1 
-line
- 
- more 3.4.1-rc2.txt edits
-------------------------------------------------------------------------
-r1673598 | mmartinec | 2015-04-15 01:03:04 +0000 (Wed, 15 Apr 2015) | 1 
-line
- 
- more 3.4.1-rc2.txt editing
-------------------------------------------------------------------------
-r1673441 | mmartinec | 2015-04-14 15:17:56 +0000 (Tue, 14 Apr 2015) | 1 
-line
- 
- fiddling with 3.4.1-rc2.txt
-------------------------------------------------------------------------
-r1673434 | mmartinec | 2015-04-14 14:24:02 +0000 (Tue, 14 Apr 2015) | 1 
-line
- 
- normalize_charset: decode as GBK if decoder for GB18030 is unavailable
-------------------------------------------------------------------------
-r1673348 | kmcgrail | 2015-04-14 03:48:28 +0000 (Tue, 14 Apr 2015) | 1 
-line
- 
- reversing purposeful break in Conf.pm - Bug 7166
-------------------------------------------------------------------------
-r1673341 | kmcgrail | 2015-04-14 02:36:36 +0000 (Tue, 14 Apr 2015) | 1 
-line
- 
- purposefully breaking the TLD list along with MANIFEST change which I 
-believe will fix bug 7166
-------------------------------------------------------------------------
-r1673335 | mmartinec | 2015-04-14 01:45:03 +0000 (Tue, 14 Apr 2015) | 1 
-line
- 
- Bug 6751: added a unit test
-------------------------------------------------------------------------
-r1673334 | kmcgrail | 2015-04-14 01:44:09 +0000 (Tue, 14 Apr 2015) | 1 
-line
- 
- fixing MANIFEST and powered by
-------------------------------------------------------------------------
-r1673327 | kmcgrail | 2015-04-14 00:57:29 +0000 (Tue, 14 Apr 2015) | 1 
-line
- 
- Adding Powered by SpamAssassin Logo
-------------------------------------------------------------------------
-r1673314 | mmartinec | 2015-04-13 23:39:29 +0000 (Mon, 13 Apr 2015) | 1 
-line
- 
- Bug 7144c9: make it possible to also turn off normalize_charset
-------------------------------------------------------------------------
-r1673266 | jquinn | 2015-04-13 20:04:30 +0000 (Mon, 13 Apr 2015) | 1 line
- 
- added normalize_charset 1 commented out in local.cf, and a note in 
-UPGRADE recommending uncommenting it
-------------------------------------------------------------------------
-r1673243 | jquinn | 2015-04-13 17:23:05 +0000 (Mon, 13 Apr 2015) | 1 line
- 
- UPGRADE and README updates for 3.4.1 release and some missed stuff in 
-3.4.0 release
-------------------------------------------------------------------------
-r1673195 | jquinn | 2015-04-13 13:55:47 +0000 (Mon, 13 Apr 2015) | 1 line
- 
- Added notes about culling old txrep data
-------------------------------------------------------------------------
-r1672441 | kmcgrail | 2015-04-09 18:23:42 +0000 (Thu, 09 Apr 2015) | 1 
-line
- 
- reversed my change on the deprecated function and cleaned up UPGRADE for 
-RegistrarBoundaries impending removal - Bug 7170
-------------------------------------------------------------------------
-r1672426 | kmcgrail | 2015-04-09 17:16:40 +0000 (Thu, 09 Apr 2015) | 1 
-line
- 
- Fixing M:S:Util for RegistrarBoundaries move to Registry and some 
-cleanup on docs for deprecation - bug 7170
-------------------------------------------------------------------------
-r1672316 | mmartinec | 2015-04-09 12:35:52 +0000 (Thu, 09 Apr 2015) | 1 
-line
- 
- Bug 7166: removed domain .tp from hard-coded default in Conf.pm, removed 
-debug output from t/uri_text.t
-------------------------------------------------------------------------
-r1672275 | mmartinec | 2015-04-09 09:37:13 +0000 (Thu, 09 Apr 2015) | 1 
-line
- 
- t/uri_text.t: more jenkins debugging
-------------------------------------------------------------------------
-r1672227 | mmartinec | 2015-04-09 01:17:13 +0000 (Thu, 09 Apr 2015) | 1 
-line
- 
- Bug 7101: Received.pm: United Internet changed the way they indicate 
-authenticated HTTP submitted mail
-------------------------------------------------------------------------
-r1672226 | mmartinec | 2015-04-08 23:53:06 +0000 (Wed, 08 Apr 2015) | 1 
-line
- 
- Bug 7166: added debug for clear_util_rb config option, reverted 
-r1672188, added missing backquotes for dots in regexps in t/uri_text.t, 
-enabled debugging in t/uri_text.t to see what is going on in jenkins
-------------------------------------------------------------------------
-r1672193 | kmcgrail | 2015-04-08 21:33:51 +0000 (Wed, 08 Apr 2015) | 1 
-line
- 
- Bug 7167 case insentive change for NAME_EMAIL_DIFF
-------------------------------------------------------------------------
-r1672188 | kmcgrail | 2015-04-08 21:25:39 +0000 (Wed, 08 Apr 2015) | 1 
-line
- 
- working on bug 7166 and trying to resolve .tp failures in uri_text.t
-------------------------------------------------------------------------
-r1672159 | jquinn | 2015-04-08 20:08:20 +0000 (Wed, 08 Apr 2015) | 1 line
- 
- added debug output for loaded TLDs, to debug the Jenkins .tp issue
-------------------------------------------------------------------------
-r1672136 | mmartinec | 2015-04-08 18:38:30 +0000 (Wed, 08 Apr 2015) | 1 
-line
- 
- Plugin::PDFInfo: xt/60_perlcritic.t - Variable declared in conditional 
-statement at line 335
-------------------------------------------------------------------------
-r1672078 | hege | 2015-04-08 12:37:34 +0000 (Wed, 08 Apr 2015) | 2 lines
- 
- Bug 6782: Fix tld handling bug from main commit
- 
-------------------------------------------------------------------------
-r1672036 | axb | 2015-04-08 09:01:57 +0000 (Wed, 08 Apr 2015) | 7 lines
- 
- disabled masscheck bloat
- rulesrc/sandbox/khopesh/20_khop_sc_bug_6114.cf (17 rules, 4 bad):
- 
-   KHOP_SC_CIDR16:  no hits at all
-   KHOP_SC_CIDR24:  no hits at all
-   KHOP_SPAMHAUS_DROP:  no hits at all
-   KHOP_SPAMHAUS_DROP_LE:  no hits at all
-------------------------------------------------------------------------
-r1672024 | kmcgrail | 2015-04-08 07:53:34 +0000 (Wed, 08 Apr 2015) | 1 
-line
- 
- Adding ceiling of 2.0 for FILL_THIS_FORM_LOAN for ruleqa
-------------------------------------------------------------------------
-r1672019 | kmcgrail | 2015-04-08 07:42:13 +0000 (Wed, 08 Apr 2015) | 1 
-line
- 
- change for insert for MySQL Bayesstore on 4/8/2015
-------------------------------------------------------------------------
-r1671850 | kmcgrail | 2015-04-07 13:54:37 +0000 (Tue, 07 Apr 2015) | 1 
-line
- 
- removing livejournal.com from 2TLD bug 6662
-------------------------------------------------------------------------
-r1671681 | kmcgrail | 2015-04-06 20:04:30 +0000 (Mon, 06 Apr 2015) | 1 
-line
- 
- more preparation for 3.4.1 with TLD updates
-------------------------------------------------------------------------
-r1671621 | jquinn | 2015-04-06 17:52:12 +0000 (Mon, 06 Apr 2015) | 1 line
- 
- big patch for Bug 6782 registrar boundaries in cf file
-------------------------------------------------------------------------
-r1671546 | jquinn | 2015-04-06 15:09:09 +0000 (Mon, 06 Apr 2015) | 1 line
- 
- New version of aux TLDs cf file in preparation of patch for bug 6782
-------------------------------------------------------------------------
-r1671285 | jhardin | 2015-04-04 17:42:53 +0000 (Sat, 04 Apr 2015) | 1 line
- 
- TO_IN_SUBJ tuning
-------------------------------------------------------------------------
-r1671093 | jquinn | 2015-04-03 15:47:22 +0000 (Fri, 03 Apr 2015) | 1 line
- 
- fix for nonstandard received headers from United Internet
-------------------------------------------------------------------------
-r1671082 | jquinn | 2015-04-03 14:59:51 +0000 (Fri, 03 Apr 2015) | 1 line
- 
- fix for font face starting with single space in some ham
-------------------------------------------------------------------------
-r1671073 | jquinn | 2015-04-03 14:16:04 +0000 (Fri, 03 Apr 2015) | 1 line
- 
- merged duplicate rule __SUBJECT_NEEDS_MIME
-------------------------------------------------------------------------
-r1670939 | kmcgrail | 2015-04-02 16:58:30 +0000 (Thu, 02 Apr 2015) | 1 
-line
- 
- sa-learn quiet option bug 7161
-------------------------------------------------------------------------
-r1670930 | kmcgrail | 2015-04-02 15:57:50 +0000 (Thu, 02 Apr 2015) | 1 
-line
- 
- pod updates from Mark Martinec bug 7160
-------------------------------------------------------------------------
-r1670891 | axb | 2015-04-02 11:53:16 +0000 (Thu, 02 Apr 2015) | 1 line
- 
- Easter Update
-------------------------------------------------------------------------
-r1669723 | mmartinec | 2015-03-28 00:47:46 +0000 (Sat, 28 Mar 2015) | 1 
-line
- 
- announcements/3.4.1-rc2.txt - (editing, rough, added bulk text in the 
-"New configuration options" section)
-------------------------------------------------------------------------
-r1669629 | mmartinec | 2015-03-27 17:28:37 +0000 (Fri, 27 Mar 2015) | 1 
-line
- 
- announcements/3.4.1-rc2.txt - (editing, still very rough)
-------------------------------------------------------------------------
-r1669620 | mmartinec | 2015-03-27 16:59:36 +0000 (Fri, 27 Mar 2015) | 1 
-line
- 
- announcements/3.4.1-rc2.txt - (very rough) collected notable changes 
-from Changelog
-------------------------------------------------------------------------
-r1668987 | kmcgrail | 2015-03-24 20:40:38 +0000 (Tue, 24 Mar 2015) | 1 
-line
- 
- Getting ready for 3.4.1-rc2
-------------------------------------------------------------------------
 r1668416 | axb | 2015-03-22 17:27:38 +0000 (Sun, 22 Mar 2015) | 1 line
  
  Updated TLD list - Version 2015032200, Last Updated Sun Mar 22 07:07:01 
diff --git a/MANIFEST b/MANIFEST
index edef111..e1861d2 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -142,7 +142,6 @@
 rules/v330.pre
 rules/v340.pre
 rules/v341.pre
-rules/20_aux_tlds.cf
 sa-awl.raw
 sa-check_spamd.raw
 sa-compile.raw
@@ -420,7 +419,6 @@
 t/html_colors.t
 t/html_obfu.t
 t/html_utf8.t
-t/idn_dots.t
 t/if_can.t
 t/ifversion.t
 t/ip_addrs.t
@@ -550,8 +548,3 @@
 t/uribl_all_types.t
 t/uribl_ips_only.t
 t/dnsbl_subtests.t
-powered_by/128-powered-by-spamassassin.png
-powered_by/256-powered-by-spamassassin.png
-powered_by/512-powered-by-spamassassin.png
-powered_by/LOGO_USAGE.TXT
-powered_by/powered_by_spamassassin.psd
diff --git a/README b/README
index e49f338..0eb04e5 100644
--- a/README
+++ b/README
@@ -1,70 +1,67 @@
-Welcome to Apache SpamAssassin!
--------------------------------
+Welcome to SpamAssassin!
+------------------------
 
-What Apache SpamAssassin Is
----------------------------
+What SpamAssassin Is
+--------------------
 
-Apache SpamAssassin is the #1 Open Source anti-spam platform giving
-system administrators a filter to classify email and block "spam"
-(unsolicited bulk email).  It uses a robust scoring framework and plug-ins
-to integrate a wide range of advanced heuristic and statistical analysis
-tests on email headers and body text including text analysis, Bayesian 
-filtering, DNS blocklists, and collaborative filtering databases.
+SpamAssassin is a mail filter which attempts to identify spam using
+a variety of mechanisms including text analysis, Bayesian filtering,
+DNS blocklists, and collaborative filtering databases.
 
-Apache SpamAssassin is a project of the Apache Software Foundation (ASF).
+SpamAssassin is a project of the Apache Software Foundation (ASF).
 
 
-What Apache SpamAssassin Is Not
--------------------------------
+What SpamAssassin Is Not
+------------------------
 
-Apache SpamAssassin is not a program to delete spam, route spam and ham to
+SpamAssassin is not a program to delete spam, route spam and ham to
 separate mailboxes or folders, or send bounces when you receive spam.
-Those are mail routing functions, and Apache SpamAssassin is not a mail
-router.  Apache SpamAssassin is a mail filter or classifier.  It will examine
+Those are mail routing functions, and SpamAssassin is not a mail
+router.  SpamAssassin is a mail filter or classifier.  It will examine
 each message presented to it, and assign a score indicating the
 likelihood that the mail is spam.  An external program must then
 examine this score and do any routing the user wants done.  There are
 many programs that will easily perform these functions after examining
-the score assigned by Apache SpamAssassin.
+the score assigned by SpamAssassin.
 
 
-How Apache SpamAssassin Works
------------------------------
+How SpamAssassin Works
+----------------------
 
-Apache SpamAssassin uses a wide range of heuristic tests on mail headers and
+SpamAssassin uses a wide range of heuristic tests on mail headers and
 body text to identify "spam", also known as unsolicited commercial
 email.
 
 Once identified, the mail can then be optionally tagged as spam for
 later filtering using the user's own mail user-agent application.
 
-Apache SpamAssassin typically differentiates successfully between spam and
+SpamAssassin typically differentiates successfully between spam and
 non-spam in between 95% and 100% of cases, depending on what kind of mail
 you get and your training of its Bayesian filter.  Specifically,
-Apache SpamAssassin has been shown to produce around 1.5% false negatives (spam
+SpamAssassin has been shown to produce around 1.5% false negatives (spam
 that was missed) and around 0.06% false positives (ham incorrectly marked
 as spam).  See the rules/STATISTICS*.txt files for more information.
 
-Apache SpamAssassin also includes plugins to support reporting spam messages
+SpamAssassin also includes plugins to support reporting spam messages
 automatically or manually to collaborative filtering databases such as
 Pyzor, DCC, and Vipul's Razor.
 
 The distribution provides "spamassassin", a command line tool to
 perform filtering, along with the "Mail::SpamAssassin" module set
-which allows Apache SpamAssassin to be used in spam-protection proxy SMTP or
+which allows SpamAssassin to be used in spam-protection proxy SMTP or
 POP/IMAP server, or a variety of different spam-blocking scenarios.
 
-In addition, "spamd", a daemonized version of Apache SpamAssassin which
+In addition, "spamd", a daemonized version of SpamAssassin which
 runs persistently, is available.  Using its counterpart, "spamc",
 a lightweight client written in C, an MTA can process large volumes of
-mail through Apache SpamAssassin without having to fork/exec a perl interpreter
+mail through SpamAssassin without having to fork/exec a perl interpreter
 for each message.
 
 
 Questions? Need Help?
 ---------------------
 
-If you have questions about Apache SpamAssassin, please check the Wiki[1] to
+If you have questions about SpamAssassin, please check the Wiki[1] to
 see if someone has already posted an answer to your question. (The
 Wiki doubles as a FAQ.) Failing that, post a message to the
 spamassassin-users mailing list[2]. If you've found a bug (and you're
@@ -78,29 +75,29 @@
 Please also be sure to read the man pages.
 
 
-Upgrading Apache SpamAssassin
------------------------------
+Upgrading SpamAssassin
+----------------------
 
 IMPORTANT: If you are upgrading from a previous major version of
-Apache SpamAssassin, please be sure to read the notes in UPGRADE to find out
+SpamAssassin, please be sure to read the notes in UPGRADE to find out
 what has changed in a non- backward compatible way.
 
 
-Installing Apache SpamAssassin
-------------------------------
+Installing SpamAssassin
+-----------------------
 
 See the INSTALL file.
 
 
-Customizing Apache SpamAssassin
--------------------------------
+Customising SpamAssassin
+------------------------
 
-These are the configuration files installed by Apache SpamAssassin.  The commands
+These are the configuration files installed by SpamAssassin.  The commands
 that can be used therein are listed in the POD documentation for the
 Mail::SpamAssassin::Conf class (run the following command to read it:
 "perldoc Mail::SpamAssassin::Conf").  Note: The following directories are
 the standard defaults that people use.  There is an explanation of all the
-default locations that Apache SpamAssassin will look at the end.
+default locations that SpamAssassin will look at the end.
 
   - /usr/share/spamassassin/*.cf:
 
@@ -169,7 +166,7 @@
   - $USER_HOME/.spamassassin/bayes*
 
 	Statistics databases used for Bayesian filtering.  If they do
-	not exist, they will be created by Apache SpamAssassin.
+	not exist, they will be created by SpamAssassin.
 
 	Spamd users may wish to create a shared set of bayes databases;
 	the "bayes_path" and "bayes_file_mode" configuration settings
@@ -180,7 +177,7 @@
 
 File Locations:
 
-Apache SpamAssassin will look in a number of areas to find the default
+SpamAssassin will look in a number of areas to find the default
 configuration files that are used.  The "__*__" text are variables
 whose value you can see by looking at the first several lines of the
 "spamassassin" or "spamd" scripts.
@@ -239,7 +236,7 @@
 
 This is normally written to by the "sa-update" script.  "__version__" is
 replaced by a representation of the version number, so that multiple
-versions of Apache SpamAssassin will not interfere with each other's rulesets.
+versions of SpamAssassin will not interfere with each other's rulesets.
 
 
 After installation, try "perldoc Mail::SpamAssassin::Conf" to see what
@@ -247,8 +244,8 @@
 
   - required_score
 
-	Set this higher to make Apache SpamAssassin less sensitive.
-        If you are installing Apache SpamAssassin system-wide, this is
+	Set this higher to make SpamAssassin less sensitive.
+        If you are installing SpamAssassin system-wide, this is
         **strongly** recommended!
 
         Statistics on how many false positives to expect at various
@@ -269,8 +266,8 @@
 Learning
 --------
 
-Apache SpamAssassin includes a Bayesian learning filter, so it is worthwhile
-training Apache SpamAssassin with your collection of non-spam and spam,
+SpamAssassin includes a Bayesian learning filter, so it is worthwhile
+training SpamAssassin with your collection of non-spam and spam,
 if possible.  This will make it more accurate for your incoming mail.
 Do this using the "sa-learn" tools, like so:
 
@@ -282,12 +279,12 @@
 If these are mail folders in mbox format, use the --mbox switch, for
 Maildirs use a trailing slash, like Maildir/cur/.
 
-Use as many mailboxes as you like.  Note that Apache SpamAssassin will remember
+Use as many mailboxes as you like.  Note that SpamAssassin will remember
 what mails it has learnt from, so you can re-run this as often as you like.
 
 
-Localization
-------------
+Locali[sz]ation
+---------------
 
 All text displayed to users is taken from the configuration files.  This
 means that you can translate messages, test descriptions, and templates
@@ -304,7 +301,7 @@
 Disabled code
 -------------
 
-There are some tests and code in Apache SpamAssassin that are turned off by
+There are some tests and code in SpamAssassin that are turned off by
 default: experimental code, slow code, or code that depends on
 non-open-source software or services that are not always free.  These
 disabled tests include:
@@ -325,7 +322,7 @@
 Automatic Reputation System
 --------------------------
 
-Apache SpamAssassin includes an automatic reputation system. The way it works is
+SpamAssassin includes an automatic reputation system. The way it works is
 by tracking for each sender address a rolling average score of messages
 so far seen from there.  Then, it combines this long-term average score
 for the sender with the score for the particular message being evaluated,
diff --git a/build/README b/build/README
index ec7ace5..d9066d8 100644
--- a/build/README
+++ b/build/README
@@ -7,10 +7,6 @@
     ssh spamassassin.zones.apache.org
     cd [checkedoutdir]
 
-  NOTE: SpamAssassin.Zones is a crashed box replaced by SpamAssassin-vm.
-  A copy of the sabuildtools is in
-  /root/zonestorage-restore/spamassassin/export/home/kmcgrail/sabuildtools
-
 - ensure the required code and data is available for the build scripts:
 
     $HOME/sabuildtools
@@ -31,13 +27,6 @@
 - by default, they're written to ~/public_html/devel/ . 
   Copy them to wherever you want, yourself.
 
-- KAM has included all of these on one of his devel systems with perl
-  5.8.6 (the earliest supported version of Perl as of 4/28/2015).  One
-  note is that you need webmake 2.4 from
-    http://webmake.taint.org/devel/HTML-WebMake-2.4.tar.gz
-  
-  Also, a copy is mirrored at www.pccc.com/downloads/SpamAssassin
-
 
 SPAMASSASSIN RELEASE PROCEDURE
 ==============================
@@ -77,6 +66,16 @@
   (ie., no "M" or "C" files; any files marked "M" have been locally
   modified, and should be "svn revert"ed before you continue.)
 
+#- consider updating the TLD list in
+#  Mail/SpamAssassin/Util/RegistrarBoundaries.pm
+#
+#  Follow the documentation under %VALID_TLDS and $VALID_TLDS_RE for
+#  updating the TLD list, make test, and do a commit if there are any
+#  changes from the previous TLD list.
+#
+#  Currently, the only way to change the TLD list is via a release as 
+#  of 6/17/2014.
+
 - Consider updating the TLD list in 20_aux_tlds.cf.  As of 4/6/2015,
   this is not automated but bug 7165 is open for this purpose.
 
@@ -105,7 +104,6 @@
 
   Verify that the X-Spam-* headers use the correct version string,
   without an SVN revision number (those are only for dev and pre builds).
-
   NOTE: If the date is old, don't worry, it will change later with the
         relbuild checkout.
 
@@ -134,14 +132,7 @@
     3.1.0 work (created 3.0 branch); replace with the correct rev number
     for the point you want to start at if different. I used r1149751 to
     produce the first 3.4.0-pre release, for example.  r1567124 is the
-    3.4.0 release tag revision.  r1676613 is the 3.4.1 release tag
-    revision.
-
-    To find the release tag revision, use the tags website, i.e.: 
-      https://svn.apache.org/repos/asf/spamassassin/tags/
-
-    NOTE: 3.4.1 is currently on trunk and will be branched to 3.4 because 
-    3.4 branch was not used.
+    3.4.0 release tag revision.
 
 - Exclude some automated changes from the logs:
 
@@ -152,7 +143,7 @@
 
 - Word wrap the Changes file with something like 
 
-    fold -sw 74 Changes.tmp > Changes && rm -f Changes.tmp
+    fold -sw 74 Changes.tmp > Changes && rm Changes.tmp
 
 - run "make distcheck" to ensure all files are included in the
   distribution that should be, and to ensure all files that are listed
@@ -195,7 +186,7 @@
 
   - For a maintainance release (x.y.1, x.y.2):
 
-    vers=3_4_2
+    vers=3_1_7
 
     Then run:
 
@@ -206,7 +197,7 @@
 
   - For a trunk release (x.y.0):
 
-    vers=3_4_1
+    vers=3_4_0
 
     repo=https://svn.apache.org/repos/asf/spamassassin
     svn delete -m "replaced old tag" $repo/tags/spamassassin_release_$vers
@@ -215,7 +206,7 @@
 
   - For a trunk release candidate (x.y.0-rc1), pre-release (x.y.0-preZ) or alpha (x.y.0-alphaZ):
 
-    vers=3_4_1_rc_2
+    vers=3_3_0_alpha_2
 
     Then run:
 
@@ -238,9 +229,8 @@
 
   Check out the code from the tag you just made:
 
-    #These should be set from the previous command unless you are on a
-    #  different server
-    #vers=3_4_1
+    #These should be set from the previous command
+    #vers=3_3_0_alpha_2 
     #repo=https://svn.apache.org/repos/asf/spamassassin
     rm -rf ~/relbuild
     svn co $repo/tags/spamassassin_release_$vers ~/relbuild
@@ -263,8 +253,7 @@
   module, you didn't update your $PATH.
 
 - run "./build/repackage_latest_update_rules" to repackage the
-  latest rules file for the purpose of publishing a starter rule file 
-  for people who can't run sa-update:
+  latest file on updates.spamassassin.org.
 
     PATH=$HOME/sabuildtools/bin:$PATH
     ./build/repackage_latest_update_rules
@@ -276,13 +265,12 @@
   links, fixing the MD5 and SHA1 checksums in this mail, and summarising
   the important changes from the Changes file.
 
-    cp build/announcements/3.4.0.txt build/announcements/3.4.1.txt
+    cp build/announcements/3.3.2.txt build/announcements/3.4.0.txt
     svn add !$
     vi !$
 
   NOTE: Here's a quick example to concat the MD5 or SHA1 checksums:
-        ls *3.4.1.* | grep md5 | xargs cat --
-        ls *3.4.1.* | grep sha1 | xargs cat --
+        ls *3.4.0*rc6* | grep sha1 | xargs cat --
 
 - If there are any issues to note, make sure to edit the UPGRADE file.
   Every x.x.0 release at a minimum should include a section.
@@ -319,9 +307,7 @@
 
   http://www.cpan.org/modules/04pause.html#developerreleases
 
-  As of 2014-02-05, adding -TRIAL to the filename should work. For example:
-
-        Mail-SpamAssassin-3.4.1-rc2-TRIAL.tar.gz
+  As of 2014-02-05, adding TRIAL to the filename should work.
 
 - (for a full release) 3 +1's votes from PMC members are required to 
   proceed with an official (not pre-release) ASF software release.
@@ -341,17 +327,16 @@
   branch, off the trunk.
 
     repo=https://svn.apache.org/repos/asf/spamassassin
-    svn copy $repo/tags/spamassassin_release_3_4_1 $repo/branches/3.4 \
-    -m 'Creating 3.4 branch based on 3.4.1 so that trunk can go to 4.0'
+    svn copy $repo/tags/spamassassin_release_3_4_0 $repo/branches/3.4 -m 'Creating 3.4 branch'
 
   "trunk" is SVN's concept of head.  Typically, our branches are named
   for their minor version number.  In the example above, 3.4 is the
   branch for the stable 3.4.x releases.
 
-  - In the new development codebase, edit lib/Mail/SpamAssassin.pm
-    and bump the $VERSION line to the correct version.
+- In the new development codebase, edit lib/Mail/SpamAssassin.pm
+  and bump the $VERSION line to the correct version.
 
-  - then, commit the new version number to the new branch:
+- then, commit the new version number to the new branch:
 
         svn commit -m "X.Y.N devel cycle started"
 
@@ -362,26 +347,24 @@
 
   - lib/Mail/SpamAssassin.pm
 
-
-- In build/mkupdates/run_part2 change versions="X.Y.Z" to the new
-  development version (A.B.C).
-
-
 - [X.Y.0 RELEASES ONLY]: NOTE: This may change, make sure this info is
   still accurate before changing this (preferrably find out BEFORE doing
   an X.Y.0 release.  Update the mkupdates stuff:
 
-#  - Create an empty file for the new version number in
-#    /var/named/updates.dev.spamassassin.org.d/ on the zone and chown to
-#    updatesd and chgrp to others.
-#
-#    NOTE: I don't believe this does anything KAM: 2014-02-11 and the
-#    directory doesn't exist.
+  - In build/mkupdates/run_part2 change versions="X.Y.0" to the new
+    development version (X.Y+1.0).
+
+  - Create an empty file for the new version number in
+    /var/named/updates.dev.spamassassin.org.d/ on the zone and chown to
+    updatesd and chgrp to others.
+
+    NOTE: I don't believe this does anything KAM: 2014-02-11
 
   - Add "$INCLUDE /var/named/updates.spamassassin.org.d/X.Y+1.0" to the
-    /var/named/spamassassin.org zone file OR use a CNAME (see below)
+    spamassassin.org zone file in spamassassin/dns/
 
-    NOTE: Per bug 6644, using a CNAME for 3.4.1, 3.4.2, 4.0.0 to 3.3.2
+    NOTE: I don't believe this is right.  Per bug 6644, using a CNAME for
+    3.4.1 to 3.4.0 - KAM: 2014-02-11
 
   - commit the changes, update the zone (if not doing above on the zone -
     NOTE: See /var/named/README) and tick the zone file using build/mkupdates/tick_zone_serial
@@ -408,9 +391,6 @@
         cd /home/updatesd/svn/spamassassin/build/mkupdates
         ./update-rules-3.3 3.4
 
-  NOTE: Is this needed with our rule update process?  not convinced it
-  is... 2015-04-28
-
 - publish the tarballs
 
   ASF bylaws prohibit the distribution of files claiming to be
@@ -482,8 +462,7 @@
 
   WARNING: if you're moving to a new major release, x.y.0, you need to edit
   'build/update_website_docs' beforehand and set the "vers" line.  And if 
-  you are running on a server other than buildbot (NOTE: this works on the 
-  spamassassin-vm.apache.org box), the PERL and WEBDIR
+  you are running on a server other than buildbot, the PERL and WEBDIR
   vars may need tweaking:
 
         cd /var/www/buildbot.spamassassin.org/staging/website
@@ -491,10 +470,7 @@
         svn delete --force full/3.4.x
         svn commit -m "removing old doc tree from website" full
 
-        #Checkout the current release
-        cd /tmp
-        svn checkout http://svn.apache.org/repos/asf/spamassassin/tags/spamassassin_release_3_4_1/ release
-        cd /tmp/release
+        cd [checkedoutdir]
         build/update_website_docs
 
         cd /var/www/buildbot.spamassassin.org/staging/website
@@ -512,7 +488,7 @@
 
     repo=https://svn.apache.org/repos/asf/spamassassin
     svn delete -m "updating for new release"  $repo/tags/spamassassin_current_release_3.4.x
-    svn copy -m "updating for new release" $repo/tags/spamassassin_release_3_4_1 $repo/tags/spamassassin_current_release_3.4.x
+    svn copy -m "updating for new release" $repo/tags/spamassassin_release_3_4_0 $repo/tags/spamassassin_current_release_3.4.x
 
 - upload release .tar.gz (not .bz2) tarball to CPAN at http://pause.cpan.org/:
 
@@ -578,8 +554,7 @@
  - Reviewed the Project Branding Report Checklist
 
 
-- Issues not resolved with the release of 3.4.0 2014-02-11 and still not
-  resolved with the release of 3.4.1 2015-04-28
+- Issues not resolved with the release of 3.4.0 2014-02-11
 
  - We updated to 3.4.0 and 3.4.1 is the current trunk version.  Need to
    confirm what needs to change on the updatesd scripts to make this
diff --git a/build/announcements/3.4.1-rc2.txt b/build/announcements/3.4.1-rc2.txt
index c0e9015..915cf21 100644
--- a/build/announcements/3.4.1-rc2.txt
+++ b/build/announcements/3.4.1-rc2.txt
@@ -1,132 +1,146 @@
 To: users, dev, announce
-Subject: ANNOUNCE: Apache SpamAssassin 3.4.1 available
+Subject: ANNOUNCE: Apache SpamAssassin 3.4.1-rc2 available
 
-Release Notes -- Apache SpamAssassin -- Version 3.4.1
+Release Notes -- Apache SpamAssassin -- Version 3.4.1-rc2
 
 Introduction
 ------------
 
-Apache SpamAssassin 3.4.1 represents more than a year of development
-and nearly 500 tweaks, changes, upgrades and bug fixes over the previous
-release. Highlights include: Improved automation to help combat spammers
-that are abusing new top level domains; Tweaks to the SPF support to
-block more spoofed emails; Increased character set normalization to
-make rules easier to develop, block more international spam and stop
-spammers from using alternate character sets to bypass tests;
-Continued refinement to the native IPv6 support; and Improved Bayesian
-classification with better debugging and attachment hashing.
+Apache SpamAssassin 3.4.1 represents more than a year of development and
+nearly 500 tweaks, changes, upgrades and bug fixes over the previous release.
+Highlights include: Improved automation to help combat spammers that are
+abusing new top level domains; Tweaks to the SPF support to block more spoofed
+emails; Increased character set normalization to make rules easier to develop,
+block more international spam & stop spammers from using alternate character
+sets to bypass tests; Continued refinement to the native IPv6 support; and
+Improved Bayesian classification with better debugging and attachment hashing.
 
 Notable features:
 =================
 
-New plugins
------------
+Bug 7115: Adding SHA digests of MIME parts as Bayes tokens allows bayes
+to see non-textual content - added configurability
 
-There are three new plugins added with this release:
+rewritten Node::_normalize
 
-  Mail::SpamAssassin::Plugin::TxRep
-  Mail::SpamAssassin::Plugin::PDFInfo
-  Mail::SpamAssassin::Plugin::URILocalBL
-
-The TxRep (Reputation) plugin is designed as a substantially improved
-replacement of the AWL plugin. It adjusts the final message spam score
-by looking up and taking in consideration the reputation of the sender.
-It cannot coexist with the old AWL plugin, which must be disabled when
-the TxRep is loaded.
-
-The PDFInfo plugin helps detecting spam with attached PDF files.
-
-The URILocalBL plugin creates some new rule test types, such as
-"uri_block_cc", "uri_block_cidr", and "uri_block_isp".  These rules
-apply to the URIs found in the HTML portion of a message, i.e.
-<a href=...> markup.
-
-All these three plugins are disabled by default. To enable, uncomment
-the loadplugin configuration options in file v341.pre, or add them to
-some local .pre file such as local.pre .
-
-Plugins are documented in their respective man pages.
-
-
-Notable changes
----------------
-
-A new subsystem RegistryBoundaries for recognizing and updating a list
-of top-level domains and registry boundaries has been introduced, which
-allows dynamically updating both lists through rule updates instead of
-having them hard-wired in the code.
-
-A subroutine Node::_normalize has been rewritten. The new behavior
-is documented with the 'normalize_charset' option in the
-Mail::SpamAssassin::Conf man page. (Bug 7144, Bug 7126, Bug 7133)
-
-Tokenization of UTF-8 -encoded or normalized text has been improved
-in the Bayes plugin. (Bug 7130, Bug 7135, Bug 7141)
-
-SHA1 digests of all MIME parts (including non-textual) can now be
-contributed to Bayes tokens, which allows the bayes classifier to assess
-also the non-textual content. The set of sources of bayes tokens is
-configurable with a new configuration option 'bayes_token_sources'
-as documented in the Mail::SpamAssassin::Conf man page. (Bug 7115)
-It is disabled by default for backward compatibility. 
+improved tokenization of UTF-8 -encoded or normalized text in
+the Bayes plugin
 
 
 New configuration options
 -------------------------
 
-The 'normalize_charset' configuration option already existed in previous
-versions, but functionality has been re-implemented with more emphasis
-on the declared character set of each textual MIME part, instead of
-relying on guesswork by Encode::Detect::Detector. When enabled, non-UTF8
-textual parts of a mail message are decoded into Unicode and re-encoded
-into UTF-8 before passing them to HTML decoding and to rules processing.
-This makes it easier to write regular expressions and strings in rules
-using UTF-8 encoding, and allows plugins (such as tokenization in a
-Bayes plugin) to recognize multibyte characters and words in non-English
-languages, instead of 'randomly' considering some non-ASCII octets in
-multibyte characters as delimiters. Please see documentation for this
-configuration option in the Mail::SpamAssassin::Conf man page.
-
-A new configuration option 'bayes_token_sources' allows more control
-on the sources of tokens for the Bayes plugin. For compatibility the
-default set of sources is unchanged, but consider: 
-    bayes_token_sources all
-or: bayes_token_sources mimepart
-to include SHA1 digests of all MIME parts in a message as Bayes tokens.
-Please see documentation for this option in the Mail::SpamAssassin::Conf
-man page.
-
-A new configuration option 'dkim_minimum_key_bits' with a default value
-of 1024 bits now controls the smallest size of a signing key (in bits)
-for a valid signature to be considered for whitelisting. Please see
-documentation for this option in the Mail::SpamAssassin::Plugin::DKIM
-man page.
-
-A new configuration option 'parse_dkim_uris' allows DKIM header fields
-to be parsed for URIs and to be processed alongside other URIs found in
-the body.
-
-A configuration option 'dns_server' can now specify a scoped link-local
-IPv6 address, e.g.:  dns_server [fe80::1%lo0]:53 .
-
-The configuration option 'check_rbl_from_domain' checks all domain names
-in a From mail address as an alternate to check_rbl_from_host. As of
-v3.4.1, it has been improved to include a subtest for a specific octet.
-
-The 'if (boolean perl expression)' now accepts 'perl_version' in the
-expression. The 'perl_version' will be replaced with the version number
-of the currently-running perl engine. Another way of testing perl
-version in a conditional of a configuration file is:
-  if can(Mail::SpamAssassin::Conf::perl_min_version_5010000)
-Please see documentation in the Mail::SpamAssassin::Conf man page.
-
-
-
-
-
 Added flag 'noawl' to the 'tflags' configuration option.
 
 
+parse_dkim_uris ( 0 | 1 ) (default: 0)
+
+  If this option is set to 1 and the message contains DKIM headers,
+  the headers will be parsed for URIs to process alongside URIs found
+  in the body with some rules and moduels (ex. URIDNSBL)
+
+
+perl_version
+  (Introduced in 3.4.2)  This will be replaced with the version
+-->>  THIS NEEDS TO BE FIXED in Conf.pm, WE ARE AT 3.4.1
+
+
+changed implementation, may produce different result in some cases:
+
+normalize_charset ( 0 | 1)        (default: 0)
+  Whether to decode non- UTF-8 and non-ASCII textual parts and recode
+  them to UTF-8 before the text is given over to rules processing.
+  The character set used for attempted decoding is primarily based on
+  a declared character set in a Content-Type header, but if the
+  decoding attempt fails a module Encode::Detect::Detector is
+  consulted (if available) to provide a guess based on the actual
+  text, and decoding is re-attempted. Even if the option is enabled
+  no unnecessary decoding and re-encoding work is done when possible
+  (like with an all-ASCII text with a US-ASCII or extended ASCII
+  character set declaration, e.g. UTF-8 or ISO-8859-nn or Windows-nnnn).
+
+  Unicode support in old versions of perl or in a core module Encode
+  is likely to be buggy in places, so if the normalize_charset
+  function is enabled it is advised to stick to more recent versions
+  of perl (preferably 5.12 or later). The module
+  Encode::Detect::Detector is optional, when necessary it will be
+  used if it is available.
+
+  
+option dns_server can now specify a link-local IPv6 address, e.g.:
+  dns_server [fe80::1%lo0]:53
+
+
+new option:
+
+bayes_token_sources  (default: header visible invisible uri)
+  Controls which sources in a mail message can contribute tokens
+  (e.g. words, phrases, etc.) to a Bayes classifier. The argument is
+  a space-separated list of keywords: header, visible, invisible,
+  uri, mimepart), each of which may be prefixed by a no to indicate
+  its exclusion. Additionally two reserved keywords are allowed: all
+  and none (or: noall). The list of keywords is processed
+  sequentially: a keyword all adds all available keywords to a set
+  being built, a none or noall clears the set, other non-negated
+  keywords are added to the set, and negated keywords are removed
+  from the set. Keywords are case-insensitive.
+
+  The default set is: header visible invisible uri, which is
+  equivalent for example to: All NoMIMEpart. The reason why mimepart
+  is not currently in a default set is that it is a newer source
+  (introduced with SpamAssassin version 3.4.1) and not much
+  experience has yet been gathered regarding its usefulness.
+
+  See also option "bayes_ignore_header" for a fine-grained control on
+  individual header fields under the umbrella of a more general
+  keyword header here.
+
+  Keywords imply the following data sources:
+    header - tokens collected from a message header section
+    visible - words from visible text (plain or HTML) in a message body
+    invisible - hidden/invisible text in HTML parts of a message body
+    uri - URIs collected from a message body
+    mimepart - digests (hashes) of all MIME parts (textual or non-
+    textual) of a message, computed after Base64 and quoted-printable
+    decoding, suffixed by their Content-Type
+    all - adds all the above keywords to the set being assembled
+    none or noall - removes all keywords from the set
+
+  The "bayes_token_sources" directive may appear multiple times, its
+  keywords are interpreted sequentially, adding or removing items
+  from the final set as they appear in their order in
+  "bayes_token_sources" directive(s).
+
+
+new option:
+
+dkim_minimum_key_bits n             (default: 1024)
+  The smallest size of a signing key (in bits) for a valid signature
+  to be considered for whitelisting. Additionally, the eval function
+  check_dkim_valid() will return false on short keys when called with
+  explicitly listed domains, and the eval function
+  check_dkim_valid_author_sig() will return false on short keys
+  (regardless of its arguments). Setting the option to 0 disables a
+  key size check.
+
+  Note that the option has no effect when the eval function
+  check_dkim_valid() is called with no arguments (like in a rule
+  DKIM_VALID). A mere presence of some valid signature on a message
+  has no reputational value (without being associated with a
+  particular domain), regardless of its key size - anyone can prepend
+  its own signature on a copy of some third party mail and re-send
+  it, which makes it no more trustworthy than without such signature.
+  This is also a reason for a rule DKIM_VALID to have a near-zero score.
+
+
+change:
+
+check_rbl_from_domain
+  This checks all the from addrs domain names as an alternate to
+  check_rbl_from_host.  As of v3.4.1, it has been improved to include
+  a subtest for a specific octet.
+
+
 new template tags:
 _SENDERDOMAIN_  a domain name of the envelope sender address, lowercased
 _AUTHORDOMAIN_  a domain name of the author address (the From header
@@ -154,6 +168,16 @@
 
 
 
+New plugins
+-----------
+
+New plugin (optional):
+# loadplugin Mail::SpamAssassin::Plugin::TxRep
+# loadplugin Mail::SpamAssassin::Plugin::PDFInfo  ???
+
+URILocalBL.pm ???
+
+
 Rule updates
 ------------
 
@@ -222,7 +246,7 @@
 
 Bug 7136: added has_check_for_spf_errors and if can() encapsulation
 
-Bug 7128: DCC plugin now uses IO::Socket::IP instead of IO::Socket::INET6 
+Bug 7128: DCC plugin now uses IO::Socket::INET6 instead of IO::Socket::IP
 
 Bug 7099: Adding tags SENDERDOMAIN and AUTHORDOMAIN
 
@@ -258,12 +282,12 @@
 unnecessary copying was avoided when reading from a temporary file
 in SA::Message::Node (small optimization)
 
+changed fillfactor for postgres bayes/awl tables to optimize for updates
+
 a small hotspot in DnsResolver.pm was optimized
 
 use faster utf8::encode instead of Encode::encode_utf8
 
-changed fillfactor for postgres bayes/awl tables to optimize for updates
-
 disabled synchronous commit for Postgres Bayes store
 
 
@@ -496,17 +520,17 @@
 
 md5sum of archive files:
 
-55f934b54e7b56fb89b491b289b10e8d  Mail-SpamAssassin-3.4.1-rc2.tar.bz2
-3c9a10d08731877a29499769e75e35b3  Mail-SpamAssassin-3.4.1-rc2.tar.gz
-8d01b76eb532499f590a8314f5a5f938  Mail-SpamAssassin-3.4.1-rc2.zip
-a5e4a3f174cc5ed8b18077f9a6ca0c47  Mail-SpamAssassin-rules-3.4.1-rc2.r1670273.tgz
+06ce92812b84bd51f20bc90fa931933c  Mail-SpamAssassin-3.4.1-rc1.tar.bz2
+5cc08804e32adeb104f0ef9b68de8d8d  Mail-SpamAssassin-3.4.1-rc1.tar.gz
+c3cc867edbf875d157e8a871b73838a6  Mail-SpamAssassin-3.4.1-rc1.zip
+cafc1a8b3a870e1c5634d39df99f37f7  Mail-SpamAssassin-rules-3.4.1-rc1.r1645877.tgz
 
 sha1sum of archive files:
 
-0efbde52cdc882461d2e3a5d9ed977499268cadd  Mail-SpamAssassin-3.4.1-rc2.tar.bz2
-bb2eb6a3c7a79ea1cc2a53abf668b4684f39b653  Mail-SpamAssassin-3.4.1-rc2.tar.gz
-318ac84a1f17e19229d9813078a12e7f4825dee3  Mail-SpamAssassin-3.4.1-rc2.zip
-680c231efd0cfca69e665445a9472d0b7bb3a8fe  Mail-SpamAssassin-rules-3.4.1-rc2.r1670273.tgz
+9a26266720114d907596a078671e10e14025ec1d  Mail-SpamAssassin-3.4.1-rc1.tar.bz2
+1029b7da3e279455ff2e8ea9619b0eb9222a484a  Mail-SpamAssassin-3.4.1-rc1.tar.gz
+0fee42eb54bec29fd817082d31cc4749a81e0b77  Mail-SpamAssassin-3.4.1-rc1.zip
+d63d73515445b15980a3155ff8004fc069527d93  Mail-SpamAssassin-rules-3.4.1-rc1.r1645877.tgz
 
 Note that the *-rules-*.tar.gz files are only necessary if you cannot,
 or do not wish to, run "sa-update" after install to download the latest
@@ -534,7 +558,7 @@
 To verify a release file, download the file with the accompanying .asc file and run the following commands:
 
   gpg -v --keyserver wwwkeys.pgp.net --recv-key F7D39814
-  gpg --verify Mail-SpamAssassin-3.4.1.tar.bz2.asc
+  gpg --verify Mail-SpamAssassin-3.4.0.tar.bz2.asc
   gpg --fingerprint F7D39814
 
 Then verify that the key matches the signature.
diff --git a/build/announcements/3.4.1.txt b/build/announcements/3.4.1.txt
deleted file mode 100644
index 80d8277..0000000
--- a/build/announcements/3.4.1.txt
+++ /dev/null
@@ -1,618 +0,0 @@
-To: users, dev, announce
-Subject: ANNOUNCE: Apache SpamAssassin 3.4.1 available
-
-Release Notes -- Apache SpamAssassin -- Version 3.4.1
-
-Introduction
-------------
-
-Apache SpamAssassin 3.4.1 represents more than a year of development
-and nearly 500 tweaks, changes, upgrades and bug fixes over the previous
-release. Highlights include: Improved automation to help combat spammers
-that are abusing new top level domains; Tweaks to the SPF support to
-block more spoofed emails; Increased character set normalization to
-make rules easier to develop, block more international spam and stop
-spammers from using alternate character sets to bypass tests;
-Continued refinement to the native IPv6 support; and Improved Bayesian
-classification with better debugging and attachment hashing.
-
-Many thanks to the committers, contributors, rule testers, mass checkers,
-and code testers who have made this release possible.  And please
-recognize Joe Quinn for stepping up in the role of an assistant 
-Release Manager.
-
-Notable features:
-=================
-
-New plugins
------------
-
-There are three new plugins added with this release:
-
-  Mail::SpamAssassin::Plugin::TxRep
-  Mail::SpamAssassin::Plugin::PDFInfo
-  Mail::SpamAssassin::Plugin::URILocalBL
-
-The TxRep (Reputation) plugin is designed as a substantially improved
-replacement of the AWL plugin. It adjusts the final message spam score
-by looking up and taking in consideration the reputation of the sender.
-It cannot coexist with the old AWL plugin, which must be disabled when
-the TxRep is loaded.
-
-The PDFInfo plugin helps detecting spam with attached PDF files.
-
-The URILocalBL plugin creates some new rule test types, such as
-"uri_block_cc", "uri_block_cidr", and "uri_block_isp".  These rules
-apply to the URIs found in the HTML portion of a message, i.e.
-<a href=...> markup.
-
-All these three plugins are disabled by default. To enable, uncomment
-the loadplugin configuration options in file v341.pre, or add them to
-some local .pre file such as local.pre .
-
-Plugins are documented in their respective man pages.
-
-
-Notable changes
----------------
-
-A new subsystem RegistryBoundaries for recognizing and updating a list
-of top-level domains and registry boundaries has been introduced, which
-allows dynamically updating both lists through rule updates instead of
-having them hard-wired in the code.
-
-A subroutine Node::_normalize has been rewritten. The new behavior
-is documented with the 'normalize_charset' option in the
-Mail::SpamAssassin::Conf man page. (Bug 7144, Bug 7126, Bug 7133)
-
-Tokenization of UTF-8 -encoded or normalized text has been improved
-in the Bayes plugin. (Bug 7130, Bug 7135, Bug 7141)
-
-SHA1 digests of all MIME parts (including non-textual) can now be
-contributed to Bayes tokens, which allows the bayes classifier to assess
-also the non-textual content. The set of sources of bayes tokens is
-configurable with a new configuration option 'bayes_token_sources'
-as documented in the Mail::SpamAssassin::Conf man page. (Bug 7115)
-It is disabled by default for backward compatibility. 
-
-
-New configuration options
--------------------------
-
-The 'normalize_charset' configuration option already existed in previous
-versions, but functionality has been re-implemented with more emphasis
-on the declared character set of each textual MIME part, instead of
-relying on guesswork by Encode::Detect::Detector. When enabled, non-UTF8
-textual parts of a mail message are decoded into Unicode and re-encoded
-into UTF-8 before passing them to HTML decoding and to rules processing.
-This makes it easier to write regular expressions and strings in rules
-using UTF-8 encoding, and allows plugins (such as tokenization in a
-Bayes plugin) to recognize multibyte characters and words in non-English
-languages, instead of 'randomly' considering some non-ASCII octets in
-multibyte characters as delimiters. Please see documentation for this
-configuration option in the Mail::SpamAssassin::Conf man page.
-
-A new configuration option 'bayes_token_sources' allows more control
-on the sources of tokens for the Bayes plugin. For compatibility the
-default set of sources is unchanged, but consider: 
-    bayes_token_sources all
-or: bayes_token_sources mimepart
-to include SHA1 digests of all MIME parts in a message as Bayes tokens.
-Please see documentation for this option in the Mail::SpamAssassin::Conf
-man page.
-
-A new configuration option 'dkim_minimum_key_bits' with a default value
-of 1024 bits now controls the smallest size of a signing key (in bits)
-for a valid signature to be considered for whitelisting. Please see
-documentation for this option in the Mail::SpamAssassin::Plugin::DKIM
-man page.
-
-A new configuration option 'parse_dkim_uris' allows DKIM header fields
-to be parsed for URIs and to be processed alongside other URIs found in
-the body.
-
-A configuration option 'dns_server' can now specify a scoped link-local
-IPv6 address, e.g.:  dns_server [fe80::1%lo0]:53 .
-
-The configuration option 'check_rbl_from_domain' checks all domain names
-in a From mail address as an alternative to check_rbl_from_host. As of
-v3.4.1, it has been improved to include a subtest for a specific octet.
-
-The 'if (boolean perl expression)' now accepts 'perl_version' in the
-expression. The 'perl_version' will be replaced with the version number
-of the currently-running perl engine. Another way of testing perl
-version in a conditional of a configuration file is:
-  if can(Mail::SpamAssassin::Conf::perl_min_version_5010000)
-Please see documentation in the Mail::SpamAssassin::Conf man page.
-
-A flag 'noawl' was added to the 'tflags' configuration option.
-
-Two new template tags were added:
-_SENDERDOMAIN_ expands to a domain name of the envelope sender address
-_AUTHORDOMAIN_ expands to a domain name of the author address (the From
-   header field), lowercased;  note that RFC 5322 allows a mail message
-   to have multiple authors - currently only the domain name of the
-   first email address is returned
-
-
-Notable Internal changes
-------------------------
-
-Mail::SpamAssassin::Util::RegistrarBoundaries is being replaced by 
-Mail::SpamAssassin::RegistryBoundaries so that new TLDs can be updated
-via 20_aux_tlds.cf delivered via sa-update.
-
-The $VALID_TLDS_RE global in registrar boundaries is deprecated but kept
-for third-party plugin compatibility.  It may be removed in a future
-release. See Mail::SpamAssassin::Plugin::FreeMail for an example of the
-new way of abtaining a valid list of TLDs.
-
-The following functions and variables will be removed in the next
-release after 3.4.1 excepting any emergency break/fix releases
-immediately after 3.4.1:
-  Mail::SpamAssassin::Util::RegistrarBoundaries::is_domain_valid 
-  Mail::SpamAssassin::Util::RegistrarBoundaries::trim_domain
-  Mail::SpamAssassin::Util::RegistrarBoundaries::split_domain 
-  Mail::SpamAssassin::Util::uri_to_domain 
-  Mail::SpamAssassin::Util::RegistrarBoundaries::US_STATES
-  Mail::SpamAssassin::Util::RegistrarBoundaries::THREE_LEVEL_DOMAINS
-  Mail::SpamAssassin::Util::RegistrarBoundaries::TWO_LEVEL_DOMAINS
-  Mail::SpamAssassin::Util::RegistrarBoundaries::VALID_TLDS_RE
-  Mail::SpamAssassin::Util::RegistrarBoundaries::VALID_TLDS
-
-This change should only affect 3rd party plugin authors who will need
-to update their code to utilize Mail::SpamAssassin::RegistryBoundaries.
-
-
-In module Mail::SpamAssassin::PerMsgStatus two new methods were added:
-
-$pms->get_names_of_tests_hit_with_scores_hash
-  After a mail message has been checked, this method can be called.
-  It will return a pointer to a hash for rule & score pairs for all
-  the symbolic test names and individual scores of the tests which
-  were triggered by the mail.
-
-$pms->get_names_of_tests_hit_with_scores
-  After a mail message has been checked, this method can be called.
-  It will return a comma-separated string of rule=score pairs for all
-  the symbolic test names and individual scores of the tests which
-  were triggered by the mail.
-
-
-Rule updates
-------------
-
-Many rules were added or modified, or their score adjusted.
-Some of these are (in no particular order):
-
-  ADMITS_SPAM, AXB_HELO_HOME_UN, AXB_XRCVD_EXCH_UUCP, BANG_GUAR,
-  BAYES_999, CANT_SEE_AD, CN_B2B, CN_B2B_SPAMMER, DX_TEXT, DX_TEXT_02,
-  Doctor Oz, END_FUTURE_EMAILS, FILLFORM, FREEMAIL_FORGED_FROMDOMAIN,
-  FREEMAIL_MANY_TO, FROM_MISSP_REPLYTO, FSL_FAKE_GMAIL_RCVD, GAPPY_,
-  FSL_HELO_BARE_IP_*, FSL_NEW_HELO_USER, HEADER_FROM_DIFFERENT_DOMAINS,
-  HELO_LH_HOME, HEXHASH, HEXHASH_WORD, HTML_OFF_PAGE, LONG_HEX_URI,
-  FUZZY_CLICK_HERE, LOTSA_MONEY, MSGID_NOFQDN[12], NORMAL_HTTP_TO_IP,
-  NUM_FREE, PDS_FROM_2_EMAILS, PHP malware/phish, PUMPDUMP, RAND_HEADER,
-  RCVD_ILLEGAL_IP, STYLE_GIBBERISH, SYSADMIN, TVD_FUZZY_SECURITIES FP,
-  TVD_GET_STOCK, TO_IN_SUBJ, TO_NO_BRTKS_MSFT, UC_GIBBERISH_OBFU,
-  URIBL_DBL_ABUSE_REDIR, URIBL_DBL_SPAM, URI_GOOGLE_PROXY, URI_IP_UNSUB,
-  URI_OPTOUT_3LD, URI_OPTOUT_USME, URI_TRY_USME, VANITY, __DATE_SPACEY,
-  __BOUNCE_RPATH_NULL, __FORGED_URL_DOM_*, __FSL_LINK_AWS_S3_WEB_LOOSE,
-  __HAS_OFFICE1214_IN_MAILER, __HEXHASHWORD_S2EU, __LONG_HEX_URI,
-  __RAND_HEADER, __SUBJECT_UTF8_B_ENCODED, unsubscribe URI to IP addr.,
-  advance_fee, lotsa_money, exploratory tagged-URI, pumpdump, optout,
-  moving money rules (very short 419 fraud spams), new phrase rules,
-  PDFinfo, protect some test rules with can(perl_min_version_5010000),
-  test rules to detect SPF queries that produce error results,
-  various unsubscribe rules, freshen and extend phishing rules,
-  added missing eval:check_uri_host_in_* rules, check for references
-  to compromised WordPress sites, other wordpress rules, some Cyrillic
-  and Hebrew obfuscations that were overlooked, avoid Japanese-language
-  false-positives, added 20_freemail_mailcom_domains.cf
-
-Some rules were removed or disabled, either because of ineffectiveness,
-or duplication with other rules, or due to false positives. Some of
-these are (in no particular order):
-
-  DNS_FROM_AHBL_RHSBL, DOS_FAKE_SQUIRREL, FSL_MISSP_REPLYTO,
-  KHOP_SPAMDB_SUBJ, MSGID_MULTIPLE_AT, SMF_FM_FORGED_REPLYTO,
-  SUBJECT_UNNEEDED_ENCODING, URIBL_DBL_REDIR, XPRIO_RPATH_NULL,
-  defunct AHBL rules, obsoleted FSL rules from 50_scores.cf,
-  obsoleted rules in 00_FVGT_File001.cf, perl-5.8-hostile rule,
-  removed duplicate domains in 20_freemail_domains.cf
-
-
-Other updates
--------------
-
-Documentation was updated or enhanced. Project's testing and evaluation
-hosts and tools running on the ASF infrastructure were updated.
-
-A list of top-level domains in registrar boundaries was updated
-several times (cw, sx, club, com.us, util_rb_2tld, ...). TLD updating
-process was improved, tests to account for new TLDs and changes were
-updated, TLD update in build/README was clarified for SA releases,
-RFC 2606: invalid TLD used in testing was changed to '.invalid' .
-
-
-Improvements
-------------
-
-Bug 7150: Allow scoped IP address in the dns_server config option
-
-Util::TinyRedis: allow a scoped / link-local IP address specification
-(avoid current limitation in IO::Socket::IP [rt.cpan.org #89608])
-
-SPF max DNS terms was raised to 15 to accomodate for eBay SPF records
-
-Bug 7136: added has_check_for_spf_errors and if can() encapsulation
-
-Bug 7128: DCC plugin now uses IO::Socket::IP instead of IO::Socket::INET6 
-
-Bug 7099: Adding tags SENDERDOMAIN and AUTHORDOMAIN
-
-Bug 7068: added rule and code to count Unicode entities
-
-Bug 7052: moved module Net::DNS::Nameserver to optional since it is
-just used in make test
-
-cleaned up on httpd.conf
-
-minor debugging improvement in Plugin::TextCat 
-
-Plugin/AskDNS: additional debug logging
-
-Bug 7107: added "perl_min_version_5010000" for preprocessor conditionals
-
-Cleaned up documentation and removed rule name parameter that was not
-needed on the rule
-
-more informative DNS debugging output
-
-added new install docs to MANIFEST
-
-improvements for disabled plugins
-
-
-Optimizations
--------------
-
-writing speed of large temporary files was improved by using a larger
-buffer and avoiding PerlIO - MS::PerMsgStatus::create_fulltext_tmpfile()
-
-unnecessary copying was avoided when reading from a temporary file
-in SA::Message::Node (small optimization)
-
-a small hotspot in DnsResolver.pm was optimized
-
-use faster utf8::encode instead of Encode::encode_utf8
-
-changed fillfactor for postgres bayes/awl tables to optimize for updates
-
-disabled synchronous commit for Postgres Bayes store
-
-
-Notable bug fixes
------------------
-
-Adjusted for Yahoo! using subnet 238.0.0./8 in Received headers
-
-Bug 6751: certain character sets can use alternate characters for
-a period and bypass DNSBL checks
-
-Bug 7153: prevent leaking of messages to stderr in URILocalBL.pm
-
-Bug 7143: use eval instead of regex to fix MakeMaker version
-
-Bug 7148: small getopt.c change
-
-added a workaround to Node::_normalize for an Encode::decode taint
-laundering bug [rt.cpan.org #84879]
-
-Bug 7141: Bayes truncates ('skip') long tokens on bytes, should it
-count characters instead?
-
-Bug 7140: fixed DKIM/SPF Insecure dependency in require
-
-Bug 7130: Bayes tokenization mangles/chops many UTF-8 words with
-accented, Cyrillic etc. letters - inappropriately assuming ISO-8859
-encoding
-
-Bug 7130: disable TOKENIZE_LONG_8BIT_SEQS_AS_TUPLES, seems redundant
-and useless with TOKENIZE_LONG_8BIT_SEQS_AS_UTF8_CHARS, e.g. turned
-each Cyrillic letter of longer words into an individual token
-
-Bug 7133: Revisiting Bug 4046 - HTML::Parser: Parsing of undecoded UTF-8
-will give garbage when decoding entities
-
-fixed missing case for permerror in From SPF
-
-Bug 7136: modified 25_spf.t and reverted reversion in SpamAssassin.pm
-from previous rc1 work
-
-Bug 7135: Bayes tokenizer 'arbitrarily' breaks multibyte CJK UTF-8
-characters into digrams instead of breaking on UTF-8 character
-boundaries
-
-Bug 7126: Incorrect character set detections by normalize_charset
-
-Bug 7125: MIME parsing of nested messages must not treat parts like
-delivery-status or disposition-notification as message/rfc822
-
-Bug 6953: spamd: could not create IO::Socket::INET6 socket
-on [::]:783: Address already in use
-
-Bug 7106: a failed IPv6 socket creation blocks creating an IPv4 socket
-
-Bug 7124: DKIM: RFC 6376 - Signers MUST use RSA keys of
-at least 1024 bits
-
-Bug 7120: Perl Critic exemption
-Bug 7119: Perl::Critic: ControlStructures::ProhibitMutatingListFunctions
-reverted critic recommendations to fix undef warning, Removed undef
-returns for perlcritic test
-
-Bug 5399: fixed MS::Util::parse_content_type, dots are allowed in
-Content-Type (a fix to Bug 5399 was too strict)
-
-fixed SA::Util::qp_decode for compliance with RFC 2045 (trailing
-whitespace must be deleted before decoding)
-
-Bug 7063: removing sawampersand
-
-Bug 7111: sa-update: wrong exit code with --checkonly (does not find
-new versions)
-
-Bug 7030: BayesStore/Redis.pm: authentication doesn't work with
-Redis 2.6 and earlier
-
-Bug 7103: bad wget option causes the first fetch of third-party rules
-channel to fail
-
-fixed uribl matching on email addresses with commas after them
-
-Bug 6919: added 'dedicated' to list of static IP indicators
-for RDNS_DYNAMIC
-
-fixed POD error caused by trailing whitespace
-
-hacked PHP URI tuning
-
-added askdns to known debug facilities
-
-expansion of replace tags for more characters
-
-avoid a perl 5.21 warning: Negative repeat count does nothing
-
-added more UTF-8 Unicode obfuscation variants
-
-removed non AV/filter headers
-
-set headers which may provide inappropriate cues to the Bayesian
-classifier
-
-Plugin/HeaderEval: header field names are case-insensitive
-
-Bug 7074, sa-update: improved error reporting of a failed spawned
-process
-
-db_id not initialized, || -> ||=
-
-renamed __freemail_hdr_replyto to __smf_freemail_hdr_replyto avoiding
-name collision
-
-changed bayes_auto_learn_threshold_nonspam -1.0
-
-MS::Plugin::AskDNS - avoid warning on undef in eq when a DNS response
-has no answer section
-
-Bug 7079: hide the Geo::IP warning
-
-Bug 7078: Mail::Spamassassin::Message::Node::header() error - normalize
-line endings in header, not just in body
-
-Bug 7060: allow excluding domains instead of individual hosts
-
-avoid a warning: Use of uninitialized value $pgm in concatenation
-Plugin/DCC.pm, line 915
-
-Bug 7070: added rbl_timeout_min so that t_min for rbl_timeout applies
-even without a zone
-
-Bug 7065: debug mode breaks Bayes but only if DBM storage is used
-
-added code for check_for_ascii_text_illegal in MIMEEval and added
-test rule to sandbox
-
-added Cyrillic and Armenian glyphs in UTF-8 encoding to single-letter
-replace tags
-
-Bug 7034: Redis.pm leaks file descriptors when preforking - avoid
-creating a circular data structure through a closure
-
-allow an "=" char in a redis password
-
-added verbose to sync to sa2 zones server
-
-added URILocalBL.pm plugin to trunk for testing, updating MANIFEST
-and v341.pre file as well as optional dependencies with Net::CIDR::Lite
-and Geo::IP
-
-fixed DNS resolving with Net::DNS 0.76
-
-changes in Spamhaus DBL DNSBL return codes as per
-  http://www.spamhaus.org/news/article/713/
-
-fixing issues with extract_to_rsync_dir
-
-having issues with this sandbox rule failing make test
-TEST_FILES="t/basic_lint.t t/basic_lint_without_sandbox.t t/basic_meta.t"
-
-fixed escaping where perl was called from bash using bash variables for
-tick_zone_serial
-
-fixed the interpreter to reference /bin/bash instead of /usr/bin/bash
-
-fixing the masses Makefile for pgapack for linux on new spamassassin-vm
-centos box
-
-Bug 7052: a fix for Net::DNS::Nameserver dependency on CentOS systems
-
-fix to install v341.pre file
-
-Bug 7050: fixed _DATE_ template tag by use of an anonymous sub,
-calling Util::time_to_rfc822_date() explicitly without any argument
-
-fixed newline collapse harming excessive whitespace rules
-
-added max_connections=100 as a safety feature
-
-fixed $self
-
-added get_names_of_tests_hit_with_scores_hash,
-get_names_of_tests_hit_with_scores functions to PMS along
-with trivial fixing of triggered being misspelled.
-
-uridnsbl_skip_domain vk.com (the russian facebook)
-
-fixed wrong plugin in IF
-
-Bug 7032: added tflag for noawl
-
-If a subrule is in an if block, ensure it appears in an else block to
-avoid breaking dependent rules. Fixed some rules depending on subrules
-in if blocks in other sandboxes so they don't break if the conditional
-check suppresses that subrule.
-
-Bug 6994: small change for systems with ACLs in testing
-
-fixed SQLBasedAddrList re-learning
-
-frequently seen domains on ns1.msedge.net
-
-added windows-1251 to likely FP list
-
-Bug 7024: check_rbl_from_host/check_rbl_from_domain/check_rbl_envfrom
-did not support the subtest functionality.  Fixed and removed
-has_check_rbl_from_domain as pointless now.
-
-Bug 7018: fixed misspelling on Razor configuration item
-
-Bug 7005: sa_compile.t test failures with MacPorts' perl - safe quoting
-
-use Config to get path when non-standard sitebin is set
-
-Bug 7015: fixed untaint var bug
-
-Bug 7013: added a small fix for bayes_auto_learn_on not working
-with BAYES_999
-
-Bug 7000: dnsbl_subtests.t hangs on Windows
-
-Bug 7008: fixed CPAN Parsing
-
-added eval for testing a quoted printable ratio for spaminess
-
-fixed SA version check
-
-Bug 7004: Test suite fails when using FreeBSD's 'script' utility
-
-
-Downloading and availability
-----------------------------
-
-Downloads are available from:
-
-http://spamassassin.apache.org/downloads.cgi
-
-md5sum of archive files:
-
-0db5d27d7b782ff5eadee12b95eae84c  Mail-SpamAssassin-3.4.1.tar.bz2
-76eca1f38c11635d319e62c26d5b034b  Mail-SpamAssassin-3.4.1.tar.gz
-2bbbf838d722c006b5ab97db167e4b22  Mail-SpamAssassin-3.4.1.zip
-4a1cbafbee2d0ae8c4f2f9ac05b4b3aa  Mail-SpamAssassin-rules-3.4.1.r1675274.tgz
-
-sha1sum of archive files:
-
-ddd62c5ab376554b0110b8fdc84f3508ea590659  Mail-SpamAssassin-3.4.1.tar.bz2
-e7b342d30f4983f70f4234480b489ccc7d2aa615  Mail-SpamAssassin-3.4.1.tar.gz
-4fae06059eeffaba43d7779f764ecda52e31af85  Mail-SpamAssassin-3.4.1.zip
-fcbcbf767f8c0b1b2ce2c3be4010cf6130f826b9  Mail-SpamAssassin-rules-3.4.1.r1675274.tgz
-
-Note that the *-rules-*.tar.gz files are only necessary if you cannot,
-or do not wish to, run "sa-update" after install to download the latest
-fresh rules.
-
-See the INSTALL and UPGRADE files in the distribution for important
-installation notes.
-
-
-GPG Verification Procedure
---------------------------
-The release files also have a .asc accompanying them.  The file serves
-as an external GPG signature for the given release file.  The signing
-key is available via the wwwkeys.pgp.net key server, as well as
-http://www.apache.org/dist/spamassassin/KEYS
-
-The key information is:
-
-pub   4096R/F7D39814 2009-12-02
-       Key fingerprint = D809 9BC7 9E17 D7E4 9BC2  1E31 FDE5 2F40 F7D3 9814
-uid                  SpamAssassin Project Management Committee <private@spamassassin.apache.org>
-uid                  SpamAssassin Signing Key (Code Signing Key, replacement for 1024D/265FA05B) <dev@spamassassin.apache.org>
-sub   4096R/7B3265A5 2009-12-02
-
-To verify a release file, download the file with the accompanying .asc
-file and run the following commands:
-
-  gpg --verbose --keyserver wwwkeys.pgp.net --recv-key F7D39814
-  gpg --verify Mail-SpamAssassin-3.4.1.tar.bz2.asc
-  gpg --fingerprint F7D39814
-
-Then verify that the key matches the signature.
-
-Note that older versions of gnupg may not be able to complete the steps
-above. Specifically, GnuPG v1.0.6, 1.0.7 & 1.2.6 failed while v1.4.11
-worked flawlessly.
-
-See http://www.apache.org/info/verification.html for more information
-on verifying Apache releases.
-
-
-About Apache SpamAssassin
--------------------------
-
-Apache SpamAssassin is a mature, widely-deployed open source project
-that serves as a mail filter to identify spam. SpamAssassin uses a
-variety of mechanisms including mail header and text analysis, Bayesian
-filtering, DNS blocklists, and collaborative filtering databases. In
-addition, Apache SpamAssassin has a modular architecture that allows
-other technologies to be quickly incorporated as an addition or as a
-replacement for existing methods.
-
-Apache SpamAssassin typically runs on a server, classifies and labels
-spam before it reaches your mailbox, while allowing other components of
-a mail system to act on its results.
-
-Most of the Apache SpamAssassin is written in Perl, with heavily
-traversed code paths carefully optimized. Benefits are portability,
-robustness and facilitated maintenance. It can run on a wide variety of
-POSIX platforms.
-
-The server and the Perl library feels at home on Unix and Linux platforms
-and reportedly also works on MS Windows systems under ActivePerl.
-
-For more information, visit http://spamassassin.apache.org/
-
-
-About The Apache Software Foundation
-------------------------------------
-
-Established in 1999, The Apache Software Foundation provides
-organizational, legal, and financial support for more than 100
-freely-available, collaboratively-developed Open Source projects. The
-pragmatic Apache License enables individual and commercial users to
-easily deploy Apache software; the Foundation's intellectual property
-framework limits the legal exposure of its 2,500+ contributors.
-
-For more information, visit http://www.apache.org/
diff --git a/build/mkupdates/run_part2 b/build/mkupdates/run_part2
index 7f032bf..08aa0f8 100755
--- a/build/mkupdates/run_part2
+++ b/build/mkupdates/run_part2
@@ -38,7 +38,7 @@
 #
 soadir=/var/named/spamassassin.org.d
 
-versions="3.4.2"
+versions="3.4.1"
 
 # ---------------------------------------------------------------------------
 # TODO: if/when this becomes fully automatic, this commit will be superfluous
diff --git a/lib/Mail/SpamAssassin.pm b/lib/Mail/SpamAssassin.pm
index db65bfc..a6fe677 100644
--- a/lib/Mail/SpamAssassin.pm
+++ b/lib/Mail/SpamAssassin.pm
@@ -94,13 +94,13 @@
   @site_rules_path
 };
 
-$VERSION = "4.000000";      # update after release (same format as perl $])
+$VERSION = "3.004001";      # update after release (same format as perl $])
 $IS_DEVEL_BUILD = 1;        # change for release versions
 
 # Used during the prerelease/release-candidate part of the official release
 # process. If you hacked up your SA, you should add a version_tag to your .cf
 # files; this variable should not be modified.
-#@EXTRA_VERSION = qw();
+#@EXTRA_VERSION = qw(rc1);
 
 @ISA = qw();
 
diff --git a/lib/Mail/SpamAssassin/Conf.pm b/lib/Mail/SpamAssassin/Conf.pm
index e3a4002..7deccc4 100644
--- a/lib/Mail/SpamAssassin/Conf.pm
+++ b/lib/Mail/SpamAssassin/Conf.pm
@@ -360,24 +360,24 @@
 address to whitelist, and the second is a string to match the relay's rDNS,
 or its IP address. Matching is case-insensitive.
 
-This second parameter is matched against a TCP-info information field as
-provided in a FROM clause of a trace information (i.e. in a Received header
+This second parameter is matched against the TCP-info information field as
+provided in a FROM clause of a trace information (i.e. the Received header
 field, see RFC 5321). Only the Received header fields inserted by trusted
-hosts are considered. This parameter can either be a full hostname, or a
-domain component of that hostname, or an IP address (optionally followed
-by a slash and a prefix length) in square brackets. The address prefix
-(mask) length with a slash may stand within brackets along with an address,
-or may follow the bracketed address. Reverse DNS lookup is done by an MTA,
-not by SpamAssassin.
+hosts are considered. This parameter can either be a full hostname, or the
+domain component of that hostname, or an IP address in square brackets.
+The reverse DNS lookup is done by a MTA, not by SpamAssassin.
 
-For backward compatibility as an alternative to a CIDR notation, an IPv4
-address in brackets may be truncated on classful boundaries to cover whole
-subnets, e.g. C<[10.1.2.3]>, C<[10.1.2]>, C<[10.1]>, C<[10]>.
+In case of an IPv4 address in brackets, it may be truncated on classful
+boundaries to cover whole subnets, e.g. C<[10.1.2.3]>, C<[10.1.2]>,
+C<[10.1]>, C<[10]>.  CIDR notation is currently not supported, nor is
+IPv6. The matching on IP address is mainly provided to cover rare cases
+where whitelisting of a sending MTA is desired which does not have a
+correct reverse DNS configured.
 
 In other words, if the host that connected to your MX had an IP address
 192.0.2.123 that mapped to 'sendinghost.example.org', you should specify
-C<sendinghost.example.org>, or C<example.org>, or C<[192.0.2.123]>, or
-C<[192.0.2.0/24]>, or C<[192.0.2]> here.
+C<sendinghost.example.org>, or C<example.org>, or C<[192.0.2.123]> or
+C<[192.0.2]> here.
 
 Note that this requires that C<internal_networks> be correct.  For simple
 cases, it will be, but for a complex network you may get better results
@@ -390,12 +390,8 @@
 e.g.
 
   whitelist_from_rcvd joe@example.com  example.com
-  whitelist_from_rcvd *@*              mail.example.org
+  whitelist_from_rcvd *@axkit.org      sergeant.org
   whitelist_from_rcvd *@axkit.org      [192.0.2.123]
-  whitelist_from_rcvd *@axkit.org      [192.0.2.0/24]
-  whitelist_from_rcvd *@axkit.org      [192.0.2.0]/24
-  whitelist_from_rcvd *@axkit.org      [2001:db8:1234::/48]
-  whitelist_from_rcvd *@axkit.org      [2001:db8:1234::]/48
 
 =item def_whitelist_from_rcvd addr@lists.sourceforge.net sourceforge.net
 
@@ -1143,29 +1139,29 @@
 	unless (defined $value && $value !~ /^$/) {
 	    return $MISSING_REQUIRED_VALUE;
 	}
-        if    (lc $value eq 'yes' || $value eq '1') { $value = 1 }
-        elsif (lc $value eq 'no'  || $value eq '0') { $value = 0 }
-        else { return $INVALID_VALUE }
-
-	$self->{normalize_charset} = $value;
+	return  if $value == 0;
+	return $INVALID_VALUE unless $value == 1;
 
 	unless ($] > 5.008004) {
 	    $self->{parser}->lint_warn("config: normalize_charset requires Perl 5.8.5 or later");
-	    $self->{normalize_charset} = 0;
 	    return $INVALID_VALUE;
 	}
 	require HTML::Parser;
         #changed to eval to use VERSION so that this version was not incorrectly parsed for CPAN
 	unless ( eval { HTML::Parser->VERSION(3.46) } ) {
 	    $self->{parser}->lint_warn("config: normalize_charset requires HTML::Parser 3.46 or later");
-	    $self->{normalize_charset} = 0;
 	    return $INVALID_VALUE;
 	}
+#	unless (eval 'require Encode::Detect::Detector') {
+#	    $self->{parser}->lint_warn("config: normalize_charset requires Encode::Detect::Detector");
+#	    return $INVALID_VALUE;
+#	}
 	unless (eval 'require Encode') {
 	    $self->{parser}->lint_warn("config: normalize_charset requires Encode");
-	    $self->{normalize_charset} = 0;
 	    return $INVALID_VALUE;
 	}
+
+	$self->{normalize_charset} = 1;
     }
   });
 
@@ -4228,18 +4224,17 @@
 This will be replaced with the version number of the currently-running
 SpamAssassin engine.  Note: The version used is in the internal SpamAssassin
 version format which is C<x.yyyzzz>, where x is major version, y is minor
-version, and z is maintenance version.  So 3.0.0 is C<3.000000>, and 3.4.80
-is C<3.004080>.
+version, and z is maintenance version.  So 3.0.0 is C<3.000000>, and 3.4.80 is
+C<3.004080>.
 
 =item perl_version
 
-(Introduced in 3.4.1)  This will be replaced with the version number of the
-currently-running perl engine.  Note: The version used is in the $] version
-format which is C<x.yyyzzz>, where x is major version, y is minor version,
-and z is maintenance version.  So 5.8.8 is C<5.008008>, and 5.10.0 is
-C<5.010000>. Use to protect rules that incorporate RE syntax elements
-introduced in later versions of perl, such as the C<++> non-backtracking
-match introduced in perl 5.10. For example:
+(Introduced in 3.4.2)  This will be replaced with the version number of the currently-running
+perl engine.  Note: The version used is in the $] version format which is
+C<x.yyyzzz>, where x is major version, y is minor version, and z is maintenance
+version.  So 5.8.8 is C<5.008008>, and 5.10.0 is C<5.010000>. Use to protect rules
+that incorporate RE syntax elements introduced in later versions of perl, such
+as the C<++> non-backtracking match introduced in perl 5.10. For example:
 
   # Avoid lint error on older perl installs
   # Check SA version first to avoid warnings on checking perl_version on older SA
diff --git a/lib/Mail/SpamAssassin/Message/Node.pm b/lib/Mail/SpamAssassin/Message/Node.pm
index f1ad898..8833d7a 100644
--- a/lib/Mail/SpamAssassin/Message/Node.pm
+++ b/lib/Mail/SpamAssassin/Message/Node.pm
@@ -486,11 +486,6 @@
       $chset = 'Windows-1252'; $decoder = $enc_w1252;
     } else {
       $chset = $charset_declared; $decoder = Encode::find_encoding($chset);
-      if (!$decoder && $chset =~ /^GB[ -]?18030(?:-20\d\d)?\z/i) {
-        $decoder = Encode::find_encoding('GBK');  # a subset of GB18030
-        dbg("message: no decoder for a declared charset %s, using GBK",
-            $chset)  if $decoder;
-      }
     }
     if (!$decoder) {
       dbg("message: failed decoding, no decoder for a declared charset %s",
@@ -544,11 +539,6 @@
     my $charset_detected = Encode::Detect::Detector::detect($_[1]);
     if ($charset_detected && lc $charset_detected ne lc $charset_declared) {
       my $decoder = Encode::find_encoding($charset_detected);
-      if (!$decoder && $charset_detected =~ /^GB[ -]?18030(?:-20\d\d)?\z/i) {
-        $decoder = Encode::find_encoding('GBK');  # a subset of GB18030
-        dbg("message: no decoder for a detected charset %s, using GBK",
-            $charset_detected)  if $decoder;
-      }
       if (!$decoder) {
         dbg("message: failed decoding, no decoder for a detected charset %s",
             $charset_detected);
diff --git a/lib/Mail/SpamAssassin/PerMsgStatus.pm b/lib/Mail/SpamAssassin/PerMsgStatus.pm
index 902898d..6d8beaa 100644
--- a/lib/Mail/SpamAssassin/PerMsgStatus.pm
+++ b/lib/Mail/SpamAssassin/PerMsgStatus.pm
@@ -3073,25 +3073,24 @@
 
   #TEST POINT - my @addrs = ("test.voipquotes2.net","test.voipquotes2.co.uk");
   #Start with all the normal from addrs
-  my @addrs = all_from_addrs($self);
+  my @addrs = &all_from_addrs($self);
 
   dbg("eval: all '*From' addrs domains (before): " . join(" ", @addrs));
 
-  #Take just the domain with a dummy localpart
-  #removing invalid and duplicate domains
-  my(%addrs_seen, @addrs_filtered);
-  foreach my $a (@addrs) {
-    my $domain = $self->{main}->{registryboundaries}->uri_to_domain($a);
-    next if !defined $domain || $addrs_seen{lc $domain}++;
-    push(@addrs_filtered, 'dummy@'.$domain);
+  #loop through and limit to just the domain with a dummy address
+  for (my $i = 0; $i < scalar(@addrs); $i++) {
+    $addrs[$i] = 'dummy@'.$self->{main}->{registryboundaries}->uri_to_domain($addrs[$i]);
   }
 
-  dbg("eval: all '*From' addrs domains (after uri to domain): " .
-      join(" ", @addrs_filtered));
+  #Remove duplicate domains
+  my %addrs = map { $_ => 1 } @addrs;
+  @addrs = keys %addrs;
 
-  $self->{all_from_addrs_domains} = \@addrs_filtered;
+  dbg("eval: all '*From' addrs domains (after uri to domain): " . join(" ", @addrs));
 
-  return @addrs_filtered;
+  $self->{all_from_addrs_domains} = \@addrs;
+
+  return @addrs;
 }
 
 sub all_to_addrs {
diff --git a/lib/Mail/SpamAssassin/Plugin/BodyEval.pm b/lib/Mail/SpamAssassin/Plugin/BodyEval.pm
index 92c1892..e55aec6 100644
--- a/lib/Mail/SpamAssassin/Plugin/BodyEval.pm
+++ b/lib/Mail/SpamAssassin/Plugin/BodyEval.pm
@@ -218,7 +218,6 @@
     }
   }
 
-  dbg("eval: tvd_vertical_words value: $pms->{tvd_vertical_words} / min: $min / max: $max - value must be >= min and < max");
   return 1 if ($pms->{tvd_vertical_words} >= $min && $pms->{tvd_vertical_words} < $max);
 }
 
diff --git a/lib/Mail/SpamAssassin/Plugin/SPF.pm b/lib/Mail/SpamAssassin/Plugin/SPF.pm
index d608af7..7f066a0 100644
--- a/lib/Mail/SpamAssassin/Plugin/SPF.pm
+++ b/lib/Mail/SpamAssassin/Plugin/SPF.pm
@@ -506,9 +506,9 @@
       $self->{spf_server} = Mail::SPF::Server->new(
 				hostname     => $scanner->get_tag('HOSTNAME'),
 				dns_resolver => $self->{main}->{resolver},
-				max_dns_interactive_terms => 20);
+				max_dns_interactive_terms => 15);
       # Bug 7112: max_dns_interactive_terms defaults to 10, but even 14 is
-      # not enough for ebay.com, setting it to 15 NOTE: raising to 20 per bug 7182
+      # not enough for ebay.com, setting it to 15
       1;
     } or do {
       $eval_stat = $@ ne '' ? $@ : "errno=$!";  chomp $eval_stat;
diff --git a/lib/Mail/SpamAssassin/Plugin/TxRep.pm b/lib/Mail/SpamAssassin/Plugin/TxRep.pm
index 4c44175..5dc0cf2 100644
--- a/lib/Mail/SpamAssassin/Plugin/TxRep.pm
+++ b/lib/Mail/SpamAssassin/Plugin/TxRep.pm
@@ -1326,37 +1326,28 @@
   my $totalweight      = 0;
   $self->{totalweight} = $totalweight;
 
-  $delta += $self->check_reputations($pms, 'EMAIL_IP', $from, $ip, $signedby, $msgscore);
-
-  if ($domain) {
-    $delta += $self->check_reputations($pms, 'DOMAIN', $domain, $ip, $signedby, $msgscore);
-  }
-  if ($helo) {
-    $delta += $self->check_reputations($pms, 'HELO', $helo, undef, 'HELO', $msgscore);
-  }
+                     $delta += $self->check_reputations($pms, 'EMAIL_IP', $from,   $ip,   $signedby, $msgscore);
+  if ($domain)      {$delta += $self->check_reputations($pms, 'DOMAIN',   $domain, $ip,   $signedby, $msgscore);}
+  if ($helo)        {$delta += $self->check_reputations($pms, 'HELO',     $helo,   undef, 'HELO',    $msgscore);}
   if ($origip) {
-    if (!$signedby) {
-      $delta += $self->check_reputations($pms, 'EMAIL', $from, undef, undef, $msgscore);
-    }
-    $delta += $self->check_reputations($pms, 'IP', $origip, undef, undef, $msgscore);
+    if (!$signedby) {$delta += $self->check_reputations($pms, 'EMAIL',    $from,   undef, undef,     $msgscore);}
+                     $delta += $self->check_reputations($pms, 'IP',       $origip, undef, undef,     $msgscore);
   }
 
   if (!defined $self->{learning}) {
     $delta = ($self->{totalweight})? $self->{conf}->{txrep_factor} * $delta / $self->{totalweight}  :  0;
     if ($delta) {
-      $pms->got_hit("TXREP", "TXREP: ", ruletype => 'eval', score => sprintf("%0.3f", $delta));
+        $pms->got_hit("TXREP", "TXREP: ", ruletype => 'eval', score => sprintf("%0.3f", $delta));
     }
     $msgscore += $delta;
     if (defined $pms->{score}) {
-      dbg("TxRep: post-TxRep score: %.3f", $pms->{score});
+        dbg("TxRep: post-TxRep score: %.3f", $pms->{score});
     }
   }
   if ($self->{conf}->{txrep_track_messages} && $msg_id) {
     $self->check_reputations($pms, 'MSG_ID', $msg_id, undef, $date, $msgscore);
   }
-  if (!defined $self->{txKeepStoreTied}) {
-    $self->finish();
-  }
+  if (!defined $self->{txKeepStoreTied}) {$self->finish();}
 
   return 0;
 }
@@ -1370,16 +1361,14 @@
 
   if ($self->open_storages()) {
     if ($self->{conf}->{txrep_user2global_ratio} && $self->{user_storage} != $self->{global_storage}) {
-      my $user   = $self->check_reputation('user_storage',  @_);
-      my $global = $self->check_reputation('global_storage',@_);
+        my $user   = $self->check_reputation('user_storage',  @_);
+        my $global = $self->check_reputation('global_storage',@_);
 
-      if (defined $user and $user == $user) {
-        $delta = ( $self->{conf}->{txrep_user2global_ratio} * $user + $global ) / ( 1 + $self->{conf}->{txrep_user2global_ratio} );
-      } else {
-        $delta = $global;
-      }
+        $delta = (defined $user && $user==$user) ?
+            ( $self->{conf}->{txrep_user2global_ratio} * $user + $global ) / ( 1 + $self->{conf}->{txrep_user2global_ratio} ) :
+            $global;
     } else {
-      $delta = $self->check_reputation(undef,@_);
+        $delta = $self->check_reputation(undef,@_);
     }
   }
   return $delta;
@@ -1394,29 +1383,6 @@
   my $delta  = 0;
   my $weight = ($key eq 'MSG_ID')? 1 : eval('$pms->{main}->{conf}->{txrep_weight_'.lc($key).'}');
 
-#  {
-#    #Bug 7164, trying to find out reason for these: _WARN: Use of uninitialized value $msgscore in addition (+) at /usr/share/perl5/vendor_perl/Mail/SpamAssassin/Plugin/TxRep.pm line 1415.
-#    no warnings;
-#
-#    unless (defined $msgscore) {
-#      #Output some params and the calling function so we can identify more about this bug
-#      dbg("TxRep: MsgScore Undefined (bug 7164) - check_reputation Parameters: self: $self storage: $storage pms: $pms, key: $key, id: $id, ip: $ip, signedby: $signedby, msgscore: $msgscore");
-#      dbg("TxRep: MsgScore Undefined (bug 7164) - weight: $weight");
-#
-#      my ($package, $filename, $line) = caller();
-#
-#      chomp($package);
-#      chomp($filename);
-#      chomp($line);
-#
-#      dbg("TxRep: MsgScore Undefined (bug 7164) - Caller Info: Package: $package - Filename: $filename - Line: $line");
-#
-#      #Define $msgscore as a triage to hide warnings while we find the root cause
-#      #$msgscore = 0;
-#    }
-#  }
-
-
   if (defined $weight && $weight) {
     my $meanrep;
     my $timer = $self->{main}->time_method('check_txrep_'.lc($key));
@@ -1444,16 +1410,11 @@
         $self->{totalweight} += $weight;
         if ($key eq 'MSG_ID' && $self->count() > 0) {
             $delta = $self->total() / $self->count();
-	    $pms->set_tag('TXREP'.$tag_id,              sprintf("%2.1f", $delta));
+	    $pms->set_tag('TXREP'.$tag_id,              sprintf("%2.1f",$delta));
         } elsif (defined $self->total()) {
-            #Bug 7164 - $msgscore undefined
-            if (defined $msgscore) {
-              $delta = ($self->total() + $msgscore) / (1 + $self->count()) - $msgscore;
-            } else {
-              $delta = ($self->total()) / (1 + $self->count());
-            }
+            $delta = ($self->total() + $msgscore) / (1 + $self->count()) - $msgscore;
 
-            $pms->set_tag('TXREP_'.$tag_id,             sprintf("%2.1f", $delta));
+            $pms->set_tag('TXREP_'.$tag_id,             sprintf("%2.1f",$delta));
             if (defined $meanrep) {
                 $pms->set_tag('TXREP_'.$tag_id.'_MEAN', sprintf("%2.1f", $meanrep));
             }
@@ -1487,9 +1448,7 @@
         $self->{checker}->remove_entry($self->{entry}); #forgetting the message ID
     }
   }
-  if (defined $storage) {
-    $self->{checker} = $self->{default_storage};
-  }
+  if (defined $storage) {$self->{checker} = $self->{default_storage};}
 
   return ($weight || 0) * ($delta || 0);
 }
diff --git a/lib/Mail/SpamAssassin/Plugin/WLBLEval.pm b/lib/Mail/SpamAssassin/Plugin/WLBLEval.pm
index da6b3c3..1592560 100644
--- a/lib/Mail/SpamAssassin/Plugin/WLBLEval.pm
+++ b/lib/Mail/SpamAssassin/Plugin/WLBLEval.pm
@@ -17,16 +17,14 @@
 
 package Mail::SpamAssassin::Plugin::WLBLEval;
 
+use Mail::SpamAssassin::Plugin;
+use Mail::SpamAssassin::Logger;
+
 use strict;
 use warnings;
 use bytes;
 use re 'taint';
 
-use NetAddr::IP 4.000;
-
-use Mail::SpamAssassin::Plugin;
-use Mail::SpamAssassin::Logger;
-
 use vars qw(@ISA);
 @ISA = qw(Mail::SpamAssassin::Plugin);
 
@@ -312,51 +310,23 @@
   foreach my $white_addr (keys %{$list}) {
     my $regexp = qr/$list->{$white_addr}{re}/i;
     foreach my $domain (@{$list->{$white_addr}{domain}}) {
-      # $domain is a second param in whitelist_from_rcvd: a domain name or an IP address
       
       if ($addr =~ $regexp) {
-        # From or sender address matching the first param in whitelist_from_rcvd
         my $match;
         foreach my $lastunt (@relays) {
-          local($1,$2);
-          if ($domain =~ m{^ \[ (.*) \] ( / \d{1,3} )? \z}sx) {
-            # matching by IP address
+          local $1;
+          if ($domain =~ m{^ \[ (.*) \] \z}sx) {  # matching by IP address
             my($wl_ip, $rly_ip) = ($1, $lastunt->{ip});
-            $wl_ip .= $2  if defined $2;  # allow prefix len even after bracket
-
             if (!defined $rly_ip || $rly_ip eq '') {
               # relay's IP address not provided or unparseable
-
-            } elsif ($wl_ip  =~ /^\d+\.\d+\.\d+\.\d+\z/s) {
-              # an IPv4 whitelist entry can only be matched by an IPv4 relay
+            } elsif ($wl_ip =~ /^\d+\.\d+\.\d+\.\d+\z/) {
               if ($wl_ip eq $rly_ip) { $match = 1; last }  # exact match
-
-            } elsif ($wl_ip =~ /^[\d\.]+\z/s) {  # an IPv4 classful subnet?
+            } elsif ($wl_ip =~ /^[\d\.]+\z/) {  # assume IPv4 classful subnet
               $wl_ip =~ s/\.*\z/./;  # enforce trailing dot
-              if ($rly_ip =~ /^\Q$wl_ip\E/) { $match = 1; last }  # subnet
-
-            } else {  # either an wl entry is an IPv6 addr, or has a prefix len
-              my $rly_ip_obj = NetAddr::IP->new($rly_ip);  # TCP-info field
-              if (!defined $rly_ip_obj) {
-                dbg("rules: bad IP address in relay: %s, sender: %s",
-                    $rly_ip, $addr);
-              } else {
-                my $wl_ip_obj = NetAddr::IP->new($wl_ip); # whitelist 2nd param
-                if (!defined $wl_ip_obj) {
-                  info("rules: bad IP address in whitelist: %s", $wl_ip);
-                } elsif ($wl_ip_obj->contains($rly_ip_obj)) {
-                  # note: an IPv4-compatible IPv6 address can match an IPv4 addr
-                  dbg("rules: relay addr %s matches whitelist %s, sender: %s",
-                      $rly_ip, $wl_ip_obj, $addr);
-                  $match = 1; last;
-                } else {
-                  dbg("rules: relay addr %s does not match wl %s, sender %s",
-                      $rly_ip, $wl_ip_obj, $addr);
-                }
-              }
+              if ($rly_ip =~ /^\Q$wl_ip\E/i) { $match = 1; last }  # subnet
             }
-
-          } else {  # match by an rdns name
+            # todo: handle IPv6 and CIDR notation
+          } else {  # match by a rdns name
             my $rdns = $lastunt->{lc_rdns};
             if ($rdns =~ /(?:^|\.)\Q${domain}\E$/i) { $match=1; last }
           }
diff --git a/rules/20_drugs.cf b/rules/20_drugs.cf
index efffbb4..124f760 100644
--- a/rules/20_drugs.cf
+++ b/rules/20_drugs.cf
@@ -37,7 +37,7 @@
 # header rules
 # (only use sufficiently long drug name to make name unique)
 
-header SUBJECT_DRUG_GAP_C	Subject =~ /\bc[\sc]{0,2}i[\si]{0,2}a[\sa]{0,2}l[\sl]{0,2}i[\si]{0,2}s{1,3}\b/i
+header SUBJECT_DRUG_GAP_C	Subject =~ /\bc.{0,2}i.{0,2}a.{0,2}l.{0,2}i.{0,2}s\b/i
 describe SUBJECT_DRUG_GAP_C	Subject contains a gappy version of 'cialis'
 
 header SUBJECT_DRUG_GAP_L	Subject =~ /l.{0,2}e.{0,2}v.{0,2}i.{0,2}t.{0,2}r.{0,2}a/i
diff --git a/rules/20_phrases.cf b/rules/20_phrases.cf
index 4606dfa..eb098a3 100644
--- a/rules/20_phrases.cf
+++ b/rules/20_phrases.cf
@@ -55,6 +55,9 @@
 # strange pattern because otherwise it matches the std. majordomo line
 # pls note the comment above. DO NOT just put "to" in the first group!
 
+body EXCUSE_24			/you(?:'ve|'re| have| are)? receiv(?:e|ed|ing) this (?:advertisement|offer|special|recurring|paid).{0,16}\b(?:by either|because)/i
+describe EXCUSE_24		Claims you wanted this ad
+
 body EXCUSE_REMOVE		/to be removed from.{0,20}(?:mailings|offers)/i
 describe EXCUSE_REMOVE		Talks about how to be removed from mailings
 
@@ -82,15 +85,15 @@
 
 
 
-#MOVED TO 20_rules_to_sandbox.cf - kmcgrail 2015-05-14
-#body NA_DOLLARS			/\b(?:\d{1,3})?Million\b.{0,40}\b(?:Canadian Dollar?s?|US\$|U\.? ?S\.? Dollar)/i
-#describe NA_DOLLARS		Talks about a million North American dollars
-#
-#body US_DOLLARS_3               /(?:\$|usd).?\d{1,3}[,.]\d{3}[,.]\d{3}(?:[,.]\d\d)?/i
-#describe US_DOLLARS_3           Mentions millions of $ ($NN,NNN,NNN.NN)
-#
-#body MILLION_USD              	/Million\b.{0,40}\b(?:United States? Dollars?|USD)/i
-#describe MILLION_USD 		Talks about millions of dollars
+
+body NA_DOLLARS			/\b(?:\d{1,3})?Million\b.{0,40}\b(?:Canadian Dollar?s?|US\$|U\.? ?S\.? Dollar)/i
+describe NA_DOLLARS		Talks about a million North American dollars
+
+body US_DOLLARS_3               /(?:\$|usd).?\d{1,3}[,.]\d{3}[,.]\d{3}(?:[,.]\d\d)?/i
+describe US_DOLLARS_3           Mentions millions of $ ($NN,NNN,NNN.NN)
+
+body MILLION_USD              	/Million\b.{0,40}\b(?:United States? Dollars?|USD)/i
+describe MILLION_USD 		Talks about millions of dollars
 
 
 
diff --git a/rules/30_text_de.cf b/rules/30_text_de.cf
index c40fb4b..8b29a5c 100644
--- a/rules/30_text_de.cf
+++ b/rules/30_text_de.cf
@@ -259,9 +259,9 @@
 lang de describe BODY_ENHANCEMENT Informationen zur Penis-/Brustvergrößerung
 lang de describe BODY_ENHANCEMENT2 Informationen zur Penis-/Brustvergrößerung
 lang de describe IMPOTENCE Beseitigt Impotenz
-#lang de describe NA_DOLLARS Handelt von einer Million Dollar aus den US oder Kanada
-#lang de describe US_DOLLARS_3 Erwähnt Millonen von Dollar
-#lang de describe MILLION_USD Erwähnt Millonen von Dollar
+lang de describe NA_DOLLARS Handelt von einer Million Dollar aus den US oder Kanada
+lang de describe US_DOLLARS_3 Erwähnt Millonen von Dollar
+lang de describe MILLION_USD Erwähnt Millonen von Dollar
 lang de describe URG_BIZ Dringende Geschäfte
 lang de describe MONEY_BACK Mit Geld-zurück Garantie
 lang de describe FREE_QUOTE_INSTANT Kostenlos ein schnelles Preisangebot, ohne Verpflichtung
diff --git a/rules/30_text_fr.cf b/rules/30_text_fr.cf
index b956850..883a6f1 100644
--- a/rules/30_text_fr.cf
+++ b/rules/30_text_fr.cf
@@ -175,7 +175,7 @@
 lang fr describe SUBJECT_DIET            Le sujet parle de perte de poids
 lang fr describe LOW_PRICE              Contient "Lowest Price" (le prix le plus bas)
 lang fr describe MARKETING_PARTNERS	Prétend que vous vous êtes enregistré auprès d'un "partenaire" quelconque
-#lang fr describe MILLION_USD 		Phrase clé d'escroquerie nigérienne (millions of dollars)
+lang fr describe MILLION_USD 		Phrase clé d'escroquerie nigérienne (millions of dollars)
 lang fr describe __MIME_BASE64		Inclut un attachement en BASE64
 lang fr describe MIME_BASE64_BLANKS	Ligne blanches surnuméraires dans l'encodage BASE64
 lang fr describe MIME_BASE64_TEXT	Texte du message camouflé par encodage en BASE64
@@ -193,7 +193,7 @@
 lang fr describe MSGID_FROM_MTA_HEADER	Message-ID ajouté par un relais
 lang fr describe MSGID_OUTLOOK_INVALID	Message-ID falsifié (fortmat Outlook Express)
 lang fr describe MULTI_FORGED		les en-têtes "Received" montrent de nombreuses falsifications
-#lang fr describe NA_DOLLARS		Parle d'un million de dollars "nord-américains"
+lang fr describe NA_DOLLARS		Parle d'un million de dollars "nord-américains"
 lang fr describe NONEXISTENT_CHARSET	Message rédigé dans un jeu de caractères inexistant
 lang fr describe NOT_ADVISOR		Contient "Not registered investment advisor"
 lang fr describe NO_DNS_FOR_FROM	Adresse From: inconnue en DNS (pas d'enregistrement MX)
@@ -253,7 +253,7 @@
 lang fr describe USER_IN_MORE_SPAM_TO	Destinataire sur la liste "more_spam_to" (config SA locale)
 lang fr describe USER_IN_WHITELIST	Expéditeur sur la liste blanche (OK) (config SA locale)
 lang fr describe USER_IN_WHITELIST_TO	Destinataire sur la liste blanche (config SA)
-#lang fr describe US_DOLLARS_3           Escroq. nigérienne, version modifiée, phrase clé ($NN,NNN,NNN.NN)
+lang fr describe US_DOLLARS_3           Escroq. nigérienne, version modifiée, phrase clé ($NN,NNN,NNN.NN)
 lang fr describe DRUG_ED_ONLINE          Vente de Viagra par correspondance
 lang fr describe WEIRD_PORT		Lien HTTP vers un numéro de port non standard
 lang fr describe WEIRD_QUOTING		Utilisation étrange de symboles de citations
diff --git a/rules/30_text_nl.cf b/rules/30_text_nl.cf
index bd2808a..df0ec7c 100644
--- a/rules/30_text_nl.cf
+++ b/rules/30_text_nl.cf
@@ -189,9 +189,9 @@
 lang nl describe BODY_ENHANCEMENT                Informatie over het vergroten van lichaamsdelen
 lang nl describe BODY_ENHANCEMENT2               Informatie over het vergroten van lichaamsdelen
 lang nl describe IMPOTENCE                       Medicijn voor impotentie
-#lang nl describe NA_DOLLARS                      Praat over een miljoen Noord-Amerikaanse dollars
-#lang nl describe US_DOLLARS_3                    Vermeldt miljoenen $ ($NN,NNN,NNN.NN)
-#lang nl describe MILLION_USD                     Heeft het over miljoenen dollars
+lang nl describe NA_DOLLARS                      Praat over een miljoen Noord-Amerikaanse dollars
+lang nl describe US_DOLLARS_3                    Vermeldt miljoenen $ ($NN,NNN,NNN.NN)
+lang nl describe MILLION_USD                     Heeft het over miljoenen dollars
 lang nl describe MONEY_BACK                      Niet-goed-geld-terug garantie
 lang nl describe FREE_QUOTE_INSTANT              Gratis offerte
 lang nl describe BAD_CREDIT                      Los al uw leningen op
diff --git a/rules/30_text_pl.cf b/rules/30_text_pl.cf
index 0c827fc..58287bb 100644
--- a/rules/30_text_pl.cf
+++ b/rules/30_text_pl.cf
@@ -162,7 +162,7 @@
 lang pl describe LIVE_PORN		Prawdopodobnie porno - Porno na ¿ywo
 lang pl describe LOW_PRICE		Najni¿sza cena
 lang pl describe MARKETING_PARTNERS	Twierdzi, ¿e jeste¶ zarejestrowany jako partner
-#lang pl describe MILLION_USD 		O milionach dolarów
+lang pl describe MILLION_USD 		O milionach dolarów
 lang pl describe MIME_BASE64_BLANKS	Dodatkowe puste linie kodowane w Base64
 lang pl describe MIME_BASE64_TEXT	Tekst wiadomo¶ci zakamuflowany przy u¿yciu kodowania Base64
 lang pl describe __MIME_BASE64		Zawiera za³±cznik kodowany w Base64
@@ -180,7 +180,7 @@
 lang pl describe MSGID_FROM_MTA_HEADER	Message-Id zosta³ dodany przez relay
 lang pl describe MSGID_OUTLOOK_INVALID	Sfa³szowany Message-Id (w formacie Outlook Express)
 lang pl describe MULTI_FORGED		Nag³ówki Received: wykazuj± wielokrotne fa³szowanie
-#lang pl describe NA_DOLLARS		O milionie Pó³nocno Amerykañskich dolarów
+lang pl describe NA_DOLLARS		O milionie Pó³nocno Amerykañskich dolarów
 lang pl describe NO_DNS_FOR_FROM	Domena w nag³ówku Do: nie posiada wpisu w DNS (MX lub A)
 lang pl describe NO_MEDICAL		Bez badañ medycznych
 lang pl describe NONEXISTENT_CHARSET	Nieznany zestaw znaków (jêzyk).
@@ -231,7 +231,7 @@
 lang pl describe UPPERCASE_50_75	Tre¶æ jest w 50-75% wielkimi literami
 lang pl describe UPPERCASE_75_100	Tre¶æ jest w 75-100% wielkimi literami
 lang pl describe URG_BIZ		Pilna sprawa
-#lang pl describe US_DOLLARS_3		Wspomina miliony $ ($NN,NNN,NNN.NN)
+lang pl describe US_DOLLARS_3		Wspomina miliony $ ($NN,NNN,NNN.NN)
 lang pl describe USER_IN_ALL_SPAM_TO	U¿ytkownik jest wymieniony w 'all_spam_to'
 lang pl describe USER_IN_BLACKLIST	Od: zawiera adres z Twojej "czarnej listy"
 lang pl describe USER_IN_BLACKLIST_TO	U¿ytkownik jest wymieniony w 'blacklist_to'
diff --git a/rules/30_text_pt_br.cf b/rules/30_text_pt_br.cf
index 2f69796..d21a2b2 100644
--- a/rules/30_text_pt_br.cf
+++ b/rules/30_text_pt_br.cf
@@ -378,9 +378,9 @@
 lang pt_BR describe BODY_ENHANCEMENT Informação sobre como aumentar partes do corpo

 lang pt_BR describe BODY_ENHANCEMENT2 Informação sobre como aumentar partes do corpo

 lang pt_BR describe IMPOTENCE Fala sobre cura da impotência

-#lang pt_BR describe NA_DOLLARS Fala sobre milhões de dólares norte americanos ou canadenses

-#lang pt_BR describe US_DOLLARS_3 Contém $($NN,NNN,NNN.NN)

-#lang pt_BR describe MILLION_USD Fala sobre milhões de dólares

+lang pt_BR describe NA_DOLLARS Fala sobre milhões de dólares norte americanos ou canadenses

+lang pt_BR describe US_DOLLARS_3 Contém $($NN,NNN,NNN.NN)

+lang pt_BR describe MILLION_USD Fala sobre milhões de dólares

 lang pt_BR describe URG_BIZ Contém: "urgent matter"

 lang pt_BR describe MONEY_BACK Contém: "Money back guarantee"

 lang pt_BR describe FREE_QUOTE_INSTANT Contém: "Free express or no-obligation quote"

diff --git a/rules/50_scores.cf b/rules/50_scores.cf
index 7e8482e..9305034 100644
--- a/rules/50_scores.cf
+++ b/rules/50_scores.cf
@@ -96,6 +96,7 @@
 score EMPTY_MESSAGE 2.195 2.344 1.552 2.320
 score EM_ROLEX 0.595 1.309 2.068 0.618 # n=0
 score ENGLISH_UCE_SUBJECT 0.953 1.542 2.569 2.899 # n=0
+score EXCUSE_24 2.799
 score EXCUSE_4 2.399 1.687 2.399 1.325
 score EXCUSE_REMOVE 2.907 2.992 3.299 3.299
 #score FAKE_HELO_MAIL_COM_DOM 1.887 0.152 1.370 2.136
@@ -221,7 +222,7 @@
 score MALE_ENHANCE 3.100 3.099 3.099 0.851
 score MARKETING_PARTNERS 0.553 0.235 0.689 0.001
 score MID_DEGREES 0 # n=0 n=1 n=2 n=3
-#score MILLION_USD 3.799 2.477 3.221 3.247
+score MILLION_USD 3.799 2.477 3.221 3.247
 score MIME_BOUND_DD_DIGITS 3.016 0.349 2.417 1.373
 score MIME_BOUND_DIGITS_15 0.432 1.225 1.241 0.798
 score MIME_BOUND_EQ_REL 0 # n=0 n=1 n=2 n=3
@@ -245,7 +246,7 @@
 score MSGID_YAHOO_CAPS 0.797 1.413 2.278 1.411
 score MSOE_MID_WRONG_CASE 0.993 3.373 0.960 2.584 # n=2
 score MULTI_FORGED 0 # n=0 n=1 n=2 n=3
-#score NA_DOLLARS 3.599
+score NA_DOLLARS 3.599
 score NONEXISTENT_CHARSET 0 # n=0 n=1 n=2 n=3
 score NORMAL_HTTP_TO_IP 0.159 0.001 0.795 0.001
 score NOT_ADVISOR 0 # n=0 n=1 n=2 n=3
@@ -343,7 +344,7 @@
 score TVD_FLOAT_GENERAL 0 # n=0 n=1 n=2 n=3
 score TVD_INCREASE_SIZE 1.529 0.601 1.055 0.001 # n=1
 score TVD_LINK_SAVE 0 # n=0 n=1 n=2 n=3
-score TVD_PH_BODY_ACCOUNTS_PRE 0.001 #changed to 0.001 due to .211 S/O on 2015-05-01 but left due to Meta Use - #1.201 1.527 1.327 2.393 # n=1
+score TVD_PH_BODY_ACCOUNTS_PRE 1.201 1.527 1.327 2.393 # n=1
 score TVD_PH_REC 3.127 2.026 3.266 1.784 # n=2
 score TVD_PH_SEC 0.291 1.498 0.869 1.764 # n=1
 score TVD_PP_PHISH 0 # n=0 n=1 n=2 n=3
@@ -373,7 +374,7 @@
 score URI_NO_WWW_INFO_CGI 2.299 2.299 0.292 2.071
 score URI_OBFU_WWW 3.099 3.099 2.306 2.475
 score URI_UNSUBSCRIBE 0 # n=0 n=1 n=2 n=3
-#score US_DOLLARS_3 2.599 2.523 1.780 1.754
+score US_DOLLARS_3 2.599 2.523 1.780 1.754
 score VIA_GAP_GRA 0 # n=0 n=1 n=2 n=3
 score WEIRD_PORT 0.001 0.001 0.097 0.001
 score WEIRD_QUOTING 0.001 0.001 0.001 0.001
diff --git a/rules/60_txrep.cf b/rules/60_txrep.cf
deleted file mode 100644
index 7728fd4..0000000
--- a/rules/60_txrep.cf
+++ /dev/null
@@ -1,31 +0,0 @@
-# SpamAssassin rules file: TxRep reputation system
-#
-# Please don't modify this file as your changes will be overwritten with
-# the next update. Use @@LOCAL_RULES_DIR@@/local.cf instead.
-# See 'perldoc Mail::SpamAssassin::Conf' for details.
-#
-# <@LICENSE>
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to you under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at:
-# 
-#     http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# </@LICENSE>
-
-ifplugin Mail::SpamAssassin::Plugin::TxRep
-
-header         TXREP   eval:check_senders_reputation()
-describe       TXREP   Score normalizing based on sender's reputation
-tflags         TXREP   userconf noautolearn
-priority       TXREP   1000
-
-endif # Mail::SpamAssassin::Plugin::TxRep
diff --git a/rules/local.cf b/rules/local.cf
index 95bc494..a40b217 100644
--- a/rules/local.cf
+++ b/rules/local.cf
@@ -52,11 +52,6 @@
 # bayes_ignore_header X-Spam-Status
 
 
-#   Whether to decode non- UTF-8 and non-ASCII textual parts and recode
-#   them to UTF-8 before the text is given over to rules processing.
-#
-# normalize_charset 1
-
 #   Some shortcircuiting, if the plugin is enabled
 # 
 ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
diff --git a/spamd-apache2/Makefile.PL b/spamd-apache2/Makefile.PL
index 018ca58..0aaa5b3 100644
--- a/spamd-apache2/Makefile.PL
+++ b/spamd-apache2/Makefile.PL
@@ -20,7 +20,7 @@
 	VERSION   => '0.03',
 	NAME      => 'Mail::SpamAssassin::Spamd::Apache2',
 	ABSTRACT  => 'mod_perl2 module implementing spamd in Apache2',
-	AUTHOR    => 'The Apache SpamAssassin Project <dev at spamassassin.apache.org>',
+	AUTHOR    => 'Radoslaw Zielinski <radek@pld-linux.org>',
 	EXE_FILES => [qw(bin/apache-spamd.pl)],
 	PREREQ_PM => {
 		'mod_perl2'          => 2,
diff --git a/spamd-apache2/README.apache b/spamd-apache2/README.apache
index 5ecc75d..c614869 100644
--- a/spamd-apache2/README.apache
+++ b/spamd-apache2/README.apache
@@ -45,20 +45,28 @@
 
 
 BUGS
-  
-See <http://issues.apache.org/SpamAssassin/> to report a bug.
 
-Please include perl, Apache and mod_perl versions. 
+For now, report to me directly or to the SpamAssassin dev list.
 
-`httpd -V` shouldn't hurt (unless you know it doesn't matter in your case).  
-`httpd -l` might also be handy, if you're reporting an apache-spamd.pl issue.
-Don't forget relevant lines from logs/error_log.
+Include perl, Apache and mod_perl versions.  `httpd -V` shouldn't hurt
+(unless you know it doesn't matter in your case).  `httpd -l` might also
+be handy, if you're reporting an apache-spamd.pl issue.  Don't forget
+relevant lines from logs/error_log.
 
-Known bugs: 
-
-Worker (and other threading MPMs) probably will cause
+Known bugs: worker (and other threading MPMs) probably will cause
 problems.  SA isn't really thread-safe; one example is using umask().
 Some helpers like Razor / Pyzor / DCC probably do chdir().  I consider
 this a problem of SA, not this code.
 
+
+COPYRIGHT AND LICENCE
+
+Copyright (C) 2006 by Radosław Zieliński <radek@pld-linux.org>
+
+Based on spamd code, (C) by The SpamAssassin(tm) Project
+
+This library is free software; you can redistribute it and/or modify it
+under the terms of the Apache License, Version 2.0.
+
+
 # vim: encoding=utf8
diff --git a/spamd-apache2/lib/Mail/SpamAssassin/Spamd.pm b/spamd-apache2/lib/Mail/SpamAssassin/Spamd.pm
index aa53213..1a8f0a8 100644
--- a/spamd-apache2/lib/Mail/SpamAssassin/Spamd.pm
+++ b/spamd-apache2/lib/Mail/SpamAssassin/Spamd.pm
@@ -47,15 +47,6 @@
 
 See the source code of L<spamd(1)> and L<Mail::SpamAssassin::Spamd::Apache2(3)>.
 
-=head1 AUTHORS
-
-The SpamAssassin(tm) Project E<lt>http://spamassassin.apache.org/E<gt>
-
-=head1 COPYRIGHT
-
-SpamAssassin is distributed under the Apache License, Version 2.0, as
-described in the file C<LICENSE> included with the distribution.
-
 =head2 METHODS
 
 =over
diff --git a/spamd-apache2/lib/Mail/SpamAssassin/Spamd/Apache2.pm b/spamd-apache2/lib/Mail/SpamAssassin/Spamd/Apache2.pm
index 0d37721..0af4831 100644
--- a/spamd-apache2/lib/Mail/SpamAssassin/Spamd/Apache2.pm
+++ b/spamd-apache2/lib/Mail/SpamAssassin/Spamd/Apache2.pm
@@ -17,8 +17,6 @@
 use APR::SockAddr ();
 use APR::Socket   ();
 use APR::Status   ();
-use Apache::Test;
-use constant APACHE24   => have_min_apache_version('2.4.0');
 
 eval { use Time::HiRes qw(time); };
 
@@ -161,8 +159,8 @@
 
 sub _server      { $_[0]->c->base_server }          # -: a
 sub _remote_host { $_[0]->c->get_remote_host }      # -: a
-sub _remote_ip   { APACHE24 ? $_[0]->c->client_ip : $_[0]->c->remote_ip; }            # -: a
-sub _remote_port { APACHE24 ? $_[0]->c->client_addr->port : $_[0]->c->remote_addr->port }    # -: a
+sub _remote_ip   { $_[0]->c->remote_ip }            # -: a
+sub _remote_port { $_[0]->c->remote_addr->port }    # -: a
 
 
 sub send_buffer { # -: A
diff --git a/spamd-apache2/lib/Mail/SpamAssassin/Spamd/Apache2/AclIP.pm b/spamd-apache2/lib/Mail/SpamAssassin/Spamd/Apache2/AclIP.pm
index b5a3893..3b07833 100644
--- a/spamd-apache2/lib/Mail/SpamAssassin/Spamd/Apache2/AclIP.pm
+++ b/spamd-apache2/lib/Mail/SpamAssassin/Spamd/Apache2/AclIP.pm
@@ -6,9 +6,6 @@
 use Apache2::Module    ();
 use Apache2::ServerRec ();
 
-use Apache::Test;
-use constant APACHE24   => have_min_apache_version('2.4.0');
-
 use Mail::SpamAssassin::Logger;
 
 =head1 NAME
@@ -64,17 +61,14 @@
   # my $ip = NetAddr::IP::Lite->new($c->remote_ip)
   #   or return Apache2::Const::SERVER_ERROR;   # log it, shouldn't happen
 
-  #use Apache::Test have_min_apache_version to support MP under Apache 2.2 and 2.4
-  my $remote = APACHE24 ? $c->client_addr : $c->remote_addr;
-
+  my $remote = $c->remote_addr;
   for my $allowed (@{ $srv_cfg->{allowed_networks} }) {
     # depends on allowed_ips format; TODO; if NetAddr::IP::Lite:
     # return Apache2::Const::OK if $allowed->contains($ip);
     return Apache2::Const::OK if $allowed->test($remote);
   }
 
-  info(sprintf "access denied for '%s'", APACHE24 ? $c->client_ip : $c->remote_ip);
-
+  info(sprintf "access denied for '%s'", $c->remote_ip);
   return Apache2::Const::FORBIDDEN;
 }
 
diff --git a/spamd-apache2/lib/Mail/SpamAssassin/Spamd/Apache2/AclRFC1413.pm b/spamd-apache2/lib/Mail/SpamAssassin/Spamd/Apache2/AclRFC1413.pm
index 5df72c4..b364520 100644
--- a/spamd-apache2/lib/Mail/SpamAssassin/Spamd/Apache2/AclRFC1413.pm
+++ b/spamd-apache2/lib/Mail/SpamAssassin/Spamd/Apache2/AclRFC1413.pm
@@ -7,9 +7,6 @@
 use Apache2::RequestRec  ();
 use Apache2::Access      ();    # $r->get_remote_logname
 
-use Apache::Test;
-use constant APACHE24   => have_min_apache_version('2.4.0');
-
 use APR::SockAddr ();           # $c->remote_addr->...
 use APR::Table    ();           # $c->notes
 
@@ -72,8 +69,8 @@
 
   unless (defined $remote_user && length $remote_user) {
     warn 'rfc1413 check: failed to obtain info for '
-      . APACHE24 ? $c->client_addr->ip_get() : $c->remote_addr->ip_get() . ':'
-      . APACHE24 ? $c->client_addr->port() : $c->remote_addr->port() . "\n";
+      . $c->remote_addr->ip_get() . ':'
+      . $c->remote_addr->port() . "\n";
     return Apache2::Const::FORBIDDEN;
   }
 
@@ -96,14 +93,14 @@
   my ($c, $user) = @_;
   my $remote_user = $c->notes->{remote_user};
   die "rfc1413 check: no query result for user=$user ip="
-    . APACHE24 ? $c->client_addr->ip_get() : $c->remote_addr->ip_get()
+    . $c->remote_addr->ip_get()
     . ' port='
-    . APACHE24 ? $c->client_addr->port() : $c->remote_addr->port()
+    . $c->remote_addr->port()
     unless defined $remote_user && length $remote_user;
   return $remote_user if $user eq $remote_user;
   warn "ident mismatch for [$user] from "
-    . APACHE24 ? $c->client_addr->ip_get() : $c->remote_addr->ip_get() . ':'
-    . APACHE24 ? $c->client_addr->port() : $c->remote_addr->port()
+    . $c->remote_addr->ip_get() . ':'
+    . $c->remote_addr->port()
     . "; remote identd returned [$remote_user]\n";
   0;
 }
diff --git a/spamd/spamd.raw b/spamd/spamd.raw
index 8d46bca..821f658 100755
--- a/spamd/spamd.raw
+++ b/spamd/spamd.raw
@@ -415,7 +415,6 @@
   'log-timestamp-fmt:s'      => \$opt{'log-timestamp-fmt'},
   'timeout-tcp|T=i'          => \$opt{'timeout-tcp'},
   'timeout-child|t=i'        => \$opt{'timeout-child'},
-  'timing'                   => \$opt{'timing'},
   'user-config'              => \$opt{'user-config'},
   'username|u=s'             => \$opt{'username'},
   'version|V'                => \$opt{'version'},
@@ -1172,11 +1171,6 @@
   }
 );
 
-#Enable Timing?
-if ($opt{'timing'}) {
-  $spamtest->timer_enable();
-}
-
 # if $clients_per_child == 1, there's no point in copying configs around
 unless ($clients_per_child > 1) {
   # unset $copy_config_p so we don't bother trying to copy things back
@@ -1462,12 +1456,7 @@
       }
       undef $current_user;
 
-      #LOG TIMING
-      if ($opt{'timing'}) {
-        info("timing: " . $spamtest->timer_report());
-      } else {
-        dbg("timing: " . $spamtest->timer_report()) if would_log('dbg', 'timing');
-      }
+      dbg("timing: " . $spamtest->timer_report()) if would_log('dbg', 'timing');
     }
 
     # If the child lives to get here, it will die ...  Muhaha.
@@ -2428,7 +2417,6 @@
       return 0;
     }
     $hdrs->{compress_zlib} = 1;
-    dbg("spamd: compress header received\n");
   }
   else {
     protocol_error("(compression type not supported)");
@@ -3251,7 +3239,6 @@
  --socketowner=name                Set UNIX domain socket file's owner
  --socketgroup=name                Set UNIX domain socket file's group
  --socketmode=mode                 Set UNIX domain socket file's mode
- --timing                          Enable timing and logging
  -V, --version                     Print version and exit
 
 The --listen option (or -i) may be specified multiple times, its syntax
@@ -3787,12 +3774,6 @@
 used, that user should have write permissions to unlink the file later, for
 when the C<spamd> server is killed.
 
-
-=item B<--timing>
-
-  Enable timing measurements and output the information for logging.  This
-  is the same information as provided by the TIMING tag.
-
 =back
 
 =head1 SEE ALSO
diff --git a/sql/README.txrep b/sql/README.txrep
index 38b975b..df0b5be 100644
--- a/sql/README.txrep
+++ b/sql/README.txrep
@@ -38,9 +38,9 @@
 user_awl_dsn                DBI:mysql:spamassassin:localhost
 
 Would tell SpamAssassin to connect to the database named spamassassin using
-MySQL on the local server, and since <port> is omitted, the driver will use
-the default port number.  The other two required options tells SpamAssassin
-to use the defined username and password to establish the connection.
+MySQL on the local server, and since <port> is omitted, the driver will use the
+default port number.  The other two required options tells SpamAssassin to use
+the defined username and password to establish the connection.
 
 If the user_awl_dsn option does not exist, SpamAssassin will not attempt
 to use SQL for tracking reputations.
@@ -85,12 +85,3 @@
 you must specify the proper storage backend in the config file in order
 for this to work and the current username must be passed to spamd.
 
-Maintenance
----------------
-
-It is recommended to keep user_awl_sql_table clear of stale data, for
-performance reasons. A sample query that can be run on a regular
-schedule is below:
-
-DELETE FROM txrep WHERE last_hit <= (now() - INTERVAL 120 day);
-
diff --git a/sql/txrep_mysql.sql b/sql/txrep_mysql.sql
index bbe6b95..f540196 100644
--- a/sql/txrep_mysql.sql
+++ b/sql/txrep_mysql.sql
@@ -5,7 +5,5 @@
   count int(11) NOT NULL default '0',
   totscore float NOT NULL default '0',
   signedby varchar(255) NOT NULL default '',
-  last_hit timestamp NOT NULL default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-  PRIMARY KEY (username,email,signedby,ip),
-  KEY last_hit (last_hit)
+  PRIMARY KEY (username,email,signedby,ip)
 ) ENGINE=InnoDB;
diff --git a/sql/txrep_pg.sql b/sql/txrep_pg.sql
index 52c1003..591758d 100644
--- a/sql/txrep_pg.sql
+++ b/sql/txrep_pg.sql
@@ -5,9 +5,7 @@
   count int(11) NOT NULL default '0',
   totscore float NOT NULL default '0',
   signedby varchar(255) NOT NULL default '',
-  last_hit timestamp NOT NULL default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-  PRIMARY KEY (username,email,signedby,ip),
-  KEY last_hit (last_hit)
+  PRIMARY KEY (username,email,signedby,ip)
 );
 
 ALTER TABLE txrep SET (fillfactor=95);
diff --git a/t/SATest.pm b/t/SATest.pm
index e1140a7..599d327 100644
--- a/t/SATest.pm
+++ b/t/SATest.pm
@@ -166,9 +166,7 @@
   # do not remove prior test results!
   # rmtree ("log");
 
-  unless (-d "log") {
-    mkdir ("log", 0755) or die ("Error creating log dir: $!");
-  }
+  mkdir ("log", 0755);
   chmod (0755, "log"); # set in case log already exists with wrong permissions
   system("chacl -B log 2>/dev/null || setfacl -b log 2>/dev/null"); # remove acls that confuse test
 
diff --git a/t/idn_dots.t b/t/idn_dots.t
deleted file mode 100755
index 7073d58..0000000
--- a/t/idn_dots.t
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/usr/bin/perl -w
-
-# test URIs with UTF8 IDNA-equivalent dots between domains instead of ordinary '.'
-
-BEGIN {
-  if (-e 't/test_dir') { # if we are running "t/rule_names.t", kluge around ...
-    chdir 't';
-  }
-
-  if (-e 'test_dir') {            # running from test directory, not ..
-    unshift(@INC, '../blib/lib');
-  }
-}
-
-my $prefix = '.';
-if (-e 'test_dir') {            # running from test directory, not ..
-  $prefix = '..';
-}
-
-use strict;
-use SATest; sa_t_init("normalize_utf8_dots.t");
-use Test;
-use Mail::SpamAssassin;
-use vars qw(%patterns %anti_patterns);
-
-# settings
-plan tests => 6;
-
-# initialize SpamAssassin
-my $sa = create_saobj({dont_copy_prefs => 1});
-$sa->init(0); # parse rules
-
-# load tests and write mail
-%patterns = ();
-%anti_patterns = ();
-my $message = write_mail();
-
-my $mail = $sa->parse($message);
-my $msg = Mail::SpamAssassin::PerMsgStatus->new($sa, $mail);
-
-my $uris = join("\n", $msg->get_uri_list(), "");
-
-# run patterns and anti-patterns
-my $failures = 0;
-for my $pattern (keys %patterns) {
-  if (!ok($uris =~ /${pattern}/m)) {
-    warn "failure: did not find /$pattern/\n";
-    $failures++;
-  }
-}
-
-for my $anti_pattern (keys %anti_patterns) {
-  if (!ok($uris !~ /${anti_pattern}/m)) {
-    warn "failure: did find /$anti_pattern/\n";
-    $failures++;
-  }
-}
-
-if ($failures) {
-  print "URIs found:\n$uris";
-}
-
-# function to write test email
-sub write_mail {
-  my $message = <<'EOF';
-Message-ID: <clean.1010101@example.com>
-Date: Mon, 07 Oct 2002 09:00:00 +0000
-From: Sender <sender@example.com>
-MIME-Version: 1.0
-To: Recipient <recipient@example.com>
-Subject: this is a trivial message
-Content-Type: text/plain; charset="UTF-8"
-Content-Transfer-Encoding: 8bit
-
-EOF
-
-  # Characters that look like a fullstop
-  my @delims = split(//, "\x{002E}\x{3002}\x{FF0E}\x{FF61}\x{FE52}\x{2024}");
-  my $i = 0;
-
-  foreach my $delim_char (@delims) {
-    $i++;
-    my $delim = $delim_char; utf8::encode($delim);  # to UTF-8 octets
-    my $string = "http://utf$i" . $delim . "example" . $delim . "com";
-    my @patterns = ("^http://utf$i\\.example\\.com\$");
-    if ($string && @patterns) {
-      $message .= "$string\n";
-      for my $pattern (@patterns) {
-        if ($pattern =~ /^!(.*)/) {
-          $anti_patterns{$1} = 1;
-        }
-        else {
-          $patterns{$pattern} = 1;
-        }
-      }
-    }
-  }
-
-  return $message;
-}
diff --git a/t/sa_compile.t b/t/sa_compile.t
index ac1e7ca..953b0be 100644
--- a/t/sa_compile.t
+++ b/t/sa_compile.t
@@ -5,8 +5,6 @@
 use SATest; sa_t_init("sa_compile");
 use Test;
 use Config;
-use File::Basename;
-use File::Path qw/mkpath/;
 
 my $temp_binpath = $Config{sitebinexp};
 $temp_binpath =~ s/^\Q$Config{prefix}\E//;
@@ -77,14 +75,8 @@
 
 sub set_rules {
   my $rules = shift;
-
-  #Create the dir for the cf file
-  my $file = "$instdir/foo/share/spamassassin/20_testrules.cf";
-  my $dir = dirname($file);
-  mkpath($dir);
-
-  open RULES, ">$file"
-          or die "cannot write $file - $!";
+  open RULES, ">$instdir/foo/share/spamassassin/20_testrules.cf"
+          or die "cannot write $instdir/foo/share/spamassassin/20_testrules.cf";
   print RULES qq{
 
     use_bayes 0
@@ -94,13 +86,8 @@
   };
   close RULES or die;
 
-  #Create the dir for the pre file
-  $file = "$instdir/foo/etc/mail/spamassassin/v330.pre";
-  $dir = dirname($file);
-  mkpath($dir);
-
-  open RULES, ">$file"
-          or die "cannot write $file - $!";
+  open RULES, ">$instdir/foo/etc/mail/spamassassin/v330.pre"
+          or die "cannot write $instdir/foo/etc/mail/spamassassin/v330.pre";
   print RULES qq{
 
     loadplugin Mail::SpamAssassin::Plugin::MIMEHeader