  This work utilizes the plethora of work on verification of sequential
programs for the purpose of verifying concurrent programs. We reduce the
verification of a concurrent program to a series of verification tasks of
sequential programs. Our approach is modular in the sense that each sequential
verification task roughly corresponds to the verification of a single thread,
with some additional information about the environment in which it operates.
Information regarding the environment is gathered during the run of the
algorithm, by need.
  While our approach is general, it specializes on concurrent programs where
the threads are structured hierarchically. The idea is to exploit the hierarchy
in order to minimize the amount of information that needs to be transferred
between threads. To that end, we verify one of the threads, considered "main",
as a sequential program. Its verification process initiates queries to its
"environment" (which may contain multiple threads). Those queries are answered
by sequential verification, if the environment consists of a single thread, or,
otherwise, by applying the same hierarchical algorithm on the environment.
  Our technique is fully automatic, and allows us to use any off-the-shelf
sequential model checker. We implemented our technique in a tool called CoMuS
and evaluated it against established tools for concurrent verification. Our
experiments show that it works particularly well on hierarchically structured
programs.
