  In the $2$-reachability problem we are given a directed graph $G$ and we wish
to determine if there are two (edge or vertex) disjoint paths from $u$ to $v$,
for a given pair of vertices $u$ and $v$. In this paper, we present an
algorithm that computes $2$-reachability information for all pairs of vertices
in $\mathcal{O}(n^{\omega}\log n)$ time, where $n$ is the number of vertices
and $\omega$ is the matrix multiplication exponent. Hence, we show that the
running time of all-pairs $2$-reachability is only within a $\log$ factor of
transitive closure.
  Moreover, our algorithm produces a witness (i.e., a separating edge or a
separating vertex) for all pair of vertices where $2$-reachability does not
hold. By processing these witnesses, we can compute all the edge- and
vertex-dominator trees of $G$ in $\mathcal{O}(n^2)$ additional time, which in
turn enables us to answer various connectivity queries in $\mathcal{O}(1)$
time. For instance, we can test in constant time if there is a path from $u$ to
$v$ avoiding an edge $e$, for any pair of query vertices $u$ and $v$, and any
query edge $e$, or if there is a path from $u$ to $v$ avoiding a vertex $w$,
for any query vertices $u$, $v$, and $w$.
