diff --git a/CI/CMakeLists.txt b/CI/CMakeLists.txt
deleted file mode 100644
index e7116b2f2f5bb620cceedc2a5300945c3209b03d..0000000000000000000000000000000000000000
--- a/CI/CMakeLists.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-
-# Declare the package's name to the build. This is necessary for it
-# to show up nicely in the build results.
-atlas_subdir( CI )
-
-# Declare tests for the "package":
-add_test (NAME DomainMapTests COMMAND python -m test.test_domain_map WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
-add_test (NAME WatchListTests COMMAND python -m test.test_watch_list WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
-set_property (TEST DomainMapTests WatchListTests APPEND PROPERTY LABELS CI)
-
-# install executables
-atlas_install_scripts( sweep_MR.py )
diff --git a/CI/check_domain_map.py b/CI/check_domain_map.py
deleted file mode 100755
index c71831ef639b124b013b8cb5d95d0afd5517f7df..0000000000000000000000000000000000000000
--- a/CI/check_domain_map.py
+++ /dev/null
@@ -1,48 +0,0 @@
-import argparse, logging, re, subprocess
-#from gitlab.exceptions import GitlabGetError
-from gitlab_mr_helpers import map_filename_to_package
-from domain_map import DOMAIN_MAP
-
-def main():
-    parser = argparse.ArgumentParser(description="GitLab merge request handler",formatter_class=argparse.ArgumentDefaultsHelpFormatter)
-    parser.add_argument("-p","--path_to_repo",dest="repo_path",default="/home/jchapman/cleanup/athena",help="path to local clone of repository")
-    parser.add_argument("-d","--domains_to_print",default=DOMAIN_MAP.keys(),help="Domains to print out")
-    parser.add_argument("-v","--verbose",default="INFO",choices=["DEBUG","INFO","WARNING","ERROR","CRITICAL"],help="verbosity level")
-
-    # get command line arguments
-    args = parser.parse_args()
-
-    # configure log output
-    logging.basicConfig(format='%(asctime)s %(levelname)-10s %(message)s',
-                        datefmt='%H:%M:%S',
-                        level=logging.getLevelName(args.verbose))
-
-    logging.debug("parsed arguments:\n" + repr(args))
-    #TODO Should check that args.repo_path is a valid directory first for security
-    result = subprocess.Popen("find %s -type d" % args.repo_path, shell=True, stdout=subprocess.PIPE).stdout.read()
-    dirlist = result.split('\n')
-    affected_packages = filter(None,sorted(set([map_filename_to_package(f) for f in dirlist])))
-    affected_packages = [package.replace(args.repo_path, "") for package in affected_packages]
-
-    #here we want to list which packages match each domain.
-    packages_per_domain = dict()
-    for domain,pattern_list in DOMAIN_MAP.items():
-        domain_packages=[]
-        for pkg in affected_packages:
-            for pattern in pattern_list:
-                if re.search(pattern,pkg,re.I):
-                    domain_packages+=[pkg]
-                    break
-        packages_per_domain[domain] = domain_packages
-
-    for domain in args.domains_to_print:
-        logging.info("--------------------------------")
-        logging.info("Domain: " + domain)
-        logging.info("--------------------------------")
-        for pkg in packages_per_domain[domain]:
-            logging.info(pkg)
-            pass
-        pass
-
-if __name__ == "__main__":
-    main()
diff --git a/CI/domain_map.py b/CI/domain_map.py
deleted file mode 100644
index fd5cc81edafd5dbc954833f31e04df39c397cdd8..0000000000000000000000000000000000000000
--- a/CI/domain_map.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# dictionary for mapping package names to software domains
-# keys   ... must be strings for the name of the software domain
-# values ... must be sets containing valid regular expression strings
-DOMAIN_MAP = {}
-
-DOMAIN_MAP['Analysis']         = set(['^PhysicsAnalysis/'])
-DOMAIN_MAP['BTagging']         = set(['JetTagging', 'ParticleJetTools', 'FlavourTag'])
-DOMAIN_MAP['Build']            = set(['^Build$','^Projects/'])
-DOMAIN_MAP['Calorimeter']      = set(['^Calorimeter/'])
-DOMAIN_MAP['CI']               = set(['^CI'])
-DOMAIN_MAP['Core']             = set(['^Control/'])
-DOMAIN_MAP['Database']         = set(['^Database/'])
-DOMAIN_MAP['Digitization']     = set(['Digitization','TileSimAlgs','PileUpComps','PileUpTools','RunDependentSim'])
-DOMAIN_MAP['DQ']               = set(['^DataQuality/','^LumiBlock/'])
-DOMAIN_MAP['EDM']              = set(['^Event/'])
-DOMAIN_MAP['Egamma']           = set(['^egamma'])
-DOMAIN_MAP['EventDisplay']     = set(['^graphics/'])
-DOMAIN_MAP['Externals']        = set(['^External/'])
-DOMAIN_MAP['ForwardDetectors'] = set(['^ForwardDetectors/'])
-DOMAIN_MAP['Generators']       = set(['^Generators/'])
-DOMAIN_MAP['Geometry']         = set(['^AtlasGeometryCommon/','^DetectorDescription/'])
-DOMAIN_MAP['InnerDetector']    = set(['^InnerDetector/'])
-DOMAIN_MAP['JetEtmiss']        = set(['Jet','(?<!spectro)(?<!geo)MET','MissingEt','EventShape'])
-DOMAIN_MAP['LAr']              = set(['^LArCalorimeter/'])
-DOMAIN_MAP['Magnets']          = set(['^MagneticField/'])
-DOMAIN_MAP['MuonSpectrometer'] = set(['^MuonSpectrometer/'])
-DOMAIN_MAP['Other']            = set(['^Commission/','^LCG_Interfaces/','^PackDist/','^ReleaseTests/'])
-DOMAIN_MAP['Overlay']          = set(['Overlay'])
-DOMAIN_MAP['Reconstruction']   = set(['^Reconstruction/'])
-DOMAIN_MAP['Simulation']       = set(['^Simulation/','G4','InDetSimUtils','SubDetectorEnvelopes','SimEvent'])
-DOMAIN_MAP['Tau']              = set(['Tau'])
-DOMAIN_MAP['Test']             = set(['^AtlasTest/','^TestPolicy/'])
-DOMAIN_MAP['TestBeam']         = set(['^TestBeam/'])
-DOMAIN_MAP['Tile']             = set(['^TileCalorimeter/'])
-DOMAIN_MAP['Tools']            = set(['^Tools/'])
-DOMAIN_MAP['Tracking']         = set(['^Tracking/'])
-DOMAIN_MAP['Trigger']          = set(['^Trigger/','^HLT/','Trig','^DetectorDescription/.?Reg','^DetectorDescription/RoiDescriptor','RegionSelector'])
-DOMAIN_MAP['TriggerMenu']      = set(['^Trigger/TriggerCommon/TriggerMenu'])
-
diff --git a/CI/get_srl_domain_information.py b/CI/get_srl_domain_information.py
deleted file mode 100644
index 852aff382c8dbddf8a6b791de6cd18ad85cf2a3b..0000000000000000000000000000000000000000
--- a/CI/get_srl_domain_information.py
+++ /dev/null
@@ -1,93 +0,0 @@
-import argparse, glob, logging, os, pickle, re, sys
-
-def get_srl_package_mapping(directory):
-    domains = {}
-    logging.debug("get SRL domain <--> package mapping from directory '%s'" % directory)
-    srl_files = glob.glob(os.path.join(directory,"atlas-srl-*"))
-    for f in srl_files:
-        logging.debug("reading file '%s'" % f)
-        m = re.match("atlas-srl-(\w+)",os.path.basename(f))
-        domain = m.group(1)
-        logging.info("extracted domain '%s' from filename '%s'" % (domain,os.path.basename(f)))
-        fh = open(f)
-        pkgs = [package.strip() for package in fh.readlines() if package.strip()]
-        fh.close()
-        logging.debug("found packages %s in file '%s'" % (str(pkgs),f))
-        if not domain in domains:
-            domains[domain] = set(pkgs)
-        else:
-            domains[domain].update(pkgs)
-
-    for domain,packages in domains.items():
-        logging.debug("domain '%s': packages = %s" % (domain,str(packages)))
-
-    return domains
-
-def get_srl_group_members(group_def_file):
-    experts = {}
-    logging.debug("read SRL group definitions from '%s'" % group_def_file)
-    fh = open(group_def_file)
-    groups = [l.strip() for l in fh.readlines()]
-    fh.close()
-    for g in groups:
-        m = re.match("atlas-srl-(\w+).*=([\w ,]+)",g)
-        domain = m.group(1)
-        expert_list = m.group(2).split(',')
-        members = set([e.strip() for e in expert_list])
-        logging.info("group '%s' consists of members %s" % (domain,members))
-        if not domain in experts:
-            experts[domain] = members
-        else:
-            experts[domain].update(members)
-
-    for domain,expert_list in experts.items():
-        logging.debug("domain '%s': experts = %s" % (domain,str(expert_list)))
-
-    return experts
-
-def merge_srl_packages_experts(pkg_map,expert_map):
-    domains = {}
-    for domain,pkgs in pkg_map.items():
-        if domain in expert_map:
-            domains[domain] = {"packages": pkgs, "experts": expert_map[domain]}
-        else:
-            logging.error("found package mapping for domain '%s' but no experts" % domain)
-
-    missing = set(expert_map.keys()) - set(domains.keys())
-    if len(missing) > 0:
-        logging.error("following domains have experts but no packages: %s" % str(missing))
-
-    return domains
-
-def main():
-    parser = argparse.ArgumentParser(description="ATLAS SRL mapper",
-                                     formatter_class=argparse.ArgumentDefaultsHelpFormatter)
-    parser.add_argument("indir",type=str,help="directory with ATLAS SRL definitions")
-    parser.add_argument("outfile",type=str,help="output pickle file with dictionary")
-    parser.add_argument("-v","--verbose",default="INFO",choices=["DEBUG","INFO","WARNING","ERROR","CRITICAL"],help="verbosity level")
-
-    # get command line arguments
-    args = parser.parse_args()
-    args.indir = os.path.abspath(args.indir)
-
-    # configure log output
-    logging.basicConfig(format='%(asctime)s %(levelname)-10s %(message)s',
-                        datefmt='%H:%M:%S',
-                        level=logging.getLevelName(args.verbose))
-
-    # delegate
-    packages = get_srl_package_mapping(os.path.join(args.indir,"done"))
-    experts  = get_srl_group_members(os.path.join(args.indir,"atlas-srl_group_defs.txt"))
-    domains  = merge_srl_packages_experts(packages,experts)
-
-    if os.path.isfile(args.outfile):
-        var = ""
-        while not (var == 'y' or var == 'n'):
-            var = raw_input("The output file '%s' already exists. Do you want to overwrite it? y|[n] " % args.outfile)
-        if var == 'n':
-            sys.exit(0)
-
-    pickle.dump(domains,open(args.outfile,'w'))
-
-if __name__ == "__main__":
-    main()
diff --git a/CI/handle_new_mr.py b/CI/handle_new_mr.py
deleted file mode 100644
index 4e1d032065c47b346e1f1e0c8c7dfb1afe48fb04..0000000000000000000000000000000000000000
--- a/CI/handle_new_mr.py
+++ /dev/null
@@ -1,174 +0,0 @@
-import argparse, gitlab, logging, re, sys
-from gitlab.exceptions import GitlabGetError
-from gitlab_mr_helpers import print_collection, list_changed_packages, list_affected_domains
-from watch_list import WATCH_LIST
-
-def comment_affected_packages(packages):
-    """
-    prepare initial comment to merge request listing affected packages
-
-    packages ... list of affected packages
-
-    return: comment text
-    """
-    n_packages = len(packages)
-    if n_packages == 0:
-        comment = "This merge request affects no known packages. Consult an expert!"
-    elif n_packages == 1:
-        comment = "This merge request affects 1 package:  \n- " + list(packages)[0]
-    elif n_packages <= 20:
-        comment = "This merge request affects %d packages:  \n- " % n_packages
-        comment += "  \n- ".join(sorted(packages))
-    else:
-        comment = "This merge request affects %d packages. Since this is a long list, I will not print it here." % n_packages
-
-    return comment
-
-def warn_unmapped_packages(packages):
-    """
-    prepare warning for packages which could not be mapped to domains
-
-    packages ... set of packages which could not be mapped
-
-    return: comment text
-    """
-    if not packages:
-        return ""
-
-    comment = "  \n  \nCould not map the following packages to a domain:  \n  \n"
-    for p in packages:
-        comment += "- %s  \n" % p
-    return comment
-
-def add_watchers(packages):
-    """
-    prepare comment to add watchers for the modified packages
-
-    packages ... set of affected packages
-
-    return: comment text
-    """
-    watchers = set()
-    for pkg in packages:
-        for pattern,users in WATCH_LIST.items():
-            if re.search(pattern,pkg):
-                logging.debug("package '%s' matches watch list pattern '%s'" % (pkg,pattern))
-                logging.debug("subscribing users:\n" + print_collection(users))
-                watchers.update(users)
-
-    logging.debug("list of watchers for this MR:\n" + print_collection(watchers))
-
-    if watchers:
-        watchers = ['@' + w for w in watchers]
-        comment = "  \n  \nAdding "
-        comment += " ,".join(watchers)
-        comment += " as watcher%s" % ('' if len(watchers) == 1 else 's')
-    else:
-        comment = ""
-
-    return comment
-
-def add_labels(mr,domains):
-    """
-    add review and domain labels to merge request
-
-    mr      ... Gitlab merge request object
-    domains ... set of affected domains
-
-    return: updated list of labels
-    """
-    # labels assigned during MR creation
-    labels = set(mr.labels)
-    logging.debug("labels assigned during MR creation:\n" + print_collection(labels))
-    # assign labels for all affected domains
-    for d in domains:
-        labels.add(d)
-    # remove possible complete review labels
-    for label in list(labels):
-        if re.match("review-",label):
-            labels.discard(label)
-    # add review-pending flag
-    labels.add("review-pending-level-1")
-    # add label for target branch
-    labels.add(mr.target_branch)
-    logging.debug("updated labels:\n" + print_collection(labels))
-    mr.labels = list(labels)
-    mr.save()
-
-    return labels
-
-def handle_new_merge_request(args):
-    """
-    handle new merge request in Gitlab
-
-    This involves the following steps:
-    - get a list of packages affected by these changes
-    - post a comment about the affected packages
-    - determine domain experts and mention those in a comment
-    - assign labels for sign-off process by domain experts
-    """
-    # get GitLab API handler
-    gl = gitlab.Gitlab(args.url,args.token)
-    try:
-        # get Gitlab project object
-        project = gl.projects.get(args.project_name)
-        logging.debug("retrieved Gitlab project handle")
-        # get Gitlab merge request object
-        mr = project.mergerequests.get(args.mr_id)
-        logging.debug("retrieved Gitlab merge request handle")
-    except GitlabGetError as e:
-        logging.critical("error communication with Gitlab API '%s'" % (e.error_message))
-        sys.exit(1)
-
-    handled_mr_states = ["opened","reopened","merged"]
-    if not mr.state in handled_mr_states:
-        logging.debug("ignore merge request in '%s' state" % mr.state)
-        sys.exit(0)
-
-    # get list of affected packages
-    affected_packages = filter(None,list_changed_packages(mr))
-    # get list of domains
-    affected_domains,unmapped_pkgs = list_affected_domains(affected_packages)
-    # add CI as fallback check if no responsible domain was found
-    if not affected_domains:
-        logging.debug("no responsible domain found -> please check that this is expected")
-        affected_domains = set(['no-domain'])
-    # assemble atlasbot comment
-    comment = ""
-    # add comment listing affected packages
-    comment += comment_affected_packages(affected_packages)
-    # warn about unmapped packages
-    comment += warn_unmapped_packages(unmapped_pkgs)
-    # add watchers for affected packages
-    comment += add_watchers(affected_packages)
-
-    # publish comment
-    logging.debug("add comment to merge request:\n\n" + comment + "\n")
-    mr.notes.create({'body':comment})
-
-    # add labels
-    add_labels(mr,affected_domains)
-
-def main():
-    parser = argparse.ArgumentParser(description="GitLab merge request handler",formatter_class=argparse.ArgumentDefaultsHelpFormatter)
-    parser.add_argument("-m","--merge-request-id",dest="mr_id",required=True,type=int,help="(unique) ID of merge request (not the project specific IID)")
-    parser.add_argument("-p","--project-name",dest="project_name",required=True,help="GitLab project with namespace (e.g. user/my-project)")
-    parser.add_argument("-t","--token",required=True,help="private GitLab user token")
-    parser.add_argument("-u","--url",default="https://gitlab.cern.ch",help="URL of GitLab instance")
-    parser.add_argument("-v","--verbose",default="INFO",choices=["DEBUG","INFO","WARNING","ERROR","CRITICAL"],help="verbosity level")
-
-    # get command line arguments
-    args = parser.parse_args()
-
-    # configure log output
-    logging.basicConfig(format='%(asctime)s %(levelname)-10s %(message)s',
-                        datefmt='%H:%M:%S',
-                        level=logging.getLevelName(args.verbose))
-
-    logging.debug("parsed arguments:\n" + repr(args))
-
-    # delegate
-    handle_new_merge_request(args)
-
-if __name__ == "__main__":
-    main()
diff --git a/CI/post_ci_result.py b/CI/post_ci_result.py
deleted file mode 100644
index 890ab8bea0adbd21181622823c81985e027afc34..0000000000000000000000000000000000000000
--- a/CI/post_ci_result.py
+++ /dev/null
@@ -1,93 +0,0 @@
-import argparse, gitlab, logging, sys
-from gitlab.exceptions import GitlabGetError, GitlabCreateError
-
-def compose_result_text(status):
-    """
-    generate comment line describing global result of CI job
-
-    status ... Jenkins exit code as string
-    """
-    text = ":question: **CI Result UNSET**"
-    if status == "SUCCESS":
-        text = ":white_check_mark: **CI Result SUCCESS**"
-    elif status == "FAILURE":
-        text = ":negative_squared_cross_mark: **CI Result FAILURE**"
-    elif status == "ABORT":
-        text = ":point_up: **CI Result ABORTED**"
-
-    return text
-
-def compose_stage_text(stage,result):
-    """
-    generate comment line describing result of CI job stage
-
-    result ... Jenkin exit code as string
-    """
-    if result == "SUCCESS":
-        text = ":white_check_mark: "
-    elif result == "FAILURE":
-        text = ":o: "
-    # everything else means that this stage was not run
-    else:
-        text = ":white_circle: "
-        
-    return text + stage
-        
-def main():
-    parser = argparse.ArgumentParser(description="GitLab merge request commentator",formatter_class=argparse.ArgumentDefaultsHelpFormatter)
-    parser.add_argument("--externals",required=True,type=str,help="result of external building step")
-    parser.add_argument("--cmake",required=True,type=str,help="result of cmake configuration step")
-    parser.add_argument("--make",required=True,type=str,help="result of build step")
-    parser.add_argument("--test",required=True,type=str,help="result of test step")
-    parser.add_argument("--status",required=True,choices=["SUCCESS","FAILURE","ABORT"],help="final result of CI job")
-    parser.add_argument("-i","--ci-job-id",dest="ci_id",required=True,type=int,help="ID of CI job")    
-    parser.add_argument("-m","--merge-request-id",dest="mr_id",required=True,type=int,help="(unique) ID of merge request (not the project specific IID)")
-    parser.add_argument("-n","--nicos-project-relname",dest="nicos_name",required=True,type=str,help="NICOS project release name for this build")
-    parser.add_argument("-p","--project-name",dest="project_name",required=True,help="GitLab project with namespace (e.g. user/my-project)")
-    parser.add_argument("-t","--token",required=True,help="private GitLab user token")
-    parser.add_argument("-u","--url",default="https://gitlab.cern.ch",help="URL of GitLab instance")
-    parser.add_argument("-v","--verbose",default="INFO",choices=["DEBUG","INFO","WARNING","ERROR","CRITICAL"],help="verbosity level")
-
-    # get command line arguments
-    args = parser.parse_args()
-
-    # configure log output
-    logging.basicConfig(format='%(asctime)s %(levelname)-10s %(message)s',
-                        datefmt='%H:%M:%S',
-                        level=logging.getLevelName(args.verbose))
-
-    logging.debug("parsed arguments:\n" + repr(args))
-
-    # get GitLab API handler
-    gl = gitlab.Gitlab(args.url,args.token)
-    try:
-        # get Gitlab project object
-        project = gl.projects.get(args.project_name)
-        logging.debug("retrieved Gitlab project handle")
-        # get Gitlab merge request object
-        mr = project.mergerequests.get(args.mr_id)
-        logging.debug("retrieved Gitlab merge request handle")
-    except GitlabGetError as e:
-        logging.critical("error communication with Gitlab API '%s'" % (e.error_message))
-        sys.exit(1)
-
-    # prepare individual parts of the CI comment
-    comment = compose_result_text(args.status)
-    comment += "  \n"
-    comment += compose_stage_text("externals",args.externals) + "  \n"
-    comment += compose_stage_text("cmake",args.cmake) + "  \n"
-    comment += compose_stage_text("make",args.make) + "  \n"
-    comment += compose_stage_text("test",args.test) + "  \n"
-    comment += "  \n"
-    comment += "Full details available at [NICOS {0}](http://atlas-nightlies-browser.cern.ch/~platinum/nightlies/info?tp=g&nightly=MR-CI-builds&rel={0}&ar=*)  \n".format(args.nicos_name)
-    comment += "For experts only: Jenkins output [[CI-MERGE-REQUEST {0}]](http://aibuild080.cern.ch:8080/job/CI-MERGE-REQUEST/{0}/) (for [remote](http://localhost:9999/job/CI-MERGE-REQUEST/{0}/) access see the [FAQ](https://atlassoftwaredocs.web.cern.ch/guides/MR_reviewers/#faq))".format(args.ci_id)
-
-    logging.debug(comment)
-    try:
-        mr.notes.create({'body':comment})
-    except GitlabCreateError as e:
-        logging.critical("error creating MR comment '%s'" % (e.error_message))
-        sys.exit(1)
-
-if __name__ == "__main__":
-    main()
diff --git a/CI/run_unit_tests_for_mr.py b/CI/run_unit_tests_for_mr.py
deleted file mode 100644
index 551e1ef318422bc2c0f9322ee5b28436e666d933..0000000000000000000000000000000000000000
--- a/CI/run_unit_tests_for_mr.py
+++ /dev/null
@@ -1,71 +0,0 @@
-import argparse, gitlab, logging, os, subprocess, sys
-from gitlab.exceptions import GitlabGetError
-from gitlab_mr_helpers import print_collection, map_filename_to_package
-
-def run_unit_tests(args):
-    # get GitLab API handler
-    gl = gitlab.Gitlab(args.url,args.token)
-    try:
-        # get Gitlab project object
-        project = gl.projects.get(args.project_name)
-        logging.debug("retrieved Gitlab project handle")
-        # get Gitlab merge request object
-        mr = project.mergerequests.get(args.mr_id)
-        logging.debug("retrieved Gitlab merge request handle")
-    except GitlabGetError as e:
-        logging.critical("error communication with Gitlab API '%s'" % (e.error_message))
-        sys.exit(1)
-
-    changes = mr.changes()['changes']
-    changed_files = set([c[p] for c in changes for p in ['old_path','new_path']])
-    logging.debug("changed files:\n" + print_collection(changed_files))
-    affected_packages = sorted(set([map_filename_to_package(f) for f in changed_files]))
-
-    # construct list of patterns for matching test labels
-    pattern_list = []
-    for package_path in affected_packages:
-        # ignore empty package paths which would trigger all tests
-        # (empty package paths may appear due to failed mapping)
-        if not package_path:
-            continue
-
-        # label is package name and not full package path
-        pattern_list.append("^" + os.path.basename(package_path) + "$")
-
-    # only run tests if we found some patterns for test labels
-    if pattern_list:
-        # assemble ctest command
-        ctest_cmd = "ctest --output-on-failure -O ctest.log "
-        ctest_cmd += "-L \"" + "|".join(pattern_list) + "\""
-
-        # execute
-        logging.debug("ctest command = '%s'" % ctest_cmd)
-        status = subprocess.call(ctest_cmd,shell=True)
-        return status
-    # no tests -> return success
-    else:
-        return 0
-
-def main():
-    parser = argparse.ArgumentParser(description="ATLAS unit test runner",
-                                     formatter_class=argparse.ArgumentDefaultsHelpFormatter)
-    parser.add_argument("-m","--merge-request-id",dest="mr_id",required=True,type=int,help="(unique) ID of merge request (not the project specific IID)")
-    parser.add_argument("-p","--project-name",dest="project_name",required=True,help="GitLab project with namespace (e.g. user/my-project)")
-    parser.add_argument("-t","--token",required=True,help="private GitLab user token")
-    parser.add_argument("-u","--url",default="https://gitlab.cern.ch",help="URL of GitLab instance")
-    parser.add_argument("-v","--verbose",default="INFO",choices=["DEBUG","INFO","WARNING","ERROR","CRITICAL"],help="verbosity level")
-
-    # get command line arguments
-    args = parser.parse_args()
-
-    # configure log output
-    logging.basicConfig(format='%(asctime)s %(levelname)-10s %(message)s',
-                        datefmt='%H:%M:%S',
-                        level=logging.getLevelName(args.verbose))
-
-    # delegate
-    status = run_unit_tests(args)
-    sys.exit(status)
-
-if __name__ == "__main__":
-    main()
diff --git a/CI/test/__init__.py b/CI/test/__init__.py
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/CI/test/test_domain_map.py b/CI/test/test_domain_map.py
deleted file mode 100644
index 3fcb2fac37a9c50a5f64951f66e527cb6fdb6540..0000000000000000000000000000000000000000
--- a/CI/test/test_domain_map.py
+++ /dev/null
@@ -1,25 +0,0 @@
-import re, unittest
-from domain_map import DOMAIN_MAP
-
-class TestDomainMapDictionary(unittest.TestCase):
-    def test_DomainMapIsDict(self):
-        self.assertIsInstance(DOMAIN_MAP,dict)
-
-    def test_KeysAreStrings(self):
-        for domain_name in DOMAIN_MAP.keys():
-            self.assertIsInstance(domain_name,str)
-
-    def test_ValuesAreSets(self):
-        for package_patterns in DOMAIN_MAP.values():
-            self.assertIsInstance(package_patterns,set)
-
-    def test_PatternsAreValidRegex(self):
-        for package_patterns in DOMAIN_MAP.values():
-            for pattern in package_patterns:
-                try:
-                    _ = re.compile(pattern)
-                except:
-                    self.fail("compiling '%s' as regular expression failed" % pattern)
-
-if __name__ == "__main__":
-    unittest.main()
diff --git a/CI/test/test_watch_list.py b/CI/test/test_watch_list.py
deleted file mode 100644
index f8221f89dfac8ece2457ea6eea902d6144dca389..0000000000000000000000000000000000000000
--- a/CI/test/test_watch_list.py
+++ /dev/null
@@ -1,25 +0,0 @@
-import re, unittest
-from watch_list import WATCH_LIST
-
-class TestWatchListDictionary(unittest.TestCase):
-    def test_WatchListIsDict(self):
-        self.assertIsInstance(WATCH_LIST,dict)
-
-    def test_ValuesAreSets(self):
-        for watchers in WATCH_LIST.values():
-            self.assertIsInstance(watchers,set)
-
-    def test_UsernamesAreStrings(self):
-        for watchers in WATCH_LIST.values():
-            for username in watchers:
-                self.assertIsInstance(username,str)
-
-    def test_PatternsAreValidRegex(self):
-        for package_pattern in WATCH_LIST.keys():
-            try:
-                _ = re.compile(package_pattern)
-            except:
-                self.fail("compiling '%s' as regular expression failed" % package_pattern)
-
-if __name__ == "__main__":
-    unittest.main()
diff --git a/CI/watch_list.py b/CI/watch_list.py
deleted file mode 100644
index c4ef7a66a07e26097034d65f32828280ed4a69e2..0000000000000000000000000000000000000000
--- a/CI/watch_list.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# dictionary defining a watch list for MR notifications
-# keys   ... must be valid regular expression
-# values ... must be sets containing Gitlab usernames as strings
-WATCH_LIST = {}
-
-WATCH_LIST['^CI$']       = set(['cgumpert'])
-WATCH_LIST['Simulation'] = set(['ritsch','jchapman','vpascuzz'])
-WATCH_LIST['Digitization'] = set(['jchapman'])
-WATCH_LIST['Overlay'] = set(['jchapman','ahaas','tkharlam','tadej'])
-WATCH_LIST['TrkiPatFitter'] = set(['pop'])
-WATCH_LIST['MooPerformance'] = set(['pop'])
-WATCH_LIST['JetCalibTools'] = set(['jbossios'])
-WATCH_LIST['AFP'] = set(['ggach'])
-WATCH_LIST['BTagging'] = set(['cpollard', 'filthaut'])
-WATCH_LIST['^Database/A'] = set(['mnowak'])
-WATCH_LIST['^Database/TPTools'] = set(['mnowak'])
-WATCH_LIST['^Database/PersistentDataModel'] = set(['mnowak'])
-WATCH_LIST['^Control/'] = set(['ssnyder'])
-WATCH_LIST['^Database/'] = set(['ssnyder'])
-WATCH_LIST['MuonSpectrometer'] = set(['jomeyer','wleight'])
-WATCH_LIST['MuonIdentification'] = set(['jomeyer','wleight'])
-WATCH_LIST['AGDD'] = set(['jomeyer'])
-WATCH_LIST['(eflow)|(PFlow)|(PFO)'] = set(['mhodgkin'])
-WATCH_LIST['InDetBeamSpot'] = set(['csuster', 'amorley'])
-WATCH_LIST['MuonEfficiencyCorrections'] = set(['nkoehler','jojungge'])
-WATCH_LIST['MuonTPTools'] = set(['nkoehler','jojungge'])
-WATCH_LIST['MuonPerformanceAlgs'] = set(['nkoehler','jojungge','gabarone'])
-WATCH_LIST['MuonPerformanceHistUtils'] = set(['nkoehler','jojungge'])
-WATCH_LIST['IsolationSelection'] = set(['maklein','jojungge','jpoveda','dzhang'])
-WATCH_LIST['Trigger/TrigCost'] = set(['cmcnicol'])
-WATCH_LIST['TrigInDetAnalysis.*'] = set(['sutt'])
-WATCH_LIST['TrigInDetValidation.*'] = set(['sutt','hartj'])
-WATCH_LIST['TrigIDtrkMonitoring'] = set(['sutt'])
-WATCH_LIST['.*RoiDescriptor'] = set(['sutt'])
-WATCH_LIST['.*RegionSelector'] = set(['sutt'])
-WATCH_LIST['RegSelLUT'] = set(['sutt'])
-WATCH_LIST['(PixelMonitoring)|(PixelConditionsServices)|(PixelRawData)'] = set(['kzoch','ibragimo'])
-WATCH_LIST['Trigger/TrigFTK'] = set(['karolos', 'benhoob', 'mswiatlo', 'jahreda'])
-WATCH_LIST['PhysicsAnalysis/SUSYPhys'] = set(['zmarshal','szambito', 'ykeisuke'])
-WATCH_LIST['MuonMomentumCorrections'] =set(['gabarone'])
-WATCH_LIST['DerivationFrameworkDataPrep'] = set(['zmarshal'])
-WATCH_LIST['DerivationFrameworkSUSY'] = set(['zmarshal','martindl','whopkins'])
-WATCH_LIST['PyJobTransforms'] = set(['mavogel'])
-WATCH_LIST['TrkV0Fitter'] = set(['bouhova'])
-WATCH_LIST['TrkVertexAnalysisUtils'] = set(['bouhova'])
-WATCH_LIST['InDetV0Finder'] = set(['bouhova'])
-WATCH_LIST['JpsiUpsilonTools'] = set(['abarton', 'wwalko'])
-WATCH_LIST['xAODBPhys'] = set(['abarton', 'wwalko'])
-WATCH_LIST['(SCT(?!Extension))|(InDetPrepRawDataFormation)|(SiClusterizationTool)|(InDetTrackHoleSearch)|(DerivationFrameworkHiggs)'] = set(['oda'])
-