diff --git a/aegisub/audio_display.h b/aegisub/audio_display.h
index 65cf8eb83379bb43dedb3f820d3279f282631c3e..4e9234732e28022dfbd0781fe2102b85b548eeb1 100644
--- a/aegisub/audio_display.h
+++ b/aegisub/audio_display.h
@@ -44,8 +44,8 @@
 #include <wx/window.h>
 #include <wx/bitmap.h>
 #include <stdint.h>
-#include "audio_provider.h"
-#include "audio_player.h"
+#include "audio_provider_manager.h"
+#include "audio_player_manager.h"
 #include "audio_spectrum.h"
 
 
diff --git a/aegisub/audio_player.cpp b/aegisub/audio_player.cpp
index 37a0114ab3c92cee40cca11ef398357798982a71..32b4ba587a7ead22fde006fd723a34feb5fa91a1 100644
--- a/aegisub/audio_player.cpp
+++ b/aegisub/audio_player.cpp
@@ -37,7 +37,7 @@
 ///////////
 // Headers
 #include <wx/wxprec.h>
-#include "audio_player.h"
+#include "audio_player_manager.h"
 #include "options.h"
 #ifdef WITH_ALSA
 #include "audio_player_alsa.h"
diff --git a/aegisub/audio_player_alsa.h b/aegisub/audio_player_alsa.h
index 5efc1e353c1e7b30f6ea48ec5bac93a8606b723f..b63c71a5f244e0d830a6da8d32d238b3c282051b 100644
--- a/aegisub/audio_player_alsa.h
+++ b/aegisub/audio_player_alsa.h
@@ -40,12 +40,11 @@
 ///////////
 // Headers
 #include <wx/wxprec.h>
-#include "audio_player.h"
-#include "audio_provider.h"
+#include "include/aegisub/audio_player.h"
+#include "include/aegisub/audio_provider.h"
 #include "utils.h"
 #include "main.h"
 #include "frame_main.h"
-#include "audio_player.h"
 #include <alsa/asoundlib.h>
 #include "options.h"
 
diff --git a/aegisub/audio_player_dsound.cpp b/aegisub/audio_player_dsound.cpp
index 845486c8d5d3bcb0a0f94b882d066d91a0c74fa9..12332ac162d5d5b09c40b4e6d21b9494fbc8ebb8 100644
--- a/aegisub/audio_player_dsound.cpp
+++ b/aegisub/audio_player_dsound.cpp
@@ -39,8 +39,6 @@
 #ifdef WITH_DIRECTSOUND
 
 #include <wx/wxprec.h>
-#include "audio_player.h"
-#include "audio_provider.h"
 #include "utils.h"
 #include "main.h"
 #include "frame_main.h"
diff --git a/aegisub/audio_player_dsound.h b/aegisub/audio_player_dsound.h
index 6643413fca58b5e878e467ae35aefd93da05104c..9b96bcb884ff46d0424634f32098fb4eff92c44e 100644
--- a/aegisub/audio_player_dsound.h
+++ b/aegisub/audio_player_dsound.h
@@ -39,12 +39,11 @@
 #ifdef WITH_DIRECTSOUND
 
 #include <wx/wxprec.h>
-#include "audio_player.h"
-#include "audio_provider.h"
+#include "include/aegisub/audio_player.h"
+#include "include/aegisub/audio_provider.h"
 #include "utils.h"
 #include "main.h"
 #include "frame_main.h"
-#include "audio_player.h"
 #include <mmsystem.h>
 #include <dsound.h>
 
diff --git a/aegisub/audio_player_manager.h b/aegisub/audio_player_manager.h
new file mode 100644
index 0000000000000000000000000000000000000000..1781a33d9246c6f02aa3e28762c5b8870aad7e87
--- /dev/null
+++ b/aegisub/audio_player_manager.h
@@ -0,0 +1,70 @@
+// Copyright (c) 2005-2007, Rodrigo Braz Monteiro
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//   * Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//   * Redistributions in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//   * Neither the name of the Aegisub Group nor the names of its contributors
+//     may be used to endorse or promote products derived from this software
+//     without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// -----------------------------------------------------------------------------
+//
+// AEGISUB
+//
+// Website: http://aegisub.cellosoft.com
+// Contact: mailto:zeratul@cellosoft.com
+//
+
+
+#pragma once
+
+
+///////////
+// Headers
+#include <wx/wxprec.h>
+#include <wx/event.h>
+#include <wx/timer.h>
+#include <wx/thread.h>
+#include <stdint.h>
+#include "factory_manager.h"
+#include "include/aegisub/audio_player.h"
+
+
+//////////////
+// Prototypes
+class AudioProvider;
+
+
+///////////////////
+// Factory Manager
+class AudioPlayerFactoryManager : public FactoryManager<AudioPlayerFactory> {
+public:
+	static AudioPlayer *GetAudioPlayer();
+	static void RegisterProviders();
+};
+
+
+
+/////////
+// Event
+DECLARE_EVENT_TYPE(wxEVT_STOP_AUDIO, -1)
+
+
diff --git a/aegisub/audio_player_openal.h b/aegisub/audio_player_openal.h
index 67ec21f59ad4b7ac57723c09b7094addbd241cc0..ace8c2f74602d6decd36b498f1b02cc407717899 100644
--- a/aegisub/audio_player_openal.h
+++ b/aegisub/audio_player_openal.h
@@ -40,8 +40,8 @@
 ///////////
 // Headers
 #include <wx/wxprec.h>
-#include "audio_player.h"
-#include "audio_provider.h"
+#include "include/aegisub/audio_player.h"
+#include "include/aegisub/audio_provider.h"
 #include "utils.h"
 #include "main.h"
 #include "frame_main.h"
diff --git a/aegisub/audio_player_portaudio.h b/aegisub/audio_player_portaudio.h
index 7f723390c4f5c19f4fce4b4e8e7c655d746a02d6..85c3a571bdb9a29b7056df205d1ad4d0a2fde85a 100644
--- a/aegisub/audio_player_portaudio.h
+++ b/aegisub/audio_player_portaudio.h
@@ -39,8 +39,8 @@
 
 ///////////
 // Headers
-#include "audio_player.h"
-#include "audio_provider.h"
+#include "include/aegisub/audio_player.h"
+#include "include/aegisub/audio_provider.h"
 #include "utils.h"
 extern "C" {
 #include <portaudio.h>
diff --git a/aegisub/audio_player_pulse.h b/aegisub/audio_player_pulse.h
index 22031f08f686a0725d253c1ad2415bd91b05a5ce..e532a6ff55e12fefe2513788d4c339703f344dfe 100644
--- a/aegisub/audio_player_pulse.h
+++ b/aegisub/audio_player_pulse.h
@@ -41,8 +41,8 @@
 // Headers
 #include <wx/wxprec.h>
 #include <stdio.h>
-#include "audio_player.h"
-#include "audio_provider.h"
+#include "include/aegisub/audio_player.h"
+#include "include/aegisub/audio_provider.h"
 #include "utils.h"
 #include "options.h"
 #include <pulse/pulseaudio.h>
diff --git a/aegisub/audio_provider_avs.h b/aegisub/audio_provider_avs.h
index 3c29c947131649624942b9bf825b2d018bedb150..dcc59096df23dd6d1e0b5f86386717867dc795e3 100644
--- a/aegisub/audio_provider_avs.h
+++ b/aegisub/audio_provider_avs.h
@@ -39,7 +39,7 @@
 #include <wx/wxprec.h>
 #ifdef WITH_AVISYNTH
 #include <Mmreg.h>
-#include "audio_provider.h"
+#include "include/aegisub/audio_provider.h"
 #include "avisynth_wrap.h"
 
 
diff --git a/aegisub/audio_provider_convert.h b/aegisub/audio_provider_convert.h
index d88448650b3e09ee6f188794f980e0a8dc9a2b66..e8f376f9f5211bda2cc14f55a474b61faa2d4e2d 100644
--- a/aegisub/audio_provider_convert.h
+++ b/aegisub/audio_provider_convert.h
@@ -39,7 +39,7 @@
 
 ///////////
 // Headers
-#include "audio_provider.h"
+#include "include/aegisub/audio_provider.h"
 
 
 ////////////////////////
diff --git a/aegisub/audio_provider_dummy.h b/aegisub/audio_provider_dummy.h
index 21d4bfd569430df1294ac8e7570bb0dd2f882c42..b9c1866fbbd1ab7e78908c83a9c7dfc2a7bdb328 100644
--- a/aegisub/audio_provider_dummy.h
+++ b/aegisub/audio_provider_dummy.h
@@ -39,7 +39,7 @@
 
 ///////////
 // Headers
-#include "audio_provider.h"
+#include "include/aegisub/audio_provider.h"
 
 
 ////////////////////////
diff --git a/aegisub/audio_provider_hd.h b/aegisub/audio_provider_hd.h
index 3a875dabd9cea9e1e1182581dc4cb4e8daefe774..ab75af3a751e07787314089a0f99d2a65e525778 100644
--- a/aegisub/audio_provider_hd.h
+++ b/aegisub/audio_provider_hd.h
@@ -39,7 +39,7 @@
 
 ///////////
 // Headers
-#include "audio_provider.h"
+#include "include/aegisub/audio_provider.h"
 #include <wx/file.h>
 
 
diff --git a/aegisub/audio_provider_lavc.h b/aegisub/audio_provider_lavc.h
index 45efd23574d913e607a05109745a8abde1d2ff71..ac9b68870f6dc408ec7d02250d2b1ced7da9c611 100644
--- a/aegisub/audio_provider_lavc.h
+++ b/aegisub/audio_provider_lavc.h
@@ -57,7 +57,7 @@ extern "C" {
 }
 #include "mkv_wrap.h"
 #include "lavc_file.h"
-#include "audio_provider.h"
+#include "include/aegisub/audio_provider.h"
 #include "lavc_file.h"
 
 
diff --git a/aegisub/audio_provider_manager.h b/aegisub/audio_provider_manager.h
new file mode 100644
index 0000000000000000000000000000000000000000..a5f93f7b3887a90ad678490e030b409d336ba700
--- /dev/null
+++ b/aegisub/audio_provider_manager.h
@@ -0,0 +1,54 @@
+// Copyright (c) 2006, Rodrigo Braz Monteiro
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//   * Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//   * Redistributions in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//   * Neither the name of the Aegisub Group nor the names of its contributors
+//     may be used to endorse or promote products derived from this software
+//     without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// -----------------------------------------------------------------------------
+//
+// AEGISUB
+//
+// Website: http://aegisub.cellosoft.com
+// Contact: mailto:zeratul@cellosoft.com
+//
+
+
+#pragma once
+
+
+///////////
+// Headers
+#include <wx/wxprec.h>
+#include <stdint.h>
+#include "factory_manager.h"
+#include "include/aegisub/audio_provider.h"
+
+
+///////////////////
+// Factory Manager
+class AudioProviderFactoryManager : public FactoryManager<AudioProviderFactory> {
+public:
+	static void RegisterProviders();
+	static AudioProvider *GetAudioProvider(wxString filename, int cache=-1);
+};
diff --git a/aegisub/audio_provider_pcm.h b/aegisub/audio_provider_pcm.h
index b62e1ec5bdaf99d3124ca9ad9f5af189e2c1624c..ea009e8ffcfcbcf9a9e907e6e9015591a06397be 100644
--- a/aegisub/audio_provider_pcm.h
+++ b/aegisub/audio_provider_pcm.h
@@ -39,7 +39,7 @@
 
 ///////////
 // Headers
-#include "audio_provider.h"
+#include "include/aegisub/audio_provider.h"
 #include <wx/file.h>
 #include <wx/thread.h>
 #include <vector>
diff --git a/aegisub/audio_provider_ram.h b/aegisub/audio_provider_ram.h
index bf5b0cf9138e7b0f98c8589565476b495603f34f..f2ac0c781be6383e842c7d8a47a9c043badb444f 100644
--- a/aegisub/audio_provider_ram.h
+++ b/aegisub/audio_provider_ram.h
@@ -39,7 +39,7 @@
 
 ///////////
 // Headers
-#include "audio_provider.h"
+#include "include/aegisub/audio_provider.h"
 
 
 ////////////////////////
diff --git a/aegisub/audio_provider_stream.h b/aegisub/audio_provider_stream.h
index 0614fa6208a7d4c0f7898a09a843eb15b6567cc7..2ab52d49d9e76c8f3538646a14b019caaa5ec0ee 100644
--- a/aegisub/audio_provider_stream.h
+++ b/aegisub/audio_provider_stream.h
@@ -41,7 +41,7 @@
 // Headers
 #include <list>
 #include <vector>
-#include "audio_provider.h"
+#include "include/aegisub/audio_provider.h"
 
 
 ////////////////////////
diff --git a/aegisub/audio_spectrum.h b/aegisub/audio_spectrum.h
index 7834e1fe0e63f692fa655aa6208fa91191bfa237..bf80119475fa7fae889f7a65fc4bd4ccfc32d5df 100644
--- a/aegisub/audio_spectrum.h
+++ b/aegisub/audio_spectrum.h
@@ -39,7 +39,7 @@
 
 #include <wx/wxprec.h>
 #include <stdint.h>
-#include "audio_provider.h"
+#include "audio_provider_manager.h"
 
 
 // Specified and implemented in cpp file, interface is private to spectrum code
diff --git a/aegisub/dialog_options.cpp b/aegisub/dialog_options.cpp
index c949f575eeba9bece0afe1a6dd2177b423356607..536e0c9e0ff5561b648c172f25602292b3356000 100644
--- a/aegisub/dialog_options.cpp
+++ b/aegisub/dialog_options.cpp
@@ -55,8 +55,8 @@
 #include "subs_grid.h"
 #include "video_box.h"
 #include "video_slider.h"
-#include "video_provider.h"
-#include "subtitles_provider.h"
+#include "video_provider_manager.h"
+#include "subtitles_provider_manager.h"
 #include "audio_box.h"
 #include "audio_display.h"
 #include "video_context.h"
diff --git a/aegisub/dialog_properties.cpp b/aegisub/dialog_properties.cpp
index 11bb1022f784249708832c408e58bf6217246d5d..79ee6c71d744257fb9aeb24122c65ea84cee750d 100644
--- a/aegisub/dialog_properties.cpp
+++ b/aegisub/dialog_properties.cpp
@@ -45,7 +45,7 @@
 #include "ass_file.h"
 #include "video_display.h"
 #include "validators.h"
-#include "video_provider.h"
+#include "video_provider_manager.h"
 #include "utils.h"
 #include "help_button.h"
 
diff --git a/aegisub/dialog_spellchecker.cpp b/aegisub/dialog_spellchecker.cpp
index 1cc41b4747874b9a37ae48af4771ed3c76f5955d..62aa03925ef6bf378f6038a15dae6d60ad018ee0 100644
--- a/aegisub/dialog_spellchecker.cpp
+++ b/aegisub/dialog_spellchecker.cpp
@@ -37,7 +37,7 @@
 // Headers
 #include <wx/intl.h>
 #include "dialog_spellchecker.h"
-#include "spellchecker.h"
+#include "spellchecker_manager.h"
 #include "subs_grid.h"
 #include "frame_main.h"
 #include "ass_file.h"
diff --git a/aegisub/dialog_style_editor.cpp b/aegisub/dialog_style_editor.cpp
index d162f774a019784e1e8d4d161319aa08572e95fb..9dc395cf3a09063e929d78d73bb13175d5c38d45 100644
--- a/aegisub/dialog_style_editor.cpp
+++ b/aegisub/dialog_style_editor.cpp
@@ -51,7 +51,7 @@
 #include "colour_button.h"
 #include "subs_preview.h"
 #include "options.h"
-#include "subtitles_provider.h"
+#include "subtitles_provider_manager.h"
 #include "ass_style_storage.h"
 #include "help_button.h"
 
diff --git a/aegisub/dialog_video_details.cpp b/aegisub/dialog_video_details.cpp
index 8ff5de3c99e70564e79fe3c95426d1634ee20584..a8075e49e04c0449ce04097447cd2141b03b026c 100644
--- a/aegisub/dialog_video_details.cpp
+++ b/aegisub/dialog_video_details.cpp
@@ -38,8 +38,8 @@
 // Headers
 #include "dialog_video_details.h"
 #include "video_context.h"
-#include "video_provider.h"
-#include "audio_provider.h"
+#include "video_provider_manager.h"
+#include "audio_provider_manager.h"
 #include "audio_box.h"
 #include "utils.h"
 
diff --git a/aegisub/frame_main.cpp b/aegisub/frame_main.cpp
index d99517beadac560af0b4b676d20a41d6747ea56f..ff45b9beb033e43c786dee2bb81cfeaf8c276569 100644
--- a/aegisub/frame_main.cpp
+++ b/aegisub/frame_main.cpp
@@ -50,7 +50,7 @@
 #include "avisynth_wrap.h"
 #endif
 #include "video_display.h"
-#include "video_provider.h"
+#include "video_provider_manager.h"
 #include "video_slider.h"
 #include "ass_file.h"
 #include "dialog_search_replace.h"
diff --git a/aegisub/include/aegisub/aegisub.h b/aegisub/include/aegisub/aegisub.h
new file mode 100644
index 0000000000000000000000000000000000000000..721314d410a18b25ee16376b2d2d71da12c32a3e
--- /dev/null
+++ b/aegisub/include/aegisub/aegisub.h
@@ -0,0 +1,60 @@
+// Copyright (c) 2008, Rodrigo Braz Monteiro
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//   * Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//   * Redistributions in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//   * Neither the name of the Aegisub Group nor the names of its contributors
+//     may be used to endorse or promote products derived from this software
+//     without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// -----------------------------------------------------------------------------
+//
+// AEGISUB
+//
+// Website: http://aegisub.cellosoft.com
+// Contact: mailto:zeratul@cellosoft.com
+//
+
+
+#pragma once
+
+
+///////////////
+// STL Headers
+#include <vector>
+#include <string>
+#include <stdint.h>
+
+
+////////////////////////////////
+// Define types used by Aegisub
+namespace Aegisub {
+	// String type
+	typedef std::basic_string<wchar_t> String;
+
+	// String array
+	typedef std::vector<String> StringArray;
+};
+
+
+///////////////////
+// Aegisub headers
+//#include "video_frame.h"
diff --git a/aegisub/audio_player.h b/aegisub/include/aegisub/audio_player.h
similarity index 90%
rename from aegisub/audio_player.h
rename to aegisub/include/aegisub/audio_player.h
index ae4c6ae6874956611c0931461ff89bdafebe451d..f58d49347022729aebfc101eb98f2ca004d4895a 100644
--- a/aegisub/audio_player.h
+++ b/aegisub/include/aegisub/audio_player.h
@@ -43,8 +43,7 @@
 #include <wx/event.h>
 #include <wx/timer.h>
 #include <wx/thread.h>
-#include <stdint.h>
-#include "factory_manager.h"
+#include "aegisub.h"
 
 
 //////////////
@@ -100,20 +99,3 @@ class AudioPlayerFactory {
 public:
 	virtual AudioPlayer *CreatePlayer()=0;
 };
-
-
-///////////////////
-// Factory Manager
-class AudioPlayerFactoryManager : public FactoryManager<AudioPlayerFactory> {
-public:
-	static AudioPlayer *GetAudioPlayer();
-	static void RegisterProviders();
-};
-
-
-
-/////////
-// Event
-DECLARE_EVENT_TYPE(wxEVT_STOP_AUDIO, -1)
-
-
diff --git a/aegisub/audio_provider.h b/aegisub/include/aegisub/audio_provider.h
similarity index 88%
rename from aegisub/audio_provider.h
rename to aegisub/include/aegisub/audio_provider.h
index 0f6e3eee105e0b0d65abc203840676c6b1a36168..50d9603628a9e580aae09fd3e44aa4bb067fb600 100644
--- a/aegisub/audio_provider.h
+++ b/aegisub/include/aegisub/audio_provider.h
@@ -39,14 +39,11 @@
 
 ///////////
 // Headers
-#include <wx/wxprec.h>
-#include <stdint.h>
-#include "factory_manager.h"
+#include "aegisub.h"
 
 
 //////////////
 // Prototypes
-class AudioDisplay;
 class VideoProvider;
 
 
@@ -88,12 +85,3 @@ class AudioProviderFactory {
 public:
 	virtual AudioProvider *CreateProvider(wxString filename)=0;
 };
-
-
-///////////////////
-// Factory Manager
-class AudioProviderFactoryManager : public FactoryManager<AudioProviderFactory> {
-public:
-	static void RegisterProviders();
-	static AudioProvider *GetAudioProvider(wxString filename, int cache=-1);
-};
diff --git a/aegisub/spellchecker.h b/aegisub/include/aegisub/spellchecker.h
similarity index 90%
rename from aegisub/spellchecker.h
rename to aegisub/include/aegisub/spellchecker.h
index 692fc1148f0fc7343d3a445ae1dc838d11438605..845218641221363adbf712002062f3eddd5e630c 100644
--- a/aegisub/spellchecker.h
+++ b/aegisub/include/aegisub/spellchecker.h
@@ -39,8 +39,7 @@
 
 ///////////
 // Headers
-#include <wx/wxprec.h>
-#include "factory_manager.h"
+#include "aegisub.h"
 
 
 ///////////////////////////
@@ -67,12 +66,3 @@ class SpellCheckerFactory {
 public:
 	virtual SpellChecker *CreateSpellChecker()=0;
 };
-
-
-///////////////////
-// Factory Manager
-class SpellCheckerFactoryManager : public FactoryManager<SpellCheckerFactory> {
-public:
-	static SpellChecker *GetSpellChecker();
-	static void RegisterProviders();
-};
diff --git a/aegisub/subtitles_provider.h b/aegisub/include/aegisub/subtitles_provider.h
similarity index 88%
rename from aegisub/subtitles_provider.h
rename to aegisub/include/aegisub/subtitles_provider.h
index 7781d77039d5a662601bc6b79cccb89f28be79cb..8defef305f06211dc4fc10011e3e341bc2b637a7 100644
--- a/aegisub/subtitles_provider.h
+++ b/aegisub/include/aegisub/subtitles_provider.h
@@ -39,9 +39,8 @@
 
 ///////////
 // Headers
-#include <wx/wxprec.h>
+#include "aegisub.h"
 #include "video_frame.h"
-#include "factory_manager.h"
 
 
 //////////////
@@ -70,14 +69,3 @@ public:
 	virtual ~SubtitlesProviderFactory() {}
 	virtual SubtitlesProvider *CreateProvider(wxString subType=_T(""))=0;
 };
-
-
-///////////////////
-// Factory Manager
-class SubtitlesProviderFactoryManager : public FactoryManager<SubtitlesProviderFactory> {
-public:
-	static SubtitlesProvider *GetProvider();
-	static void RegisterProviders();
-	static bool ProviderAvailable();
-};
-
diff --git a/aegisub/video_provider.h b/aegisub/include/aegisub/video_provider.h
similarity index 92%
rename from aegisub/video_provider.h
rename to aegisub/include/aegisub/video_provider.h
index c8ce3af59d3d47c0e5cded3e4d785f25306a21cd..bfd9c43fc6b079bd68b418524e0edc37fd647a65 100644
--- a/aegisub/video_provider.h
+++ b/aegisub/include/aegisub/video_provider.h
@@ -39,9 +39,8 @@
 
 //////////
 // Headers
-#include <wx/intl.h>
 #include "video_frame.h"
-#include "factory_manager.h"
+#include "aegisub.h"
 
 
 //////////////
@@ -90,12 +89,3 @@ class VideoProviderFactory {
 public:
 	virtual VideoProvider *CreateProvider(wxString video,double fps=0.0)=0;
 };
-
-
-///////////////////
-// Factory Manager
-class VideoProviderFactoryManager : public FactoryManager<VideoProviderFactory> {
-public:
-	static void RegisterProviders();
-	static VideoProvider *GetProvider(wxString video,double fps=0.0);
-};
diff --git a/aegisub/plugin_manager.cpp b/aegisub/plugin_manager.cpp
index 60a229fdf1fe5d0bff47b55d614d3ba841923354..2f10ac0688522c000d87c1bcd1953ecffb789656 100644
--- a/aegisub/plugin_manager.cpp
+++ b/aegisub/plugin_manager.cpp
@@ -37,11 +37,11 @@
 ///////////
 // Headers
 #include "plugin_manager.h"
-#include "video_provider.h"
-#include "audio_provider.h"
-#include "audio_player.h"
-#include "subtitles_provider.h"
-#include "spellchecker.h"
+#include "video_provider_manager.h"
+#include "audio_provider_manager.h"
+#include "audio_player_manager.h"
+#include "subtitles_provider_manager.h"
+#include "spellchecker_manager.h"
 
 
 ///////////////
diff --git a/aegisub/spellchecker.cpp b/aegisub/spellchecker.cpp
index e30a2ad3f5c9f644a271ee369ae2db45f6a3126d..bcbcd1c0f7c898889c368645962517128af23e09 100644
--- a/aegisub/spellchecker.cpp
+++ b/aegisub/spellchecker.cpp
@@ -36,7 +36,7 @@
 
 ///////////
 // Headers
-#include "spellchecker.h"
+#include "spellchecker_manager.h"
 #ifdef WITH_HUNSPELL
 #include "spellchecker_hunspell.h"
 #endif
diff --git a/aegisub/spellchecker_hunspell.h b/aegisub/spellchecker_hunspell.h
index bd98c902d82c5119f2dca136de15a301fd1698e6..c56e381984e663b15d9c573a7668615f35282250 100644
--- a/aegisub/spellchecker_hunspell.h
+++ b/aegisub/spellchecker_hunspell.h
@@ -39,7 +39,7 @@
 
 #ifdef WITH_HUNSPELL
 
-#include "spellchecker.h"
+#include "include/aegisub/spellchecker.h"
 #include <hunspell/hunspell.hxx>
 #include <wx/wxprec.h>
 
diff --git a/aegisub/spellchecker_manager.h b/aegisub/spellchecker_manager.h
new file mode 100644
index 0000000000000000000000000000000000000000..b81d3e6de7caab13ede1baf79ededa4cac8ac919
--- /dev/null
+++ b/aegisub/spellchecker_manager.h
@@ -0,0 +1,53 @@
+// Copyright (c) 2006, Rodrigo Braz Monteiro
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//   * Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//   * Redistributions in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//   * Neither the name of the Aegisub Group nor the names of its contributors
+//     may be used to endorse or promote products derived from this software
+//     without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// -----------------------------------------------------------------------------
+//
+// AEGISUB
+//
+// Website: http://aegisub.cellosoft.com
+// Contact: mailto:zeratul@cellosoft.com
+//
+
+
+#pragma once
+
+
+///////////
+// Headers
+#include <wx/wxprec.h>
+#include "factory_manager.h"
+#include "include/aegisub/spellchecker.h"
+
+
+///////////////////
+// Factory Manager
+class SpellCheckerFactoryManager : public FactoryManager<SpellCheckerFactory> {
+public:
+	static SpellChecker *GetSpellChecker();
+	static void RegisterProviders();
+};
diff --git a/aegisub/subs_edit_ctrl.h b/aegisub/subs_edit_ctrl.h
index 2f5acc96fe7552120a9faf264dc0596594bb88bf..4efb4d35b80c731758f5c9daca25e684014db671 100644
--- a/aegisub/subs_edit_ctrl.h
+++ b/aegisub/subs_edit_ctrl.h
@@ -40,7 +40,7 @@
 ////////////
 // Includes
 #include <wx/wxprec.h>
-#include "spellchecker.h"
+#include "spellchecker_manager.h"
 #include "thesaurus.h"
 #include "scintilla_text_ctrl.h"
 
diff --git a/aegisub/subs_grid.h b/aegisub/subs_grid.h
index be25942a11e8a6ad5e51e95c0a555e1b76b767b1..930f76ab5603de2cb59a488eca865c32d975c5c5 100644
--- a/aegisub/subs_grid.h
+++ b/aegisub/subs_grid.h
@@ -45,7 +45,7 @@
 #include <list>
 #include "base_grid.h"
 #include "audio_display.h"
-#include "audio_provider.h"
+#include "audio_provider_manager.h"
 #include "audio_box.h"
 #include <iostream>
 #include <fstream>
diff --git a/aegisub/subs_preview.cpp b/aegisub/subs_preview.cpp
index 4dbb73611dc041229a52260fc3e1429a5d89eee0..4f20e8f3bd26b03f2009bcd1860a5871fd9b4924 100644
--- a/aegisub/subs_preview.cpp
+++ b/aegisub/subs_preview.cpp
@@ -42,7 +42,7 @@
 #include "ass_style.h"
 #include "subs_preview.h"
 #include "video_provider_dummy.h"
-#include "subtitles_provider.h"
+#include "subtitles_provider_manager.h"
 #include "ass_file.h"
 
 
diff --git a/aegisub/subtitle_format_dvd.cpp b/aegisub/subtitle_format_dvd.cpp
index b6a2a52169d91bcebce18af1ad5c888ac1fea4a5..f4fc676439631929a7ba93d7711e4eb3c24391aa 100644
--- a/aegisub/subtitle_format_dvd.cpp
+++ b/aegisub/subtitle_format_dvd.cpp
@@ -41,7 +41,7 @@
 // Headers
 #include "subtitle_format_dvd.h"
 #include "video_provider_dummy.h"
-#include "subtitles_provider.h"
+#include "subtitles_provider_manager.h"
 #include "ass_dialogue.h"
 #include "ass_file.h"
 #ifdef _OPENMP
diff --git a/aegisub/subtitles_provider.cpp b/aegisub/subtitles_provider.cpp
index 1960988d5618469ade439889fde8b926aca8ded8..753fc3cd4f2b7ba9d07c3a9891cf6bf04d16de82 100644
--- a/aegisub/subtitles_provider.cpp
+++ b/aegisub/subtitles_provider.cpp
@@ -36,7 +36,7 @@
 
 ///////////
 // Headers
-#include "subtitles_provider.h"
+#include "subtitles_provider_manager.h"
 #ifdef WITH_CSRI
 #include "subtitles_provider_csri.h"
 #endif
diff --git a/aegisub/subtitles_provider_csri.h b/aegisub/subtitles_provider_csri.h
index 8a03f045f59c5d6744711608166de887e2510ad0..a0b899f2039e857d7e529bf43bc06be6f623cce8 100644
--- a/aegisub/subtitles_provider_csri.h
+++ b/aegisub/subtitles_provider_csri.h
@@ -40,7 +40,7 @@
 #ifdef WITH_CSRI
 
 #include <wx/wxprec.h>
-#include "subtitles_provider.h"
+#include "include/aegisub/subtitles_provider.h"
 #ifdef WIN32
 #define CSRIAPI
 #endif
diff --git a/aegisub/subtitles_provider_manager.h b/aegisub/subtitles_provider_manager.h
new file mode 100644
index 0000000000000000000000000000000000000000..d5ae146e8424490b024d9f80a65e357591819e9d
--- /dev/null
+++ b/aegisub/subtitles_provider_manager.h
@@ -0,0 +1,56 @@
+// Copyright (c) 2007, Rodrigo Braz Monteiro
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//   * Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//   * Redistributions in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//   * Neither the name of the Aegisub Group nor the names of its contributors
+//     may be used to endorse or promote products derived from this software
+//     without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// -----------------------------------------------------------------------------
+//
+// AEGISUB
+//
+// Website: http://aegisub.cellosoft.com
+// Contact: mailto:zeratul@cellosoft.com
+//
+
+
+#pragma once
+
+
+///////////
+// Headers
+#include <wx/wxprec.h>
+#include "include/aegisub/subtitles_provider.h"
+#include "video_frame.h"
+#include "factory_manager.h"
+
+
+///////////////////
+// Factory Manager
+class SubtitlesProviderFactoryManager : public FactoryManager<SubtitlesProviderFactory> {
+public:
+	static SubtitlesProvider *GetProvider();
+	static void RegisterProviders();
+	static bool ProviderAvailable();
+};
+
diff --git a/aegisub/video_box.cpp b/aegisub/video_box.cpp
index 8260391fa4703411d887a920f7be35826144b105..faae2688a1c1ae55a6793eb0ef639f8c2f055dfa 100644
--- a/aegisub/video_box.cpp
+++ b/aegisub/video_box.cpp
@@ -49,7 +49,7 @@
 #include "toggle_bitmap.h"
 #include "options.h"
 #include "subs_grid.h"
-#include "video_provider.h"
+#include "video_provider_manager.h"
 #include "ass_file.h"
 #include "ass_dialogue.h"
 #include "vfr.h"
diff --git a/aegisub/video_context.cpp b/aegisub/video_context.cpp
index 2d066e79391528456db66736d988baeb0171c2b8..07b711d247869fb0644f0e6e4a88a8a805b15fa8 100644
--- a/aegisub/video_context.cpp
+++ b/aegisub/video_context.cpp
@@ -51,9 +51,9 @@
 #include "utils.h"
 #include "video_display.h"
 #include "video_context.h"
-#include "video_provider.h"
+#include "video_provider_manager.h"
 #include "visual_tool.h"
-#include "subtitles_provider.h"
+#include "subtitles_provider_manager.h"
 #include "vfr.h"
 #include "ass_file.h"
 #include "ass_exporter.h"
diff --git a/aegisub/video_display.cpp b/aegisub/video_display.cpp
index 3b12ce08d1f035edfe2bf6e6c4aa074d9f6fd1bf..90e274e663ad705de5e05d911c76e2673d6e968c 100644
--- a/aegisub/video_display.cpp
+++ b/aegisub/video_display.cpp
@@ -51,7 +51,7 @@
 #include <wx/config.h>
 #include "utils.h"
 #include "video_display.h"
-#include "video_provider.h"
+#include "video_provider_manager.h"
 #include "vfr.h"
 #include "ass_file.h"
 #include "ass_time.h"
diff --git a/aegisub/video_provider_avs.h b/aegisub/video_provider_avs.h
index efdd176007521dc85e84b5ef1dff42e0c62c7906..931e1a301b19cd70da66862a1d4df9f9da9eb17e 100644
--- a/aegisub/video_provider_avs.h
+++ b/aegisub/video_provider_avs.h
@@ -39,8 +39,8 @@
 #include <wx/wxprec.h>
 #ifdef WITH_AVISYNTH
 #include "avisynth_wrap.h"
-#include "video_provider.h"
-#include "subtitles_provider.h"
+#include "include/aegisub/video_provider.h"
+#include "include/aegisub/subtitles_provider.h"
 
 
 ////////////
diff --git a/aegisub/video_provider_cache.h b/aegisub/video_provider_cache.h
index f15613582a4d4646538b4c96909b18ba5b3a910f..630a6ba7c6a298c25ed5c1e5915b116deed188b2 100644
--- a/aegisub/video_provider_cache.h
+++ b/aegisub/video_provider_cache.h
@@ -40,7 +40,7 @@
 //////////
 // Headers
 #include <list>
-#include "video_provider.h"
+#include "include/aegisub/video_provider.h"
 
 
 ////////////////
diff --git a/aegisub/video_provider_dshow.h b/aegisub/video_provider_dshow.h
index a774bd0dfadc35a5d6833cb042092450564a6c48..55a0d25bb421e8a642ba94a1a7554da8eec362c5 100644
--- a/aegisub/video_provider_dshow.h
+++ b/aegisub/video_provider_dshow.h
@@ -50,7 +50,7 @@
 #include <windows.h>
 #include <tchar.h>
 #include <initguid.h>
-#include "video_provider.h"
+#include "include/aegisub/video_provider.h"
 #include "videosink.h"
 
 
diff --git a/aegisub/video_provider_dummy.h b/aegisub/video_provider_dummy.h
index 90dd111021c3c2b2dd68d96a67cfc5ccd82da604..256aa00bee0974b5f0bccfdb2c85dfee3daf419a 100644
--- a/aegisub/video_provider_dummy.h
+++ b/aegisub/video_provider_dummy.h
@@ -41,7 +41,7 @@
 
 ///////////
 // Headers
-#include "video_provider.h"
+#include "include/aegisub/video_provider.h"
 #include <wx/colour.h>
 
 
diff --git a/aegisub/video_provider_lavc.h b/aegisub/video_provider_lavc.h
index 45951b26b510f55bbf115ec55d3ee7f8eb9f1586..85cf867be710596bbb601bf954db993d0619c8a9 100644
--- a/aegisub/video_provider_lavc.h
+++ b/aegisub/video_provider_lavc.h
@@ -47,7 +47,7 @@ extern "C" {
 #include <ffmpeg/avformat.h>
 #include <ffmpeg/swscale.h>
 }
-#include "video_provider.h"
+#include "include/aegisub/video_provider.h"
 #include "mkv_wrap.h"
 #include "lavc_file.h"
 
diff --git a/aegisub/video_provider.cpp b/aegisub/video_provider_manager.cpp
similarity index 99%
rename from aegisub/video_provider.cpp
rename to aegisub/video_provider_manager.cpp
index b70cb339f60edba852906a6d74071ed3b979211e..6dcb3202140a322ab09d94b8d6c221b801c2f58d 100644
--- a/aegisub/video_provider.cpp
+++ b/aegisub/video_provider_manager.cpp
@@ -36,7 +36,7 @@
 
 ///////////
 // Headers
-#include "video_provider.h"
+#include "video_provider_manager.h"
 #include "video_provider_dummy.h"
 #include "options.h"
 #include "vfr.h"
diff --git a/aegisub/video_provider_manager.h b/aegisub/video_provider_manager.h
new file mode 100644
index 0000000000000000000000000000000000000000..fc54e5a2661154d27e0304a9c34b519d0c3bea7c
--- /dev/null
+++ b/aegisub/video_provider_manager.h
@@ -0,0 +1,54 @@
+// Copyright (c) 2006-2008, Rodrigo Braz Monteiro, Fredrik Mellbin
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//   * Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//   * Redistributions in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//   * Neither the name of the Aegisub Group nor the names of its contributors
+//     may be used to endorse or promote products derived from this software
+//     without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// -----------------------------------------------------------------------------
+//
+// AEGISUB
+//
+// Website: http://aegisub.cellosoft.com
+// Contact: mailto:zeratul@cellosoft.com
+//
+
+
+#pragma once
+
+
+//////////
+// Headers
+#include <wx/intl.h>
+#include "include/aegisub/video_provider.h"
+#include "video_frame.h"
+#include "factory_manager.h"
+
+
+///////////////////
+// Factory Manager
+class VideoProviderFactoryManager : public FactoryManager<VideoProviderFactory> {
+public:
+	static void RegisterProviders();
+	static VideoProvider *GetProvider(wxString video,double fps=0.0);
+};
diff --git a/aegisub/visual_tool.cpp b/aegisub/visual_tool.cpp
index 3abdf6f41c2ac8e03cc89a48f4fbcc3c178ce55c..8399beebcb3ce0925be1091af32ed74cba1fcaa3 100644
--- a/aegisub/visual_tool.cpp
+++ b/aegisub/visual_tool.cpp
@@ -45,7 +45,7 @@
 #include <wx/wxprec.h>
 #include "visual_tool.h"
 #include "video_display.h"
-#include "video_provider.h"
+#include "video_provider_manager.h"
 #include "vfr.h"
 #include "ass_file.h"
 #include "ass_time.h"
diff --git a/build/aegisub_vs2008/aegisub_vs2008.vcproj b/build/aegisub_vs2008/aegisub_vs2008.vcproj
index 7ae93b0ee4ca7fa60d4cbf2efc41c6c6fb99df86..5661123d0e5d6dddff01bd1a054ca9583b4776a1 100644
--- a/build/aegisub_vs2008/aegisub_vs2008.vcproj
+++ b/build/aegisub_vs2008/aegisub_vs2008.vcproj
@@ -56,7 +56,7 @@
 				WarningLevel="3"
 				WarnAsError="true"
 				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="4"
+				DebugInformationFormat="3"
 				DisableSpecificWarnings="4267"
 				ForcedIncludeFiles="stdwx.h;config.h"
 			/>
@@ -489,10 +489,6 @@
 				RelativePath="..\..\aegisub\audio_player.cpp"
 				>
 			</File>
-			<File
-				RelativePath="..\..\aegisub\audio_player.h"
-				>
-			</File>
 			<File
 				RelativePath="..\..\aegisub\audio_player_alsa.cpp"
 				>
@@ -509,6 +505,10 @@
 				RelativePath="..\..\aegisub\audio_player_dsound.h"
 				>
 			</File>
+			<File
+				RelativePath="..\..\aegisub\audio_player_manager.h"
+				>
+			</File>
 			<File
 				RelativePath="..\..\aegisub\audio_player_openal.cpp"
 				>
@@ -537,10 +537,6 @@
 				RelativePath="..\..\aegisub\audio_provider.cpp"
 				>
 			</File>
-			<File
-				RelativePath="..\..\aegisub\audio_provider.h"
-				>
-			</File>
 			<File
 				RelativePath="..\..\aegisub\audio_provider_avs.cpp"
 				>
@@ -581,6 +577,10 @@
 				RelativePath="..\..\aegisub\audio_provider_lavc.h"
 				>
 			</File>
+			<File
+				RelativePath="..\..\aegisub\audio_provider_manager.h"
+				>
+			</File>
 			<File
 				RelativePath="..\..\aegisub\audio_provider_pcm.cpp"
 				>
@@ -1593,14 +1593,6 @@
 				RelativePath="..\..\aegisub\video_frame.h"
 				>
 			</File>
-			<File
-				RelativePath="..\..\aegisub\video_provider.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\..\aegisub\video_provider.h"
-				>
-			</File>
 			<File
 				RelativePath="..\..\aegisub\video_provider_avs.cpp"
 				>
@@ -1641,6 +1633,14 @@
 				RelativePath="..\..\aegisub\video_provider_lavc.h"
 				>
 			</File>
+			<File
+				RelativePath="..\..\aegisub\video_provider_manager.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\aegisub\video_provider_manager.h"
+				>
+			</File>
 			<File
 				RelativePath="..\..\aegisub\video_slider.cpp"
 				>
@@ -1658,15 +1658,15 @@
 				>
 			</File>
 			<File
-				RelativePath="..\..\aegisub\spellchecker.h"
+				RelativePath="..\..\aegisub\spellchecker_hunspell.cpp"
 				>
 			</File>
 			<File
-				RelativePath="..\..\aegisub\spellchecker_hunspell.cpp"
+				RelativePath="..\..\aegisub\spellchecker_hunspell.h"
 				>
 			</File>
 			<File
-				RelativePath="..\..\aegisub\spellchecker_hunspell.h"
+				RelativePath="..\..\aegisub\spellchecker_manager.h"
 				>
 			</File>
 			<File
@@ -1777,10 +1777,6 @@
 				RelativePath="..\..\aegisub\subtitles_provider.cpp"
 				>
 			</File>
-			<File
-				RelativePath="..\..\aegisub\subtitles_provider.h"
-				>
-			</File>
 			<File
 				RelativePath="..\..\aegisub\subtitles_provider_csri.cpp"
 				>
@@ -1797,6 +1793,10 @@
 				RelativePath="..\..\aegisub\subtitles_provider_libass.h"
 				>
 			</File>
+			<File
+				RelativePath="..\..\aegisub\subtitles_provider_manager.h"
+				>
+			</File>
 		</Filter>
 		<Filter
 			Name="Visual Tools"
@@ -1902,6 +1902,34 @@
 				</File>
 			</Filter>
 		</Filter>
+		<Filter
+			Name="Include"
+			>
+			<File
+				RelativePath="..\..\aegisub\include\aegisub\aegisub.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\aegisub\include\aegisub\audio_player.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\aegisub\include\aegisub\audio_provider.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\aegisub\include\aegisub\spellchecker.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\aegisub\include\aegisub\subtitles_provider.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\aegisub\include\aegisub\video_provider.h"
+				>
+			</File>
+		</Filter>
 		<File
 			RelativePath="..\..\aegisub\changelog.txt"
 			>
diff --git a/vsfilter/vsfilter_2008.sln b/vsfilter/vsfilter_2008.sln
index 790064f0eaebbb093b28d100d88a03203e3b4021..94e30770e718ffb4e22b088a7637cffa4a558613 100644
--- a/vsfilter/vsfilter_2008.sln
+++ b/vsfilter/vsfilter_2008.sln
@@ -7,6 +7,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vsfilter_2008", "vsfilter_2
 		{5F6E4984-0E0A-468D-8EF5-AE52AE8CBBF6} = {5F6E4984-0E0A-468D-8EF5-AE52AE8CBBF6}
 		{6BB08A9D-BBD3-433A-A6D9-079C84EBE270} = {6BB08A9D-BBD3-433A-A6D9-079C84EBE270}
 		{B0CD35D2-65C8-48D0-BEC8-D235137F62F6} = {B0CD35D2-65C8-48D0-BEC8-D235137F62F6}
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA} = {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}
 	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basevideofilter_2008", "basevideofilter\basevideofilter_2008.vcproj", "{B0CD35D2-65C8-48D0-BEC8-D235137F62F6}"
@@ -23,36 +24,108 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "subtitles_2008", "subtitles
 		{971851AB-A612-4F2F-866F-F0FA152EFFB2} = {971851AB-A612-4F2F-866F-F0FA152EFFB2}
 	EndProjectSection
 EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "baseclasses", "C:\Program Files (x86)\Microsoft Platform SDK for Windows Server 2003 R2\Samples\Multimedia\DirectShow\BaseClasses\baseclasses.vcproj", "{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug_MBCS|Win32 = Debug_MBCS|Win32
+		Debug_MBCS|x64 = Debug_MBCS|x64
 		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Release_MBCS|Win32 = Release_MBCS|Win32
+		Release_MBCS|x64 = Release_MBCS|x64
 		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{7A3950FD-A235-459A-ACA2-5170863CD32C}.Debug_MBCS|Win32.ActiveCfg = Debug|Win32
+		{7A3950FD-A235-459A-ACA2-5170863CD32C}.Debug_MBCS|Win32.Build.0 = Debug|Win32
+		{7A3950FD-A235-459A-ACA2-5170863CD32C}.Debug_MBCS|x64.ActiveCfg = Debug|Win32
 		{7A3950FD-A235-459A-ACA2-5170863CD32C}.Debug|Win32.ActiveCfg = Debug|Win32
 		{7A3950FD-A235-459A-ACA2-5170863CD32C}.Debug|Win32.Build.0 = Debug|Win32
+		{7A3950FD-A235-459A-ACA2-5170863CD32C}.Debug|x64.ActiveCfg = Debug|Win32
+		{7A3950FD-A235-459A-ACA2-5170863CD32C}.Release_MBCS|Win32.ActiveCfg = Release|Win32
+		{7A3950FD-A235-459A-ACA2-5170863CD32C}.Release_MBCS|Win32.Build.0 = Release|Win32
+		{7A3950FD-A235-459A-ACA2-5170863CD32C}.Release_MBCS|x64.ActiveCfg = Release|Win32
 		{7A3950FD-A235-459A-ACA2-5170863CD32C}.Release|Win32.ActiveCfg = Release|Win32
 		{7A3950FD-A235-459A-ACA2-5170863CD32C}.Release|Win32.Build.0 = Release|Win32
+		{7A3950FD-A235-459A-ACA2-5170863CD32C}.Release|x64.ActiveCfg = Release|Win32
+		{B0CD35D2-65C8-48D0-BEC8-D235137F62F6}.Debug_MBCS|Win32.ActiveCfg = Debug|Win32
+		{B0CD35D2-65C8-48D0-BEC8-D235137F62F6}.Debug_MBCS|Win32.Build.0 = Debug|Win32
+		{B0CD35D2-65C8-48D0-BEC8-D235137F62F6}.Debug_MBCS|x64.ActiveCfg = Debug|Win32
 		{B0CD35D2-65C8-48D0-BEC8-D235137F62F6}.Debug|Win32.ActiveCfg = Debug|Win32
 		{B0CD35D2-65C8-48D0-BEC8-D235137F62F6}.Debug|Win32.Build.0 = Debug|Win32
+		{B0CD35D2-65C8-48D0-BEC8-D235137F62F6}.Debug|x64.ActiveCfg = Debug|Win32
+		{B0CD35D2-65C8-48D0-BEC8-D235137F62F6}.Release_MBCS|Win32.ActiveCfg = Release|Win32
+		{B0CD35D2-65C8-48D0-BEC8-D235137F62F6}.Release_MBCS|Win32.Build.0 = Release|Win32
+		{B0CD35D2-65C8-48D0-BEC8-D235137F62F6}.Release_MBCS|x64.ActiveCfg = Release|Win32
 		{B0CD35D2-65C8-48D0-BEC8-D235137F62F6}.Release|Win32.ActiveCfg = Release|Win32
 		{B0CD35D2-65C8-48D0-BEC8-D235137F62F6}.Release|Win32.Build.0 = Release|Win32
+		{B0CD35D2-65C8-48D0-BEC8-D235137F62F6}.Release|x64.ActiveCfg = Release|Win32
+		{5F6E4984-0E0A-468D-8EF5-AE52AE8CBBF6}.Debug_MBCS|Win32.ActiveCfg = Debug|Win32
+		{5F6E4984-0E0A-468D-8EF5-AE52AE8CBBF6}.Debug_MBCS|Win32.Build.0 = Debug|Win32
+		{5F6E4984-0E0A-468D-8EF5-AE52AE8CBBF6}.Debug_MBCS|x64.ActiveCfg = Debug|Win32
 		{5F6E4984-0E0A-468D-8EF5-AE52AE8CBBF6}.Debug|Win32.ActiveCfg = Debug|Win32
 		{5F6E4984-0E0A-468D-8EF5-AE52AE8CBBF6}.Debug|Win32.Build.0 = Debug|Win32
+		{5F6E4984-0E0A-468D-8EF5-AE52AE8CBBF6}.Debug|x64.ActiveCfg = Debug|Win32
+		{5F6E4984-0E0A-468D-8EF5-AE52AE8CBBF6}.Release_MBCS|Win32.ActiveCfg = Release|Win32
+		{5F6E4984-0E0A-468D-8EF5-AE52AE8CBBF6}.Release_MBCS|Win32.Build.0 = Release|Win32
+		{5F6E4984-0E0A-468D-8EF5-AE52AE8CBBF6}.Release_MBCS|x64.ActiveCfg = Release|Win32
 		{5F6E4984-0E0A-468D-8EF5-AE52AE8CBBF6}.Release|Win32.ActiveCfg = Release|Win32
 		{5F6E4984-0E0A-468D-8EF5-AE52AE8CBBF6}.Release|Win32.Build.0 = Release|Win32
+		{5F6E4984-0E0A-468D-8EF5-AE52AE8CBBF6}.Release|x64.ActiveCfg = Release|Win32
+		{971851AB-A612-4F2F-866F-F0FA152EFFB2}.Debug_MBCS|Win32.ActiveCfg = Debug|Win32
+		{971851AB-A612-4F2F-866F-F0FA152EFFB2}.Debug_MBCS|Win32.Build.0 = Debug|Win32
+		{971851AB-A612-4F2F-866F-F0FA152EFFB2}.Debug_MBCS|x64.ActiveCfg = Debug|Win32
 		{971851AB-A612-4F2F-866F-F0FA152EFFB2}.Debug|Win32.ActiveCfg = Debug|Win32
 		{971851AB-A612-4F2F-866F-F0FA152EFFB2}.Debug|Win32.Build.0 = Debug|Win32
+		{971851AB-A612-4F2F-866F-F0FA152EFFB2}.Debug|x64.ActiveCfg = Debug|Win32
+		{971851AB-A612-4F2F-866F-F0FA152EFFB2}.Release_MBCS|Win32.ActiveCfg = Release|Win32
+		{971851AB-A612-4F2F-866F-F0FA152EFFB2}.Release_MBCS|Win32.Build.0 = Release|Win32
+		{971851AB-A612-4F2F-866F-F0FA152EFFB2}.Release_MBCS|x64.ActiveCfg = Release|Win32
 		{971851AB-A612-4F2F-866F-F0FA152EFFB2}.Release|Win32.ActiveCfg = Release|Win32
 		{971851AB-A612-4F2F-866F-F0FA152EFFB2}.Release|Win32.Build.0 = Release|Win32
+		{971851AB-A612-4F2F-866F-F0FA152EFFB2}.Release|x64.ActiveCfg = Release|Win32
+		{11B20554-2747-469C-9093-3345B1D99E0C}.Debug_MBCS|Win32.ActiveCfg = Debug|Win32
+		{11B20554-2747-469C-9093-3345B1D99E0C}.Debug_MBCS|Win32.Build.0 = Debug|Win32
+		{11B20554-2747-469C-9093-3345B1D99E0C}.Debug_MBCS|x64.ActiveCfg = Debug|Win32
 		{11B20554-2747-469C-9093-3345B1D99E0C}.Debug|Win32.ActiveCfg = Debug|Win32
 		{11B20554-2747-469C-9093-3345B1D99E0C}.Debug|Win32.Build.0 = Debug|Win32
+		{11B20554-2747-469C-9093-3345B1D99E0C}.Debug|x64.ActiveCfg = Debug|Win32
+		{11B20554-2747-469C-9093-3345B1D99E0C}.Release_MBCS|Win32.ActiveCfg = Release|Win32
+		{11B20554-2747-469C-9093-3345B1D99E0C}.Release_MBCS|Win32.Build.0 = Release|Win32
+		{11B20554-2747-469C-9093-3345B1D99E0C}.Release_MBCS|x64.ActiveCfg = Release|Win32
 		{11B20554-2747-469C-9093-3345B1D99E0C}.Release|Win32.ActiveCfg = Release|Win32
 		{11B20554-2747-469C-9093-3345B1D99E0C}.Release|Win32.Build.0 = Release|Win32
+		{11B20554-2747-469C-9093-3345B1D99E0C}.Release|x64.ActiveCfg = Release|Win32
+		{6BB08A9D-BBD3-433A-A6D9-079C84EBE270}.Debug_MBCS|Win32.ActiveCfg = Debug|Win32
+		{6BB08A9D-BBD3-433A-A6D9-079C84EBE270}.Debug_MBCS|Win32.Build.0 = Debug|Win32
+		{6BB08A9D-BBD3-433A-A6D9-079C84EBE270}.Debug_MBCS|x64.ActiveCfg = Debug|Win32
 		{6BB08A9D-BBD3-433A-A6D9-079C84EBE270}.Debug|Win32.ActiveCfg = Debug|Win32
 		{6BB08A9D-BBD3-433A-A6D9-079C84EBE270}.Debug|Win32.Build.0 = Debug|Win32
+		{6BB08A9D-BBD3-433A-A6D9-079C84EBE270}.Debug|x64.ActiveCfg = Debug|Win32
+		{6BB08A9D-BBD3-433A-A6D9-079C84EBE270}.Release_MBCS|Win32.ActiveCfg = Release|Win32
+		{6BB08A9D-BBD3-433A-A6D9-079C84EBE270}.Release_MBCS|Win32.Build.0 = Release|Win32
+		{6BB08A9D-BBD3-433A-A6D9-079C84EBE270}.Release_MBCS|x64.ActiveCfg = Release|Win32
 		{6BB08A9D-BBD3-433A-A6D9-079C84EBE270}.Release|Win32.ActiveCfg = Release|Win32
 		{6BB08A9D-BBD3-433A-A6D9-079C84EBE270}.Release|Win32.Build.0 = Release|Win32
+		{6BB08A9D-BBD3-433A-A6D9-079C84EBE270}.Release|x64.ActiveCfg = Release|Win32
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug_MBCS|Win32.ActiveCfg = Debug_MBCS|Win32
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug_MBCS|Win32.Build.0 = Debug_MBCS|Win32
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug_MBCS|x64.ActiveCfg = Debug_MBCS|x64
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug_MBCS|x64.Build.0 = Debug_MBCS|x64
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|Win32.ActiveCfg = Debug|Win32
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|Win32.Build.0 = Debug|Win32
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|x64.ActiveCfg = Debug|x64
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|x64.Build.0 = Debug|x64
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_MBCS|Win32.ActiveCfg = Release_MBCS|Win32
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_MBCS|Win32.Build.0 = Release_MBCS|Win32
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_MBCS|x64.ActiveCfg = Release_MBCS|x64
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_MBCS|x64.Build.0 = Release_MBCS|x64
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release|Win32.ActiveCfg = Release|Win32
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release|Win32.Build.0 = Release|Win32
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release|x64.ActiveCfg = Release|x64
+		{E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/vsfilter/vsfilter_2008.vcproj b/vsfilter/vsfilter_2008.vcproj
index e21705f7aec5fa130811065dba1e12e4d5e75095..653ea09dbec586e2e1ce3b9e40a1b0a8921928bc 100644
--- a/vsfilter/vsfilter_2008.vcproj
+++ b/vsfilter/vsfilter_2008.vcproj
@@ -147,7 +147,7 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="delayimp.lib strmbaseu.lib winmm.lib"
+				AdditionalDependencies="delayimp.lib winmm.lib"
 				LinkIncremental="1"
 				AdditionalLibraryDirectories="..\lib"
 				ModuleDefinitionFile=".\vsfilter.def"