We show how to find and efficiently maintain maximal 3-edge-connected subgraphs in undirected graphs. In particular, we provide the following results. $(1)$ Two algorithms for the incremental maintenance of the maximal $3$-edge-connected subgraphs. These algorithms allow for vertex and edge insertions, interspersed with queries asking whether two vertices belong to the same maximal $3$-edge-connected subgraph, and there is a trade-off between their time- and space-complexity. Specifically, the first algorithm has $O(m\alpha(m,n) + n^2\log^2 n)$ total running time and uses $O(n)$ space, where $m$ is the number of edge insertions and queries, and $n$ is the total number of vertices inserted starting from an empty graph. The second algorithm performs the same operations in faster $O(m\alpha(m,n) + n^2\alpha(n,n))$ time in total, using $O(n^2)$ space. $(2)$ A fully dynamic algorithm for maintaining information about the maximal $k$-edge-connected subgraphs for fixed $k$. Our update bounds are ${O}(n\sqrt{n}\,\log n)$ worst-case time for $k>4$ and ${O}(n\sqrt{n}\,)$ worst-case time for $k\in\{3,4\}$. In both cases, we achieve constant time for maximal $k$-edge-connected subgraph queries. $(3)$ A deterministic algorithm for computing the maximal $k$-edge-connected subgraphs, for any fixed $k>2$, in $\widetilde{O}(m+n\sqrt{n}\,)$ time. This result improves substantially on the previously best known deterministic bounds and matches (modulo $\log$ factors) the expected time of the best randomized algorithm for the same problem. $(4)$ A linear-time algorithm for computing a spanning subgraph with $O(n\log n)$ edges that has the same maximal $k$-edge-connected subgraphs as the original graph.