Co-evolution is the process in which a set of orthologs exhibits a similar or correlative pattern of evolution. Co-evolution is a powerful way to learn about the functional interdependencies between sets of genes and cellular functions, about their complementary and backup relations, and more generally, for answering fundamental questions about the evolution of biological systems. Orthologs that exhibit strong signal of co-evolution in part of the evolutionary tree may show mild signal of co-evolution in other parts of the tree. The major reasons for this phenomenon are noise in the biological input, genes that gain or lose functions, and the fact that some measures of co-evolution relate to rare events such as positive evolution. Previous works in the field dealt with the problem of finding sets of genes that co-evolved along an entire underlying phylogenetic tree, without considering the fact that often co-evolution is local. In this work, we describe a new set of biological problems that are related to finding patterns of local co-evolution. We discuss their computational complexity and design algorithms for solving them. These algorithms outperform other bi-clustering methods as they are designed specifically for solving the set of problems mentioned above. We use our approach to trace the co-evolution of fungal and Eukaryotic genes at a high resolution across the different parts of the corresponding phylogenetic trees. Our analysis shows that local co-evolution is a wide-scale phenomenon.