An important problem in distributed systems is to detect termination of a distributed computation. A computation is said to have terminated when all processes have become passive and all channels have become empty. In this paper, we present a suite of algorithms for detecting termination of a non-diffusing computation for an arbitrary topology. All our termination detection algorithms have optimal message complexity and optimal detection latency under varying assumptions. Key words: monitoring distributed system, termination detection, arbitrary communication topology, optimal algorithm, diffusing and non-diffusing computations, simultaneous and delayed initiations, single-hop and multi-hop application messages