def METHOD_NAME(clusters, options=None, **kwargs):
    """
    Remove the HaloTouch's from `clusters` and create a mapping associating
    each removed HaloTouch to the first Cluster necessitating it.
    """
    queue = []
    processed = []
    for c in clusters:
        if c.is_halo_touch:
            hs = HaloScheme.union(e.rhs.halo_scheme for e in c.exprs)
            queue.append(c.rebuild(halo_scheme=hs))
        else:
            dims = set(c.ispace.promote(lambda d: d.is_Block).itdimensions)
            found = []
            for c1 in list(queue):
                distributed_aindices = c1.halo_scheme.distributed_aindices
                diff = dims - distributed_aindices
                intersection = dims & distributed_aindices
                if all(c1.guards.get(d) == c.guards.get(d) for d in diff) and \
                   len(intersection) > 0:
                    found.append(c1)
                    queue.remove(c1)
            syncs = normalize_syncs(*[c1.syncs for c1 in found])
            if syncs:
                ispace = c.ispace.project(syncs)
                processed.append(c.rebuild(exprs=[], ispace=ispace, syncs=syncs))
            halo_scheme = HaloScheme.union([c1.halo_scheme for c1 in found])
            processed.append(c.rebuild(halo_scheme=halo_scheme))
    # Sanity check!
    try:
        assert not queue
    except AssertionError:
        if options['mpi']:
            raise RuntimeError("Unsupported MPI for the given equations")
    return processed