diff --git a/aegisub/include/aegisub/aegisub.h b/aegisub/include/aegisub/aegisub.h
index 721314d410a18b25ee16376b2d2d71da12c32a3e..385b689015cc275f55be22979c33425da98c87e2 100644
--- a/aegisub/include/aegisub/aegisub.h
+++ b/aegisub/include/aegisub/aegisub.h
@@ -52,6 +52,9 @@ namespace Aegisub {
 
 	// String array
 	typedef std::vector<String> StringArray;
+
+	// Integer array
+	typedef std::vector<int> IntArray;
 };
 
 
diff --git a/aegisub/include/aegisub/video_provider.h b/aegisub/include/aegisub/video_provider.h
index bfd9c43fc6b079bd68b418524e0edc37fd647a65..b7f66ad3f38afeb7dc29509a2afccd93bd6e3183 100644
--- a/aegisub/include/aegisub/video_provider.h
+++ b/aegisub/include/aegisub/video_provider.h
@@ -66,17 +66,17 @@ public:
 	virtual double GetFPS()=0;					// Get framerate in frames per second
 
 	// Use this to set any post-loading warnings, such as "being loaded with unreliable seeking"
-	virtual wxString GetWarning() { return _T(""); }
+	virtual Aegisub::String GetWarning() { return L""; }
 
 	// Name of decoder, e.g. "Avisynth/FFMPegSource"
-	virtual wxString GetDecoderName() { return _("Unknown"); }
+	virtual Aegisub::String GetDecoderName() { return L"Unknown"; }
 
 	// How many frames does this provider wants that Aegisub caches? Set to 0 if it doesn't require caching.
 	virtual int GetDesiredCacheSize() { return 0; }
 
 	// For providers that are natively time-based (e.g. DirectShow)
 	virtual bool IsNativelyByFrames() { return true; }
-	virtual void OverrideFrameTimeList(wxArrayInt list) {}	// Override the list with the provided one, for VFR handling
+	virtual void OverrideFrameTimeList(Aegisub::IntArray list) {}	// Override the list with the provided one, for VFR handling
 
 	// If this video provider has a built-in subtitles provider, return that
 	virtual SubtitlesProvider *GetAsSubtitlesProvider() { return NULL; }
@@ -87,5 +87,5 @@ public:
 // Factory
 class VideoProviderFactory {
 public:
-	virtual VideoProvider *CreateProvider(wxString video,double fps=0.0)=0;
+	virtual VideoProvider *CreateProvider(Aegisub::String video,double fps=0.0)=0;
 };
diff --git a/aegisub/vfr.cpp b/aegisub/vfr.cpp
index 14f742fb2eda19b5cb8a207174c25e7c58644bb2..5ea76283f0ea48252c447528da588a09f5430389 100644
--- a/aegisub/vfr.cpp
+++ b/aegisub/vfr.cpp
@@ -404,10 +404,8 @@ int FrameRate::GetTimeAtFrame(int frame,bool start,bool exact) {
 
 ////////////////////////////////////////
 // Get the current list of frames/times
-wxArrayInt FrameRate::GetFrameTimeList() {
-	wxArrayInt final;
-	for (unsigned int i=0;i<Frame.size();i++) final.Add(Frame[i]);
-	return final;
+Aegisub::IntArray FrameRate::GetFrameTimeList() {
+	return Frame;
 }
 
 
diff --git a/aegisub/vfr.h b/aegisub/vfr.h
index bf6109f06ed23f386396cbe9c4c9955be741f54b..5ded182d21ddea17fbcfc90d4c334c49e26c7d45 100644
--- a/aegisub/vfr.h
+++ b/aegisub/vfr.h
@@ -47,6 +47,7 @@
 #include <vector>
 #include <wx/wxprec.h>
 #include <wx/dynarray.h>
+#include "include/aegisub/aegisub.h"
 
 
 ///////////////////////
@@ -65,7 +66,7 @@ class FrameRate {
 private:
 	double last_time;
 	int last_frame;
-	std::vector<int> Frame;
+	Aegisub::IntArray Frame;
 
 	// contains the assumed fps for v1 timecodes, average for v2 and actual fps for cfr
 	double AverageFrameRate; 
@@ -101,7 +102,7 @@ public:
 	ASS_FrameRateType GetFrameRateType() { return FrameRateType; };
 	wxString GetFilename() { return vfrFile; };
 
-	wxArrayInt GetFrameTimeList();
+	Aegisub::IntArray GetFrameTimeList();
 	double GetCommonFPS();
 };
 
diff --git a/aegisub/video_provider_avs.cpp b/aegisub/video_provider_avs.cpp
index b7f39a3a343da309ac06861bad70265c100f6573..aa1831b5facd2a63fd92f923e9e7bc0f25936d34 100644
--- a/aegisub/video_provider_avs.cpp
+++ b/aegisub/video_provider_avs.cpp
@@ -52,7 +52,7 @@
 
 ///////////////
 // Constructor
-AvisynthVideoProvider::AvisynthVideoProvider(wxString _filename, double _fps) {
+AvisynthVideoProvider::AvisynthVideoProvider(Aegisub::String _filename, double _fps) {
 	AVSTRACE(wxString::Format(_T("AvisynthVideoProvider: Creating new AvisynthVideoProvider: \"%s\", \"%s\""), _filename, _subfilename));
 	bool mpeg2dec3_priority = true;
 	RGB32Video = NULL;
@@ -97,7 +97,7 @@ AvisynthVideoProvider::~AvisynthVideoProvider() {
 
 /////////////////////////////////////////
 // Actually open the video into Avisynth
-PClip AvisynthVideoProvider::OpenVideo(wxString _filename, bool mpeg2dec3_priority) {
+PClip AvisynthVideoProvider::OpenVideo(Aegisub::String _filename, bool mpeg2dec3_priority) {
 	AVSTRACE(_T("AvisynthVideoProvider::OpenVideo: Opening video"));
 	wxMutexLocker lock(AviSynthMutex);
 	AVSTRACE(_T("AvisynthVideoProvider::OpenVideo: Got AVS mutex"));
@@ -107,7 +107,7 @@ PClip AvisynthVideoProvider::OpenVideo(wxString _filename, bool mpeg2dec3_priori
 	usedDirectShow = false;
 	decoderName = _("Unknown");
 
-	wxString extension = _filename.Right(4);
+	wxString extension = wxString(_filename.c_str()).Right(4);
 	extension.LowerCase();
 
 	try {
@@ -369,7 +369,7 @@ const AegiVideoFrame AvisynthVideoProvider::GetFrame(int _n,int formatMask) {
 
 ////////////////////////////////////////////////////////
 // Apply VSFilter subtitles, or whatever is appropriate
-PClip AvisynthVideoProvider::ApplySubtitles(wxString _filename, PClip videosource) {
+PClip AvisynthVideoProvider::ApplySubtitles(Aegisub::String _filename, PClip videosource) {
 	AVSTRACE(_T("AvisynthVideoProvider::ApplySutitles: Applying subtitles"));
 	wxMutexLocker lock(AviSynthMutex);
 	AVSTRACE(_T("AvisynthVideoProvider::ApplySutitles: Got AVS mutex"));
@@ -383,7 +383,7 @@ PClip AvisynthVideoProvider::ApplySubtitles(wxString _filename, PClip videosourc
 
 	try {
 		AVSTRACE(_T("AvisynthVideoProvider::ApplySutitles: Now invoking ") + rendererCallString);
-		script = env->Invoke(rendererCallString.mb_str(wxConvUTF8), AVSValue(args,2));
+		script = env->Invoke(wxString(rendererCallString.c_str()).mb_str(wxConvUTF8), AVSValue(args,2));
 		AVSTRACE(_T("AvisynthVideoProvider::ApplySutitles: Invoked successfully"));
 	}
 	catch (AvisynthError &err) {
@@ -422,7 +422,7 @@ void AvisynthVideoProvider::LoadSubtitles(AssFile *subs) {
 	delete subs;
 
 	// Load subtitles
-	SubtitledVideo = ApplySubtitles(subfilename, RGB32Video);
+	SubtitledVideo = ApplySubtitles(subfilename.c_str(), RGB32Video);
 	AVSTRACE(_T("AvisynthVideoProvider::RefreshSubtitles: Subtitles refreshed"));
 	vi = SubtitledVideo->GetVideoInfo();
 	AVSTRACE(_T("AvisynthVideoProvider: Got video info"));
@@ -527,9 +527,9 @@ void AvisynthVideoProvider::OverrideFrameTimeList(wxArrayInt list) {
 
 ///////////////
 // Get warning
-wxString AvisynthVideoProvider::GetWarning() {
-	if (usedDirectShow) return _("Warning! The file is being opened using Avisynth's DirectShowSource, which has unreliable seeking. Frame numbers might not match the real number. PROCEED AT YOUR OWN RISK!");
-	else return _T("");
+Aegisub::String AvisynthVideoProvider::GetWarning() {
+	if (usedDirectShow) return L"Warning! The file is being opened using Avisynth's DirectShowSource, which has unreliable seeking. Frame numbers might not match the real number. PROCEED AT YOUR OWN RISK!";
+	else return L"";
 }
 
 #endif
diff --git a/aegisub/video_provider_avs.h b/aegisub/video_provider_avs.h
index 931e1a301b19cd70da66862a1d4df9f9da9eb17e..da82d9202ba5a06c3a67dea03557545b9c920fba 100644
--- a/aegisub/video_provider_avs.h
+++ b/aegisub/video_provider_avs.h
@@ -51,8 +51,8 @@ private:
 	AegiVideoFrame iframe;
 
 	bool usedDirectShow;
-	wxString rendererCallString;
-	wxString decoderName;
+	Aegisub::String rendererCallString;
+	Aegisub::String decoderName;
 
 	int num_frames;
 	int last_fnum;
@@ -64,15 +64,15 @@ private:
 	PClip RGB32Video;
 	PClip SubtitledVideo;
 
-	PClip OpenVideo(wxString _filename, bool mpeg2dec3_priority = true);
-	PClip ApplySubtitles(wxString _filename, PClip videosource);
+	PClip OpenVideo(Aegisub::String _filename, bool mpeg2dec3_priority = true);
+	PClip ApplySubtitles(Aegisub::String _filename, PClip videosource);
 
 	void LoadVSFilter();
 	void LoadASA();
 	void LoadRenderer();
 
 public:
-	AvisynthVideoProvider(wxString _filename, double fps=0.0);
+	AvisynthVideoProvider(Aegisub::String _filename, double fps=0.0);
 	~AvisynthVideoProvider();
 
 	SubtitlesProvider *GetAsSubtitlesProvider();
@@ -91,8 +91,8 @@ public:
 
 	void OverrideFrameTimeList(wxArrayInt list);
 	bool IsNativelyByFrames() { return byFrame; }
-	wxString GetWarning();
-	wxString GetDecoderName() { return _T("Avisynth/") + decoderName; }
+	Aegisub::String GetWarning();
+	Aegisub::String GetDecoderName() { return Aegisub::String(L"Avisynth/") + decoderName; }
 };
 
 
@@ -100,7 +100,7 @@ public:
 // Factory
 class AvisynthVideoProviderFactory : public VideoProviderFactory {
 public:
-	VideoProvider *CreateProvider(wxString video,double fps=0.0) { return new AvisynthVideoProvider(video,fps); }
+	VideoProvider *CreateProvider(Aegisub::String video,double fps=0.0) { return new AvisynthVideoProvider(video,fps); }
 };
 
 
diff --git a/aegisub/video_provider_cache.cpp b/aegisub/video_provider_cache.cpp
index 00c13929b0ae90bd866ce0e9a5c8c30c6bebc017..dbaff1bcf4924eefd2c0dca6585a9c0c5c0c2a05 100644
--- a/aegisub/video_provider_cache.cpp
+++ b/aegisub/video_provider_cache.cpp
@@ -162,15 +162,15 @@ int VideoProviderCache::GetHeight() {
 double VideoProviderCache::GetFPS() {
 	return master->GetFPS();
 }
-void VideoProviderCache::OverrideFrameTimeList(wxArrayInt list) {
+void VideoProviderCache::OverrideFrameTimeList(Aegisub::IntArray list) {
 	master->OverrideFrameTimeList(list);
 }
 bool VideoProviderCache::IsNativelyByFrames() {
 	return master->IsNativelyByFrames();
 }
-wxString VideoProviderCache::GetWarning() {
+Aegisub::String VideoProviderCache::GetWarning() {
 	return master->GetWarning();
 }
-wxString VideoProviderCache::GetDecoderName() {
+Aegisub::String VideoProviderCache::GetDecoderName() {
 	return master->GetDecoderName();
 }
diff --git a/aegisub/video_provider_cache.h b/aegisub/video_provider_cache.h
index 630a6ba7c6a298c25ed5c1e5915b116deed188b2..408da0f1cb5d5fa943da19dfebd1d777b29cfa69 100644
--- a/aegisub/video_provider_cache.h
+++ b/aegisub/video_provider_cache.h
@@ -86,8 +86,8 @@ public:
 	virtual int GetWidth();					// Returns the video width in pixels
 	virtual int GetHeight();				// Returns the video height in pixels
 	virtual double GetFPS();				// Get framerate in frames per second
-	virtual void OverrideFrameTimeList(wxArrayInt list);	// Override the list with the provided one, for VFR handling
+	virtual void OverrideFrameTimeList(Aegisub::IntArray list);	// Override the list with the provided one, for VFR handling
 	virtual bool IsNativelyByFrames();
-	virtual wxString GetWarning();
-	virtual wxString GetDecoderName();
+	virtual Aegisub::String GetWarning();
+	virtual Aegisub::String GetDecoderName();
 };
diff --git a/aegisub/video_provider_dshow.cpp b/aegisub/video_provider_dshow.cpp
index 532d61063e0717aec19e1a6d1fd711486e3c41a3..3e15493917acd1e021061e45e34df5cc2efadfe6 100644
--- a/aegisub/video_provider_dshow.cpp
+++ b/aegisub/video_provider_dshow.cpp
@@ -62,7 +62,7 @@
 ///////////////
 // Constructor
 // Based on Haali's code for DirectShowSource2
-DirectShowVideoProvider::DirectShowVideoProvider(wxString _filename, double _fps) {
+DirectShowVideoProvider::DirectShowVideoProvider(Aegisub::String _filename, double _fps) {
 	fps = _fps;
 	m_registered = false;
 	m_hFrameReady = CreateEvent(NULL, FALSE, FALSE, NULL);
@@ -387,17 +387,17 @@ int DirectShowVideoProvider::NextFrame(DF &df,int &_fn) {
 		if (df.timestamp >= 0) {
 			// CFR frame number
 			int frameno = -1;
-			if (frameTime.Count() == 0) frameno = (int)((double)df.timestamp / defd + 0.5);
+			if (frameTime.size() == 0) frameno = (int)((double)df.timestamp / defd + 0.5);
 
 			// VFR
 			else {
-				for (unsigned int i=0;i<frameTime.Count();i++) {
+				for (unsigned int i=0;i<frameTime.size();i++) {
 					if (df.timestamp < (int64_t) frameTime[i] * 10000) {
 						frameno = i-1;
 						break;
 					}
 				}
-				if (frameno == -1) frameno = frameTime.Count()-1;
+				if (frameno == -1) frameno = frameTime.size()-1;
 			}
 
 			// Got a good one
@@ -427,7 +427,7 @@ const AegiVideoFrame DirectShowVideoProvider::GetFrame(int n,int formatMask) {
 	// Time to seek to
 	REFERENCE_TIME cur;
 	cur = defd * n + 10001;
-	if (frameTime.Count() > (unsigned) n) cur = frameTime[n] * 10000 + 10001;
+	if (frameTime.size() > (unsigned) n) cur = frameTime[n] * 10000 + 10001;
 	if (cur < 0) cur = 0;
 
 	// Is next
@@ -505,9 +505,9 @@ void DirectShowVideoProvider::GetFloatFrame(float* Buffer, int n) {
 
 ////////////////////////
 // Override frame times
-void DirectShowVideoProvider::OverrideFrameTimeList(wxArrayInt list) {
+void DirectShowVideoProvider::OverrideFrameTimeList(Aegisub::IntArray list) {
 	frameTime = list;
-	num_frames = frameTime.Count();
+	num_frames = frameTime.size();
 }
 
 #endif
diff --git a/aegisub/video_provider_dshow.h b/aegisub/video_provider_dshow.h
index 55a0d25bb421e8a642ba94a1a7554da8eec362c5..6741347bc8d38ce3a92972d860053560a209959d 100644
--- a/aegisub/video_provider_dshow.h
+++ b/aegisub/video_provider_dshow.h
@@ -69,7 +69,7 @@ class DirectShowVideoProvider: public VideoProvider {
 	};
 
 private:
-	wxArrayInt frameTime;
+	Aegisub::IntArray frameTime;
 
 	unsigned int last_fnum;
 	unsigned int width;
@@ -97,7 +97,7 @@ private:
 	DWORD                   m_rot_cookie;
 
 public:
-	DirectShowVideoProvider(wxString _filename, double _fps=0.0);
+	DirectShowVideoProvider(Aegisub::String _filename, double _fps=0.0);
 	~DirectShowVideoProvider();
 
 	void RefreshSubtitles();
@@ -110,10 +110,10 @@ public:
 	double GetFPS() { return fps; };
 	int GetWidth() { return width; };
 	int GetHeight() { return height; };
-	wxString GetDecoderName() { return _("DirectShow"); }
+	Aegisub::String GetDecoderName() { return L"DirectShow"; }
 	bool IsNativelyByFrames() { return false; }
 
-	void OverrideFrameTimeList(wxArrayInt list);
+	void OverrideFrameTimeList(Aegisub::IntArray list);
 	int GetDesiredCacheSize() { return 8; }
 };
 
@@ -123,7 +123,7 @@ public:
 // Factory
 class DirectShowVideoProviderFactory : public VideoProviderFactory {
 public:
-	VideoProvider *CreateProvider(wxString video,double fps=0.0) { return new DirectShowVideoProvider(video,fps); }
+	VideoProvider *CreateProvider(Aegisub::String video,double fps=0.0) { return new DirectShowVideoProvider(video,fps); }
 };
 
 #endif
diff --git a/aegisub/video_provider_dummy.cpp b/aegisub/video_provider_dummy.cpp
index 3422fbf1e4e5a220f79c8141d785819713214eff..77754c33cd552dd1671d5276ef9acadc7b5edbb9 100644
--- a/aegisub/video_provider_dummy.cpp
+++ b/aegisub/video_provider_dummy.cpp
@@ -119,8 +119,9 @@ void DummyVideoProvider::Create(double _fps, int frames, int _width, int _height
 
 ///////////////////////
 // Parsing constructor
-DummyVideoProvider::DummyVideoProvider(wxString filename, double _fps)
+DummyVideoProvider::DummyVideoProvider(Aegisub::String _filename, double _fps)
 {
+	wxString filename = _filename;
 	wxString params;
 	if (!filename.StartsWith(_T("?dummy:"), &params)) {
 		throw _T("Attempted creating dummy video provider with non-dummy filename");
@@ -246,7 +247,7 @@ double DummyVideoProvider::GetFPS() {
 
 ////////////////////
 // Get decoder name
-wxString DummyVideoProvider::GetDecoderName() {
-	return _("Dummy Video Provider");
+Aegisub::String DummyVideoProvider::GetDecoderName() {
+	return L"Dummy Video Provider";
 }
 
diff --git a/aegisub/video_provider_dummy.h b/aegisub/video_provider_dummy.h
index 256aa00bee0974b5f0bccfdb2c85dfee3daf419a..2377a775b744c5d442f19f63ec558d65f9bf1ff0 100644
--- a/aegisub/video_provider_dummy.h
+++ b/aegisub/video_provider_dummy.h
@@ -59,7 +59,7 @@ private:
 	void Create(double fps, int frames, int _width, int _height, const wxColour &colour, bool pattern);
 
 public:
-	DummyVideoProvider(wxString filename, double fps);
+	DummyVideoProvider(Aegisub::String filename, double fps);
 	DummyVideoProvider(double fps, int frames, int _width, int _height, const wxColour &colour, bool pattern);
 	~DummyVideoProvider();
 
@@ -72,7 +72,7 @@ public:
 	int GetWidth();
 	int GetHeight();
 	double GetFPS();
-	wxString GetDecoderName();
+	Aegisub::String GetDecoderName();
 };
 
 #endif
diff --git a/aegisub/video_provider_manager.cpp b/aegisub/video_provider_manager.cpp
index 6dcb3202140a322ab09d94b8d6c221b801c2f58d..2125ddb8190c31eb587df04340410c3cb9352cb8 100644
--- a/aegisub/video_provider_manager.cpp
+++ b/aegisub/video_provider_manager.cpp
@@ -58,7 +58,7 @@
 VideoProvider *VideoProviderFactoryManager::GetProvider(wxString video,double fps) {
 	// First check special case of dummy video
 	if (video.StartsWith(_T("?dummy:"))) {
-		return new DummyVideoProvider(video, fps);
+		return new DummyVideoProvider(video.c_str(), fps);
 	}
 
 	// List of providers
@@ -72,7 +72,7 @@ VideoProvider *VideoProviderFactoryManager::GetProvider(wxString video,double fp
 	for (unsigned int i=0;i<list.Count();i++) {
 		try {
 			// Create provider
-			VideoProvider *provider = GetFactory(list[i])->CreateProvider(video,fps);
+			VideoProvider *provider = GetFactory(list[i])->CreateProvider(video.c_str(),fps);
 			if (provider) {
 				// Cache if necessary
 				if (provider->GetDesiredCacheSize()) {