diff --git a/libaegisub/ass/dialogue_parser.cpp b/libaegisub/ass/dialogue_parser.cpp
index 95f4b41e1d8943088ce5cfd0f101a4eb399d7f38..045f889467d7ee6ed6af57498e98d3de5a098a5a 100644
--- a/libaegisub/ass/dialogue_parser.cpp
+++ b/libaegisub/ass/dialogue_parser.cpp
@@ -18,9 +18,9 @@
 
 #include "libaegisub/spellchecker.h"
 
-#include "iconv.h"
-
-#include <boost/locale/boundary.hpp>
+#include <boost/locale/boundary/index.hpp>
+#include <boost/locale/boundary/segment.hpp>
+#include <boost/locale/boundary/types.hpp>
 
 namespace {
 
diff --git a/libaegisub/common/cajun/elements.cpp b/libaegisub/common/cajun/elements.cpp
index cfd569973c47d632dcf3509503dbcdabbad4e6bf..c38b0831743e35eb642dc815afb3ad4417431ef5 100644
--- a/libaegisub/common/cajun/elements.cpp
+++ b/libaegisub/common/cajun/elements.cpp
@@ -9,8 +9,7 @@ Author: Terry Caton
 
 #include "libaegisub/cajun/visitor.h"
 
-#include <algorithm>
-#include <cassert>
+#include <utility>
 
 namespace {
 	using namespace json;
diff --git a/libaegisub/common/calltip_provider.cpp b/libaegisub/common/calltip_provider.cpp
index 63cf2b54f5555d3cb2cf1d417248db2b69e7408a..6d16718996498bee3252108917c4bc675da3f94b 100644
--- a/libaegisub/common/calltip_provider.cpp
+++ b/libaegisub/common/calltip_provider.cpp
@@ -18,8 +18,6 @@
 
 #include "libaegisub/ass/dialogue_parser.h"
 
-#include <boost/range.hpp>
-
 namespace {
 	struct proto_lit {
 		const char *name;
diff --git a/libaegisub/common/charset.cpp b/libaegisub/common/charset.cpp
index ec5bab23885a30726116e8cd1b699924d2698460..02abfcc24fea7873dd60458054ca58b404549a7f 100644
--- a/libaegisub/common/charset.cpp
+++ b/libaegisub/common/charset.cpp
@@ -28,7 +28,6 @@
 
 #include "../../vendor/universalchardet/nscore.h"
 #include "../../vendor/universalchardet/nsUniversalDetector.h"
-#include "../../vendor/universalchardet/nsMBCSGroupProber.h"
 #include "../../vendor/universalchardet/nsCharSetProber.h"
 
 namespace {
diff --git a/libaegisub/common/charset_6937.cpp b/libaegisub/common/charset_6937.cpp
index f796993a605e5af02ede9f33baea8230987c0406..c0e446a14e60253e7e590e48eeede692c91f49df 100644
--- a/libaegisub/common/charset_6937.cpp
+++ b/libaegisub/common/charset_6937.cpp
@@ -18,12 +18,10 @@
 
 #include "charset_6937.h"
 
-#include <algorithm>
 #include <cerrno>
-
 #include <iconv.h>
 
-#include <boost/range/algorithm.hpp>
+#include <boost/range/algorithm/lower_bound.hpp>
 
 namespace {
 
diff --git a/libaegisub/common/file_mapping.cpp b/libaegisub/common/file_mapping.cpp
index 5462fff1e876f6f5aefd1397bf372edb8351b970..e12ed1106fdf79c3a2d9265bbc9018423a710624 100644
--- a/libaegisub/common/file_mapping.cpp
+++ b/libaegisub/common/file_mapping.cpp
@@ -20,7 +20,7 @@
 #include "libaegisub/make_unique.h"
 #include "libaegisub/util.h"
 
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
 #include <boost/interprocess/mapped_region.hpp>
 #include <limits>
 
diff --git a/libaegisub/common/fs.cpp b/libaegisub/common/fs.cpp
index 6d7d71452cfff0aa866fd99da633af5560944762..2d5fdee063e608a0f424cf2386c036011a01467d 100644
--- a/libaegisub/common/fs.cpp
+++ b/libaegisub/common/fs.cpp
@@ -17,12 +17,11 @@
 #include "libaegisub/fs.h"
 
 #include "libaegisub/access.h"
-#include "libaegisub/exception.h"
 #include "libaegisub/log.h"
 
 #include <boost/algorithm/string/predicate.hpp>
 #define BOOST_NO_SCOPED_ENUMS
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/operations.hpp>
 #undef BOOST_NO_SCOPED_ENUMS
 
 namespace bfs = boost::filesystem;
diff --git a/libaegisub/common/hotkey.cpp b/libaegisub/common/hotkey.cpp
index 4a527e7c8d3016372de96f38987bcc7a66cbe750..abe6cc346ace6ab704a3febfcd34614f3f147610 100644
--- a/libaegisub/common/hotkey.cpp
+++ b/libaegisub/common/hotkey.cpp
@@ -19,7 +19,6 @@
 #include "libaegisub/hotkey.h"
 
 #include "libaegisub/cajun/writer.h"
-#include "libaegisub/exception.h"
 #include "libaegisub/io.h"
 #include "libaegisub/json.h"
 #include "libaegisub/log.h"
@@ -27,7 +26,6 @@
 #include <algorithm>
 #include <boost/algorithm/string/join.hpp>
 #include <boost/range/adaptor/map.hpp>
-#include <cmath>
 #include <tuple>
 
 namespace agi {
diff --git a/libaegisub/common/io.cpp b/libaegisub/common/io.cpp
index 0892b0f447006b5196d717e13ee9010b96963890..c95c5559ae8f7e3bd4d28e637e1964ce7ee89ff8 100644
--- a/libaegisub/common/io.cpp
+++ b/libaegisub/common/io.cpp
@@ -22,11 +22,10 @@
 #include "libaegisub/fs.h"
 #include "libaegisub/log.h"
 #include "libaegisub/make_unique.h"
-#include "libaegisub/path.h"
 #include "libaegisub/util.h"
 
-#include <boost/filesystem.hpp>
 #include <boost/filesystem/fstream.hpp>
+#include <boost/filesystem/operations.hpp>
 
 namespace agi {
 	namespace io {
diff --git a/libaegisub/common/json.cpp b/libaegisub/common/json.cpp
index 556498b86db6765ce326a05c3f86a225b88ea0de..d1fd1613e219414c8b81db2ae410c47c0368e6e8 100644
--- a/libaegisub/common/json.cpp
+++ b/libaegisub/common/json.cpp
@@ -18,10 +18,10 @@
 
 #include "libaegisub/json.h"
 
+#include "libaegisub/cajun/reader.h"
 #include "libaegisub/fs.h"
 #include "libaegisub/io.h"
 #include "libaegisub/log.h"
-#include "libaegisub/make_unique.h"
 
 #include <boost/interprocess/streams/bufferstream.hpp>
 
diff --git a/libaegisub/common/keyframe.cpp b/libaegisub/common/keyframe.cpp
index 98b7ee15fa2fc4fb5921627a5582d0aebf7b0ff4..50e5373382372d15cf0178507a12a81529568af9 100644
--- a/libaegisub/common/keyframe.cpp
+++ b/libaegisub/common/keyframe.cpp
@@ -19,13 +19,11 @@
 
 #include "libaegisub/keyframe.h"
 
-#include <algorithm>
-
 #include "libaegisub/io.h"
 #include "libaegisub/line_iterator.h"
 
 #include <boost/algorithm/string/predicate.hpp>
-#include <boost/range/algorithm.hpp>
+#include <boost/range/algorithm/copy.hpp>
 
 namespace {
 std::vector<int> agi_keyframes(std::istream &file) {
diff --git a/libaegisub/common/log.cpp b/libaegisub/common/log.cpp
index 7c59b288a50dfe2999377f3cf3aa735f59d4488d..70817f33bb8616026b606bd590f4f3f31d022cdf 100644
--- a/libaegisub/common/log.cpp
+++ b/libaegisub/common/log.cpp
@@ -12,25 +12,18 @@
 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-/// @file log.cpp
-/// @brief Logging
-/// @ingroup libaegisub
-
 #include "libaegisub/log.h"
 
 #include "libaegisub/cajun/elements.h"
 #include "libaegisub/cajun/writer.h"
 #include "libaegisub/dispatch.h"
-#include "libaegisub/io.h"
+#include "libaegisub/time.h"
 #include "libaegisub/util.h"
 
-#include <algorithm>
-#include <boost/filesystem.hpp>
 #include <boost/filesystem/fstream.hpp>
-#include <boost/range/algorithm.hpp>
-#include <cstring>
-#include <functional>
-#include <mutex>
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/range/algorithm/remove_if.hpp>
 
 namespace agi {
 	namespace log {
diff --git a/libaegisub/common/option.cpp b/libaegisub/common/option.cpp
index 59bad38c0e99ab9221550f6b85ce526fa32310ca..b28cf3c58c4307e419d16c03cd753846ce35de63 100644
--- a/libaegisub/common/option.cpp
+++ b/libaegisub/common/option.cpp
@@ -30,7 +30,6 @@
 #include "option_visit.h"
 
 #include <boost/interprocess/streams/bufferstream.hpp>
-#include <boost/range/adaptor/map.hpp>
 #include <cassert>
 #include <memory>
 
diff --git a/libaegisub/common/option_visit.cpp b/libaegisub/common/option_visit.cpp
index 825f19571f85eb06d24fa8d8ed1bac1e971a13f4..12716394d00d2936967bb75778780cfe1b0c8b5c 100644
--- a/libaegisub/common/option_visit.cpp
+++ b/libaegisub/common/option_visit.cpp
@@ -20,9 +20,7 @@
 #include "option_visit.h"
 
 #include <cassert>
-#include <cmath>
 
-#include <libaegisub/color.h>
 #include <libaegisub/log.h>
 #include <libaegisub/option_value.h>
 #include <libaegisub/make_unique.h>
diff --git a/libaegisub/common/option_visit.h b/libaegisub/common/option_visit.h
index 48988c0e11eaf3a55de08a66eb449d89ef13e910..a53bf3bd0789839adf9da4005bf3dd92387b5a10 100644
--- a/libaegisub/common/option_visit.h
+++ b/libaegisub/common/option_visit.h
@@ -22,7 +22,6 @@
 #include "libaegisub/cajun/visitor.h"
 
 #include <memory>
-#include <vector>
 
 namespace agi {
 
diff --git a/libaegisub/common/path.cpp b/libaegisub/common/path.cpp
index 154fc2dd37aab7ffbe1221b0b2d63abf7db92577..05f1fd74f26555b2756e9908e918c9bc7baf5320 100644
--- a/libaegisub/common/path.cpp
+++ b/libaegisub/common/path.cpp
@@ -21,10 +21,8 @@
 #include "libaegisub/path.h"
 
 #include "libaegisub/fs.h"
-#include "libaegisub/make_unique.h"
 
 #include <boost/algorithm/string/predicate.hpp>
-#include <boost/filesystem.hpp>
 #include <boost/range/distance.hpp>
 
 namespace {
diff --git a/libaegisub/common/thesaurus.cpp b/libaegisub/common/thesaurus.cpp
index c26cd3d2bf3367e3f5872a19731534c602aea584..111f6af878cd1106479c6a55c6b80d6e7043bad4 100644
--- a/libaegisub/common/thesaurus.cpp
+++ b/libaegisub/common/thesaurus.cpp
@@ -23,7 +23,7 @@
 #include "libaegisub/line_iterator.h"
 #include "libaegisub/make_unique.h"
 
-#include <boost/algorithm/string.hpp>
+#include <boost/algorithm/string/split.hpp>
 #include <boost/interprocess/streams/bufferstream.hpp>
 #include <boost/phoenix/operator/comparison.hpp>
 #include <boost/phoenix/core/argument.hpp>
diff --git a/libaegisub/common/util.cpp b/libaegisub/common/util.cpp
index 6485d6828b954fc0f3366f821e9e217941ba0958..18d14a8a3a5819c491c19777172d442b8157b7ba 100644
--- a/libaegisub/common/util.cpp
+++ b/libaegisub/common/util.cpp
@@ -17,11 +17,9 @@
 #include "libaegisub/util.h"
 #include "libaegisub/util_osx.h"
 
-#include "libaegisub/exception.h"
-
 #include <boost/locale/boundary.hpp>
 #include <boost/locale/conversion.hpp>
-#include <boost/range/algorithm_ext.hpp>
+#include <boost/range/distance.hpp>
 #include <ctime>
 
 namespace {
diff --git a/libaegisub/common/vfr.cpp b/libaegisub/common/vfr.cpp
index f03947c4c16fe6e60ca671da3a907d0a7968151c..972655660f575b52fa65e4773e2dbe435dd4f595 100644
--- a/libaegisub/common/vfr.cpp
+++ b/libaegisub/common/vfr.cpp
@@ -21,7 +21,6 @@
 #include "libaegisub/charset.h"
 #include "libaegisub/io.h"
 #include "libaegisub/line_iterator.h"
-#include "libaegisub/scoped_ptr.h"
 
 #include <algorithm>
 #include <boost/interprocess/streams/bufferstream.hpp>
@@ -30,7 +29,6 @@
 #include <functional>
 #include <iterator>
 #include <list>
-#include <numeric>
 
 namespace {
 
diff --git a/libaegisub/include/libaegisub/access.h b/libaegisub/include/libaegisub/access.h
index f58d2d0fa098f414c691c2a112a3c404b82d7d98..f956cc920b1208971eec2fa7b262ae7a12068082 100644
--- a/libaegisub/include/libaegisub/access.h
+++ b/libaegisub/include/libaegisub/access.h
@@ -12,16 +12,9 @@
 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-/// @file access.h
-/// @brief Public interface for access methods.
-/// @ingroup libaegisub
-
-#include <libaegisub/exception.h>
 #include <libaegisub/fs_fwd.h>
 
-namespace agi {
-	namespace acs {
-
+namespace agi { namespace acs {
 enum Type {
 	FileRead,
 	DirRead,
@@ -36,6 +29,4 @@ inline void CheckFileWrite(fs::path const& file) { Check(file, acs::FileWrite);
 
 inline void CheckDirRead(fs::path const& dir) { Check(dir, acs::DirRead); }
 inline void CheckDirWrite(fs::path const& dir) { Check(dir, acs::DirWrite); }
-
-	} // namespace axs
-} // namespace agi
+} }
diff --git a/libaegisub/include/libaegisub/cajun/elements.h b/libaegisub/include/libaegisub/cajun/elements.h
index 63688a07f5a8dbb6ca75cd72893d66772b03178d..9595be9a1affda2ecbb69bc0fa9694d57c8a8d61 100644
--- a/libaegisub/include/libaegisub/cajun/elements.h
+++ b/libaegisub/include/libaegisub/cajun/elements.h
@@ -10,7 +10,6 @@ Author: Terry Caton
 
 #include <cstdint>
 #include <deque>
-#include <list>
 #include <map>
 #include <memory>
 #include <string>
@@ -25,9 +24,6 @@ struct Visitor;
 struct ConstVisitor;
 class UnknownElement;
 
-template <typename ValueTypeT>
-class TrivialType_T;
-
 typedef int64_t Integer;
 typedef double Double;
 typedef bool Boolean;
diff --git a/libaegisub/include/libaegisub/hotkey.h b/libaegisub/include/libaegisub/hotkey.h
index a520d6e6c5bf8fcf5ab6d9fdc4190d8cf81133bc..f7e663161ba477bc77843cde70391c63256d7007 100644
--- a/libaegisub/include/libaegisub/hotkey.h
+++ b/libaegisub/include/libaegisub/hotkey.h
@@ -18,7 +18,6 @@
 
 #include <boost/filesystem/path.hpp>
 #include <map>
-#include <memory>
 #include <string>
 #include <vector>
 
diff --git a/libaegisub/include/libaegisub/json.h b/libaegisub/include/libaegisub/json.h
index 1061df486a3209d4562fefa7f47257fcb7c5969c..cad86fd9c3e873b49d018ecc3b6cc10738964232 100644
--- a/libaegisub/include/libaegisub/json.h
+++ b/libaegisub/include/libaegisub/json.h
@@ -16,14 +16,10 @@
 /// @brief Parse JSON files and return json::UnknownElement
 /// @ingroup libaegisub io
 
-#include <libaegisub/cajun/reader.h>
 #include <libaegisub/cajun/elements.h>
 #include <libaegisub/fs_fwd.h>
 
-#include <memory>
-
-namespace agi {
-	namespace json_util {
+namespace agi { namespace json_util {
 
 /// Parse a JSON stream.
 /// @param stream JSON stream to parse
@@ -41,5 +37,4 @@ json::UnknownElement file(agi::fs::path const& file);
 /// @return json::UnknownElement
 json::UnknownElement file(agi::fs::path const& file, std::pair<const char *, size_t> default_config);
 
-	} // namespace json_util
-} // namespace agi
+} }
diff --git a/libaegisub/include/libaegisub/kana_table.h b/libaegisub/include/libaegisub/kana_table.h
index a826819bed3c00f38e2f6bdcf9ee4a814a5ae82b..1a25c098f4d8aea87dde5b171ae6ce0cc68da151 100644
--- a/libaegisub/include/libaegisub/kana_table.h
+++ b/libaegisub/include/libaegisub/kana_table.h
@@ -14,7 +14,8 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-#include <boost/range/iterator_range.hpp>
+#include <boost/range/iterator_range_core.hpp>
+#include <string>
 #include <vector>
 
 namespace agi {
diff --git a/libaegisub/include/libaegisub/keyframe.h b/libaegisub/include/libaegisub/keyframe.h
index 812b984691f0334d2787b488474955a9f7c3ea4f..8f0eb459f1189408ceffea2fbe3380d34b27891a 100644
--- a/libaegisub/include/libaegisub/keyframe.h
+++ b/libaegisub/include/libaegisub/keyframe.h
@@ -12,18 +12,12 @@
 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-/// @file keyframe.h
-/// @see keyframe.cpp
-/// @ingroup libaegisub
-///
-
 #include <vector>
 
 #include "exception.h"
 #include "fs_fwd.h"
 
 namespace agi {
-	namespace vfr { class Framerate; }
 	namespace keyframe {
 		/// @brief Load a keyframe file
 		/// @param filename File to load
diff --git a/libaegisub/include/libaegisub/log.h b/libaegisub/include/libaegisub/log.h
index f2c6b75f716e8444849f5b2a17ab97cfb753fa7c..21b7eb0260b68c7fafc8a7f2df4160911ff0d4cf 100644
--- a/libaegisub/include/libaegisub/log.h
+++ b/libaegisub/include/libaegisub/log.h
@@ -19,7 +19,6 @@
 #include <libaegisub/fs_fwd.h>
 #include <libaegisub/time.h>
 
-#include <ctime>
 #include <boost/circular_buffer.hpp>
 #include <boost/interprocess/streams/bufferstream.hpp>
 #include <iosfwd>
diff --git a/libaegisub/include/libaegisub/path.h b/libaegisub/include/libaegisub/path.h
index cbb10f5297cb2258f65e63007055bea54bf2fce6..73398c5af0ff273f783d4c86571b47d87f514afc 100644
--- a/libaegisub/include/libaegisub/path.h
+++ b/libaegisub/include/libaegisub/path.h
@@ -18,7 +18,6 @@
 /// @brief Common paths.
 /// @ingroup libaegisub
 
-#include <libaegisub/exception.h>
 #include <libaegisub/fs_fwd.h>
 
 #include <boost/filesystem/path.hpp>
diff --git a/libaegisub/include/libaegisub/thesaurus.h b/libaegisub/include/libaegisub/thesaurus.h
index 3630321cfcd55dbdd444054ec9243b450b85e51a..887d59b13accc6547fe411a143720e282bd3a544 100644
--- a/libaegisub/include/libaegisub/thesaurus.h
+++ b/libaegisub/include/libaegisub/thesaurus.h
@@ -12,10 +12,6 @@
 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-/// @file thesaurus.h
-/// @brief MyThes-compatible thesaurus implementation
-/// @ingroup libaegisub thesaurus
-
 #include "fs_fwd.h"
 
 #include <boost/container/flat_map.hpp>
diff --git a/libaegisub/include/libaegisub/util.h b/libaegisub/include/libaegisub/util.h
index 46ea888a3eedf8de44688980ab76508151e1b963..972e573348b0cc4291aa48e7f62b6f9cd1db6885 100644
--- a/libaegisub/include/libaegisub/util.h
+++ b/libaegisub/include/libaegisub/util.h
@@ -12,17 +12,11 @@
 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-/// @file util.h
-/// @brief Public interface for general utilities.
-/// @ingroup libaegisub
-
 #include <libaegisub/time.h>
 
 #include <algorithm>
 #include <boost/range/irange.hpp>
-#include <cstdint>
 #include <string>
-#include <memory>
 
 struct tm;
 
diff --git a/libaegisub/include/libaegisub/vfr.h b/libaegisub/include/libaegisub/vfr.h
index d38edfdac3e4ee73b4e7b08d8298092f81b70df8..b5d0da9686d460f069401cdd55bdefa2a905c372 100644
--- a/libaegisub/include/libaegisub/vfr.h
+++ b/libaegisub/include/libaegisub/vfr.h
@@ -12,16 +12,10 @@
 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-/// @file vfr.h
-/// @brief Framerate handling of all sorts
-/// @ingroup libaegisub video_input
-
 #pragma once
 
-#include <string>
-#include <vector>
-
 #include <cstdint>
+#include <vector>
 
 #include <libaegisub/exception.h>
 #include <libaegisub/fs_fwd.h>
diff --git a/libaegisub/lua/modules/lfs.cpp b/libaegisub/lua/modules/lfs.cpp
index 7b3153bebae6b73fba4ee703e506023b7b3b3eb1..c6a554dfe375f5a0497f2a04b85800ff5592f3e8 100644
--- a/libaegisub/lua/modules/lfs.cpp
+++ b/libaegisub/lua/modules/lfs.cpp
@@ -16,7 +16,8 @@
 
 #include "libaegisub/lua/utils.h"
 
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
 #include <boost/range/size.hpp>
 
 namespace {
diff --git a/libaegisub/lua/modules/unicode.cpp b/libaegisub/lua/modules/unicode.cpp
index 66b95549717fe252ad298d44e5fa62e9d714c50c..7c8deb3a9acf99a063798faa3b036b12e16d0d1c 100644
--- a/libaegisub/lua/modules/unicode.cpp
+++ b/libaegisub/lua/modules/unicode.cpp
@@ -16,7 +16,7 @@
 
 #include "libaegisub/lua/utils.h"
 
-#include <boost/locale.hpp>
+#include <boost/locale/conversion.hpp>
 
 namespace {
 using namespace agi::lua;
diff --git a/libaegisub/unix/fs.cpp b/libaegisub/unix/fs.cpp
index b5f6af13984799589a355284b559abc71ecafaca..8f6ead6a896b2ac3aad7fb72e09e0e99d19597e5 100644
--- a/libaegisub/unix/fs.cpp
+++ b/libaegisub/unix/fs.cpp
@@ -18,7 +18,8 @@
 #include "libaegisub/fs.h"
 #include "libaegisub/io.h"
 
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
 #include <fcntl.h>
 #include <fnmatch.h>
 #include <istream>
diff --git a/libaegisub/unix/log.cpp b/libaegisub/unix/log.cpp
index 4840f82408fff59ef07c291722f6e0f2b5108ea9..0e137804b5fc626390cfe3c4af217081c9763caf 100644
--- a/libaegisub/unix/log.cpp
+++ b/libaegisub/unix/log.cpp
@@ -12,22 +12,14 @@
 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-/// @file log.cpp
-/// @brief Unix logging
-/// @ingroup libaegisub
-
 #include <cstdio>
 #include <ctime>
-#include <cstring>
 
 #include <unistd.h>
 
 #include "libaegisub/log.h"
-#include "libaegisub/make_unique.h"
-
-namespace agi {
-	namespace log {
 
+namespace agi { namespace log {
 void EmitSTDOUT::log(SinkMessage *sm) {
 	tm tmtime;
 	localtime_r(&sm->tv.tv_sec, &tmtime);
@@ -47,6 +39,4 @@ void EmitSTDOUT::log(SinkMessage *sm) {
 	if (!isatty(fileno(stdout)))
 		fflush(stdout);
 }
-
-	} // namespace log
-} // namespace agi
+} }
diff --git a/libaegisub/unix/path.cpp b/libaegisub/unix/path.cpp
index 8fd082f5343b5485cfd0dd15b11b5e26657f9b60..7612331770ee325f7b08e6ebd0f8611b9863f4fa 100644
--- a/libaegisub/unix/path.cpp
+++ b/libaegisub/unix/path.cpp
@@ -16,9 +16,10 @@
 
 #include <libaegisub/path.h>
 
+#include <libaegisub/exception.h>
 #include <libaegisub/util_osx.h>
 
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/operations.hpp>
 #include <pwd.h>
 
 namespace {
@@ -38,7 +39,6 @@ std::string home_dir() {
 }
 
 namespace agi {
-
 void Path::FillPlatformSpecificPaths() {
 #ifndef __APPLE__
 	agi::fs::path home = home_dir();
diff --git a/libaegisub/unix/util.cpp b/libaegisub/unix/util.cpp
index 80a76a859457730e8730811edd110c659f982367..32ca827f292c066bc2d30d93af258a79571fde3a 100644
--- a/libaegisub/unix/util.cpp
+++ b/libaegisub/unix/util.cpp
@@ -12,12 +12,6 @@
 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-/// @file util.cpp
-/// @brief Unix utility methods.
-/// @ingroup libaegisub unix
-
-#include "libaegisub/make_unique.h"
-
 #include <boost/thread.hpp>
 
 namespace agi { namespace util {
diff --git a/libaegisub/windows/path_win.cpp b/libaegisub/windows/path_win.cpp
index 2c8fc60bdf53bb9f4acad0d121ffd73e3c3a0191..9784a945496a970b8b2d0be9b547864c949e1904 100644
--- a/libaegisub/windows/path_win.cpp
+++ b/libaegisub/windows/path_win.cpp
@@ -20,6 +20,7 @@
 
 #include <libaegisub/path.h>
 
+#include <libaegisub/exception.h>
 #include <libaegisub/make_unique.h>
 
 #include <boost/filesystem.hpp>
diff --git a/src/ass_attachment.h b/src/ass_attachment.h
index 4f42b4085fe7a7b9c9b388339af61e1e9e41186d..34416d6744ef122977325ad9ceffdaf42b15f608 100644
--- a/src/ass_attachment.h
+++ b/src/ass_attachment.h
@@ -19,7 +19,6 @@
 #include <libaegisub/fs_fwd.h>
 
 #include <boost/flyweight.hpp>
-#include <vector>
 
 /// @class AssAttachment
 class AssAttachment final : public AssEntry {
diff --git a/src/ass_dialogue.h b/src/ass_dialogue.h
index 996586a503b24981fe79924b34df99a33d9fe561..a008b15169dd75e074686a3f9eec3bf543339de1 100644
--- a/src/ass_dialogue.h
+++ b/src/ass_dialogue.h
@@ -36,8 +36,6 @@
 #include "ass_override.h"
 #include "ass_time.h"
 
-#include <libaegisub/exception.h>
-
 #include <array>
 #include <boost/flyweight.hpp>
 #include <vector>
diff --git a/src/ass_exporter.h b/src/ass_exporter.h
index 6c2670046084d6b7b01495dbb72869bdaaaf9952..1565c01f261dc8b33790dd4f7d2da04f78a4913d 100644
--- a/src/ass_exporter.h
+++ b/src/ass_exporter.h
@@ -39,7 +39,6 @@
 #include <vector>
 
 class AssExportFilter;
-class AssFile;
 namespace agi { struct Context; }
 class wxSizer;
 class wxWindow;
diff --git a/src/ass_file.cpp b/src/ass_file.cpp
index 8397ff132ecccaa8f9e5893ff198d3fd2092b07f..e5090ec02d2029be0e309de45286716a246ed25c 100644
--- a/src/ass_file.cpp
+++ b/src/ass_file.cpp
@@ -22,9 +22,6 @@
 #include "ass_style.h"
 #include "ass_style_storage.h"
 #include "options.h"
-#include "utils.h"
-
-#include <libaegisub/fs.h>
 
 #include <algorithm>
 #include <boost/algorithm/string/case_conv.hpp>
diff --git a/src/ass_karaoke.cpp b/src/ass_karaoke.cpp
index 751a6544118f8ae76018d2ed6ede963e9b9c086a..7d9c100f0975f79d77b855b231634ad905942e08 100644
--- a/src/ass_karaoke.cpp
+++ b/src/ass_karaoke.cpp
@@ -17,14 +17,10 @@
 #include "ass_karaoke.h"
 
 #include "ass_dialogue.h"
-#include "ass_file.h"
-#include "include/aegisub/context.h"
-#include "selection_controller.h"
 
 #include <boost/format.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/trim.hpp>
-#include <wx/intl.h>
 
 std::string AssKaraoke::Syllable::GetText(bool k_tag) const {
 	std::string ret;
diff --git a/src/ass_karaoke.h b/src/ass_karaoke.h
index 4cbcdcdb79be6dfc517e5ec34535064df8b803d8..fd929f8672044784bacb2590f62b6b715aacdd0b 100644
--- a/src/ass_karaoke.h
+++ b/src/ass_karaoke.h
@@ -15,7 +15,6 @@
 // Aegisub Project http://www.aegisub.org/
 
 #include <map>
-#include <set>
 #include <string>
 #include <vector>
 
diff --git a/src/ass_parser.h b/src/ass_parser.h
index 41396fb1fc1b435a6a5c3d38c794947b86a82ea6..9cf6f50173f7dda06236b86a2292c1471d9510f2 100644
--- a/src/ass_parser.h
+++ b/src/ass_parser.h
@@ -12,8 +12,6 @@
 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-#include <array>
-#include <map>
 #include <memory>
 
 class AssAttachment;
diff --git a/src/ass_style.cpp b/src/ass_style.cpp
index 21efc713f3510aba8c5ed33532cb304265345ffa..0fd93413bbc443c18a181387a5ebea6d4bdba6a3 100644
--- a/src/ass_style.cpp
+++ b/src/ass_style.cpp
@@ -39,12 +39,9 @@
 
 #include <libaegisub/split.h>
 
-#include <algorithm>
 #include <boost/algorithm/string/trim.hpp>
 #include <boost/format.hpp>
 #include <boost/lexical_cast.hpp>
-#include <cctype>
-
 #include <wx/intl.h>
 
 AssStyle::AssStyle() {
diff --git a/src/ass_style.h b/src/ass_style.h
index 4ce0fccddd5a0dc042a1c34c1f5ff77b5862d0a3..1ec57073e2ff321fc8f8417f6f9460a14cc7b8ca 100644
--- a/src/ass_style.h
+++ b/src/ass_style.h
@@ -27,17 +27,13 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file ass_style.h
-/// @see ass_style.cpp
-/// @ingroup subs_storage
-///
-
 #include "ass_entry.h"
 
 #include <libaegisub/color.h>
 
 #include <array>
-#include <wx/arrstr.h>
+
+class wxArrayString;
 
 class AssStyle final : public AssEntry, public AssEntryListHook {
 	std::string data;
diff --git a/src/async_video_provider.cpp b/src/async_video_provider.cpp
index b57ff95c01066f81fa1d9f7adedcb4c04d46fe78..6f2765de38a0458b63748d56731768fef11b9456 100644
--- a/src/async_video_provider.cpp
+++ b/src/async_video_provider.cpp
@@ -20,15 +20,10 @@
 #include "ass_file.h"
 #include "export_fixstyle.h"
 #include "include/aegisub/subtitles_provider.h"
-#include "video_frame.h"
 #include "video_provider_manager.h"
 
 #include <libaegisub/dispatch.h>
 
-#include <condition_variable>
-#include <functional>
-#include <mutex>
-
 enum {
 	NEW_SUBS_FILE = -1,
 	SUBS_FILE_ALREADY_LOADED = -2
diff --git a/src/audio_box.cpp b/src/audio_box.cpp
index 61947d9101c8bc5de4a9652de1b7c651f14f9eb5..cf9230e6f7e84c8c21ec3659ff36c24b769673ff 100644
--- a/src/audio_box.cpp
+++ b/src/audio_box.cpp
@@ -27,28 +27,6 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file audio_box.cpp
-/// @brief The entire audio area in the main UI, containing display and related toolbars
-/// @ingroup audio_ui
-///
-
-#include <cmath>
-
-#include <wx/bmpbuttn.h>
-#include <wx/panel.h>
-#include <wx/slider.h>
-#include <wx/scrolbar.h>
-#include <wx/sizer.h>
-#include <wx/slider.h>
-#include <wx/string.h>
-#include <wx/statline.h>
-#include <wx/textctrl.h>
-#include <wx/tglbtn.h>
-#include <wx/toolbar.h>
-#include <wx/laywin.h> // Keep this last so wxSW_3D is set.
-
-#include <libaegisub/log.h>
-
 #include "audio_box.h"
 
 #include "include/aegisub/context.h"
@@ -58,14 +36,20 @@
 #include "audio_display.h"
 #include "audio_karaoke.h"
 #include "audio_timing.h"
-#include "command/command.h"
-#include "libresrc/libresrc.h"
 #include "options.h"
 #include "project.h"
 #include "toggle_bitmap.h"
-#include "selection_controller.h"
 #include "utils.h"
 
+#include <cmath>
+#include <wx/panel.h>
+#include <wx/slider.h>
+#include <wx/scrolbar.h>
+#include <wx/sizer.h>
+#include <wx/slider.h>
+#include <wx/string.h>
+#include <wx/toolbar.h>
+
 enum {
 	Audio_Horizontal_Zoom = 1600,
 	Audio_Vertical_Zoom,
diff --git a/src/audio_box.h b/src/audio_box.h
index a449ddc317979f3c3b9643fb485b863c64f3c71c..ea633eba74d17d79f51e09ef51a5cf08de8bae13 100644
--- a/src/audio_box.h
+++ b/src/audio_box.h
@@ -27,11 +27,7 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file audio_box.h
-/// @see audio_box.cpp
-/// @ingroup audio_ui
-///
-
+#include <wx/defs.h>
 #include <wx/sashwin.h>
 
 #include <libaegisub/signal.h>
diff --git a/src/audio_colorscheme.cpp b/src/audio_colorscheme.cpp
index d8fb74127b6502f877aeb2e615ee1da3b8e9cd14..bbcd7763e4b5f044f42eb0c18ada0a3c7a841399 100644
--- a/src/audio_colorscheme.cpp
+++ b/src/audio_colorscheme.cpp
@@ -27,13 +27,6 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file audio_colorscheme.cpp
-/// @ingroup audio_ui
-///
-/// Manage colour schemes for the audio display
-
-#include <algorithm>
-
 #include "audio_colorscheme.h"
 
 #include "audio_rendering_style.h"
diff --git a/src/audio_controller.cpp b/src/audio_controller.cpp
index 709f1067d606a864e597f8ad16f197404c614b03..487ad39caeb700d0521653eba4c0472db9b1df5d 100644
--- a/src/audio_controller.cpp
+++ b/src/audio_controller.cpp
@@ -35,8 +35,6 @@
 #include "include/aegisub/context.h"
 #include "options.h"
 #include "project.h"
-#include "selection_controller.h"
-#include "utils.h"
 
 #include <algorithm>
 
diff --git a/src/audio_controller.h b/src/audio_controller.h
index 87f3dcdcda138b20b828b392dbeecf5c468edeb5..8cef885686e1322c3169de03014ba5e06e28ef5e 100644
--- a/src/audio_controller.h
+++ b/src/audio_controller.h
@@ -28,7 +28,6 @@
 // Aegisub Project http://www.aegisub.org/
 
 #include <libaegisub/exception.h>
-#include <libaegisub/fs_fwd.h>
 #include <libaegisub/signal.h>
 
 #include <cstdint>
diff --git a/src/audio_display.cpp b/src/audio_display.cpp
index 3843e2b9a728a079d1f020db67f9ba3a0949d7ba..ed664c0dc6a7139b8020639e51ef31c951e39587 100644
--- a/src/audio_display.cpp
+++ b/src/audio_display.cpp
@@ -28,28 +28,20 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file audio_display.cpp
-/// @brief Display audio in the main UI
-/// @ingroup audio_ui
-///
-
 #include "audio_display.h"
 
 #include "ass_time.h"
-#include "audio_colorscheme.h"
 #include "audio_controller.h"
 #include "audio_renderer.h"
 #include "audio_renderer_spectrum.h"
 #include "audio_renderer_waveform.h"
 #include "audio_timing.h"
-#include "block_cache.h"
 #include "compat.h"
 #include "include/aegisub/audio_provider.h"
 #include "include/aegisub/context.h"
 #include "include/aegisub/hotkey.h"
 #include "options.h"
 #include "project.h"
-#include "selection_controller.h"
 #include "utils.h"
 #include "video_controller.h"
 
@@ -58,7 +50,6 @@
 #include <algorithm>
 
 #include <wx/dcbuffer.h>
-#include <wx/dcclient.h>
 #include <wx/mousestate.h>
 
 namespace {
diff --git a/src/audio_display.h b/src/audio_display.h
index 4c17d4be51d571f34eef66fd1239771b6008b130..e8c78e397a312ca7245b09f646bc8b6723fb0228 100644
--- a/src/audio_display.h
+++ b/src/audio_display.h
@@ -27,11 +27,8 @@
 // POSSIBILITY OF SUCH DAMAGE.
 //
 // Aegisub Project http://www.aegisub.org/
-
-/// @file audio_display.h
-/// @see audio_display.cpp
-/// @ingroup audio_ui
-///
+//
+#include <libaegisub/signal.h>
 
 #include <chrono>
 #include <cstdint>
@@ -43,14 +40,11 @@
 #include <wx/timer.h>
 #include <wx/window.h>
 
-#include <libaegisub/signal.h>
-
 namespace agi { struct Context; }
 
 class AudioController;
 class AudioRenderer;
 class AudioRendererBitmapProvider;
-class AudioKaraoke;
 class AudioProvider;
 class TimeRange;
 
@@ -58,7 +52,6 @@ class TimeRange;
 namespace {
 	class AudioDisplayScrollbar;
 	class AudioDisplayTimeline;
-	class AudioDisplaySelection;
 }
 class AudioMarkerInteractionObject;
 
diff --git a/src/audio_karaoke.cpp b/src/audio_karaoke.cpp
index 56ec1288a8c95617eccc12bf920e6757e242f374..4f42bc970574a7d833b6377f6ce43eed680db13f 100644
--- a/src/audio_karaoke.cpp
+++ b/src/audio_karaoke.cpp
@@ -40,7 +40,6 @@
 
 #include <algorithm>
 #include <boost/locale/boundary.hpp>
-#include <numeric>
 #include <wx/bmpbuttn.h>
 #include <wx/button.h>
 #include <wx/dcclient.h>
diff --git a/src/audio_marker.h b/src/audio_marker.h
index b953b6cd4767d696c0dcde5ba9252d331017c873..383ab87ac4956e86c4b84f1cf056304fc95a7ab0 100644
--- a/src/audio_marker.h
+++ b/src/audio_marker.h
@@ -16,18 +16,18 @@
 
 #pragma once
 
+#include "time_range.h"
+
 #include <libaegisub/signal.h>
 
 #include <memory>
 #include <vector>
-
 #include <wx/string.h>
 
 class AudioMarkerKeyframe;
 class Pen;
 class Project;
 class VideoController;
-class TimeRange;
 class VideoPositionMarker;
 class wxPen;
 
@@ -36,8 +36,6 @@ namespace agi {
 	struct Context;
 }
 
-#include "time_range.h"
-
 /// @class AudioMarker
 /// @brief A marker on the audio display
 class AudioMarker {
diff --git a/src/audio_provider.cpp b/src/audio_provider.cpp
index 1ea0a65168ca7bde8ec685114ffabb2546e14046..ffafd41a907fa824a330039a69098e9002cfa337 100644
--- a/src/audio_provider.cpp
+++ b/src/audio_provider.cpp
@@ -27,23 +27,15 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file audio_provider.cpp
-/// @brief Baseclass for audio providers
-/// @ingroup audio_input
-///
-
 #include "include/aegisub/audio_provider.h"
 
 #include "audio_controller.h"
 #include "factory_manager.h"
-#include "frame_main.h"
 #include "options.h"
 #include "utils.h"
 
-#include <libaegisub/background_runner.h>
 #include <libaegisub/fs.h>
 #include <libaegisub/log.h>
-#include <libaegisub/make_unique.h>
 
 #include <boost/range/iterator_range.hpp>
 
diff --git a/src/audio_provider_dummy.cpp b/src/audio_provider_dummy.cpp
index 1a314ee4f6cc043b1dba1960e4041a5eab829ab9..6a1dc9d089524c187153ea4bb87d25a19f19bb42 100644
--- a/src/audio_provider_dummy.cpp
+++ b/src/audio_provider_dummy.cpp
@@ -27,17 +27,12 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file audio_provider_dummy.cpp
-/// @brief Dummy (silence or noise) audio provider
-/// @ingroup audio_input
-///
-
 #include "include/aegisub/audio_provider.h"
 
-#include <libaegisub/fs.h>
 #include <libaegisub/make_unique.h>
 
 #include <boost/algorithm/string/predicate.hpp>
+#include <boost/filesystem/path.hpp>
 
 /*
  * scheme            ::= "dummy-audio" ":" signal-specifier "?" signal-parameters
diff --git a/src/audio_provider_hd.cpp b/src/audio_provider_hd.cpp
index fc166fea2383bda28a0618b9aa3e6370f95da568..2ad845b01e6647dfc3f632f37e8a92062ed61686 100644
--- a/src/audio_provider_hd.cpp
+++ b/src/audio_provider_hd.cpp
@@ -17,7 +17,6 @@
 #include "include/aegisub/audio_provider.h"
 
 #include "audio_controller.h"
-#include "compat.h"
 #include "options.h"
 
 #include <libaegisub/file_mapping.h>
@@ -25,13 +24,10 @@
 #include <libaegisub/path.h>
 #include <libaegisub/make_unique.h>
 
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/algorithm/string/replace.hpp>
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
 #include <boost/format.hpp>
 #include <boost/interprocess/detail/os_thread_functions.hpp>
 #include <thread>
-#include <wx/intl.h>
 
 namespace {
 class HDAudioProvider final : public AudioProviderWrapper {
diff --git a/src/audio_provider_pcm.cpp b/src/audio_provider_pcm.cpp
index 024b73d126a6294c2e76b3848accafe314fb67d7..a9fc39674fd80b3bcb4c81687ac6da520ba41f74 100644
--- a/src/audio_provider_pcm.cpp
+++ b/src/audio_provider_pcm.cpp
@@ -27,19 +27,12 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file audio_provider_pcm.cpp
-/// @brief PCM WAV and WAV64 audio provider
-/// @ingroup audio_input
-///
-
 #include "include/aegisub/audio_provider.h"
 
 #include "audio_controller.h"
-#include "utils.h"
 
 #include <libaegisub/file_mapping.h>
 #include <libaegisub/fs.h>
-#include <libaegisub/log.h>
 #include <libaegisub/make_unique.h>
 
 #include <vector>
diff --git a/src/audio_provider_ram.cpp b/src/audio_provider_ram.cpp
index 2f0aa5d1cc5ea4eb594b44a351a791105da5e01e..b03b4648a7773d11cfbf7ba9e405fb32989b3f80 100644
--- a/src/audio_provider_ram.cpp
+++ b/src/audio_provider_ram.cpp
@@ -35,14 +35,12 @@
 #include "include/aegisub/audio_provider.h"
 
 #include "audio_controller.h"
-#include "compat.h"
 
 #include <libaegisub/make_unique.h>
 
 #include <array>
 #include <boost/container/stable_vector.hpp>
 #include <thread>
-#include <wx/intl.h>
 
 namespace {
 
diff --git a/src/audio_renderer.cpp b/src/audio_renderer.cpp
index 5f804672e4255ded1bd59a78eae216a865298be0..90872fce2b3777f637a5a7df6dc998bddfd1ceaa 100644
--- a/src/audio_renderer.cpp
+++ b/src/audio_renderer.cpp
@@ -38,10 +38,7 @@
 #include <libaegisub/make_unique.h>
 
 #include <algorithm>
-#include <functional>
-
-#include <wx/bitmap.h>
-#include <wx/dcmemory.h>
+#include <wx/dc.h>
 
 namespace {
 	template<typename T>
diff --git a/src/audio_renderer.h b/src/audio_renderer.h
index 0ccd928bc8b8108b578ce4907f6faea9214786ed..c0f53ee975d4282d1e41c27b18793ebdb817cafd 100644
--- a/src/audio_renderer.h
+++ b/src/audio_renderer.h
@@ -27,29 +27,20 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file audio_renderer.h
-/// @see audio_renderer.cpp
-/// @ingroup audio_ui
-///
-/// Base classes for audio renderers (spectrum, waveform, ...)
-
 #pragma once
 
 #include <memory>
 #include <vector>
 
-#include <wx/dc.h>
 #include <wx/gdicmn.h>
 
 #include "audio_rendering_style.h"
 #include "block_cache.h"
 
-// Some forward declarations for outside stuff
 class AudioProvider;
-
-// Forwards declarations for internal stuff
 class AudioRendererBitmapProvider;
 class AudioRenderer;
+class wxDC;
 
 /// @class AudioRendererBitmapCacheBitmapFactory
 /// @brief Produces wxBitmap objects for DataBlockCache storage for the audio renderer
diff --git a/src/audio_renderer_spectrum.cpp b/src/audio_renderer_spectrum.cpp
index bbb60bd05cd82f170a8473c96caff7dc638491c5..5aedb4b109b7bc63ddc5f7d6c6692678a35b8ccd 100644
--- a/src/audio_renderer_spectrum.cpp
+++ b/src/audio_renderer_spectrum.cpp
@@ -39,15 +39,12 @@
 #include "fft.h"
 #endif
 #include "include/aegisub/audio_provider.h"
-#include "utils.h"
 
-#include <libaegisub/log.h>
 #include <libaegisub/make_unique.h>
 
 #include <algorithm>
 
 #include <wx/image.h>
-#include <wx/rawbmp.h>
 #include <wx/dcmemory.h>
 
 /// Allocates blocks of derived data for the audio spectrum
diff --git a/src/audio_renderer_waveform.cpp b/src/audio_renderer_waveform.cpp
index f0dab3386ce3d50939bf17bc54397132d0ba2227..ee9b18df93cfffb1cee54d169667c20da09b7f8f 100644
--- a/src/audio_renderer_waveform.cpp
+++ b/src/audio_renderer_waveform.cpp
@@ -27,23 +27,16 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file audio_renderer_waveform.cpp
-/// @ingroup audio_ui
-///
-/// Render a waveform display of PCM audio data
-
 #include "audio_renderer_waveform.h"
 
-#include <algorithm>
-
-#include <wx/dcmemory.h>
-
 #include "audio_colorscheme.h"
-#include "block_cache.h"
-#include "colorspace.h"
 #include "include/aegisub/audio_provider.h"
 #include "options.h"
 
+#include <algorithm>
+
+#include <wx/dcmemory.h>
+
 enum {
 	/// Only render the peaks
 	Waveform_MaxOnly = 0,
diff --git a/src/audio_renderer_waveform.h b/src/audio_renderer_waveform.h
index 79213421bb196b444b2dc20f200eb1567168f7dc..a07a9a2bead6d7dfc8645ed34bc00a1f878de81f 100644
--- a/src/audio_renderer_waveform.h
+++ b/src/audio_renderer_waveform.h
@@ -27,19 +27,14 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file audio_renderer_waveform.h
-/// @see audio_renderer_waveform.cpp
-/// @ingroup audio_ui
-///
-/// Render a waveform display of PCM audio data
+#include "audio_renderer.h"
 
-#include <cstdint>
 #include <vector>
 
 class AudioColorScheme;
+class wxArrayString;
 
-#include "audio_renderer.h"
-
+/// Render a waveform display of PCM audio data
 class AudioWaveformRenderer final : public AudioRendererBitmapProvider {
 	/// Colour tables used for rendering
 	std::vector<AudioColorScheme> colors;
diff --git a/src/audio_timing_dialogue.cpp b/src/audio_timing_dialogue.cpp
index 43a8074a881e47223b694c4acf2e1ecd58fb3d8d..6a1bf21975ff8bc8c154789d430f426a9606ced7 100644
--- a/src/audio_timing_dialogue.cpp
+++ b/src/audio_timing_dialogue.cpp
@@ -27,14 +27,11 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file audio_timing_dialogue.cpp
-/// @brief Default timing mode for dialogue subtitles
-/// @ingroup audio_ui
-
 #include "ass_dialogue.h"
 #include "ass_file.h"
 #include "ass_time.h"
-#include "audio_renderer.h"
+#include "audio_marker.h"
+#include "audio_rendering_style.h"
 #include "audio_timing.h"
 #include "command/command.h"
 #include "include/aegisub/context.h"
@@ -46,7 +43,6 @@
 #include <libaegisub/make_unique.h>
 
 #include <boost/range/algorithm.hpp>
-#include <cstdint>
 #include <wx/pen.h>
 
 namespace {
diff --git a/src/audio_timing_karaoke.cpp b/src/audio_timing_karaoke.cpp
index dd66288e8308b182a414e8543b739e6837c354bc..b848ef5829e5cb90b16dc624aa80e00e0062708b 100644
--- a/src/audio_timing_karaoke.cpp
+++ b/src/audio_timing_karaoke.cpp
@@ -14,18 +14,14 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file audio_timing_karaoke.cpp
-/// @brief Timing mode for karaoke
-/// @ingroup audio_ui
-///
-
 #include <libaegisub/signal.h>
 
 #include "ass_dialogue.h"
 #include "ass_file.h"
 #include "ass_karaoke.h"
 #include "audio_controller.h"
-#include "audio_renderer.h"
+#include "audio_marker.h"
+#include "audio_rendering_style.h"
 #include "audio_timing.h"
 #include "compat.h"
 #include "include/aegisub/context.h"
@@ -39,6 +35,7 @@
 #include <boost/range/algorithm/copy.hpp>
 #include <boost/range/adaptor/filtered.hpp>
 #include <boost/range/adaptor/sliced.hpp>
+#include <wx/intl.h>
 
 /// @class KaraokeMarker
 /// @brief AudioMarker implementation for AudioTimingControllerKaraoke
diff --git a/src/auto4_base.cpp b/src/auto4_base.cpp
index 8f15129fdc15da30da2da1ec77de58ec56d7f2ff..f113a544ed6b1ae046162c44267a11882ac5f219 100644
--- a/src/auto4_base.cpp
+++ b/src/auto4_base.cpp
@@ -27,23 +27,16 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file auto4_base.cpp
-/// @brief Baseclasses for Automation 4 scripting framework
-/// @ingroup scripting
-///
-
 #include "auto4_base.h"
 
 #include "ass_file.h"
 #include "ass_style.h"
-#include "command/command.h"
+#include "compat.h"
 #include "dialog_progress.h"
 #include "include/aegisub/context.h"
 #include "options.h"
 #include "string_codec.h"
 #include "subs_controller.h"
-#include "subtitle_format.h"
-#include "utils.h"
 
 #include <libaegisub/dispatch.h>
 #include <libaegisub/fs.h>
@@ -59,7 +52,6 @@
 #include <wx/dcmemory.h>
 #include <wx/log.h>
 #include <wx/sizer.h>
-#include <wx/msgdlg.h>
 
 #ifdef __WINDOWS__
 #define WIN32_LEAN_AND_MEAN
@@ -511,4 +503,8 @@ namespace Automation4 {
 
 		return fnfilter;
 	}
+
+	std::string UnknownScript::GetDescription() const {
+		return from_wx(_("File was not recognized as a script"));
+	}
 }
diff --git a/src/auto4_base.h b/src/auto4_base.h
index 95a204111da1c0497593f3bf3d5a96ce613abea0..be67d3f7c9a8fa662435345e16bf245d0b00698e 100644
--- a/src/auto4_base.h
+++ b/src/auto4_base.h
@@ -40,14 +40,11 @@
 #include <libaegisub/signal.h>
 
 #include "ass_export_filter.h"
-#include "compat.h"
 
 #include <boost/filesystem/path.hpp>
 #include <memory>
 #include <vector>
 
-#include <wx/dialog.h>
-
 class AssStyle;
 class DialogProgress;
 class wxWindow;
@@ -283,7 +280,7 @@ namespace Automation4 {
 		void Reload() override { }
 
 		std::string GetName() const override { return GetFilename().stem().string(); }
-		std::string GetDescription() const override { return from_wx(_("File was not recognized as a script")); }
+		std::string GetDescription() const override;
 		std::string GetAuthor() const override { return ""; }
 		std::string GetVersion() const override { return ""; }
 		bool GetLoadedState() const override { return false; }
diff --git a/src/auto4_lua.cpp b/src/auto4_lua.cpp
index 943495de19c1a5004e68bb49d0e94bbb5ded6d48..09816858821bfa0b0e966e4f278b449d5f3a5da1 100644
--- a/src/auto4_lua.cpp
+++ b/src/auto4_lua.cpp
@@ -34,18 +34,15 @@
 
 #include "auto4_lua.h"
 
-#include "ass_attachment.h"
 #include "ass_dialogue.h"
-#include "ass_info.h"
 #include "ass_file.h"
+#include "ass_info.h"
 #include "ass_style.h"
 #include "async_video_provider.h"
 #include "auto4_lua_factory.h"
 #include "command/command.h"
 #include "compat.h"
 #include "include/aegisub/context.h"
-#include "include/aegisub/video_provider.h"
-#include "main.h"
 #include "options.h"
 #include "project.h"
 #include "selection_controller.h"
@@ -53,7 +50,6 @@
 #include "video_controller.h"
 #include "utils.h"
 
-#include <libaegisub/access.h>
 #include <libaegisub/lua/modules.h>
 #include <libaegisub/lua/script_reader.h>
 #include <libaegisub/lua/utils.h>
@@ -67,14 +63,10 @@
 #include <boost/format.hpp>
 #include <boost/scope_exit.hpp>
 #include <cassert>
-#include <cstdint>
 #include <mutex>
 #include <wx/clipbrd.h>
-#include <wx/filefn.h>
-#include <wx/filename.h>
 #include <wx/log.h>
 #include <wx/msgdlg.h>
-#include <wx/window.h>
 
 using namespace agi::lua;
 using namespace Automation4;
diff --git a/src/auto4_lua.h b/src/auto4_lua.h
index b647081f1bf4cc4ed765487c357b3f3ef89a7b8c..a3d284558c0e202df0b3517ec62bb8fd191a9a1c 100644
--- a/src/auto4_lua.h
+++ b/src/auto4_lua.h
@@ -27,23 +27,16 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file auto4_lua.h
-/// @see auto4_lua.cpp
-/// @ingroup scripting
-///
-
 #include "auto4_base.h"
 
 #include <deque>
 #include <vector>
-
-#include <wx/event.h>
-#include <wx/thread.h>
+#include <wx/string.h>
 
 class AssEntry;
+class wxControl;
 class wxWindow;
 struct lua_State;
-namespace agi { namespace vfr { class Framerate; } }
 
 namespace Automation4 {
 	/// @class LuaAssFile
diff --git a/src/auto4_lua_assfile.cpp b/src/auto4_lua_assfile.cpp
index 9bf9a73367e96b5198e4aeab22c34174e899ae0a..63ad6c475cddac8137ee1c8d7a6cf1b76dab0ef2 100644
--- a/src/auto4_lua_assfile.cpp
+++ b/src/auto4_lua_assfile.cpp
@@ -39,7 +39,7 @@
 #include "ass_file.h"
 #include "ass_karaoke.h"
 #include "ass_style.h"
-#include "utils.h"
+#include "compat.h"
 
 #include <libaegisub/exception.h>
 #include <libaegisub/log.h>
diff --git a/src/auto4_lua_dialog.cpp b/src/auto4_lua_dialog.cpp
index 6b123e2acc37730a3a7e5b0736fd5ea9a4a8d98f..5dc5cfb764f4ee4174dafb4f7954b2d96ae114bc 100644
--- a/src/auto4_lua_dialog.cpp
+++ b/src/auto4_lua_dialog.cpp
@@ -34,11 +34,9 @@
 
 #include "auto4_lua.h"
 
-#include "ass_style.h"
 #include "colour_button.h"
 #include "compat.h"
 #include "string_codec.h"
-#include "utils.h"
 #include "validators.h"
 
 #include <libaegisub/log.h>
@@ -46,24 +44,21 @@
 #include <libaegisub/make_unique.h>
 
 #include <boost/algorithm/string/case_conv.hpp>
-#include <boost/range/adaptors.hpp>
+#include <boost/range/adaptor/map.hpp>
 #include <boost/range/algorithm.hpp>
 #include <boost/tokenizer.hpp>
-#include <cassert>
 #include <cfloat>
 #include <unordered_map>
 
 #include <wx/button.h>
 #include <wx/checkbox.h>
 #include <wx/combobox.h>
+#include <wx/dialog.h>
 #include <wx/gbsizer.h>
 #include <wx/panel.h>
 #include <wx/spinctrl.h>
 #include <wx/stattext.h>
-#include <wx/validate.h>
 #include <wx/valgen.h>
-#include <wx/valnum.h>
-#include <wx/window.h>
 
 using namespace agi::lua;
 namespace {
diff --git a/src/auto4_lua_progresssink.cpp b/src/auto4_lua_progresssink.cpp
index 80b42087ce8340958bf4abb47810fd73679b63c4..bb6b8f1ba02b0a2cbdb577d0fac35bb53bac2a5a 100644
--- a/src/auto4_lua_progresssink.cpp
+++ b/src/auto4_lua_progresssink.cpp
@@ -34,6 +34,8 @@
 
 #include "auto4_lua.h"
 
+#include "compat.h"
+
 #include <libaegisub/lua/utils.h>
 
 #include <wx/filedlg.h>
diff --git a/src/base_grid.cpp b/src/base_grid.cpp
index 1a2f6fc24b23d386c0be65d72f23df21fda4c131..7d276c989059092fb3f74cfbfcbdb5541a3b9d4d 100644
--- a/src/base_grid.cpp
+++ b/src/base_grid.cpp
@@ -37,7 +37,6 @@
 #include "ass_file.h"
 #include "audio_box.h"
 #include "compat.h"
-#include "frame_main.h"
 #include "grid_column.h"
 #include "options.h"
 #include "project.h"
@@ -49,13 +48,8 @@
 #include <libaegisub/util.h>
 
 #include <algorithm>
-#include <boost/range/algorithm.hpp>
-#include <cmath>
-#include <iterator>
-#include <numeric>
 
 #include <wx/dcbuffer.h>
-#include <wx/kbdstate.h>
 #include <wx/menu.h>
 #include <wx/scrolbar.h>
 #include <wx/sizer.h>
@@ -63,10 +57,10 @@
 namespace {
 #ifdef __WXMSW__
 class PaintDC : public wxBufferedDC {
-    wxPaintDC dc;
+	wxPaintDC dc;
 
 public:
-    PaintDC(wxWindow *window) : dc(window) {
+	PaintDC(wxWindow *window) : dc(window) {
 		dc.SetLayoutDirection(wxLayout_LeftToRight);
 		Init(&dc, window->GetClientSize(), 0);
 		if (window->GetLayoutDirection() == wxLayout_RightToLeft) {
@@ -75,7 +69,7 @@ public:
 		}
 	}
 
-    ~PaintDC() {
+	~PaintDC() {
 		SetLayoutDirection(wxLayout_LeftToRight);
 		SetLogicalOrigin(0, 0);
 		UnMask();
diff --git a/src/base_grid.h b/src/base_grid.h
index 8967d519a277b84009ddb1c7ba251a937ec5c6b9..2163ba9e9e94d053c3b61355cda50bee464bb063 100644
--- a/src/base_grid.h
+++ b/src/base_grid.h
@@ -29,7 +29,6 @@
 
 #include <libaegisub/signal.h>
 
-#include <array>
 #include <memory>
 #include <vector>
 #include <wx/window.h>
diff --git a/src/colour_button.cpp b/src/colour_button.cpp
index 1e37d81c7d5ae04682454ebb891940f578fce240..f985e62f19a5f3b2e61378629f1fa722840180eb 100644
--- a/src/colour_button.cpp
+++ b/src/colour_button.cpp
@@ -16,7 +16,6 @@
 
 #include "colour_button.h"
 
-#include "compat.h"
 #include "dialogs.h"
 
 #include <boost/gil/gil_all.hpp>
diff --git a/src/command/audio.cpp b/src/command/audio.cpp
index 45ee75eac1673c8e392fcc0b3946ad20ce6bd026..66db86e6649500978857b9c4b651ca759ef22042 100644
--- a/src/command/audio.cpp
+++ b/src/command/audio.cpp
@@ -36,7 +36,6 @@
 #include "../audio_controller.h"
 #include "../audio_karaoke.h"
 #include "../audio_timing.h"
-#include "../compat.h"
 #include "../include/aegisub/audio_provider.h"
 #include "../include/aegisub/context.h"
 #include "../libresrc/libresrc.h"
@@ -47,11 +46,8 @@
 #include "../video_controller.h"
 
 #include <libaegisub/make_unique.h>
-#include <libaegisub/fs.h>
 #include <libaegisub/io.h>
 
-#include <wx/msgdlg.h>
-
 namespace {
 	using cmd::Command;
 
diff --git a/src/command/automation.cpp b/src/command/automation.cpp
index fb8fe282e4b8ddafc2e277700c76b5fd7a31f3cd..817bfabb5444df81095e66c93a16bd00c20283eb 100644
--- a/src/command/automation.cpp
+++ b/src/command/automation.cpp
@@ -37,9 +37,6 @@
 #include "../include/aegisub/context.h"
 #include "../libresrc/libresrc.h"
 #include "../main.h"
-#include "../options.h"
-#include "../utils.h"
-#include "../video_controller.h"
 
 #include <libaegisub/make_unique.h>
 
diff --git a/src/command/command.h b/src/command/command.h
index a22e97a600414f3a7f920e7d55ac42936344f825..e3ea33f542afd4e47406893ed96e3544712c6a3d 100644
--- a/src/command/command.h
+++ b/src/command/command.h
@@ -16,7 +16,6 @@
 /// @brief Command base class and main header.
 /// @ingroup command
 
-
 #include <map>
 #include <string>
 #include <vector>
diff --git a/src/command/edit.cpp b/src/command/edit.cpp
index a78fe090d41e2d7cc9c7e3b2d1093a1b740ff7ed..288a2dfd75f9d26b762bc2443945665cdee8bb94 100644
--- a/src/command/edit.cpp
+++ b/src/command/edit.cpp
@@ -43,10 +43,8 @@
 #include "../libresrc/libresrc.h"
 #include "../options.h"
 #include "../project.h"
-#include "../search_replace_engine.h"
 #include "../selection_controller.h"
 #include "../subs_controller.h"
-#include "../subs_edit_ctrl.h"
 #include "../text_selection_controller.h"
 #include "../utils.h"
 #include "../video_controller.h"
@@ -64,10 +62,12 @@
 #include <boost/range/adaptor/reversed.hpp>
 #include <boost/range/adaptor/sliced.hpp>
 #include <boost/range/adaptor/transformed.hpp>
+#include <boost/regex.hpp>
 #include <boost/tokenizer.hpp>
 
 #include <wx/clipbrd.h>
 #include <wx/fontdlg.h>
+#include <wx/textentry.h>
 
 namespace {
 	using namespace boost::adaptors;
diff --git a/src/command/grid.cpp b/src/command/grid.cpp
index e69ef4b5c99011e86c200b1ce0befae16a7720ed..d0a9d165b7ce0955d71052fe3888a4732d219744 100644
--- a/src/command/grid.cpp
+++ b/src/command/grid.cpp
@@ -40,7 +40,6 @@
 #include "../libresrc/libresrc.h"
 #include "../options.h"
 #include "../selection_controller.h"
-#include "../utils.h"
 
 #include <libaegisub/make_unique.h>
 
diff --git a/src/command/help.cpp b/src/command/help.cpp
index cfdb345fd38d7a426c2b2e747914bf37d4b5f8e1..144a1f81aec36d648363c8da28a687f72b772554 100644
--- a/src/command/help.cpp
+++ b/src/command/help.cpp
@@ -34,7 +34,6 @@
 #include "../help_button.h"
 #include "../include/aegisub/context.h"
 #include "../libresrc/libresrc.h"
-#include "../options.h"
 
 #include <libaegisub/make_unique.h>
 
diff --git a/src/command/recent.cpp b/src/command/recent.cpp
index 21e954d8afbf2c2532bec113699996c3d7d745cf..4e2a980f43bb8889303fe4fc0da6bdada3139a69 100644
--- a/src/command/recent.cpp
+++ b/src/command/recent.cpp
@@ -29,7 +29,6 @@
 
 #include "command.h"
 
-#include "../compat.h"
 #include "../include/aegisub/context.h"
 #include "../libresrc/libresrc.h"
 #include "../options.h"
diff --git a/src/command/subtitle.cpp b/src/command/subtitle.cpp
index c9559069078fa576ba53dd1c245f9b2b432594d2..24175191cbd608000255b6cc57c034d346b13d64 100644
--- a/src/command/subtitle.cpp
+++ b/src/command/subtitle.cpp
@@ -51,7 +51,7 @@
 #include <libaegisub/charset_conv.h>
 #include <libaegisub/make_unique.h>
 
-#include <boost/range/algorithm.hpp>
+#include <boost/range/algorithm/copy.hpp>
 #include <wx/msgdlg.h>
 #include <wx/choicdlg.h>
 
diff --git a/src/command/time.cpp b/src/command/time.cpp
index da21265b000d0fcd510aff12503aecd677a43595..3e7a8f66b9b77bbb4d82159412e2451dc4a0dd5e 100644
--- a/src/command/time.cpp
+++ b/src/command/time.cpp
@@ -39,7 +39,6 @@
 #include "../dialogs.h"
 #include "../include/aegisub/context.h"
 #include "../libresrc/libresrc.h"
-#include "../options.h"
 #include "../project.h"
 #include "../selection_controller.h"
 #include "../video_controller.h"
diff --git a/src/command/video.cpp b/src/command/video.cpp
index f4823ab5758285b7722f4a045b160a00902c6fbe..49e4b2be05277342282c3608c318587866ac9788 100644
--- a/src/command/video.cpp
+++ b/src/command/video.cpp
@@ -46,11 +46,9 @@
 #include "../project.h"
 #include "../selection_controller.h"
 #include "../utils.h"
-#include "../video_box.h"
 #include "../video_controller.h"
 #include "../video_display.h"
 #include "../video_frame.h"
-#include "../video_slider.h"
 
 #include <libaegisub/fs.h>
 #include <libaegisub/path.h>
@@ -61,7 +59,6 @@
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/split.hpp>
 #include <boost/format.hpp>
-#include <wx/clipbrd.h>
 #include <wx/msgdlg.h>
 #include <wx/textdlg.h>
 
diff --git a/src/command/vis_tool.cpp b/src/command/vis_tool.cpp
index 0cfd308b18485aed24970727451174bc9f13ae23..168f427ee81e49ddb019e4f1587dcc4bc3aa8745 100644
--- a/src/command/vis_tool.cpp
+++ b/src/command/vis_tool.cpp
@@ -19,8 +19,6 @@
 #include "../include/aegisub/context.h"
 #include "../libresrc/libresrc.h"
 #include "../project.h"
-#include "../video_box.h"
-#include "../video_controller.h"
 #include "../video_display.h"
 #include "../visual_tool_clip.h"
 #include "../visual_tool_cross.h"
diff --git a/src/dialog_automation.cpp b/src/dialog_automation.cpp
index 52a87795442cd9492208160170ff48c4577af254..69ef63033dd925184656cca813e251f4c0d3315d 100644
--- a/src/dialog_automation.cpp
+++ b/src/dialog_automation.cpp
@@ -36,12 +36,11 @@
 #include "libresrc/libresrc.h"
 #include "options.h"
 #include "main.h"
-#include "subtitle_format.h"
 
 #include <libaegisub/signal.h>
 
 #include <algorithm>
-#include <boost/range/algorithm.hpp>
+#include <boost/range/algorithm/transform.hpp>
 #include <vector>
 
 #include <wx/button.h>
diff --git a/src/dialog_autosave.cpp b/src/dialog_autosave.cpp
index 5c015aebb7c47bf1d9707b4c8533464260c8328e..00c7ada9cd1a63f6ca9ac7470069160d8ee1f137 100644
--- a/src/dialog_autosave.cpp
+++ b/src/dialog_autosave.cpp
@@ -20,7 +20,6 @@
 
 #include <libaegisub/path.h>
 
-#include <cstdint>
 #include <boost/range/adaptor/map.hpp>
 #include <map>
 #include <string>
@@ -31,7 +30,6 @@
 #include <wx/filename.h>
 #include <wx/listbox.h>
 #include <wx/sizer.h>
-#include <wx/statbox.h>
 #include <wx/string.h>
 
 namespace {
diff --git a/src/dialog_colorpicker.cpp b/src/dialog_colorpicker.cpp
index e5e7f23543e05e3b14365e859d0637cf88f40632..6e03df8edcf0f47fd816266f10493216b5cd4070 100644
--- a/src/dialog_colorpicker.cpp
+++ b/src/dialog_colorpicker.cpp
@@ -27,7 +27,6 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-#include "ass_style.h"
 #include "colorspace.h"
 #include "compat.h"
 #include "help_button.h"
@@ -50,7 +49,6 @@
 #include <wx/dcscreen.h>
 #include <wx/dialog.h>
 #include <wx/event.h>
-#include <wx/gbsizer.h>
 #include <wx/image.h>
 #include <wx/rawbmp.h>
 #include <wx/settings.h>
diff --git a/src/dialog_dummy_video.cpp b/src/dialog_dummy_video.cpp
index be56aad0de0cadc3f2d40d3f85f84e5c26061daa..85e5aed898b61de53a319130844fd5f0a1c111d3 100644
--- a/src/dialog_dummy_video.cpp
+++ b/src/dialog_dummy_video.cpp
@@ -34,7 +34,6 @@
 #include <wx/string.h>
 #include <wx/textctrl.h>
 #include <wx/valgen.h>
-#include <wx/valnum.h>
 
 namespace {
 struct DialogDummyVideo final : wxDialog {
diff --git a/src/dialog_export.cpp b/src/dialog_export.cpp
index 347ba863e239f3747c1fb74dea213be82c4cee0f..a6e5d455fed67c39539f67ab6a5948396b87cd5a 100644
--- a/src/dialog_export.cpp
+++ b/src/dialog_export.cpp
@@ -37,7 +37,6 @@
 #include "utils.h"
 
 #include <libaegisub/charset_conv.h>
-#include <libaegisub/make_unique.h>
 
 #include <algorithm>
 #include <boost/filesystem/path.hpp>
diff --git a/src/dialog_export_ebu3264.cpp b/src/dialog_export_ebu3264.cpp
index aa2d4716036ca19849e7a8f238bb6aee128c3335..f2eb54c784c5a0459c7c8ea9cbdbeb7671ef6719 100644
--- a/src/dialog_export_ebu3264.cpp
+++ b/src/dialog_export_ebu3264.cpp
@@ -23,7 +23,6 @@
 
 #include "compat.h"
 #include "options.h"
-#include "text_file_writer.h"
 
 #include <libaegisub/charset_conv.h>
 #include <libaegisub/make_unique.h>
diff --git a/src/dialog_fonts_collector.cpp b/src/dialog_fonts_collector.cpp
index 059046bbf5b2060952063a20d9b7ceeea319500c..c82e763e82d736a6d0c2023ce6be025c2cea50e1 100644
--- a/src/dialog_fonts_collector.cpp
+++ b/src/dialog_fonts_collector.cpp
@@ -17,7 +17,6 @@
 #include "font_file_lister.h"
 #include "font_file_lister_fontconfig.h"
 
-#include "ass_file.h"
 #include "compat.h"
 #include "dialog_manager.h"
 #include "help_button.h"
@@ -25,8 +24,6 @@
 #include "libresrc/libresrc.h"
 #include "options.h"
 #include "scintilla_text_ctrl.h"
-#include "selection_controller.h"
-#include "subs_controller.h"
 #include "utils.h"
 
 #include <libaegisub/dispatch.h>
diff --git a/src/dialog_jumpto.cpp b/src/dialog_jumpto.cpp
index 6356483f0001b0cf9ec10b54dd9fd2aea70af258..1c5fce2b8bab2e445eccfd30a2688518d5aed6ac 100644
--- a/src/dialog_jumpto.cpp
+++ b/src/dialog_jumpto.cpp
@@ -36,7 +36,6 @@
 #include "validators.h"
 #include "video_controller.h"
 
-#include <wx/button.h>
 #include <wx/dialog.h>
 #include <wx/sizer.h>
 #include <wx/stattext.h>
diff --git a/src/dialog_kara_timing_copy.cpp b/src/dialog_kara_timing_copy.cpp
index 0940e8a06206615751016ab94f2400cd738a3510..7b0db5184f70c6ed22368f550d7706f7c08e0ad8 100644
--- a/src/dialog_kara_timing_copy.cpp
+++ b/src/dialog_kara_timing_copy.cpp
@@ -36,17 +36,11 @@
 #include "include/aegisub/context.h"
 #include "libresrc/libresrc.h"
 #include "options.h"
-#include "selection_controller.h"
-#include "utils.h"
 
 #include <libaegisub/karaoke_matcher.h>
 
-#include <boost/algorithm/string/case_conv.hpp>
-#include <boost/algorithm/string/predicate.hpp>
 #include <boost/locale/boundary.hpp>
-#include <boost/range/algorithm_ext.hpp>
 #include <deque>
-#include <list>
 #include <vector>
 #include <wx/checkbox.h>
 #include <wx/combobox.h>
diff --git a/src/dialog_log.cpp b/src/dialog_log.cpp
index 02e3962ef0f3ead1106365fe99f7ac63a0d64ce9..b66e10569114e41ad52a67bb0e830eb27c09b454 100644
--- a/src/dialog_log.cpp
+++ b/src/dialog_log.cpp
@@ -34,10 +34,7 @@
 #include <libaegisub/dispatch.h>
 #include <libaegisub/log.h>
 
-#include <algorithm>
 #include <ctime>
-#include <functional>
-#include <string>
 #include <wx/button.h>
 #include <wx/dialog.h>
 #include <wx/sizer.h>
diff --git a/src/dialog_properties.cpp b/src/dialog_properties.cpp
index d209fb8dcaec739f919fdceb4b59e8af08206d80..eae2f49e8bdf0a1855487c1bce9ec50fb420762f 100644
--- a/src/dialog_properties.cpp
+++ b/src/dialog_properties.cpp
@@ -37,7 +37,6 @@
 #include "resolution_resampler.h"
 #include "validators.h"
 
-#include <algorithm>
 #include <boost/algorithm/string/predicate.hpp>
 #include <vector>
 #include <wx/button.h>
diff --git a/src/dialog_selection.cpp b/src/dialog_selection.cpp
index 0dd29518fcc49c000b9c34c614d2d86313e8b19b..260ddde842a8289854cd701e1c7321aef8d161e2 100644
--- a/src/dialog_selection.cpp
+++ b/src/dialog_selection.cpp
@@ -25,11 +25,8 @@
 #include "options.h"
 #include "search_replace_engine.h"
 #include "selection_controller.h"
-#include "utils.h"
 
-#include <boost/algorithm/string/find.hpp>
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/range/algorithm.hpp>
+#include <boost/range/algorithm/set_algorithm.hpp>
 
 #include <wx/checkbox.h>
 #include <wx/combobox.h>
@@ -255,4 +252,4 @@ void DialogSelection::OnDialogueCheckbox(wxCheckBox *chk) {
 
 void ShowSelectLinesDialog(agi::Context *c) {
 	c->dialog->Show<DialogSelection>(c);
-}
\ No newline at end of file
+}
diff --git a/src/dialog_shift_times.cpp b/src/dialog_shift_times.cpp
index a36b3e5b3bb01eef5b3539f9e33f475b8d97334c..656c1d61d61e3ee15209c99d069f95b2a4544962 100644
--- a/src/dialog_shift_times.cpp
+++ b/src/dialog_shift_times.cpp
@@ -39,9 +39,7 @@
 #include <libaegisub/cajun/reader.h>
 #include <libaegisub/cajun/writer.h>
 
-#include <algorithm>
 #include <boost/filesystem/path.hpp>
-#include <vector>
 #include <wx/dialog.h>
 #include <wx/listbox.h>
 #include <wx/radiobox.h>
diff --git a/src/dialog_spellchecker.cpp b/src/dialog_spellchecker.cpp
index 99314fbeafddd1a5ef914bd4d4aada2ee7647a38..88e0595e6e7606f538e21da671aeb1e22ce3afc2 100644
--- a/src/dialog_spellchecker.cpp
+++ b/src/dialog_spellchecker.cpp
@@ -25,8 +25,6 @@
 #include "options.h"
 #include "selection_controller.h"
 #include "text_selection_controller.h"
-#include "subs_edit_ctrl.h"
-#include "utils.h"
 
 #include <libaegisub/ass/dialogue_parser.h>
 #include <libaegisub/exception.h>
diff --git a/src/dialog_style_editor.cpp b/src/dialog_style_editor.cpp
index fc80ef6042eca6ac0e1a67a853371be48f6e756b..a1b947b1121bfdb3550f2ad0eddee4b8b42255fa 100644
--- a/src/dialog_style_editor.cpp
+++ b/src/dialog_style_editor.cpp
@@ -55,8 +55,10 @@
 #include <algorithm>
 
 #include <wx/bmpbuttn.h>
+#include <wx/checkbox.h>
 #include <wx/msgdlg.h>
 #include <wx/sizer.h>
+#include <wx/spinctrl.h>
 #include <wx/stattext.h>
 
 /// Style rename helper that walks a file searching for a style and optionally
diff --git a/src/dialog_style_editor.h b/src/dialog_style_editor.h
index 6fa0033fdbb3bce72d948f9c056bb2ff440405f3..f505daa67fc7154435c84a2e01f8e249dbf76f8f 100644
--- a/src/dialog_style_editor.h
+++ b/src/dialog_style_editor.h
@@ -27,25 +27,25 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file dialog_style_editor.h
-/// @see dialog_style_editor.cpp
-/// @ingroup style_editor
-///
-
 #include <memory>
-
-#include <wx/checkbox.h>
-#include <wx/combobox.h>
+#include <string>
 #include <wx/dialog.h>
-#include <wx/radiobox.h>
-#include <wx/spinctrl.h>
-#include <wx/textctrl.h>
 
-namespace agi { struct Context; }
 class AssStyle;
 class AssStyleStorage;
 class PersistLocation;
 class SubtitlesPreview;
+class wxArrayString;
+class wxCheckBox;
+class wxChildFocusEvent;
+class wxComboBox;
+class wxCommandEvent;
+class wxRadioBox;
+class wxSpinCtrl;
+class wxTextCtrl;
+class wxThreadEvent;
+class wxWindow;
+namespace agi { struct Context; }
 
 class DialogStyleEditor final : public wxDialog {
 	agi::Context *c;
diff --git a/src/dialog_style_manager.cpp b/src/dialog_style_manager.cpp
index 4fceb00e78ac5ae5c8b84cec03be4fcb1087300e..eeaa728051b73a592a8f159f730ec23f8621eec6 100644
--- a/src/dialog_style_manager.cpp
+++ b/src/dialog_style_manager.cpp
@@ -42,9 +42,7 @@
 #include "options.h"
 #include "persist_location.h"
 #include "selection_controller.h"
-#include "subs_controller.h"
 #include "subtitle_format.h"
-#include "utils.h"
 
 #include <libaegisub/fs.h>
 #include <libaegisub/path.h>
@@ -60,14 +58,18 @@
 #include <vector>
 #include <wx/bmpbuttn.h>
 #include <wx/button.h>
+#include <wx/checkbox.h>
+#include <wx/combobox.h>
 #include <wx/combobox.h>
-#include <wx/dialog.h>
 #include <wx/filename.h>
 #include <wx/fontenum.h>
 #include <wx/intl.h>
 #include <wx/listbox.h>
 #include <wx/msgdlg.h>
+#include <wx/radiobox.h>
 #include <wx/sizer.h>
+#include <wx/spinctrl.h>
+#include <wx/textctrl.h>
 #include <wx/textdlg.h>
 #include <wx/choicdlg.h> // Keep this last so wxUSE_CHOICEDLG is set.
 
@@ -334,43 +336,43 @@ DialogStyleManager::DialogStyleManager(agi::Context *context)
 	StorageList->Bind(wxEVT_KEY_DOWN, &DialogStyleManager::OnKeyDown, this);
 	CurrentList->Bind(wxEVT_KEY_DOWN, &DialogStyleManager::OnKeyDown, this);
 
-	StorageMoveUp->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::MoveStyles, this, true, 0));
-	StorageMoveTop->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::MoveStyles, this, true, 1));
-	StorageMoveDown->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::MoveStyles, this, true, 2));
-	StorageMoveBottom->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::MoveStyles, this, true, 3));
-	StorageSort->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::MoveStyles, this, true, 4));
+	StorageMoveUp->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { MoveStyles(true, 0); });
+	StorageMoveTop->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { MoveStyles(true, 1); });
+	StorageMoveDown->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { MoveStyles(true, 2); });
+	StorageMoveBottom->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { MoveStyles(true, 3); });
+	StorageSort->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { MoveStyles(true, 4); });
 
-	CurrentMoveUp->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::MoveStyles, this, false, 0));
-	CurrentMoveTop->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::MoveStyles, this, false, 1));
-	CurrentMoveDown->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::MoveStyles, this, false, 2));
-	CurrentMoveBottom->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::MoveStyles, this, false, 3));
-	CurrentSort->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::MoveStyles, this, false, 4));
+	CurrentMoveUp->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { MoveStyles(false, 0); });
+	CurrentMoveTop->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { MoveStyles(false, 1); });
+	CurrentMoveDown->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { MoveStyles(false, 2); });
+	CurrentMoveBottom->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { MoveStyles(false, 3); });
+	CurrentSort->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { MoveStyles(false, 4); });
 
-	CatalogNew->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::OnCatalogNew, this));
-	CatalogDelete->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::OnCatalogDelete, this));
+	CatalogNew->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { OnCatalogNew(); });
+	CatalogDelete->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { OnCatalogDelete(); });
 
-	StorageNew->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::OnStorageNew, this));
-	StorageEdit->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::OnStorageEdit, this));
-	StorageCopy->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::OnStorageCopy, this));
-	StorageDelete->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::OnStorageDelete, this));
+	StorageNew->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { OnStorageNew(); });
+	StorageEdit->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { OnStorageEdit(); });
+	StorageCopy->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { OnStorageCopy(); });
+	StorageDelete->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { OnStorageDelete(); });
 
-	CurrentNew->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::OnCurrentNew, this));
-	CurrentEdit->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::OnCurrentEdit, this));
-	CurrentCopy->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::OnCurrentCopy, this));
-	CurrentDelete->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::OnCurrentDelete, this));
+	CurrentNew->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { OnCurrentNew(); });
+	CurrentEdit->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { OnCurrentEdit(); });
+	CurrentCopy->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { OnCurrentCopy(); });
+	CurrentDelete->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { OnCurrentDelete(); });
 
-	CurrentImport->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::OnCurrentImport, this));
+	CurrentImport->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { OnCurrentImport(); });
 
-	MoveToLocal->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::OnCopyToCurrent, this));
-	MoveToStorage->Bind(wxEVT_BUTTON, bind(&DialogStyleManager::OnCopyToStorage, this));
+	MoveToLocal->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { OnCopyToCurrent(); });
+	MoveToStorage->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { OnCopyToStorage(); });
 
-	CatalogList->Bind(wxEVT_COMBOBOX, bind(&DialogStyleManager::OnChangeCatalog, this));
+	CatalogList->Bind(wxEVT_COMBOBOX, [=](wxCommandEvent&) { OnChangeCatalog(); });
 
-	StorageList->Bind(wxEVT_LISTBOX, bind(&DialogStyleManager::UpdateButtons, this));
-	StorageList->Bind(wxEVT_LISTBOX_DCLICK, bind(&DialogStyleManager::OnStorageEdit, this));
+	StorageList->Bind(wxEVT_LISTBOX, [=](wxCommandEvent&) { UpdateButtons(); });
+	StorageList->Bind(wxEVT_LISTBOX_DCLICK, [=](wxCommandEvent&) { OnStorageEdit(); });
 
-	CurrentList->Bind(wxEVT_LISTBOX, bind(&DialogStyleManager::UpdateButtons, this));
-	CurrentList->Bind(wxEVT_LISTBOX_DCLICK, bind(&DialogStyleManager::OnCurrentEdit, this));
+	CurrentList->Bind(wxEVT_LISTBOX, [=](wxCommandEvent&) { UpdateButtons(); });
+	CurrentList->Bind(wxEVT_LISTBOX_DCLICK, [=](wxCommandEvent&) { OnCurrentEdit(); });
 }
 
 void DialogStyleManager::LoadCurrentStyles(int commit_type) {
diff --git a/src/dialog_styling_assistant.cpp b/src/dialog_styling_assistant.cpp
index d8e7c8b2a458d7ce138e4fce6ca5aec665e0036a..77688cad98cb3ed19aeb11208d46377d43fcc458 100644
--- a/src/dialog_styling_assistant.cpp
+++ b/src/dialog_styling_assistant.cpp
@@ -26,8 +26,6 @@
 
 #include "ass_dialogue.h"
 #include "ass_file.h"
-#include "ass_style.h"
-#include "audio_controller.h"
 #include "command/command.h"
 #include "compat.h"
 #include "help_button.h"
@@ -41,6 +39,7 @@
 
 #include <wx/checkbox.h>
 #include <wx/colour.h>
+#include <wx/event.h>
 #include <wx/listbox.h>
 #include <wx/settings.h>
 #include <wx/sizer.h>
diff --git a/src/dialog_styling_assistant.h b/src/dialog_styling_assistant.h
index 33c09229bdaa2e1da682129c6ed9152579707edd..1658bcf773f69a85347e6289d62c7f95836bda76 100644
--- a/src/dialog_styling_assistant.h
+++ b/src/dialog_styling_assistant.h
@@ -18,15 +18,17 @@
 
 #include <memory>
 #include <wx/dialog.h>
-#include <wx/event.h>
 
-namespace agi { struct Context; }
 class AssDialogue;
 class PersistLocation;
+class wxActivateEvent;
 class wxButton;
 class wxCheckBox;
+class wxCommandEvent;
+class wxKeyEvent;
 class wxListBox;
 class wxTextCtrl;
+namespace agi { struct Context; }
 
 class DialogStyling final : public wxDialog {
 	agi::Context *c;
diff --git a/src/dialog_timing_processor.cpp b/src/dialog_timing_processor.cpp
index af4cb8d9dacd04e69d2bb1c41ddd1f868e1d4f23..39860d5c0c738ab6906dfc03d104ed7ea7536eeb 100644
--- a/src/dialog_timing_processor.cpp
+++ b/src/dialog_timing_processor.cpp
@@ -45,7 +45,7 @@
 #include <algorithm>
 #include <boost/range/adaptor/filtered.hpp>
 #include <boost/range/algorithm.hpp>
-#include <boost/range/algorithm_ext.hpp>
+#include <boost/range/algorithm_ext/push_back.hpp>
 #include <functional>
 #include <vector>
 #include <wx/button.h>
@@ -447,4 +447,4 @@ void DialogTimingProcessor::Process() {
 
 void ShowTimingProcessorDialog(agi::Context *c) {
 	DialogTimingProcessor(c).ShowModal();
-}
\ No newline at end of file
+}
diff --git a/src/dialog_translation.cpp b/src/dialog_translation.cpp
index 755d4436ae2275829b7da22516c614fbb63c8286..a78a6ebc40e87366ece3e91c63d8f3b422c1d57a 100644
--- a/src/dialog_translation.cpp
+++ b/src/dialog_translation.cpp
@@ -26,7 +26,6 @@
 
 #include "ass_dialogue.h"
 #include "ass_file.h"
-#include "audio_controller.h"
 #include "command/command.h"
 #include "compat.h"
 #include "help_button.h"
@@ -35,7 +34,6 @@
 #include "project.h"
 #include "subs_edit_ctrl.h"
 #include "selection_controller.h"
-#include "utils.h"
 #include "video_controller.h"
 
 #include <libaegisub/make_unique.h>
diff --git a/src/dialog_version_check.cpp b/src/dialog_version_check.cpp
index 6c48f1cc3edc4640a811dbf79f2ccbec7dcb1b72..3339d4d37e375194dbf4d84bf931ee52ee71b8a4 100644
--- a/src/dialog_version_check.cpp
+++ b/src/dialog_version_check.cpp
@@ -43,16 +43,13 @@
 #include <libaegisub/line_iterator.h>
 #include <libaegisub/scoped_ptr.h>
 
-#include <algorithm>
 #include <ctime>
 #include <boost/algorithm/string/classification.hpp>
 #include <boost/algorithm/string/split.hpp>
 #include <boost/asio/ip/tcp.hpp>
 #include <boost/format.hpp>
 #include <functional>
-#include <memory>
 #include <mutex>
-#include <set>
 #include <vector>
 #include <wx/button.h>
 #include <wx/checkbox.h>
diff --git a/src/export_framerate.cpp b/src/export_framerate.cpp
index fc9c8c48412606ea4ba58bc9b395641249b28893..d27b9e4e79c64e533195091f89868ff5f5ac657e 100644
--- a/src/export_framerate.cpp
+++ b/src/export_framerate.cpp
@@ -35,7 +35,6 @@
 #include "compat.h"
 #include "include/aegisub/context.h"
 #include "project.h"
-#include "utils.h"
 
 #include <libaegisub/of_type_adaptor.h>
 
diff --git a/src/ffmpegsource_common.cpp b/src/ffmpegsource_common.cpp
index 05e0b78e215d6b8fa466da6cf191f43acba2b381..9c806dd94a24629dd1f69304bcb2472412ab23f5 100644
--- a/src/ffmpegsource_common.cpp
+++ b/src/ffmpegsource_common.cpp
@@ -36,21 +36,18 @@
 #include "ffmpegsource_common.h"
 
 #include "compat.h"
-#include "frame_main.h"
 #include "options.h"
 #include "utils.h"
 
 #include <libaegisub/background_runner.h>
 #include <libaegisub/fs.h>
 #include <libaegisub/path.h>
-#include <libaegisub/log.h>
 
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/crc.hpp>
-#include <boost/filesystem.hpp>
-#include <inttypes.h>
-
-#include <wx/choicdlg.h> // Keep this last so wxUSE_CHOICEDLG is set.
+#include <boost/filesystem/path.hpp>
+#include <wx/intl.h>
+#include <wx/choicdlg.h>
 
 #ifdef _WIN32
 #include <objbase.h>
diff --git a/src/font_file_lister.cpp b/src/font_file_lister.cpp
index a049d5c9cf90d6a4a2568c92829317ca53a0af35..0a40a68d01c66046546070e04c273caa6a8eecdc 100644
--- a/src/font_file_lister.cpp
+++ b/src/font_file_lister.cpp
@@ -25,7 +25,6 @@
 #include "ass_file.h"
 #include "ass_style.h"
 #include "compat.h"
-#include "utils.h"
 
 #include <algorithm>
 #include <tuple>
diff --git a/src/font_file_lister_fontconfig.cpp b/src/font_file_lister_fontconfig.cpp
index bc9d29804bf34008f777f3792a4076a24bbb63bd..94924ad1bc72873740ca32d9e80baf86cd1d1b51 100644
--- a/src/font_file_lister_fontconfig.cpp
+++ b/src/font_file_lister_fontconfig.cpp
@@ -22,7 +22,6 @@
 #include "font_file_lister_fontconfig.h"
 
 #include <libaegisub/log.h>
-#include <libaegisub/make_unique.h>
 
 #ifdef __APPLE__
 #include <libaegisub/util_osx.h>
diff --git a/src/frame_main.cpp b/src/frame_main.cpp
index 24b55aa37a14179799b1d8d27bea1135a9842ebb..466f956514c3508539f8dabe9cbb0bb5b634e438 100644
--- a/src/frame_main.cpp
+++ b/src/frame_main.cpp
@@ -47,33 +47,24 @@
 #include "command/command.h"
 #include "dialog_detached_video.h"
 #include "dialog_manager.h"
-#include "help_button.h"
 #include "libresrc/libresrc.h"
 #include "main.h"
 #include "options.h"
 #include "project.h"
 #include "subs_controller.h"
 #include "subs_edit_box.h"
-#include "subs_edit_ctrl.h"
 #include "utils.h"
 #include "version.h"
 #include "video_box.h"
 #include "video_controller.h"
 #include "video_display.h"
-#include "video_slider.h"
 
-#include <libaegisub/fs.h>
 #include <libaegisub/log.h>
 #include <libaegisub/make_unique.h>
-#include <libaegisub/path.h>
-#include <libaegisub/util.h>
-
-#include <boost/algorithm/string/predicate.hpp>
 
 #include <wx/dnd.h>
-#include <wx/filename.h>
-#include <wx/image.h>
 #include <wx/msgdlg.h>
+#include <wx/sizer.h>
 #include <wx/statline.h>
 #include <wx/sysopt.h>
 
diff --git a/src/frame_main.h b/src/frame_main.h
index 985b131ce7b0576dfd448d4dc96b05280941adff..b91d3b2a6b8dcdb74e5e6b4d28afe5de1a96f598 100644
--- a/src/frame_main.h
+++ b/src/frame_main.h
@@ -27,12 +27,8 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-#include <libaegisub/fs_fwd.h>
-
 #include <memory>
-#include <vector>
 #include <wx/frame.h>
-#include <wx/sizer.h>
 #include <wx/timer.h>
 
 class AegisubApp;
@@ -77,9 +73,9 @@ class FrameMain : public wxFrame {
 	AudioBox *audioBox;      ///< The audio area
 	VideoBox *videoBox;      ///< The video area
 
-	wxBoxSizer *MainSizer;  ///< Arranges things from top to bottom in the window
-	wxBoxSizer *TopSizer;   ///< Arranges video box and tool box from left to right
-	wxBoxSizer *ToolsSizer; ///< Arranges audio and editing areas top to bottom
+	wxSizer *MainSizer;  ///< Arranges things from top to bottom in the window
+	wxSizer *TopSizer;   ///< Arranges video box and tool box from left to right
+	wxSizer *ToolsSizer; ///< Arranges audio and editing areas top to bottom
 
 public:
 	FrameMain();
diff --git a/src/gl_text.h b/src/gl_text.h
index aeb888bef93614d8a3909a7a311d1932952d4e16..e25045f12440c03f056e9c7c91dc8094dfb6951f 100644
--- a/src/gl_text.h
+++ b/src/gl_text.h
@@ -27,14 +27,8 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file gl_text.h
-/// @see gl_text.cpp
-/// @ingroup video_output
-///
-
 #include <boost/container/map.hpp>
 
-#include <memory>
 #include <string>
 #include <vector>
 
diff --git a/src/help_button.cpp b/src/help_button.cpp
index 043f4c7fa45ad8353257fb909b1e10c6000e37e1..5a3c006584e3b4cc548cf3fab61da9126d0d8ea9 100644
--- a/src/help_button.cpp
+++ b/src/help_button.cpp
@@ -27,23 +27,11 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file help_button.cpp
-/// @brief Push-button opening the help file at a specified section
-/// @ingroup custom_control
-///
-
 #include "help_button.h"
 
-#include "options.h"
-
 #include <libaegisub/exception.h>
-#include <libaegisub/path.h>
 
 #include <boost/container/flat_map.hpp>
-#include <boost/filesystem/path.hpp>
-#include <functional>
-
-#include <wx/filename.h>
 
 namespace {
 static boost::container::flat_map<wxString, wxString> pages;
@@ -78,7 +66,7 @@ void init_static() {
 HelpButton::HelpButton(wxWindow *parent, wxString const& page, wxPoint position, wxSize size)
 : wxButton(parent, wxID_HELP, "", position, size)
 {
-	Bind(wxEVT_BUTTON, std::bind(&HelpButton::OpenPage, page));
+	Bind(wxEVT_BUTTON, [=](wxCommandEvent&) { OpenPage(page); });
 	init_static();
 	if (pages.find(page) == pages.end())
 		throw agi::InternalError("Invalid help page", nullptr);
diff --git a/src/help_button.h b/src/help_button.h
index 143e45c3bec479fa0f39b73be6570bb50f4a941f..885f810992bfd62440b41bb5e2aa148bf50115aa 100644
--- a/src/help_button.h
+++ b/src/help_button.h
@@ -27,11 +27,6 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file help_button.h
-/// @see help_button.cpp
-/// @ingroup custom_control
-///
-
 #include <wx/button.h>
 
 class HelpButton final : public wxButton {
diff --git a/src/include/aegisub/audio_provider.h b/src/include/aegisub/audio_provider.h
index 6a35976de8b9b39684fa14d170fd6addbbaf9bb1..f16c5cf54cb8bbf0f89cb37db32cce08c540f586 100644
--- a/src/include/aegisub/audio_provider.h
+++ b/src/include/aegisub/audio_provider.h
@@ -27,18 +27,13 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file audio_provider.h
-/// @brief Declaration of base-class for audio providers
-/// @ingroup main_headers audio_input
-///
-
 #pragma once
 
 #include <libaegisub/exception.h>
 #include <libaegisub/fs_fwd.h>
 
 #include <atomic>
-#include <boost/filesystem/path.hpp>
+#include <vector>
 
 class AudioProvider {
 protected:
diff --git a/src/main.cpp b/src/main.cpp
index b3395e1b033679b4ab57c1fe2beb9731e5e3bf94..4ee7b3ededeba2e745bed5747a3a99bcee911784 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -37,7 +37,6 @@
 #include "command/command.h"
 #include "include/aegisub/hotkey.h"
 
-#include "ass_file.h"
 #include "auto4_base.h"
 #include "auto4_lua_factory.h"
 #include "compat.h"
@@ -51,14 +50,12 @@
 #include "options.h"
 #include "project.h"
 #include "subs_controller.h"
-#include "subtitle_format.h"
 #include "subtitles_provider_libass.h"
 #include "utils.h"
 #include "version.h"
 
 #include <libaegisub/dispatch.h>
 #include <libaegisub/fs.h>
-#include <libaegisub/hotkey.h>
 #include <libaegisub/io.h>
 #include <libaegisub/log.h>
 #include <libaegisub/make_unique.h>
diff --git a/src/menu.cpp b/src/menu.cpp
index c7f938aeae1027e580d46b8cc22ddd2bf8193092..133c48b89f3f9d81bc8084885e2e3718accf92c9 100644
--- a/src/menu.cpp
+++ b/src/menu.cpp
@@ -28,6 +28,7 @@
 #include "main.h"
 #include "options.h"
 
+#include <libaegisub/cajun/reader.h>
 #include <libaegisub/hotkey.h>
 #include <libaegisub/json.h>
 #include <libaegisub/log.h>
diff --git a/src/mkv_wrap.cpp b/src/mkv_wrap.cpp
index 4bab6d9b1b647f3268f388adeae9862bdd125340..1fa1cfab7a72fbdd6b9811385e40a6e74aa8a5dd 100644
--- a/src/mkv_wrap.cpp
+++ b/src/mkv_wrap.cpp
@@ -42,11 +42,9 @@
 #include "MatroskaParser.h"
 
 #include <libaegisub/file_mapping.h>
-#include <libaegisub/fs.h>
 #include <libaegisub/scoped_ptr.h>
 
 #include <algorithm>
-#include <boost/algorithm/string/classification.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/format.hpp>
 #include <boost/lexical_cast.hpp>
diff --git a/src/preferences.cpp b/src/preferences.cpp
index 0f2fab6cba01582de4df832fe54e517950e0f166..ac38084512046d42a8f3833f1342ed589826aaf7 100644
--- a/src/preferences.cpp
+++ b/src/preferences.cpp
@@ -20,7 +20,6 @@
 
 #include "ass_style_storage.h"
 #include "audio_renderer_waveform.h"
-#include "colour_button.h"
 #include "command/command.h"
 #include "compat.h"
 #include "help_button.h"
@@ -42,18 +41,13 @@
 #include <ffms.h>
 #endif
 
-#include <libaegisub/exception.h>
-#include <libaegisub/fs.h>
 #include <libaegisub/hotkey.h>
-#include <libaegisub/path.h>
 
-#include <iterator>
 #include <unordered_set>
 
 #include <wx/checkbox.h>
 #include <wx/combobox.h>
 #include <wx/event.h>
-#include <wx/filefn.h>
 #include <wx/listctrl.h>
 #include <wx/msgdlg.h>
 #include <wx/srchctrl.h>
@@ -62,9 +56,8 @@
 #include <wx/stattext.h>
 #include <wx/treebook.h>
 
-#define CLASS_PAGE(name)                             \
-class name: public OptionPage {                  \
-public:                                          \
+#define CLASS_PAGE(name)                         \
+struct name : OptionPage {                       \
 	name(wxTreebook *book, Preferences *parent); \
 };
 
diff --git a/src/preferences_base.cpp b/src/preferences_base.cpp
index 1e6051e985483a57eda5470892d298a77953ccc0..25e66fab475032db505d0d4033e9cc95dc9aafe9 100644
--- a/src/preferences_base.cpp
+++ b/src/preferences_base.cpp
@@ -20,12 +20,8 @@
 
 #include "colour_button.h"
 #include "compat.h"
-#include "include/aegisub/audio_player.h"
-#include "include/aegisub/audio_provider.h"
-#include "libresrc/libresrc.h"
 #include "options.h"
 #include "preferences.h"
-#include "video_provider_manager.h"
 
 #include <libaegisub/path.h>
 #include <libaegisub/make_unique.h>
@@ -34,7 +30,6 @@
 #include <wx/combobox.h>
 #include <wx/dirdlg.h>
 #include <wx/event.h>
-#include <wx/filefn.h>
 #include <wx/fontdlg.h>
 #include <wx/listctrl.h>
 #include <wx/sizer.h>
@@ -52,7 +47,7 @@
 		type(std::string const& n, Preferences *p) : name(n), parent(p) { } \
 		void operator()(evttype& evt) {                                     \
 			evt.Skip();                                                     \
-			parent->SetOption(agi::make_unique<agi::opt>(name, body));\
+			parent->SetOption(agi::make_unique<agi::opt>(name, body));      \
 		}                                                                   \
 	}
 
diff --git a/src/project.cpp b/src/project.cpp
index 82366b2b8e6216a4082b03dc8e47e0ef500a5958..9cd1e3786cf5c567b54b075b502c756b8da6468b 100644
--- a/src/project.cpp
+++ b/src/project.cpp
@@ -37,10 +37,8 @@
 #include <libaegisub/log.h>
 #include <libaegisub/make_unique.h>
 #include <libaegisub/path.h>
-#include <libaegisub/util.h>
 
 #include <boost/algorithm/string/case_conv.hpp>
-#include <boost/algorithm/string/predicate.hpp>
 #include <boost/filesystem/operations.hpp>
 #include <wx/msgdlg.h>
 
diff --git a/src/resolution_resampler.cpp b/src/resolution_resampler.cpp
index e6a71ed847e51742615105cc30b87955890a9bf6..3f116f7480d1a33c39931bf480b0710c2aa9b8b1 100644
--- a/src/resolution_resampler.cpp
+++ b/src/resolution_resampler.cpp
@@ -28,9 +28,8 @@
 
 #include <algorithm>
 #include <boost/algorithm/string/predicate.hpp>
-#include <boost/lexical_cast.hpp>
 #include <cmath>
-#include <functional>
+#include <wx/intl.h>
 
 enum {
 	LEFT = 0,
diff --git a/src/scintilla_text_ctrl.h b/src/scintilla_text_ctrl.h
index 220b1496bcce587808d0af09c0bf91876fc8672b..e8ed68f295f7ae6fd78bfb4eed00983fb781c83c 100644
--- a/src/scintilla_text_ctrl.h
+++ b/src/scintilla_text_ctrl.h
@@ -27,15 +27,8 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file scintilla_text_ctrl.h
-/// @see scintilla_text_ctrl.cpp
-/// @ingroup custom_control
-///
-
 #include <wx/stc/stc.h>
 
-#include <string>
-
 class ScintillaTextCtrl : public wxStyledTextCtrl {
 	wxString text;
 
diff --git a/src/search_replace_engine.cpp b/src/search_replace_engine.cpp
index 7e3e4bbdff676e1aa25e7d65420e9c0f37c0fa1f..92595a5510a8b3cefc7ab1fcad8b0b3a9e71b0f7 100644
--- a/src/search_replace_engine.cpp
+++ b/src/search_replace_engine.cpp
@@ -24,7 +24,7 @@
 
 #include <libaegisub/util.h>
 
-#include <boost/locale.hpp>
+#include <boost/locale/conversion.hpp>
 
 #include <wx/msgdlg.h>
 
diff --git a/src/spline.cpp b/src/spline.cpp
index 851eaa03da881e947dd70613ab3ec4601a493d22..1853b1936cd481c1d78bbe6ee3bdfe32442217ac 100644
--- a/src/spline.cpp
+++ b/src/spline.cpp
@@ -34,7 +34,6 @@
 
 #include "spline.h"
 
-#include "utils.h"
 #include "visual_tool.h"
 
 #include <libaegisub/util.h>
diff --git a/src/spline_curve.cpp b/src/spline_curve.cpp
index 1cc546af50686cc878e3daf40a6b952eed8cee4e..3de65859b8b075bfb118aaaf3efd7c38628f5f7e 100644
--- a/src/spline_curve.cpp
+++ b/src/spline_curve.cpp
@@ -36,7 +36,6 @@
 #include "utils.h"
 
 #include <limits>
-#include <numeric>
 
 SplineCurve::SplineCurve(Vector2D p1) : p1(std::move(p1)), type(POINT) { }
 SplineCurve::SplineCurve(Vector2D p1, Vector2D p2) : p1(std::move(p1)), p2(std::move(p2)), type(LINE) { }
diff --git a/src/subs_controller.cpp b/src/subs_controller.cpp
index cf446fe0eb61669adff25835159575d0ceec8a3a..1491bde06bcd25e044e2e46f65e74f59bb03ed5d 100644
--- a/src/subs_controller.cpp
+++ b/src/subs_controller.cpp
@@ -21,7 +21,6 @@
 #include "ass_file.h"
 #include "ass_info.h"
 #include "ass_style.h"
-#include "ass_style_storage.h"
 #include "compat.h"
 #include "command/command.h"
 #include "frame_main.h"
@@ -31,13 +30,11 @@
 #include "selection_controller.h"
 #include "subtitle_format.h"
 #include "text_selection_controller.h"
-#include "utils.h"
 
 #include <libaegisub/fs.h>
 #include <libaegisub/path.h>
 #include <libaegisub/util.h>
 
-#include <boost/algorithm/string/predicate.hpp>
 #include <boost/format.hpp>
 #include <wx/msgdlg.h>
 
diff --git a/src/subs_controller.h b/src/subs_controller.h
index 5425e08718162c767fee1ca4121e2c4d61002cca..f75af0b9399a41107cd5cd563fd63739260c1966 100644
--- a/src/subs_controller.h
+++ b/src/subs_controller.h
@@ -19,11 +19,8 @@
 
 #include <boost/container/list.hpp>
 #include <boost/filesystem/path.hpp>
-#include <set>
 #include <wx/timer.h>
 
-class AssDialogue;
-class AssFile;
 struct AssFileCommit;
 class SelectionController;
 
diff --git a/src/subs_edit_box.cpp b/src/subs_edit_box.cpp
index ff4ab978921485636c8aa526aef11f91977588d2..ae34b93e7079fe7e7d283ed2cee9432327cacbcb 100644
--- a/src/subs_edit_box.cpp
+++ b/src/subs_edit_box.cpp
@@ -43,7 +43,6 @@
 #include "include/aegisub/context.h"
 #include "include/aegisub/hotkey.h"
 #include "initial_line_state.h"
-#include "libresrc/libresrc.h"
 #include "options.h"
 #include "project.h"
 #include "placeholder_ctrl.h"
diff --git a/src/subs_edit_box.h b/src/subs_edit_box.h
index e8638f524c6eca0d195a6712c1b20d3360874a78..71e92cdd4fbb5a4a056406dd8fba2f6f49f3a54d 100644
--- a/src/subs_edit_box.h
+++ b/src/subs_edit_box.h
@@ -27,15 +27,9 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file subs_edit_box.h
-/// @see subs_edit_box.cpp
-/// @ingroup main_ui
-///
-
 #include <array>
 #include <boost/container/map.hpp>
 #include <boost/flyweight/flyweight_fwd.hpp>
-#include <memory>
 #include <vector>
 
 #include <wx/combobox.h>
diff --git a/src/subs_edit_ctrl.cpp b/src/subs_edit_ctrl.cpp
index 1d1944fd8beac057adb6ffc90a0a796944c3e030..13b5212a1507107e64038253e9680719386a8bbe 100644
--- a/src/subs_edit_ctrl.cpp
+++ b/src/subs_edit_ctrl.cpp
@@ -35,7 +35,6 @@
 #include "subs_edit_ctrl.h"
 
 #include "ass_dialogue.h"
-#include "ass_file.h"
 #include "command/command.h"
 #include "compat.h"
 #include "options.h"
diff --git a/src/subs_edit_ctrl.h b/src/subs_edit_ctrl.h
index d708f8bb9e0aba4eb88ca34e0aacbfa69df1f292..6574501c6963603e484ba8642bc1d6797928684f 100644
--- a/src/subs_edit_ctrl.h
+++ b/src/subs_edit_ctrl.h
@@ -27,18 +27,12 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file subs_edit_ctrl.h
-/// @see subs_edit_ctrl.cpp
-/// @ingroup main_ui
-///
+#include "scintilla_text_ctrl.h"
 
 #include <memory>
 #include <string>
 #include <vector>
 
-#include "scintilla_text_ctrl.h"
-
-class SubsEditBox;
 class Thesaurus;
 namespace agi {
 	class CalltipProvider;
diff --git a/src/subtitle_format.cpp b/src/subtitle_format.cpp
index 150d2ce2ac8119bec9d3ae0f3cddf4d8f755d846..2b5741a7667a12f94c26be3c98b9982deb6f9a05 100644
--- a/src/subtitle_format.cpp
+++ b/src/subtitle_format.cpp
@@ -37,10 +37,8 @@
 #include <wx/intl.h>
 #include <wx/choicdlg.h> // Keep this last so wxUSE_CHOICEDLG is set.
 
-#include "ass_attachment.h"
 #include "ass_dialogue.h"
 #include "ass_file.h"
-#include "ass_style.h"
 #include "compat.h"
 #include "subtitle_format_ass.h"
 #include "subtitle_format_ebu3264.h"
@@ -51,14 +49,12 @@
 #include "subtitle_format_transtation.h"
 #include "subtitle_format_ttxt.h"
 #include "subtitle_format_txt.h"
-#include "video_controller.h"
 
 #include <libaegisub/fs.h>
 #include <libaegisub/make_unique.h>
 
 #include <algorithm>
 #include <boost/algorithm/string/join.hpp>
-#include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 
 namespace {
diff --git a/src/subtitle_format_encore.cpp b/src/subtitle_format_encore.cpp
index 040d5d2a79ede3499dbf0c43048cd257a43ac099..59d23be271796df0de91527c62b3581efa61b4b6 100644
--- a/src/subtitle_format_encore.cpp
+++ b/src/subtitle_format_encore.cpp
@@ -38,8 +38,6 @@
 #include "ass_file.h"
 #include "text_file_writer.h"
 
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/filesystem/path.hpp>
 #include <boost/format.hpp>
 
 EncoreSubtitleFormat::EncoreSubtitleFormat()
@@ -48,9 +46,7 @@ EncoreSubtitleFormat::EncoreSubtitleFormat()
 }
 
 std::vector<std::string> EncoreSubtitleFormat::GetWriteWildcards() const {
-	std::vector<std::string> formats;
-	formats.push_back("encore.txt");
-	return formats;
+	return {"encore.txt"};
 }
 
 void EncoreSubtitleFormat::WriteFile(const AssFile *src, agi::fs::path const& filename, agi::vfr::Framerate const& video_fps, std::string const&) const {
diff --git a/src/subtitle_format_microdvd.cpp b/src/subtitle_format_microdvd.cpp
index bb60e1b9b975314416c1dc87291c7520c5bbc6f1..af8f4bcf60fc47b7da1276e26765ea224378a1a1 100644
--- a/src/subtitle_format_microdvd.cpp
+++ b/src/subtitle_format_microdvd.cpp
@@ -40,7 +40,6 @@
 #include "options.h"
 #include "text_file_reader.h"
 #include "text_file_writer.h"
-#include "video_controller.h"
 
 #include <libaegisub/fs.h>
 #include <libaegisub/util.h>
@@ -56,9 +55,7 @@ MicroDVDSubtitleFormat::MicroDVDSubtitleFormat()
 }
 
 std::vector<std::string> MicroDVDSubtitleFormat::GetReadWildcards() const {
-	std::vector<std::string> formats;
-	formats.push_back("sub");
-	return formats;
+	return {"sub"};
 }
 
 std::vector<std::string> MicroDVDSubtitleFormat::GetWriteWildcards() const {
diff --git a/src/subtitle_format_srt.cpp b/src/subtitle_format_srt.cpp
index f08c397cad2e215d76e223d1e93d4a3eadbb3658..ac89d074475598c9acfad7475e974ba5e0f3a848 100644
--- a/src/subtitle_format_srt.cpp
+++ b/src/subtitle_format_srt.cpp
@@ -37,14 +37,11 @@
 #include "ass_attachment.h"
 #include "ass_dialogue.h"
 #include "ass_file.h"
-#include "ass_style.h"
 #include "options.h"
-#include "utils.h"
 #include "text_file_reader.h"
 #include "text_file_writer.h"
 
 #include <libaegisub/of_type_adaptor.h>
-#include <libaegisub/path.h>
 
 #include <boost/algorithm/string/case_conv.hpp>
 #include <boost/algorithm/string/predicate.hpp>
diff --git a/src/subtitle_format_ssa.cpp b/src/subtitle_format_ssa.cpp
index 1cd790377a02dae37bfe01734e49b53dc459481b..e7a2b3570e952acf1b0c3c414b019f68c07f71f4 100644
--- a/src/subtitle_format_ssa.cpp
+++ b/src/subtitle_format_ssa.cpp
@@ -24,8 +24,6 @@
 #include "text_file_writer.h"
 #include "version.h"
 
-#include <libaegisub/fs.h>
-
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/format.hpp>
diff --git a/src/subtitle_format_transtation.cpp b/src/subtitle_format_transtation.cpp
index e0646c094ecd1484ceb0eedbf64cb91688bed773..d1a68216cbaa2041e6414b0a26ca6ef3f0a26346 100644
--- a/src/subtitle_format_transtation.cpp
+++ b/src/subtitle_format_transtation.cpp
@@ -32,8 +32,6 @@
 /// @ingroup subtitle_io
 ///
 
-#include <cstdio>
-
 #include "subtitle_format_transtation.h"
 
 #include "ass_dialogue.h"
@@ -42,8 +40,6 @@
 #include "ass_time.h"
 #include "text_file_writer.h"
 
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/filesystem/path.hpp>
 #include <boost/format.hpp>
 
 TranStationSubtitleFormat::TranStationSubtitleFormat()
@@ -52,9 +48,7 @@ TranStationSubtitleFormat::TranStationSubtitleFormat()
 }
 
 std::vector<std::string> TranStationSubtitleFormat::GetWriteWildcards() const {
-	std::vector<std::string> formats;
-	formats.push_back("transtation.txt");
-	return formats;
+	return {"transtation.txt"};
 }
 
 void TranStationSubtitleFormat::WriteFile(const AssFile *src, agi::fs::path const& filename, agi::vfr::Framerate const& vfps, std::string const& encoding) const {
diff --git a/src/subtitle_format_ttxt.cpp b/src/subtitle_format_ttxt.cpp
index 7bd5f3c350699e6145d441cb0152c15b5170bb19..6d28560747eb43e6a3ff966db50599fff1e252b1 100644
--- a/src/subtitle_format_ttxt.cpp
+++ b/src/subtitle_format_ttxt.cpp
@@ -34,17 +34,14 @@
 
 #include "subtitle_format_ttxt.h"
 
-#include <wx/xml/xml.h>
-
 #include "ass_dialogue.h"
 #include "ass_file.h"
 #include "ass_time.h"
 #include "compat.h"
 #include "options.h"
 
-#include <libaegisub/path.h>
-
 #include <boost/range/adaptor/reversed.hpp>
+#include <wx/xml/xml.h>
 
 DEFINE_SIMPLE_EXCEPTION(TTXTParseError, SubtitleFormatParseError, "subtitle_io/parse/ttxt")
 
@@ -54,9 +51,7 @@ TTXTSubtitleFormat::TTXTSubtitleFormat()
 }
 
 std::vector<std::string> TTXTSubtitleFormat::GetReadWildcards() const {
-	std::vector<std::string> formats;
-	formats.push_back("ttxt");
-	return formats;
+	return {"ttxt"};
 }
 
 std::vector<std::string> TTXTSubtitleFormat::GetWriteWildcards() const {
diff --git a/src/subtitle_format_txt.cpp b/src/subtitle_format_txt.cpp
index a5600235694f9861e9c594f15b8f965bc62ab839..2e0bd98c3f2c4c84c595838f66e0cafeefbb657c 100644
--- a/src/subtitle_format_txt.cpp
+++ b/src/subtitle_format_txt.cpp
@@ -40,11 +40,8 @@
 #include "options.h"
 #include "text_file_reader.h"
 #include "text_file_writer.h"
-#include "utils.h"
 #include "version.h"
 
-#include <libaegisub/path.h>
-
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/trim.hpp>
 
diff --git a/src/text_file_reader.cpp b/src/text_file_reader.cpp
index a4885b9c580ff449b3d9ee1c066ee3878306dd86..972526a36abac2faae5a55af8f7da9c959a73196 100644
--- a/src/text_file_reader.cpp
+++ b/src/text_file_reader.cpp
@@ -19,7 +19,6 @@
 #include <libaegisub/file_mapping.h>
 #include <libaegisub/make_unique.h>
 
-#include <algorithm>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/trim.hpp>
 #include <boost/interprocess/streams/bufferstream.hpp>
diff --git a/src/text_file_writer.cpp b/src/text_file_writer.cpp
index 2de9018c18f7257d3da71a7f334f029582237139..b77af0942305b3b56e37e85b3ebe3a710334002c 100644
--- a/src/text_file_writer.cpp
+++ b/src/text_file_writer.cpp
@@ -28,7 +28,6 @@
 #include <libaegisub/make_unique.h>
 
 #include <boost/algorithm/string/predicate.hpp>
-#include <boost/filesystem.hpp>
 
 TextFileWriter::TextFileWriter(agi::fs::path const& filename, std::string encoding)
 : file(new agi::io::Save(filename, true))
diff --git a/src/time_range.h b/src/time_range.h
index e4e25e863dc7e32da1739dd9c136780f787a5cc4..6c270f07d19bb7383152f9f26af6052150820a14 100644
--- a/src/time_range.h
+++ b/src/time_range.h
@@ -27,8 +27,7 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file time_range.h
-/// @ingroup audio_ui
+#include <cassert>
 
 /// @class TimeRange
 /// @brief Represents an immutable range of time
diff --git a/src/timeedit_ctrl.cpp b/src/timeedit_ctrl.cpp
index 1e0eb1051564c86731376de447e33054a7d8600e..20aed53e8748daab1ed788daed7e26ed70c02416 100644
--- a/src/timeedit_ctrl.cpp
+++ b/src/timeedit_ctrl.cpp
@@ -43,8 +43,6 @@
 #include "project.h"
 #include "utils.h"
 
-#include <wx/clipbrd.h>
-#include <wx/dataobj.h>
 #include <wx/menu.h>
 #include <wx/valtext.h>
 
diff --git a/src/toggle_bitmap.cpp b/src/toggle_bitmap.cpp
index abf21e1d87660e3b37e0a5201d6feafd79172b7e..71de3ca576dc69a602eeac27b490ef532a489e13 100644
--- a/src/toggle_bitmap.cpp
+++ b/src/toggle_bitmap.cpp
@@ -32,16 +32,15 @@
 /// @ingroup custom_control
 ///
 
-#include <wx/dcbuffer.h>
-#include <wx/settings.h>
-#include <wx/tglbtn.h>
-
 #include "toggle_bitmap.h"
 
 #include "command/command.h"
-#include "include/aegisub/context.h"
 #include "tooltip_manager.h"
 
+#include <wx/dcbuffer.h>
+#include <wx/settings.h>
+#include <wx/tglbtn.h>
+
 ToggleBitmap::ToggleBitmap(wxWindow *parent, agi::Context *context, const char *cmd_name, int icon_size, const char *ht_ctx, wxSize const& size)
 : wxControl(parent, -1, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER)
 , context(context)
diff --git a/src/toolbar.cpp b/src/toolbar.cpp
index 96130643fd8481dcef185b52e8e049ec0dfe54cc..d0d5c86df4b60916381920465ff77af695076584 100644
--- a/src/toolbar.cpp
+++ b/src/toolbar.cpp
@@ -20,18 +20,15 @@
 
 #include "command/command.h"
 #include "compat.h"
-#include "include/aegisub/context.h"
 #include "include/aegisub/hotkey.h"
 #include "libresrc/libresrc.h"
 #include "options.h"
 #include "retina_helper.h"
-#include "utils.h"
 
 #include <libaegisub/hotkey.h>
 #include <libaegisub/json.h>
 #include <libaegisub/log.h>
 #include <libaegisub/signal.h>
-#include <libaegisub/make_unique.h>
 
 #include <boost/algorithm/string/join.hpp>
 #include <boost/interprocess/streams/bufferstream.hpp>
diff --git a/src/utils.cpp b/src/utils.cpp
index 24aacb45f8def9f105c9268b5449db5b7cc2cd70..4c275f721a10a4b7aea8b66561b8fde75632975d 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -35,7 +35,6 @@
 #include "utils.h"
 
 #include "compat.h"
-#include "frame_main.h"
 #include "options.h"
 #include "retina_helper.h"
 
@@ -46,7 +45,7 @@
 #ifdef __UNIX__
 #include <unistd.h>
 #endif
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
 #include <boost/format.hpp>
 #include <map>
 #include <unicode/locid.h>
diff --git a/src/utils.h b/src/utils.h
index 34738f3da67dc6194b96d4519945b51d746ee996..b6555a839c8135b2329343bc954d6e56228c4447 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -27,29 +27,18 @@
 //
 // Aegisub Project http://www.aegisub.org/
 
-/// @file utils.h
-/// @see utils.cpp
-/// @ingroup utility
-///
-
 #pragma once
 
 #include <libaegisub/fs_fwd.h>
 
-#include <algorithm>
 #include <cstdint>
-#include <functional>
-#include <utility>
-#include <vector>
+#include <string>
 
-#include <wx/app.h>
-#include <wx/icon.h>
-#include <wx/event.h>
-#include <wx/thread.h>
+#include <wx/bitmap.h>
+#include <wx/string.h>
 
 class wxMouseEvent;
 class wxWindow;
-namespace cmd { class Command; }
 
 wxString PrettySize(int bytes);
 
diff --git a/src/validators.cpp b/src/validators.cpp
index 1486d91f5ca854953230545660b37018b5643424..c86c8bb03ddef60b5d080caea7382e6138306b14 100644
--- a/src/validators.cpp
+++ b/src/validators.cpp
@@ -17,7 +17,6 @@
 #include "validators.h"
 
 #include "compat.h"
-#include "utils.h"
 
 #include <libaegisub/exception.h>
 #include <libaegisub/util.h>
diff --git a/src/video_box.cpp b/src/video_box.cpp
index 24663dcd649663ad770ea33d60c320d99a149f77..b8a120e55b800a0ddf1d6bbb35d35443e7d02297 100644
--- a/src/video_box.cpp
+++ b/src/video_box.cpp
@@ -31,11 +31,9 @@
 
 #include "ass_dialogue.h"
 #include "ass_file.h"
-#include "command/command.h"
 #include "compat.h"
 #include "include/aegisub/context.h"
 #include "include/aegisub/toolbar.h"
-#include "libresrc/libresrc.h"
 #include "options.h"
 #include "project.h"
 #include "selection_controller.h"
diff --git a/src/video_controller.cpp b/src/video_controller.cpp
index 66178b32081e8fd8d8cb51fe4ace227c782689da..0e13a9173bad38e9fe4429f865ef5859351c5028 100644
--- a/src/video_controller.cpp
+++ b/src/video_controller.cpp
@@ -34,25 +34,15 @@
 #include "ass_time.h"
 #include "audio_controller.h"
 #include "compat.h"
-#include "dialog_progress.h"
-#include "dialogs.h"
 #include "include/aegisub/context.h"
-#include "include/aegisub/video_provider.h"
-#include "mkv_wrap.h"
 #include "options.h"
 #include "project.h"
 #include "selection_controller.h"
-#include "subs_controller.h"
 #include "time_range.h"
 #include "async_video_provider.h"
 #include "utils.h"
-#include "video_frame.h"
 
-#include <libaegisub/fs.h>
-#include <libaegisub/path.h>
-#include <libaegisub/make_unique.h>
-
-#include <wx/msgdlg.h>
+#include <wx/log.h>
 
 VideoController::VideoController(agi::Context *c)
 : context(c)
diff --git a/src/video_controller.h b/src/video_controller.h
index d8a8870912d86f38149dad6edb7ed5b583307b07..27b5a43425136e320f890018d4172e2bf4b4872d 100644
--- a/src/video_controller.h
+++ b/src/video_controller.h
@@ -31,7 +31,6 @@
 #include <libaegisub/vfr.h>
 
 #include <chrono>
-#include <memory>
 #include <set>
 
 #include <wx/timer.h>
@@ -39,7 +38,6 @@
 class AssDialogue;
 class AsyncVideoProvider;
 struct SubtitlesProviderErrorEvent;
-struct VideoFrame;
 struct VideoProviderErrorEvent;
 
 namespace agi {
diff --git a/src/video_display.cpp b/src/video_display.cpp
index 84b14c4987297615a56d458610730470931c5d93..6d5344de4c78de68ff49d8defe1af743c757d7fd 100644
--- a/src/video_display.cpp
+++ b/src/video_display.cpp
@@ -45,19 +45,15 @@
 #include "project.h"
 #include "retina_helper.h"
 #include "spline_curve.h"
-#include "subs_controller.h"
 #include "utils.h"
 #include "video_out_gl.h"
 #include "video_controller.h"
-#include "video_frame.h"
 #include "visual_tool.h"
 
 #include <libaegisub/make_unique.h>
 
 #include <algorithm>
 #include <wx/combobox.h>
-#include <wx/dataobj.h>
-#include <wx/dcclient.h>
 #include <wx/menu.h>
 #include <wx/textctrl.h>
 #include <wx/toolbar.h>
diff --git a/src/video_provider_dummy.cpp b/src/video_provider_dummy.cpp
index 8c9db4491bd9fae8d8489e377aeef666517a65d0..8b33770804934c832c0fd3ad2f51bfe53d534a63 100644
--- a/src/video_provider_dummy.cpp
+++ b/src/video_provider_dummy.cpp
@@ -38,13 +38,13 @@
 #include "video_frame.h"
 
 #include <libaegisub/color.h>
-#include <libaegisub/fs.h>
 #include <libaegisub/make_unique.h>
 #include <libaegisub/util.h>
 
 #include <boost/algorithm/string/classification.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/split.hpp>
+#include <boost/filesystem/path.hpp>
 #include <boost/format.hpp>
 #include <boost/gil/gil_all.hpp>
 
diff --git a/src/video_provider_ffmpegsource.cpp b/src/video_provider_ffmpegsource.cpp
index ea86e1a15301dd9c1d9ad81d2736c8715d189cd4..b8384ed235a2011d72a150512ba7d214a6ffcc8d 100644
--- a/src/video_provider_ffmpegsource.cpp
+++ b/src/video_provider_ffmpegsource.cpp
@@ -36,18 +36,13 @@
 #include "ffmpegsource_common.h"
 #include "include/aegisub/video_provider.h"
 
-#include "compat.h"
 #include "options.h"
 #include "utils.h"
-#include "video_controller.h"
 #include "video_frame.h"
 
 #include <libaegisub/fs.h>
 #include <libaegisub/make_unique.h>
 
-#include <wx/choicdlg.h>
-#include <wx/msgdlg.h>
-
 namespace {
 /// @class FFmpegSourceVideoProvider
 /// @brief Implements video loading through the FFMS library.
diff --git a/src/video_provider_manager.cpp b/src/video_provider_manager.cpp
index 98842d6c15af3f733a6b036bc304e76da0d357b8..3739a7293df7963232b295f2020655992b0a2a73 100644
--- a/src/video_provider_manager.cpp
+++ b/src/video_provider_manager.cpp
@@ -22,7 +22,6 @@
 
 #include <libaegisub/fs.h>
 #include <libaegisub/log.h>
-#include <libaegisub/make_unique.h>
 
 #include <boost/range/iterator_range.hpp>
 
diff --git a/src/video_provider_yuv4mpeg.cpp b/src/video_provider_yuv4mpeg.cpp
index d254e84ed829e69ad6dae07b94c2aee78bdd7a66..5694aca9bca4f45c56333426eebf6911eda065c0 100644
--- a/src/video_provider_yuv4mpeg.cpp
+++ b/src/video_provider_yuv4mpeg.cpp
@@ -34,19 +34,16 @@
 
 #include "include/aegisub/video_provider.h"
 
-#include "compat.h"
 #include "utils.h"
 #include "video_frame.h"
 
 #include <libaegisub/file_mapping.h>
-#include <libaegisub/fs.h>
 #include <libaegisub/log.h>
 #include <libaegisub/make_unique.h>
 #include <libaegisub/util.h>
 #include <libaegisub/ycbcr_conv.h>
 
 #include <boost/algorithm/string/case_conv.hpp>
-#include <boost/filesystem/path.hpp>
 #include <memory>
 #include <vector>
 
diff --git a/src/visual_tool.cpp b/src/visual_tool.cpp
index 6559441ac0b385d38a56380c3b2ea7be3a3b6b84..5aecc92df67e8744e3aa51b4a6c1c0360a334b37 100644
--- a/src/visual_tool.cpp
+++ b/src/visual_tool.cpp
@@ -25,12 +25,9 @@
 #include "ass_style.h"
 #include "ass_time.h"
 #include "include/aegisub/context.h"
-#include "options.h"
 #include "selection_controller.h"
-#include "utils.h"
 #include "video_controller.h"
 #include "video_display.h"
-#include "visual_feature.h"
 #include "visual_tool_clip.h"
 #include "visual_tool_drag.h"
 #include "visual_tool_vector_clip.h"
diff --git a/src/visual_tool.h b/src/visual_tool.h
index c1d071b6a7afa24825f245e1323c6f7c0bdd58bb..c041b5909d975f625931ec8606a6451354b0c124 100644
--- a/src/visual_tool.h
+++ b/src/visual_tool.h
@@ -27,11 +27,11 @@
 #include <libaegisub/signal.h>
 
 #include <set>
-#include <wx/event.h>
 
 class AssDialogue;
-class SubtitlesGrid;
 class VideoDisplay;
+class wxMouseCaptureLostEvent;
+class wxMouseEvent;
 class wxToolBar;
 namespace agi {
 	struct Context;
diff --git a/src/visual_tool_clip.cpp b/src/visual_tool_clip.cpp
index 754f5ab9ce112d60778d151a3ccd2acc1090c434..ea12f3fe847ff93466c9b68e5787f533c8345582 100644
--- a/src/visual_tool_clip.cpp
+++ b/src/visual_tool_clip.cpp
@@ -23,10 +23,9 @@
 #include "ass_dialogue.h"
 #include "include/aegisub/context.h"
 #include "selection_controller.h"
-#include "utils.h"
 
 #include <boost/format.hpp>
-#include <utility>
+#include <wx/colour.h>
 
 VisualToolClip::VisualToolClip(VideoDisplay *parent, agi::Context *context)
 : VisualTool<ClipCorner>(parent, context)
diff --git a/src/visual_tool_cross.h b/src/visual_tool_cross.h
index 637532c6697b4dae43f6d8ba92c68c5f69d3739e..8172a40f8ef5b82e4f67ef77b95540a899ff8312 100644
--- a/src/visual_tool_cross.h
+++ b/src/visual_tool_cross.h
@@ -19,8 +19,8 @@
 /// @ingroup visual_ts
 ///
 
-#include "visual_feature.h"
 #include "visual_tool.h"
+#include "visual_feature.h"
 
 #include <memory>
 
diff --git a/src/visual_tool_drag.cpp b/src/visual_tool_drag.cpp
index 0e6d2130658218a752a3f4cab8886629b6b759b8..c2a7dfd2bed6d364145ab437b51f066c2977836c 100644
--- a/src/visual_tool_drag.cpp
+++ b/src/visual_tool_drag.cpp
@@ -26,7 +26,6 @@
 #include "libresrc/libresrc.h"
 #include "options.h"
 #include "selection_controller.h"
-#include "utils.h"
 #include "video_controller.h"
 #include "video_display.h"
 
@@ -35,7 +34,6 @@
 #include <algorithm>
 #include <boost/format.hpp>
 #include <boost/range/algorithm/binary_search.hpp>
-#include <functional>
 
 #include <wx/toolbar.h>
 
diff --git a/src/visual_tool_drag.h b/src/visual_tool_drag.h
index 70dade63f61b3b0f2df350fc86bfd2d52d206d4b..d869d37e82e6aa3df5ec3820068005b53a81403d 100644
--- a/src/visual_tool_drag.h
+++ b/src/visual_tool_drag.h
@@ -31,6 +31,7 @@ public:
 };
 
 class wxBitmapButton;
+class wxCommandEvent;
 class wxToolBar;
 
 /// @class VisualToolDrag
diff --git a/src/visual_tool_rotatexy.cpp b/src/visual_tool_rotatexy.cpp
index e3fc503e1ced43c181a14e2d62a1e068eef4f0c2..1e2ea62c86a5fc45cbafb1ab7dcba6350a06a4d5 100644
--- a/src/visual_tool_rotatexy.cpp
+++ b/src/visual_tool_rotatexy.cpp
@@ -22,6 +22,7 @@
 
 #include <boost/format.hpp>
 #include <cmath>
+#include <wx/colour.h>
 
 VisualToolRotateXY::VisualToolRotateXY(VideoDisplay *parent, agi::Context *context)
 : VisualTool<VisualDraggableFeature>(parent, context)
diff --git a/src/visual_tool_rotatez.cpp b/src/visual_tool_rotatez.cpp
index 6fb0bb3f29ea05192c6d063e507eaf400b9bf7db..4f8ba7ca8d8ddf75acb75a1ec8f7359d0dc9e560 100644
--- a/src/visual_tool_rotatez.cpp
+++ b/src/visual_tool_rotatez.cpp
@@ -20,10 +20,9 @@
 
 #include "visual_tool_rotatez.h"
 
-#include "utils.h"
-
 #include <boost/format.hpp>
 #include <cmath>
+#include <wx/colour.h>
 
 static const float deg2rad = 3.1415926536f / 180.f;
 static const float rad2deg = 180.f / 3.1415926536f;
diff --git a/src/visual_tool_scale.cpp b/src/visual_tool_scale.cpp
index 50f26844b14e1678e351ca8a70fb41648fe64362..1a0a0a1de932a419bdd213316e028b7543664256 100644
--- a/src/visual_tool_scale.cpp
+++ b/src/visual_tool_scale.cpp
@@ -18,11 +18,9 @@
 /// @brief X/Y scaling visual typesetting tool
 /// @ingroup visual_ts
 
-#include <cmath>
-
 #include "visual_tool_scale.h"
 
-#include "utils.h"
+#include <wx/colour.h>
 
 VisualToolScale::VisualToolScale(VideoDisplay *parent, agi::Context *context)
 : VisualTool<VisualDraggableFeature>(parent, context)
diff --git a/src/visual_tool_vector_clip.cpp b/src/visual_tool_vector_clip.cpp
index 35c40b88b60ed63551f4d4e772a47cb7f30f2402..a9d002a61b9efcbec31961fb558dff8d3f7769d4 100644
--- a/src/visual_tool_vector_clip.cpp
+++ b/src/visual_tool_vector_clip.cpp
@@ -25,7 +25,6 @@
 #include "libresrc/libresrc.h"
 #include "options.h"
 #include "selection_controller.h"
-#include "utils.h"
 
 #include <libaegisub/make_unique.h>