diff --git a/Script/CastorScript.py b/Script/CastorScript.py
index 0919f385af7133ad3c00fbc50b7c73b6d69f3f1b..a08fb2091c77ba704ebbe34f1913e7401d7a2b4a 100644
--- a/Script/CastorScript.py
+++ b/Script/CastorScript.py
@@ -1,9 +1,5 @@
 #!/bin/env tdaq_python
 
-from __future__ import print_function
-from future import standard_library
-standard_library.install_aliases()
-from builtins import str
 from queue import Queue
 from time import time
 import subprocess
diff --git a/Script/cs/StorageBackends/castorstorage.py b/Script/cs/StorageBackends/castorstorage.py
index f1882fc935c7151f6f6f126f6846b01c044c8859..e1d88a5ea2c7f737a52b5d8ca9a8a646b0a33d2d 100644
--- a/Script/cs/StorageBackends/castorstorage.py
+++ b/Script/cs/StorageBackends/castorstorage.py
@@ -1,4 +1,3 @@
-
 import subprocess
 import os
 
diff --git a/Script/cs/StorageBackends/eosstorage.py b/Script/cs/StorageBackends/eosstorage.py
index 88046271cd119b7bbbf9e69c0e725e15006dad2e..f33b803fe756d26cf87046162176901f9c61e2e1 100644
--- a/Script/cs/StorageBackends/eosstorage.py
+++ b/Script/cs/StorageBackends/eosstorage.py
@@ -2,7 +2,6 @@
 Provides EOS backend functionalities.
 Tape migration is not supported by EOS.
 """
-from builtins import str
 import subprocess
 import os
 import sys
diff --git a/Script/cs/StorageBackends/storagetester.py b/Script/cs/StorageBackends/storagetester.py
index 83c12e911c52ddda58a3740378b709b13b9ff8d8..33c9bb2a9650e54f16e61840f44f9ff3df0cc229 100644
--- a/Script/cs/StorageBackends/storagetester.py
+++ b/Script/cs/StorageBackends/storagetester.py
@@ -3,9 +3,6 @@
 Helper module to test storage backends
 
 """
-from __future__ import print_function
-
-
 import sys
 import logging
 import argparse
diff --git a/Script/cs/Threads/CopyThread.py b/Script/cs/Threads/CopyThread.py
index 28f7665167c21c947619be487f1b730d0bdccab3..71fe782514f7f4f516e83af565dffef1015ebff6 100644
--- a/Script/cs/Threads/CopyThread.py
+++ b/Script/cs/Threads/CopyThread.py
@@ -1,8 +1,4 @@
 #!/bin/env python
-
-from future import standard_library
-standard_library.install_aliases()
-from builtins import str
 import threading, glob, os
 from time import time
 import signal
diff --git a/Script/cs/Threads/DdmMonitoringThread.py b/Script/cs/Threads/DdmMonitoringThread.py
index b6c246ef1c0780a03bf66a202ddf1f5321c5eae3..735051f5ae8fbcd70fb29ef244e2ac1f05557d86 100644
--- a/Script/cs/Threads/DdmMonitoringThread.py
+++ b/Script/cs/Threads/DdmMonitoringThread.py
@@ -1,7 +1,4 @@
 #!/bin/env python
-from future import standard_library
-standard_library.install_aliases()
-from builtins import str
 import threading
 import urllib.request, urllib.error, urllib.parse #pylint: disable=import-error
 import json
diff --git a/Script/cs/Threads/DeleteThread.py b/Script/cs/Threads/DeleteThread.py
index 4ab7a16a8ef7dde326e3045e6ca36b5c487b68d8..1aebc3f16f7b4a038c05042ce3fd7f206bec7a62 100644
--- a/Script/cs/Threads/DeleteThread.py
+++ b/Script/cs/Threads/DeleteThread.py
@@ -1,7 +1,4 @@
 #!/bin/env python
-
-from builtins import str
-from builtins import map
 import threading
 import os
 import glob
diff --git a/Script/cs/Threads/InfoServiceThread.py b/Script/cs/Threads/InfoServiceThread.py
index 5ae6455debac298b26c9858f7f9a1aa352e45470..0d48753c4b2dd0a9546941b9c395835cfea37e32 100644
--- a/Script/cs/Threads/InfoServiceThread.py
+++ b/Script/cs/Threads/InfoServiceThread.py
@@ -1,8 +1,4 @@
 #!/usr/bin/env tdaq_python
-from __future__ import division
-from builtins import map
-from builtins import str
-from past.utils import old_div
 import threading
 import glob
 import os
@@ -120,8 +116,8 @@ class InfoServiceThread(threading.Thread):
                 self.logger.debug("creating ISObject: %s, type: %s", fs_data_identifier, fs_data_type)
                 is_data = ispy.ISObject(self.ipc_partition, fs_data_identifier, fs_data_type)
 
-                is_data.total_MB = old_div((fs.f_blocks * fs.f_bsize), 1000000)
-                is_data.available_MB = old_div((fs.f_bavail * fs.f_bsize), 1000000)
+                is_data.total_MB = (fs.f_blocks * fs.f_bsize) // 1000000
+                is_data.available_MB = (fs.f_bavail * fs.f_bsize) // 1000000
                 is_data.occupancy_percent = 100.*(1-float(fs.f_bavail)/float(fs.f_blocks))
 
                 self.logger.debug("checkin of is_data")
diff --git a/Script/cs/Threads/ManagerThread.py b/Script/cs/Threads/ManagerThread.py
index 38a4b73e0a163ef597cf97dd28c4b6ee5cfe323f..9729ddc851813ff484dea96271a1155f2e13dd84 100644
--- a/Script/cs/Threads/ManagerThread.py
+++ b/Script/cs/Threads/ManagerThread.py
@@ -1,11 +1,8 @@
 #!/bin/env python
-
 """ @package ManagerThread
 This module describe the Manager Thread.
 It is in charge of ls on SFO disk.
 """
-
-from past.builtins import cmp
 import threading, os, glob
 from time import time
 import datetime
@@ -254,6 +251,8 @@ class ManagerThread(threading.Thread):
 
     # Compare two (timestamp, filename, is express)
     def Compare(self,a, b):
+        def cmp(a, b):
+            return (a > b) - (a < b)
         if (a[2]!= b[2]): return cmp(-a[2],-b[2])
         else: return cmp(a[0],b[0])
 
diff --git a/Script/cs/Threads/ProfiledThread.py b/Script/cs/Threads/ProfiledThread.py
index 0ae3ccfa2e2d49892ec4d23741fbb1457035a376..11601e26d508b69165ed7ce4873f7d776642b5e3 100644
--- a/Script/cs/Threads/ProfiledThread.py
+++ b/Script/cs/Threads/ProfiledThread.py
@@ -1,23 +1,14 @@
 """ @package ProfiledThread
 Simple class to instrument threads with a profiler
 """
-from __future__ import print_function
-
 import threading
 import cProfile
 
 class ProfiledThread(threading.Thread):
     # Overrides threading.Thread.run()
     def run(self):
-
-        
         profiler = cProfile.Profile()
-        #try:
         res =  profiler.runcall(threading.Thread.run, self)
         profiler.dump_stats('/afs/cern.ch/user/v/vandelli/working/nightly/CastorScript/myprofile-%d.profile' % (self.ident,))
         print('Dump done')
         return res
-            
-        #finally:
-            
-            
diff --git a/Script/cs/Tools/ConfigParser.py b/Script/cs/Tools/ConfigParser.py
index add05cbd64e81793e3c9c7d8a5481dc72d3a51d8..6bd784b04654ddd37980cbe22ff10881ab3b5131 100644
--- a/Script/cs/Tools/ConfigParser.py
+++ b/Script/cs/Tools/ConfigParser.py
@@ -1,8 +1,4 @@
 #!/bin/env python
-from __future__ import print_function
-from builtins import str
-from builtins import zip
-from builtins import object
 from cs.Tools.Libraries.config import Config
 import importlib
 from collections import namedtuple
@@ -437,4 +433,3 @@ class ConfigHolder(object):
             self.DBLookupMaxRetries = self.DBLookupMaxRetries
         except AttributeError:
             self.DBLookupMaxRetries = 5
-
diff --git a/Script/cs/Tools/FilenameParsers/BCMFileNameParser.py b/Script/cs/Tools/FilenameParsers/BCMFileNameParser.py
index ba4729fb34e821fd579bda2ebe883122e60a2155..a59ce3d6193375b10d2a68ddc145dc72f76bc5c4 100644
--- a/Script/cs/Tools/FilenameParsers/BCMFileNameParser.py
+++ b/Script/cs/Tools/FilenameParsers/BCMFileNameParser.py
@@ -1,4 +1,3 @@
-from __future__ import print_function
 import os.path
 from cs.Tools.FilenameParsers.BaseFileNameParser import BaseFileNameParser
 
diff --git a/Script/cs/Tools/FilenameParsers/BCMSimpleFileNameParser.py b/Script/cs/Tools/FilenameParsers/BCMSimpleFileNameParser.py
index 24f088c71bbd4f704351cdec88ce4669097058f0..d176cdebf27ab6eb69955aa24db56778085690a5 100644
--- a/Script/cs/Tools/FilenameParsers/BCMSimpleFileNameParser.py
+++ b/Script/cs/Tools/FilenameParsers/BCMSimpleFileNameParser.py
@@ -1,4 +1,3 @@
-from __future__ import print_function
 __version__ = '$Revision$'
 
 import os.path
diff --git a/Script/cs/Tools/FilenameParsers/BaseFileNameParser.py b/Script/cs/Tools/FilenameParsers/BaseFileNameParser.py
index e808db7f98424f94574822b4f10a797e09fae9e5..f428e6d4f6a6136a74b2a7b0bfbd45488dc43738 100644
--- a/Script/cs/Tools/FilenameParsers/BaseFileNameParser.py
+++ b/Script/cs/Tools/FilenameParsers/BaseFileNameParser.py
@@ -1,4 +1,3 @@
-from builtins import object
 class BaseFileNameParser(object):
 
     def __init__(self, filename):
diff --git a/Script/cs/Tools/FilenameParsers/BeastFileNameParser.py b/Script/cs/Tools/FilenameParsers/BeastFileNameParser.py
index 58929e9ae141f1fba8016bdb2692b2467b021521..f7c2a61d1b46a6fa432fc833867c1f9e7b802f80 100644
--- a/Script/cs/Tools/FilenameParsers/BeastFileNameParser.py
+++ b/Script/cs/Tools/FilenameParsers/BeastFileNameParser.py
@@ -1,5 +1,4 @@
 #!/usr/bin/env tdaq_python
-from __future__ import print_function
 import os.path
 from cs.Tools.FilenameParsers.BaseFileNameParser import BaseFileNameParser
 
diff --git a/Script/cs/Tools/FilenameParsers/CocaFileNameParser.py b/Script/cs/Tools/FilenameParsers/CocaFileNameParser.py
index b4a0fe23b964c0350e12c2cd7fa449402e13fdc5..8475616fe37de1ed90a186ce90f3b227a90ecef9 100644
--- a/Script/cs/Tools/FilenameParsers/CocaFileNameParser.py
+++ b/Script/cs/Tools/FilenameParsers/CocaFileNameParser.py
@@ -1,8 +1,6 @@
 import os.path
 from cs.Tools.FilenameParsers.BaseFileNameParser import BaseFileNameParser
 
-
-#
 #  CDR parser for file names produced by coca. Main idea is that
 #  we start writing coca files to subdirectories and repeat the
 #  same directory structure in EOS. We split files between
diff --git a/Script/cs/Tools/FilenameParsers/MUCalibNameParser.py b/Script/cs/Tools/FilenameParsers/MUCalibNameParser.py
index 41417b8e1751d20a356fc32a367ed21582e5120a..46ccfd22126726cbfd41667505bc9a75b9000c27 100644
--- a/Script/cs/Tools/FilenameParsers/MUCalibNameParser.py
+++ b/Script/cs/Tools/FilenameParsers/MUCalibNameParser.py
@@ -1,5 +1,3 @@
-
-from builtins import str
 from cs.Tools.FilenameParsers.BaseFileNameParser import BaseFileNameParser
 import os.path
 
diff --git a/Script/cs/Tools/FilenameParsers/SCTFileNameParser.py b/Script/cs/Tools/FilenameParsers/SCTFileNameParser.py
index 352f9bece983e471c99b28b7f7bbc298d43eccc0..80da1c8a5757dd34b99f0e363433ace29f1b9119 100644
--- a/Script/cs/Tools/FilenameParsers/SCTFileNameParser.py
+++ b/Script/cs/Tools/FilenameParsers/SCTFileNameParser.py
@@ -1,5 +1,3 @@
-from __future__ import print_function
-
 from cs.Tools.FilenameParsers.BaseFileNameParser import BaseFileNameParser
 import os.path
 
diff --git a/Script/cs/Tools/FilenameParsers/SFOFileNameParser.py b/Script/cs/Tools/FilenameParsers/SFOFileNameParser.py
index 85626ffb6e00a9bc7f2273edc2bdfc99dd8fbbb5..74cc37b9027baafc67f4a3aa7802660effa87f35 100644
--- a/Script/cs/Tools/FilenameParsers/SFOFileNameParser.py
+++ b/Script/cs/Tools/FilenameParsers/SFOFileNameParser.py
@@ -1,4 +1,3 @@
-from builtins import str
 import os.path
 
 from cs.Tools.FilenameParsers.BaseFileNameParser import BaseFileNameParser
diff --git a/Script/cs/Tools/Libraries/Database.py b/Script/cs/Tools/Libraries/Database.py
index 1b7d1d852e58f2cc649fe851164e864714ea8018..aec8328f885b93020b9473183fed1ce16dad8826 100644
--- a/Script/cs/Tools/Libraries/Database.py
+++ b/Script/cs/Tools/Libraries/Database.py
@@ -1,8 +1,5 @@
 #!/bin/env python
-
-from builtins import str
-from builtins import object
-import cx_Oracle 
+import cx_Oracle
 import sys
 import datetime
 import time
diff --git a/Script/cs/Tools/LogConfig.py b/Script/cs/Tools/LogConfig.py
index 7a72127cc6b94dadecb1da9f16757888b84abe06..25f03432091fe5f2ec392e7509561c65005649e7 100644
--- a/Script/cs/Tools/LogConfig.py
+++ b/Script/cs/Tools/LogConfig.py
@@ -1,4 +1,3 @@
-from builtins import str
 import socket
 import os
 import logging
diff --git a/Script/cs/Tools/MigrationCheckers/DDMMigrated.py b/Script/cs/Tools/MigrationCheckers/DDMMigrated.py
index a44f3972805e4b5d499b0733ba68aa05bb2c7c2c..b00263772ed90a67473008d159685b63e04a37d4 100644
--- a/Script/cs/Tools/MigrationCheckers/DDMMigrated.py
+++ b/Script/cs/Tools/MigrationCheckers/DDMMigrated.py
@@ -1,7 +1,4 @@
 #!/bin/env python
-
-from __future__ import print_function
-from builtins import object
 import os.path
 import cs.StorageBackends.ctastorage as ctastorage
 import re
diff --git a/Script/cs/Tools/MigrationCheckers/MergedMigrated.py b/Script/cs/Tools/MigrationCheckers/MergedMigrated.py
index 499295bc4c65d862ce950bcb315b9704e9d53541..9022ebf527486f96f0f6c4867067d450e23438b1 100644
--- a/Script/cs/Tools/MigrationCheckers/MergedMigrated.py
+++ b/Script/cs/Tools/MigrationCheckers/MergedMigrated.py
@@ -1,6 +1,4 @@
 #!/bin/env python
-
-from __future__ import print_function
 import os.path
 import sys
 
diff --git a/Script/cs/Tools/MigrationCheckers/TestMigrated.py b/Script/cs/Tools/MigrationCheckers/TestMigrated.py
index 588aa64e46fa7fea4440f61be24dfcc7bb79ce0c..e1111b04fb6f72f1b71027e8cbea3056ca7a7aa1 100644
--- a/Script/cs/Tools/MigrationCheckers/TestMigrated.py
+++ b/Script/cs/Tools/MigrationCheckers/TestMigrated.py
@@ -1,6 +1,4 @@
 #!/bin/env python
-from __future__ import print_function
-from builtins import object
 import os.path
 import cs.StorageBackends.ctastorage as ctastorage
 
diff --git a/UnitTests/TestSuite_Functional.py b/UnitTests/TestSuite_Functional.py
index b9c7768df7bd549978e854e01278ee9091f1404a..755015e23953c2076d60537790358ec702a50c8e 100644
--- a/UnitTests/TestSuite_Functional.py
+++ b/UnitTests/TestSuite_Functional.py
@@ -1,4 +1,3 @@
-from __future__ import print_function
 import unittest
 from UnitTests.FunctionalTests import LocalCopy_Test
 
diff --git a/UnitTests/TestSuite_UnitTests.py b/UnitTests/TestSuite_UnitTests.py
index e70aa1dbb57c9d51422755ed8545bcbb3345aff4..76d899d838964d6252d1435fe0491dcf7a48fccf 100644
--- a/UnitTests/TestSuite_UnitTests.py
+++ b/UnitTests/TestSuite_UnitTests.py
@@ -1,4 +1,3 @@
-from __future__ import print_function
 import unittest
 from UnitTests import BaseFileNameParser_Test
 from UnitTests import LogConfig_Test
@@ -17,4 +16,4 @@ runner = unittest.TextTestRunner(verbosity=3)
 print("\n==============================================================")
 print("Running Unit Tests:")
 print("==============================================================\n")
-result = runner.run(suite)
\ No newline at end of file
+result = runner.run(suite)
diff --git a/UnitTests/UnitTests/ConfigParser_Test.py b/UnitTests/UnitTests/ConfigParser_Test.py
index 28df931dbd8bc9582822fe40fc78640e7d5be127..e24ca930bfde08f4d95b06b8ebc88dfe69b31a87 100644
--- a/UnitTests/UnitTests/ConfigParser_Test.py
+++ b/UnitTests/UnitTests/ConfigParser_Test.py
@@ -1,5 +1,4 @@
 import unittest
-#import mock
 import os
 
 if __name__ == '__main__':
diff --git a/UnitTests/UnitTests/ERSThread_Test.py b/UnitTests/UnitTests/ERSThread_Test.py
index 7f341b2726d3b011c8339056793232747b0435eb..e8acbf5ee5a63f90e2568a30aa55bbf35f9ef2e4 100644
--- a/UnitTests/UnitTests/ERSThread_Test.py
+++ b/UnitTests/UnitTests/ERSThread_Test.py
@@ -1,5 +1,3 @@
-from future import standard_library
-standard_library.install_aliases()
 import unittest
 import time
 import threading
diff --git a/UnitTests/UnitTests/FunctionalTests/LocalCopy_Test.py b/UnitTests/UnitTests/FunctionalTests/LocalCopy_Test.py
index 4a6a10aa4970c1c307705774d21af1bcbdd0cac7..a6b08e6ec65c7de133d322a971c67d3abd515ea1 100644
--- a/UnitTests/UnitTests/FunctionalTests/LocalCopy_Test.py
+++ b/UnitTests/UnitTests/FunctionalTests/LocalCopy_Test.py
@@ -1,4 +1,3 @@
-from builtins import str
 import unittest
 import signal
 import shutil
@@ -38,14 +37,14 @@ class TestCanCopyFilesLocally(unittest.TestCase):
         # I make a new file in CastorScript/tmp directory
         cfgTest = open(self.dirs["tmp"] + "/funcTestConf.cfg", "w")
 
-        # And I copy the content and replaces the directories with my own dirs        
+        # And I copy the content and replaces the directories with my own dirs
         custom_cfg_lines = {
             "LogDir: ": "LogDir: \'{}\'\n".format(self.dirs["log"]),
             "DirList: ": "DirList: [\'{}\',]\n".format(self.dirs["src"]),
             "CopyDir: ": "CopyDir: \'{}\'\n".format(self.dirs["des"]),
                 }
 
-        # And I copy the content and replaces the directories with my own dirs        
+        # And I copy the content and replaces the directories with my own dirs
         for line in cfgTemplate:
             for key, value in custom_cfg_lines.items():
                 if line.find(key) is not -1:
@@ -75,10 +74,10 @@ class TestCanCopyFilesLocally(unittest.TestCase):
 
 
     def test_localCopy_can_produce_logfiles(self):
-        
+
         seconds = 10
         timeout, output = DirectoryChecker(self.dirs["log"]).waitForAnyFile(seconds)
-        
+
         timeoutMessage = "Timeout, found no log files within a timeframe of " + str(seconds) + " seconds"
         self.assertFalse(timeout, msg=timeoutMessage)
 
@@ -87,10 +86,10 @@ class TestCanCopyFilesLocally(unittest.TestCase):
 
 
     def test_localCopy_can_copy_files_to_des_directory(self):
-        
+
         seconds = 4
         timeout, output = DirectoryChecker(self.dirs["des"]).waitForAnyFile(seconds)
-        
+
         timeoutMessage = "Timeout, found no files within a timeframe of " + str(seconds) + " seconds"
         self.assertFalse(timeout, msg=timeoutMessage)
 
diff --git a/UnitTests/UnitTests/InfoServiceThread_Test.py b/UnitTests/UnitTests/InfoServiceThread_Test.py
index abb53e8a69b791f12a118a400340470653b9a3c5..60c5b5b4ebd409f5a095ecef88aecbe9d2c8e57d 100644
--- a/UnitTests/UnitTests/InfoServiceThread_Test.py
+++ b/UnitTests/UnitTests/InfoServiceThread_Test.py
@@ -1,5 +1,3 @@
-from future import standard_library
-standard_library.install_aliases()
 import unittest
 import mock
 import threading
diff --git a/external/mailinglogger/__init__.py b/external/mailinglogger/__init__.py
deleted file mode 100644
index b6098ca855e1c72fc47a40ba73c3881fd83130a7..0000000000000000000000000000000000000000
--- a/external/mailinglogger/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from __future__ import absolute_import
-from .mailinglogger import MailingLogger
-from .summarisinglogger import SummarisingLogger
diff --git a/external/mailinglogger/common.py b/external/mailinglogger/common.py
deleted file mode 100644
index ee5977291a5d5d315b4d0671cad3198d5aa6f769..0000000000000000000000000000000000000000
--- a/external/mailinglogger/common.py
+++ /dev/null
@@ -1,24 +0,0 @@
-from cgi import escape
-from logging import Formatter
-from socket import gethostname
-
-
-class SubjectFormatter(Formatter):
-
-    def format(self, record):
-        record.message = record.getMessage()
-        if self._fmt.find('%(line)') >= 0:
-            record.line = record.message.split('\n')[0]
-        if self._fmt.find("%(asctime)") >= 0:
-            record.asctime = self.formatTime(record, self.datefmt)
-        if self._fmt.find("%(hostname)") >= 0:
-            record.hostname = gethostname()
-        return self._fmt % record.__dict__
-
-
-class HTMLFilter(object):
-
-    def filter(self, record):
-        record.msg = escape(record.getMessage())
-        record.args = ()
-        return True
diff --git a/external/mailinglogger/flood_template.txt b/external/mailinglogger/flood_template.txt
deleted file mode 100644
index e9e6b70e49157239b6a515f2acb898890c6187a3..0000000000000000000000000000000000000000
--- a/external/mailinglogger/flood_template.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-Too Many Log Entries
-                
-More than %s entries have been logged that would have resulted in
-emails being sent.
-
-No further emails will be sent for log entries generated between
-%s and %i:00:00
-
-Please consult any other configured logs, such as a File Logger,
-that may contain important entries that have not been emailed.
diff --git a/external/mailinglogger/mailinglogger.py b/external/mailinglogger/mailinglogger.py
deleted file mode 100644
index ac0234e58ffc1ca38e0c0e02a5d39433fd061e2f..0000000000000000000000000000000000000000
--- a/external/mailinglogger/mailinglogger.py
+++ /dev/null
@@ -1,116 +0,0 @@
-import datetime
-import os
-import smtplib
-
-from six import text_type, PY3
-
-try:
-    from email.Utils import formatdate, make_msgid
-    from email.MIMEText import MIMEText
-except ImportError:
-    from email.utils import formatdate, make_msgid
-    from email.mime.text import MIMEText
-from logging.handlers import SMTPHandler
-from logging import LogRecord, CRITICAL
-from .common import SubjectFormatter
-
-this_dir = os.path.dirname(__file__)
-version = open(os.path.join(this_dir, 'version.txt')).read().strip()
-x_mailer = 'MailingLogger ' + version
-flood_template = open(os.path.join(this_dir, 'flood_template.txt')).read()
-
-
-class MailingLogger(SMTPHandler):
-
-    now = datetime.datetime.now
-
-    def __init__(self,
-                 fromaddr,
-                 toaddrs,
-                 mailhost='localhost',
-                 subject='%(line)s',
-                 send_empty_entries=False,
-                 flood_level=10,
-                 username=None,
-                 password=None,
-                 headers=None,
-                 template=None,
-                 charset='utf-8',
-                 content_type='text/plain'):
-        SMTPHandler.__init__(self, mailhost, fromaddr, toaddrs, subject)
-        self.subject_formatter = SubjectFormatter(subject)
-        self.send_empty_entries = send_empty_entries
-        self.flood_level = flood_level
-        self.hour = self.now().hour
-        self.sent = 0
-        self.username = username
-        self.password = password
-        self.headers = headers or {}
-        self.template = template
-        self.charset = charset
-        self.content_type = content_type
-        if not self.mailport:
-            self.mailport = smtplib.SMTP_PORT
-
-    def getSubject(self, record):
-        return self.subject_formatter.format(record)
-
-    def emit(self, record):
-        msg = record.getMessage()
-        if not self.send_empty_entries and not msg.strip():
-            return
-
-        current_time = self.now()
-        current_hour = current_time.hour
-        if current_hour != self.hour:
-            self.hour = current_hour
-            self.sent = 0
-        if self.sent == self.flood_level:
-            # send critical error
-            record = LogRecord(
-                name='flood',
-                level=CRITICAL,
-                pathname='',
-                lineno=0,
-                msg=flood_template % (self.sent,
-                                      current_time.strftime('%H:%M:%S'),
-                                      current_hour + 1),
-                args=(),
-                exc_info=None)
-        elif self.flood_level and self.sent > self.flood_level:
-            # do nothing, we've sent too many emails already
-            return
-        self.sent += 1
-
-        # actually send the mail
-        try:
-            msg = self.format(record)
-            if self.template is not None:
-                msg = self.template % msg
-            subtype = self.content_type.split('/')[-1]
-            if isinstance(msg, text_type):
-                try:
-                    msg = msg.encode('ascii')
-                    charset = 'ascii'
-                except UnicodeEncodeError:
-                    charset = self.charset
-                email = MIMEText(msg, subtype, charset)
-            else:
-                email = MIMEText(msg, subtype)
-
-            for header, value in self.headers.items():
-                email[header] = value
-            email['Subject'] = self.getSubject(record)
-            email['From'] = self.fromaddr
-            email['To'] = ', '.join(self.toaddrs)
-            email['X-Mailer'] = x_mailer
-            email['X-Log-Level'] = record.levelname
-            email['Date'] = formatdate()
-            email['Message-ID'] = make_msgid('MailingLogger')
-            smtp = smtplib.SMTP(self.mailhost, self.mailport)
-            if self.username and self.password:
-                smtp.login(self.username, self.password)
-            smtp.sendmail(self.fromaddr, self.toaddrs, email.as_string())
-            smtp.quit()
-        except:
-            self.handleError(record)
diff --git a/external/mailinglogger/summarisinglogger.py b/external/mailinglogger/summarisinglogger.py
deleted file mode 100644
index aae050ad3d0ec8e4fb6bb00f82748cc82b5ac54c..0000000000000000000000000000000000000000
--- a/external/mailinglogger/summarisinglogger.py
+++ /dev/null
@@ -1,143 +0,0 @@
-from collections import deque
-from logging import CRITICAL, FileHandler, Formatter, LogRecord
-import atexit as atexit_module
-import os
-
-from .mailinglogger import MailingLogger
-from six import PY2
-from tempfile import mkstemp
-
-flood_template = '%i messages not included as flood limit of %i exceeded'
-
-
-class SummarisingLogger(FileHandler):
-
-    maxlevelno = 0
-    message_count = 0
-    tail = None
-
-    def __init__(self,
-                 fromaddr,
-                 toaddrs,
-                 mailhost='localhost',
-                 subject='Summary of Log Messages (%(levelname)s)',
-                 send_empty_entries=True,
-                 atexit=True,
-                 username=None,
-                 password=None,
-                 headers=None,
-                 send_level=None,
-                 template=None,
-                 charset='utf-8',
-                 content_type='text/plain',
-                 flood_level=100,
-                 ):
-        # create the "real" mailinglogger
-        self.mailer = MailingLogger(fromaddr,
-                                    toaddrs,
-                                    mailhost,
-                                    subject,
-                                    send_empty_entries,
-                                    username=username,
-                                    password=password,
-                                    headers=headers,
-                                    template=template,
-                                    charset=charset,
-                                    content_type=content_type)
-        # set the mailing logger's log format
-        self.mailer.setFormatter(Formatter('%(message)s'))
-        self.send_level = send_level
-        self.charset = charset
-        self.flood_level = flood_level
-        self.open()
-        # register our close method
-        if atexit:
-            atexit_module.register(self.close)
-
-    def open(self):
-        # create a temp file logger to store log entries
-        self.fd, self.filename = mkstemp()
-        FileHandler.__init__(self, self.filename, 'w', encoding=self.charset)
-        self.closed = False
-
-    def setLevel(self, lvl):
-        self.mailer.setLevel(lvl)
-        FileHandler.setLevel(self, lvl)
-
-    def emit(self, record):
-        if self.closed:
-            return
-
-        if record.levelno > self.maxlevelno:
-            self.maxlevelno = record.levelno
-
-        self.message_count += 1
-        if self.message_count > self.flood_level:
-            if self.tail is None:
-                self.tail = deque(maxlen=5)
-            self.tail.append(record)
-        else:
-            FileHandler.emit(self, record)
-
-    def close(self):
-        if self.closed:
-            return
-        self.closed = True
-
-        if self.message_count > self.flood_level:
-            hidden = self.message_count - self.flood_level - len(self.tail)
-            if hidden:
-                # send critical error
-                FileHandler.emit(self, LogRecord(
-                    name='flood',
-                    level=CRITICAL,
-                    pathname='',
-                    lineno=0,
-                    msg=flood_template % (
-                        self.message_count - self.flood_level - len(self.tail),
-                        self.flood_level
-                    ),
-                    args=(),
-                    exc_info=None
-                ))
-            for record in self.tail:
-                FileHandler.emit(self, record)
-
-        FileHandler.close(self)
-
-
-        if PY2:
-            f = os.fdopen(self.fd)
-            summary = f.read().decode(self.charset)
-        else:
-            f = open(self.fd, encoding=self.charset)
-            summary = f.read()
-        f.close()
-        try:
-            encoded_summary = summary.encode('ascii')
-            self.mailer.charset = 'ascii'
-        except UnicodeEncodeError:
-            pass
-        else:
-            if PY2:
-                summary = encoded_summary
-
-
-        if os.path.exists(self.filename):
-            os.remove(self.filename)
-        if self.send_level is None or self.maxlevelno >= self.send_level:
-            self.mailer.handle(
-                LogRecord(
-                    name='Summary',
-                    level=self.maxlevelno,
-                    pathname='',
-                    lineno=0,
-                    msg=summary,
-                    args=(),
-                    exc_info=None
-                )
-            )
-
-    def reopen(self):
-        self.close()
-        self.open()
diff --git a/external/mailinglogger/tests/__init__.py b/external/mailinglogger/tests/__init__.py
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/external/mailinglogger/tests/shared.py b/external/mailinglogger/tests/shared.py
deleted file mode 100644
index 83607cf9e48797c0c815cfab93158b41dc3e7d5d..0000000000000000000000000000000000000000
--- a/external/mailinglogger/tests/shared.py
+++ /dev/null
@@ -1,131 +0,0 @@
-from __future__ import print_function
-
-import logging
-import smtplib
-from collections import namedtuple
-from time import tzset
-
-from testfixtures import Replacer, test_datetime, test_time
-
-SentMessage = namedtuple('SentMessage', ['to_addr', 'from_addr', 'host', 'port', 'msg', 'username', 'password'])
-
-
-class DummySMTP:
-
-    broken = False
-
-    sent = []
-
-    stdout = True
-
-    old_smtp = None
-
-    username = None
-    password = None
-
-    @staticmethod
-    def install(stdout=False):
-        if DummySMTP.old_smtp is None:
-            DummySMTP.old_smtp = smtplib.SMTP
-            smtplib.SMTP = DummySMTP
-        DummySMTP.sent = []
-        DummySMTP.stdout = stdout
-
-    @staticmethod
-    def remove():
-        if DummySMTP.old_smtp is not None:
-            smtplib.SMTP = DummySMTP.old_smtp
-            DummySMTP.old_smtp = None
-        DummySMTP.stdout = True
-
-    def __init__(self, mailhost, port=25):
-        self.mailhost = mailhost
-        self.port = port
-
-    def login(self, username, password):
-        self.username = username
-        self.password = password
-
-    def sendmail(self, fromaddr, toaddrs, msg):
-        sent = SentMessage(
-            to_addr=toaddrs,
-            from_addr=fromaddr,
-            host=self.mailhost,
-            port=self.port,
-            msg=msg.replace('\r\n', '\n'),
-            username=self.username,
-            password=self.password,
-        )
-        if self.stdout:
-            print('sending to %r from %r using %r' % (
-                toaddrs, fromaddr, (self.mailhost, self.port)
-            ))
-            if self.username and self.password:
-                print('(authenticated using username:%r and password:%r)' % (
-                    self.username,
-                    self.password,
-                ))
-            parts = msg.split('\n\n', 1)
-            if len(parts)>1:
-                headers, body = parts
-                headers = '\n'.join(sorted(headers.split('\n')))
-                print(headers, end='')
-                print('\n\n', end='')
-                print(body)
-            else:
-                print(msg)
-        else:
-            self.sent.append(sent)
-
-    def quit(self):
-        pass
-
-
-class Dummy:
-
-    def __init__(self, value):
-        self.value = value
-
-    def __call__(self, *args):
-        return self.value
-
-
-def removeHandlers():
-    logger = logging.getLogger()
-    logger.setLevel(logging.INFO)
-    for handler in list(logger.handlers):
-        logger.removeHandler(handler)
-    hl = getattr(logging, '_handlerList', None)
-    if hl:
-        hl[:] = []
-
-
-def _setUp(d, stdout=True):
-    removeHandlers()
-    DummySMTP.install(stdout=stdout)
-
-    atexit_handlers = []
-    datetime = test_datetime(2007, 1, 1, 10, delta=0)
-    time = test_time(2007, 1, 1, 10, delta=0)
-    r = Replacer()
-    r.replace('atexit.register', atexit_handlers.append)
-    r.replace('mailinglogger.MailingLogger.now', datetime.now)
-    r.replace('mailinglogger.common.gethostname', Dummy('host.example.com'))
-    r.replace('time.time', time)
-    r.replace('os.environ.TZ', 'GMT', strict=False)
-    tzset()
-
-    d['atexit_handlers'] = atexit_handlers
-    d['r'] = r
-    d['smtp'] = DummySMTP
-    d['datetime'] = datetime
-    d['time'] = time
-    d['removeHandlers'] = removeHandlers
-
-
-def _tearDown(d):
-    # restore stuff we've mocked out
-    d['r'].restore()
-    tzset()
-    # make sure we have no dummy smtp
-    DummySMTP.remove()
diff --git a/external/mailinglogger/tests/test_htmlfilter.py b/external/mailinglogger/tests/test_htmlfilter.py
deleted file mode 100644
index 79dc372f5be063e7681a86ea18f87a6e35d501d5..0000000000000000000000000000000000000000
--- a/external/mailinglogger/tests/test_htmlfilter.py
+++ /dev/null
@@ -1,48 +0,0 @@
-from logging import getLogger
-from mailinglogger.common import HTMLFilter
-from unittest import TestCase
-from testfixtures import LogCapture
-
-
-class TestHTMLFilter(TestCase):
-
-    def setUp(self):
-        self.log = LogCapture()
-        self.logger = getLogger()
-        self.log.addFilter(HTMLFilter())
-
-    def tearDown(self):
-        self.log.uninstall()
-
-    def test_plain_string(self):
-        self.logger.info('foo')
-        self.log.check(('root', 'INFO', 'foo'),)
-
-    def test_html_string(self):
-        self.logger.info('<foo &bar>')
-        self.log.check(('root', 'INFO', '&lt;foo &amp;bar&gt;'),)
-
-    def test_with_params_string(self):
-        self.logger.info('%s', 'foo')
-        self.log.check(('root', 'INFO', 'foo'),)
-
-    def test_plain_unicode(self):
-        self.logger.info(u"accentu\u00E9")
-        self.log.check(('root', 'INFO', u'accentu\xe9'),)
-
-    def test_html_unicode(self):
-        self.logger.info(u"<u\u00E9 &bar>")
-        self.log.check(('root', 'INFO', u'&lt;u\xe9 &amp;bar&gt;'),)
-
-    def test_with_params_unicode(self):
-        self.logger.info(u"\u00E9%s", u"accentu\u00E9")
-        self.log.check(('root', 'INFO', u'\xe9accentu\xe9'),)
-
-    def test_some_object(self):
-        class AnObject(object):
-
-            def __repr__(self):
-                return 'obj'
-            __str__ = __repr__
-        self.logger.info(AnObject())
-        self.log.check(('root', 'INFO', 'obj'),)
diff --git a/external/mailinglogger/tests/test_mailinglogger.py b/external/mailinglogger/tests/test_mailinglogger.py
deleted file mode 100644
index 7d8695ee7bc8b4e2bb569c123388dcd17333372d..0000000000000000000000000000000000000000
--- a/external/mailinglogger/tests/test_mailinglogger.py
+++ /dev/null
@@ -1,150 +0,0 @@
-import logging
-from unittest import TestCase
-
-from testfixtures import OutputCapture
-
-from mailinglogger.mailinglogger import MailingLogger
-from mailinglogger.tests.shared import DummySMTP, _setUp, _tearDown
-
-
-class TestMailingLogger(TestCase):
-
-    def getLogger(self):
-        return logging.getLogger('')
-
-    def setUp(self):
-        _setUp(self.__dict__, stdout=False)
-
-    def tearDown(self):
-        _tearDown(self.__dict__)
-
-    def test_imports(self):
-        pass
-
-    def test_default_flood_limit(self):
-        # set up logger
-        self.handler = MailingLogger('from@example.com', ('to@example.com',))
-        logger = self.getLogger()
-        logger.addHandler(self.handler)
-        # log 11 entries
-        for i in range(12):
-            logger.critical('message')
-        # only 1st 10 should get sent
-        # +1 for the final warning
-        self.assertEqual(len(DummySMTP.sent), 11)
-
-    def test_flood_protection_bug(self):
-        # set up logger
-        self.handler = MailingLogger('from@example.com', ('to@example.com',),
-                                     flood_level=1)
-        logger = self.getLogger()
-        logger.addHandler(self.handler)
-        # make it 11pm
-        self.datetime.set(2007, 3, 15, 23)
-        # paranoid check
-        self.assertEqual(len(DummySMTP.sent), 0)
-        # log until flood protection kicked in
-        logger.critical('message1')
-        logger.critical('message2')
-        # check - 1 logged, 1 final warning
-        self.assertEqual(len(DummySMTP.sent), 2)
-        # check nothing emitted
-        logger.critical('message3')
-        self.assertEqual(len(DummySMTP.sent), 2)
-        # advance time past midnight
-        self.datetime.set(2007, 3, 15)
-        # log again
-        logger.critical('message4')
-        # check we are emitted now!
-        self.assertEqual(len(DummySMTP.sent), 3)
-
-    def test_headers_supplied_get_added_to_those_generated(self):
-        # set up logger
-        self.handler = MailingLogger('from@example.com', ('to@example.com',),
-                                     headers={'From': 'someidiot',
-                                              'to': 'someidiot'})
-        logger = self.getLogger()
-        logger.addHandler(self.handler)
-        logger.critical('message')
-        self.assertEqual(len(DummySMTP.sent), 1)
-        m = DummySMTP.sent[0].msg
-        # the headers specified in the `headers` parameter get added
-        # to those generated by mailinglogger - be careful!
-        self.assertTrue('From: from@example.com' in m)
-        self.assertTrue('From: someidiot' in m)
-        # however, if you try hard you *can* break things :-S
-        self.assertTrue('To: to@example.com' in m)
-        self.assertTrue('to: someidiot' in m)
-
-    def test_subject_contains_date(self):
-        # set up logger
-        self.handler = MailingLogger('from@example.com', ('to@example.com',),
-                                     subject="%(asctime)s")
-        logger = self.getLogger()
-        logger.addHandler(self.handler)
-        logger.critical('message')
-        self.assertEqual(len(DummySMTP.sent), 1)
-        m = DummySMTP.sent[0].msg
-        self.assertTrue('Subject: 2007-01-01 10:00:00,000' in m, m)
-
-    def test_non_string_error_messages_dont_break_logging(self):
-        self.handler = MailingLogger('from@example.com', ('to@example.com',),)
-        logger = self.getLogger()
-        logger.addHandler(self.handler)
-        logger.critical(object())
-        self.assertEqual(len(DummySMTP.sent), 1)
-
-    def test_template(self):
-        self.handler = MailingLogger('from@example.com', ('to@example.com',),
-                                     template="<before>%s<after>")
-        logger = self.getLogger()
-        logger.addHandler(self.handler)
-        logger.critical('message')
-        m = DummySMTP.sent[0].msg
-        self.assertTrue('Subject: message' in m, m)
-        self.assertTrue('<before>message<after>' in m, m)
-
-    def test_default_charset(self):
-        self.handler = MailingLogger('from@example.com', ('to@example.com',), )
-        logger = self.getLogger()
-        logger.addHandler(self.handler)
-        logger.critical(u"accentu\u00E9")
-        m = DummySMTP.sent[0].msg
-        # lovely, utf-8 encoded goodness
-        self.assertTrue('Subject: =?utf-8?b?YWNjZW50dcOp?=' in m, m)
-        self.assertTrue('Content-Type: text/plain; charset="utf-8"' in m, m)
-        self.assertTrue('\nYWNjZW50dcOp' in m, m)
-
-    def test_specified_charset(self):
-        self.handler = MailingLogger('from@example.com', ('to@example.com',),
-                                     charset='iso-8859-1')
-        logger = self.getLogger()
-        logger.addHandler(self.handler)
-        logger.critical(u"accentu\u00E9")
-        m = DummySMTP.sent[0].msg
-        # lovely, latin-1 encoded goodness
-        self.assertTrue('\naccentu=E9' in m, m)
-        self.assertTrue(
-            'Content-Type: text/plain; charset="iso-8859-1"' in m, m)
-        # no idea why MIMEText doesn't use iso-8859-1 here, best not to
-        # argue...
-        self.assertTrue('Subject: =?utf-8?b?YWNjZW50dcOp?=' in m, m)
-
-    def test_specified_content_type(self):
-        self.handler = MailingLogger('from@example.com', ('to@example.com',),
-                                     content_type='foo/bar')
-        logger = self.getLogger()
-        logger.addHandler(self.handler)
-        logger.critical(u"message")
-        m = DummySMTP.sent[0].msg
-        # NB: we drop the 'foo'
-        self.assertTrue('Content-Type: text/bar' in m, m)
-
-    def test_send_failure(self):
-        handler = MailingLogger('from@example.com', ('to@example.com',),
-                                template='x')
-        logger = self.getLogger()
-        logger.addHandler(handler)
-        with OutputCapture() as output:
-            logger.critical(u"message")
-        assert 'TypeError: not all arguments converted' in output.captured
diff --git a/external/mailinglogger/tests/test_summarisinglogger.py b/external/mailinglogger/tests/test_summarisinglogger.py
deleted file mode 100644
index 5581953e8cd0fb967e416af95381db37af91f16f..0000000000000000000000000000000000000000
--- a/external/mailinglogger/tests/test_summarisinglogger.py
+++ /dev/null
@@ -1,177 +0,0 @@
-import logging
-import os
-import threading
-from unittest import TestCase
-
-from mailinglogger.summarisinglogger import SummarisingLogger
-from mailinglogger.tests.shared import DummySMTP, removeHandlers
-
-
-class TestSummarisingLogger(TestCase):
-
-    def setUp(self):
-        removeHandlers()
-        DummySMTP.install()
-
-    def tearDown(self):
-        DummySMTP.remove()
-
-    def test_imports(self):
-        pass
-
-    def create(self, *args, **kw):
-        kw['atexit'] = False
-        self.handler = SummarisingLogger(*args, **kw)
-        self.logger = logging.getLogger('')
-        self.logger.addHandler(self.handler)
-
-    def test_do_send_empty(self):
-        self.create('from@example.com', ('to@example.com',))
-        logging.shutdown()
-        self.assertEqual(len(DummySMTP.sent), 1)
-
-    def test_dont_send_empty(self):
-        self.create('from@example.com', ('to@example.com',),
-                    send_empty_entries=False)
-        logging.shutdown()
-        self.assertEqual(len(DummySMTP.sent), 0)
-
-    def test_send_level_filters(self):
-        self.create('from@example.com', ('to@example.com',),
-                    send_level=logging.CRITICAL)
-        self.logger.warning('This line will not be sent')
-        logging.shutdown()
-        self.assertEqual(len(DummySMTP.sent), 0)
-
-    def test_send_level_includes_lower_level(self):
-        self.create('from@example.com', ('to@example.com',),
-                    send_level=logging.CRITICAL)
-        self.logger.warning('a warning')
-        self.logger.critical('something critical')
-        logging.shutdown()
-        self.assertEqual(len(DummySMTP.sent), 1)
-        message_text = DummySMTP.sent[0].msg
-        self.assertTrue('a warning' in message_text)
-        self.assertTrue('something critical' in message_text)
-
-    def test_tmpfile_goes_away(self):
-        self.create('from@example.com', ('to@example.com',))
-        os.remove(self.handler.filename)
-        logging.shutdown()
-        self.assertEqual(len(DummySMTP.sent), 1)
-
-    def test_default_charset(self):
-        self.create('from@example.com', ('to@example.com',), )
-        self.logger.critical(u"accentu\u00E9")
-        logging.shutdown()
-        m = DummySMTP.sent[0].msg
-        # lovely, utf-8 encoded goodness
-        self.assertTrue('Subject: Summary of Log Messages (CRITICAL)' in m, m)
-        self.assertTrue('Content-Type: text/plain; charset="utf-8"' in m, m)
-        self.assertTrue('\nYWNjZW50dcOp' in m, m)
-
-    def test_specified_charset(self):
-        self.create('from@example.com', ('to@example.com',),
-                    charset='iso-8859-1')
-        self.logger.critical(u"accentu\u00E9")
-        logging.shutdown()
-        m = DummySMTP.sent[0].msg
-        # lovely, latin-1 encoded goodness
-        self.assertTrue('\naccentu=E9' in m, m)
-        self.assertTrue(
-            'Content-Type: text/plain; charset="iso-8859-1"' in m, m)
-        self.assertTrue('Subject: Summary of Log Messages (CRITICAL)' in m, m)
-
-    def test_template(self):
-        self.create('from@example.com', ('to@example.com',),
-                    template='<before>%s<after>')
-        logging.critical('message')
-        logging.shutdown()
-        m = DummySMTP.sent[0].msg
-        self.assertTrue('Subject: Summary of Log Messages (CRITICAL)' in m, m)
-        self.assertTrue('<before>message\n<after>' in m, repr(m))
-
-    def test_specified_content_type(self):
-        self.create('from@example.com', ('to@example.com',),
-                    content_type='foo/bar')
-        self.logger.critical(u"message")
-        logging.shutdown()
-        m = DummySMTP.sent[0].msg
-        # NB: we drop the 'foo'
-        self.assertTrue('Content-Type: text/bar' in m, m)
-
-    def test_flood_level_exceeded(self):
-        self.create('from@example.com', ('to@example.com', ),
-                    flood_level=3)
-        self.handler.setFormatter(
-            logging.Formatter('%(levelname)s - %(message)s')
-        )
-        for i in range(10):
-            logging.warning('message %s', i)
-        logging.shutdown()
-        self.assertEqual(len(DummySMTP.sent), 1)
-        m = DummySMTP.sent[0].msg
-        self.assertTrue('Subject: Summary of Log Messages (WARNING)' in m, m)
-        self.assertTrue('\n'.join([
-            'WARNING - message 0',
-            'WARNING - message 1',
-            'WARNING - message 2',
-            'CRITICAL - 2 messages not included as flood limit of 3 exceeded',
-            'WARNING - message 5',
-            'WARNING - message 6',
-            'WARNING - message 7',
-            'WARNING - message 8',
-        ]) in m, repr(m))
-
-    def test_flood_highest_level_still_recorded(self):
-        self.create('from@example.com', ('to@example.com', ),
-                    flood_level=1)
-        self.handler.setFormatter(
-            logging.Formatter('%(levelname)s - %(message)s')
-        )
-        logging.info('included')
-        logging.warning('filtered')
-        for i in range(5):
-            logging.info('after %i', i)
-        logging.shutdown()
-        self.assertEqual(len(DummySMTP.sent), 1)
-        m = DummySMTP.sent[0].msg
-        self.assertTrue('Subject: Summary of Log Messages (WARNING)' in m, m)
-        self.assertTrue('\n'.join([
-            'INFO - included',
-            'CRITICAL - 1 messages not included as flood limit of 1 exceeded',
-            'INFO - after 0',
-        ]) in m, repr(m))
-
-    def test_flood_except_for_tail(self):
-        self.create('from@example.com', ('to@example.com', ),
-                    flood_level=1)
-        self.handler.setFormatter(
-            logging.Formatter('%(levelname)s - %(message)s')
-        )
-        logging.warning('message 1')
-        logging.warning('message 2')
-        logging.shutdown()
-        self.assertEqual(len(DummySMTP.sent), 1)
-        m = DummySMTP.sent[0].msg
-        self.assertTrue('Subject: Summary of Log Messages (WARNING)' in m, m)
-        self.assertTrue('\n'.join([
-            'WARNING - message 1',
-            'WARNING - message 2',
-        ]) in m, repr(m))
-
-    def test_reopen(self):
-        self.create('from@example.com', ('to@example.com',))
-        self.handler.reopen()
-        logging.shutdown()
-        self.assertEqual(len(DummySMTP.sent), 2)
-
-    def test_safe_close(self):
-        self.create('from@example.com', ('to@example.com', ))
-        threads = []
-        for i in range(2):
-            t = threading.Thread(target=self.handler.close)
-            threads.append(t)
-            t.start()
-        [t.join() for t in threads]
-        self.assertEqual(len(DummySMTP.sent), 1)
diff --git a/external/mailinglogger/version.txt b/external/mailinglogger/version.txt
deleted file mode 100644
index c00465f00d1664ff55825738fd4da167c61fbf10..0000000000000000000000000000000000000000
--- a/external/mailinglogger/version.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-5.0.0
-