diff --git a/Source/Core/Core/Src/ConfigManager.cpp b/Source/Core/Core/Src/ConfigManager.cpp
index 383b10fac5..4eecb7c4e7 100644
--- a/Source/Core/Core/Src/ConfigManager.cpp
+++ b/Source/Core/Core/Src/ConfigManager.cpp
@@ -125,10 +125,7 @@ void SConfig::SaveSettings()
 		// Plugins
 		ini.Set("Core", "GFXPlugin",	m_LocalCoreStartupParameter.m_strVideoPlugin);
 		ini.Set("Core", "DSPPlugin",	m_LocalCoreStartupParameter.m_strDSPPlugin);
-		ini.Set("Core", "Pad1Plugin",	m_LocalCoreStartupParameter.m_strPadPlugin[0]);
-		ini.Set("Core", "Pad2Plugin",	m_LocalCoreStartupParameter.m_strPadPlugin[1]);
-		ini.Set("Core", "Pad3Plugin",	m_LocalCoreStartupParameter.m_strPadPlugin[2]);
-		ini.Set("Core", "Pad4Plugin",	m_LocalCoreStartupParameter.m_strPadPlugin[3]);
+		ini.Set("Core", "PadPlugin",	m_LocalCoreStartupParameter.m_strPadPlugin[0]);
 		ini.Set("Core", "WiiMote1Plugin",m_LocalCoreStartupParameter.m_strWiimotePlugin[0]);
 	}
 
@@ -239,11 +236,7 @@ void SConfig::LoadSettings()
 		// Plugins
 		ini.Get("Core", "GFXPlugin",  &m_LocalCoreStartupParameter.m_strVideoPlugin,	m_DefaultGFXPlugin.c_str());
 		ini.Get("Core", "DSPPlugin",  &m_LocalCoreStartupParameter.m_strDSPPlugin,		m_DefaultDSPPlugin.c_str());
-		for (int i = 0; i < MAXPADS; i++)
-		{
-			std::string TmpName = StringFromFormat("Pad%iPlugin", (i + 1));
-			ini.Get("Core", TmpName.c_str(), &m_LocalCoreStartupParameter.m_strPadPlugin[i], m_DefaultPADPlugin.c_str());
-		}
+		ini.Get("Core", "PadPlugin", &m_LocalCoreStartupParameter.m_strPadPlugin[0], m_DefaultPADPlugin.c_str());
 		ini.Get("Core", "WiiMote1Plugin", &m_LocalCoreStartupParameter.m_strWiimotePlugin[0], m_DefaultWiiMotePlugin.c_str());
 	}
 
diff --git a/Source/Core/Core/Src/Core.cpp b/Source/Core/Core/Src/Core.cpp
index 31fd948941..5360e6db03 100644
--- a/Source/Core/Core/Src/Core.cpp
+++ b/Source/Core/Core/Src/Core.cpp
@@ -68,6 +68,7 @@ namespace Core
 // Declarations and definitions
 Common::Timer Timer;
 volatile u32 DrawnFrame = 0;
+u32 DrawnVideo = 0;
  
 // Function forwarding
 //void Callback_VideoRequestWindowSize(int _iWidth, int _iHeight, BOOL _bFullscreen);
@@ -589,17 +590,16 @@ void ScreenShot()
 
 // Apply Frame Limit and Display FPS info
 // This should only be called from VI
-void FrameThrottle()
+void VideoThrottle()
 {
-	u32 TargetFPS = (SConfig::GetInstance().m_Framelimit > 1) ? SConfig::GetInstance().m_Framelimit * 5
+	u32 TargetVPS = (SConfig::GetInstance().m_Framelimit > 1) ? SConfig::GetInstance().m_Framelimit * 5
 		: VideoInterface::TargetRefreshRate;
-	u32 frames = Common::AtomicLoad(DrawnFrame);
 
 	// When frame limit is NOT off
-	if (frames && SConfig::GetInstance().m_Framelimit != 1)
+	if (SConfig::GetInstance().m_Framelimit != 1)
 	{
-		u32 frametime = frames * 1000 / TargetFPS;
-		while (Timer.GetTimeDifference() < frametime)
+		u32 frametime = DrawnVideo * 2 * 1000 / TargetVPS;
+		while ((u32)Timer.GetTimeDifference() < frametime)
 			//Common::YieldCPU();
 			Common::SleepCurrentThread(1);
 	}
@@ -608,30 +608,14 @@ void FrameThrottle()
 	u32 ElapseTime = (u32)Timer.GetTimeDifference();
 	if (ElapseTime >= 1000)
 	{
-	    SCoreStartupParameter& _CoreParameter = SConfig::GetInstance().m_LocalCoreStartupParameter;
+		SCoreStartupParameter& _CoreParameter = SConfig::GetInstance().m_LocalCoreStartupParameter;
 
-		// Use extended or summary information. The summary information does not print the ticks data,
-		// that's more of a debugging interest, it can always be optional of course if someone is interested.
-		//#define EXTENDED_INFO
-		#ifdef EXTENDED_INFO
-			u64 newTicks = CoreTiming::GetTicks();
-			u64 newIdleTicks = CoreTiming::GetIdleTicks();
-	 
-			u64 diff = (newTicks - ticks) / 1000000;
-			u64 idleDiff = (newIdleTicks - idleTicks) / 1000000;
-	 
-			ticks = newTicks;
-			idleTicks = newIdleTicks;	 
-			
-			float TicksPercentage = (float)diff / (float)(SystemTimers::GetTicksPerSecond() / 1000000) * 100;
-		#endif
-
-		u32 FPS = frames * 1000 / ElapseTime;
-
-		float Speed = (float)FPS / (float)TargetFPS * 100.0f;
+		u32 FPS = Common::AtomicLoad(DrawnFrame) * 1000 / ElapseTime;
+		u32 VPS = DrawnVideo * 2 * 1000 / ElapseTime;
+		u32 Speed = VPS * 100 / TargetVPS;
 		
 		// Settings are shown the same for both extended and summary info
-		std::string SSettings = StringFromFormat(" | Core: %s %s",
+		std::string SSettings = StringFromFormat("Core: %s %s",
 		#if defined(JITTEST) && JITTEST
 			#ifdef _M_IX86
 						_CoreParameter.bUseJIT ? "JIT32IL" : "Int32", 
@@ -647,8 +631,22 @@ void FrameThrottle()
 		#endif
 		_CoreParameter.bCPUThread ? "DC" : "SC");
 
+		// Use extended or summary information. The summary information does not print the ticks data,
+		// that's more of a debugging interest, it can always be optional of course if someone is interested.
+		//#define EXTENDED_INFO
 		#ifdef EXTENDED_INFO
-			std::string SFPS = StringFromFormat("FPS: %i/%i (%3.0f%%)", FPS, TargetFPS, Speed);
+			u64 newTicks = CoreTiming::GetTicks();
+			u64 newIdleTicks = CoreTiming::GetIdleTicks();
+	 
+			u64 diff = (newTicks - ticks) / 1000000;
+			u64 idleDiff = (newIdleTicks - idleTicks) / 1000000;
+	 
+			ticks = newTicks;
+			idleTicks = newIdleTicks;	 
+			
+			float TicksPercentage = (float)diff / (float)(SystemTimers::GetTicksPerSecond() / 1000000) * 100;
+
+			std::string SFPS = StringFromFormat("FPS: %u - VPS: %u - SPEED: %u%%", FPS, VPS, Speed);
 			SFPS += StringFromFormat(" | CPU: %s%i MHz [Real: %i + IdleSkip: %i] / %i MHz (%s%3.0f%%)",
 					_CoreParameter.bSkipIdle ? "~" : "",
 					(int)(diff),
@@ -659,11 +657,11 @@ void FrameThrottle()
 					TicksPercentage);
 		
 		#else	// Summary information
-			std::string SFPS = StringFromFormat("FPS: %i/%i (%3.0f%%)", FPS, TargetFPS, Speed);
+		std::string SFPS = StringFromFormat("FPS: %u - VPS: %u - SPEED: %u%%", FPS, VPS, Speed);
 		#endif
 
 		// This is our final "frame counter" string
-		std::string SMessage = StringFromFormat("%s%s", SFPS.c_str(), SSettings.c_str());
+		std::string SMessage = StringFromFormat(" %s | %s", SSettings.c_str(), SFPS.c_str());
 
 		// Show message
 		if (g_pUpdateFPSDisplay != NULL)
@@ -671,10 +669,13 @@ void FrameThrottle()
 
 		Host_UpdateStatusBar(SMessage.c_str());
 
-		// Reset frame counter
+		// Reset counter
         Timer.Update();
 		Common::AtomicStore(DrawnFrame, 0);
+		DrawnVideo = 0;
 	}
+
+	DrawnVideo++;
 }
 
 // Executed from GPU thread
diff --git a/Source/Core/Core/Src/Core.h b/Source/Core/Core/Src/Core.h
index 8740f6d899..370486728e 100644
--- a/Source/Core/Core/Src/Core.h
+++ b/Source/Core/Core/Src/Core.h
@@ -74,7 +74,7 @@ namespace Core
     void StopTrace();
 
 	bool report_slow(int skipped);
-	void FrameThrottle();
+	void VideoThrottle();
 
 	// -----------------------------------------
 	#ifdef RERECORDING
diff --git a/Source/Core/Core/Src/HW/VideoInterface.cpp b/Source/Core/Core/Src/HW/VideoInterface.cpp
index a40a7437bf..ce5e797739 100644
--- a/Source/Core/Core/Src/HW/VideoInterface.cpp
+++ b/Source/Core/Core/Src/HW/VideoInterface.cpp
@@ -1056,7 +1056,7 @@ static void EndField()
 
 
 // Purpose: Send VI interrupt when triggered
-// Run when: When every line is scaned
+// Run when: When a line is scaned
 void Update()
 {
 
@@ -1070,8 +1070,8 @@ void Update()
     if (++m_VBeamPos > s_lineCount)
 	{
         m_VBeamPos = 1;
-		// Apply frame throttle wheneven a full screen scan finishes
-		Core::FrameThrottle();
+		// Apply video throttle whenever a full screen scan finishes
+		Core::VideoThrottle();
 	}
 
 	for (int i = 0; i < 4; ++i)