diff --git a/src/animation/AnimBlendAssocGroup.cpp b/src/animation/AnimBlendAssocGroup.cpp
index 72c90233..ecdebd29 100644
--- a/src/animation/AnimBlendAssocGroup.cpp
+++ b/src/animation/AnimBlendAssocGroup.cpp
@@ -1,5 +1,6 @@
 #include "common.h"
 #include "patcher.h"
+#include "General.h"
 #include "ModelInfo.h"
 #include "AnimManager.h"
 #include "RpAnimBlend.h"
@@ -38,7 +39,7 @@ CAnimBlendAssocGroup::GetAnimation(const char *name)
 {
 	int i;
 	for(i = 0; i < numAssociations; i++)
-		if(strcmpi(assocList[i].hierarchy->name, name) == 0)
+		if(!CGeneral::faststricmp(assocList[i].hierarchy->name, name))
 			return &assocList[i];
 	return nil;
 }
@@ -64,7 +65,7 @@ CAnimBlendAssocGroup::CopyAnimation(const char *name)
 	return new CAnimBlendAssociation(*anim);
 }
 
-int
+bool
 strcmpIgnoringDigits(const char *s1, const char *s2)
 {
 	char c1, c2;
@@ -75,13 +76,13 @@ strcmpIgnoringDigits(const char *s1, const char *s2)
 		if(c1) s1++;
 		if(c2) s2++;
 		if(c1 == '\0' && c2 == '\0')
-			return 1;
-		if(islower(c1)) c1 = toupper(c1);
-		if(islower(c2)) c2 = toupper(c2);
-		if(isdigit(c1) && isdigit(c2))
+			return true;
+		if(__ascii_iswdigit(c1) && __ascii_iswdigit(c2))
 			continue;
+		c1 = __ascii_toupper(c1);
+		c2 = __ascii_toupper(c2);
 		if(c1 != c2)
-			return 0;
+			return false;
 	}
 }
 
diff --git a/src/animation/AnimManager.cpp b/src/animation/AnimManager.cpp
index 444ae93d..e5721bdf 100644
--- a/src/animation/AnimManager.cpp
+++ b/src/animation/AnimManager.cpp
@@ -1,5 +1,6 @@
 #include "common.h"
 #include "patcher.h"
+#include "General.h"
 #include "ModelInfo.h"
 #include "ModelIndices.h"
 #include "FileMgr.h"
@@ -605,7 +606,7 @@ CAnimManager::GetAnimationBlock(const char *name)
 	int i;
 
 	for(i = 0; i < ms_numAnimBlocks; i++)
-		if(strcmpi(ms_aAnimBlocks[i].name, name) == 0)
+		if(strcasecmp(ms_aAnimBlocks[i].name, name) == 0)
 			return &ms_aAnimBlocks[i];
 	return nil;
 }
@@ -617,7 +618,7 @@ CAnimManager::GetAnimation(const char *name, CAnimBlock *animBlock)
 	CAnimBlendHierarchy *hier = &ms_aAnimations[animBlock->firstIndex];
 
 	for(i = 0; i < animBlock->numAnims; i++){
-		if(strcmpi(hier->name, name) == 0)
+		if(!CGeneral::faststricmp(hier->name, name))
 			return hier;
 		hier++;
 	}
diff --git a/src/animation/RpAnimBlend.cpp b/src/animation/RpAnimBlend.cpp
index 17394743..8108619e 100644
--- a/src/animation/RpAnimBlend.cpp
+++ b/src/animation/RpAnimBlend.cpp
@@ -1,5 +1,6 @@
 #include "common.h"
 #include "patcher.h"
+#include "General.h"
 #include "NodeName.h"
 #include "VisibilityPlugins.h"
 #include "AnimBlendClumpData.h"
@@ -320,7 +321,7 @@ void
 FrameFindCallBack(AnimBlendFrameData *frame, void *arg)
 {
 	char *nodename = GetFrameNodeName(frame->frame);
-	if(strcmpi(nodename, (char*)arg) == 0)
+	if(!CGeneral::faststricmp(nodename, (char*)arg))
 		pFrameDataFound = frame;
 }
 
diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp
index facf3a4a..a6f357c2 100644
--- a/src/audio/AudioManager.cpp
+++ b/src/audio/AudioManager.cpp
@@ -1,5 +1,6 @@
 #include "common.h"
 #include "patcher.h"
+#include "General.h"
 #include "audio_enums.h"
 
 #include "AudioManager.h"
@@ -2130,16 +2131,16 @@ uint32
 cAudioManager::GetSpecialCharacterTalkSfx(int32 modelIndex, int32 sound)
 {
 	char *modelName = CModelInfo::GetModelInfo(modelIndex)->GetName();
-	if(strcmpi(modelName, "eight") == 0 || strcmpi(modelName, "eight2") == 0) { return GetEightTalkSfx(sound); }
-	if(strcmpi(modelName, "frankie") == 0) { return GetFrankieTalkSfx(sound); }
-	if(strcmpi(modelName, "misty") == 0) { return GetMistyTalkSfx(sound); }
-	if(strcmpi(modelName, "ojg") == 0 || strcmpi(modelName, "ojg_p") == 0) { return GetOJGTalkSfx(sound); }
-	if(strcmpi(modelName, "cat") == 0) { return GetCatatalinaTalkSfx(sound); }
-	if(strcmpi(modelName, "bomber") == 0) { return GetBomberTalkSfx(sound); }
-	if(strcmpi(modelName, "s_guard") == 0) { return GetSecurityGuardTalkSfx(sound); }
-	if(strcmpi(modelName, "chunky") == 0) { return GetChunkyTalkSfx(sound); }
-	if(strcmpi(modelName, "asuka") == 0) { return GetGenericFemaleTalkSfx(sound); }
-	if(strcmpi(modelName, "maria") == 0) { return GetGenericFemaleTalkSfx(sound); }
+	if(!CGeneral::faststricmp(modelName, "eight") || !CGeneral::faststricmp(modelName, "eight2")) { return GetEightTalkSfx(sound); }
+	if(!CGeneral::faststricmp(modelName, "frankie")) { return GetFrankieTalkSfx(sound); }
+	if(!CGeneral::faststricmp(modelName, "misty")) { return GetMistyTalkSfx(sound); }
+	if(!CGeneral::faststricmp(modelName, "ojg") || !CGeneral::faststricmp(modelName, "ojg_p")) { return GetOJGTalkSfx(sound); }
+	if(!CGeneral::faststricmp(modelName, "cat")) { return GetCatatalinaTalkSfx(sound); }
+	if(!CGeneral::faststricmp(modelName, "bomber")) { return GetBomberTalkSfx(sound); }
+	if(!CGeneral::faststricmp(modelName, "s_guard")) { return GetSecurityGuardTalkSfx(sound); }
+	if(!CGeneral::faststricmp(modelName, "chunky")) { return GetChunkyTalkSfx(sound); }
+	if(!CGeneral::faststricmp(modelName, "asuka")) { return GetGenericFemaleTalkSfx(sound); }
+	if(!CGeneral::faststricmp(modelName, "maria")) { return GetGenericFemaleTalkSfx(sound); }
 
 	return GetGenericMaleTalkSfx(sound);
 }
@@ -3100,7 +3101,7 @@ int32
 FindMissionAudioSfx(const char *name)
 {
 	for(uint32 i = 0; i < ARRAY_SIZE(MissionAudioNameSfxAssoc); ++i) {
-		if(strcmpi(MissionAudioNameSfxAssoc[i].m_pName, name) == 0) return MissionAudioNameSfxAssoc[i].m_nId;
+		if(!CGeneral::faststricmp(MissionAudioNameSfxAssoc[i].m_pName, name)) return MissionAudioNameSfxAssoc[i].m_nId;
 	}
 	debug("Can't find mission audio %s", name);
 	return NO_SAMPLE;
diff --git a/src/audio/sampman.cpp b/src/audio/sampman.cpp
index 53b81a36..c9b4cb32 100644
--- a/src/audio/sampman.cpp
+++ b/src/audio/sampman.cpp
@@ -116,7 +116,7 @@ typedef struct provider_stuff
 
 static int __cdecl comp(const provider_stuff*s1,const provider_stuff*s2)
 {
-  return( _stricmp(s1->name,s2->name) );
+  return(strcasecmp(s1->name, s2->name));
 }
 
 static void
diff --git a/src/core/CutsceneMgr.cpp b/src/core/CutsceneMgr.cpp
index fa322242..2fbc5186 100644
--- a/src/core/CutsceneMgr.cpp
+++ b/src/core/CutsceneMgr.cpp
@@ -1,5 +1,6 @@
 #include "common.h"
 #include "patcher.h"
+#include "General.h"
 #include "CutsceneMgr.h"
 #include "Directory.h"
 #include "Camera.h"
@@ -107,7 +108,7 @@ int
 FindCutsceneAudioTrackId(const char *szCutsceneName)
 {
 	for (int i = 0; musicNameIdAssoc[i].szTrackName; i++) {
-		if (!strcmpi(musicNameIdAssoc[i].szTrackName, szCutsceneName))
+		if (!CGeneral::faststricmp(musicNameIdAssoc[i].szTrackName, szCutsceneName))
 			return musicNameIdAssoc[i].iTrackId;
 	}
 	return -1;
@@ -171,7 +172,7 @@ CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName)
 	CPlayerPed *pPlayerPed;
 
 	ms_cutsceneProcessing = true;
-	if (!strcmpi(szCutsceneName, "jb"))
+	if (!strcasecmp(szCutsceneName, "jb"))
 		ms_useLodMultiplier = true;
 	CTimer::Stop();
 
@@ -207,7 +208,7 @@ CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName)
 
 	CFileMgr::CloseFile(file);
 
-	if (strcmpi(ms_cutsceneName, "end")) {
+	if (CGeneral::faststricmp(ms_cutsceneName, "end")) {
 		DMAudio.ChangeMusicMode(MUSICMODE_CUTSCENE);
 		int trackId = FindCutsceneAudioTrackId(szCutsceneName);
 		if (trackId != -1) {
@@ -364,9 +365,9 @@ CCutsceneMgr::DeleteCutsceneData(void)
 	CPad::GetPad(0)->DisablePlayerControls &= ~PLAYERCONTROL_DISABLED_80;
 	CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(false);
 
-	if (strcmpi(ms_cutsceneName, "end")) {
+	if (CGeneral::faststricmp(ms_cutsceneName, "end")) {
 		DMAudio.StopCutSceneMusic();
-		if (strcmpi(ms_cutsceneName, "bet"))
+		if (CGeneral::faststricmp(ms_cutsceneName, "bet"))
 			DMAudio.ChangeMusicMode(MUSICMODE_GAME);
 	}
 	CTimer::Stop();
@@ -389,7 +390,7 @@ CCutsceneMgr::Update(void)
 	switch (ms_cutsceneLoadStatus) {
 	case CUTSCENE_LOADING_AUDIO:
 		SetupCutsceneToStart();
-		if (strcmpi(ms_cutsceneName, "end"))
+		if (CGeneral::faststricmp(ms_cutsceneName, "end"))
 			DMAudio.PlayPreloadedCutSceneMusic();
 		ms_cutsceneLoadStatus++;
 		break;
@@ -407,7 +408,7 @@ CCutsceneMgr::Update(void)
 	if (!ms_running) return;
 
 	ms_cutsceneTimer += CTimer::GetTimeStepNonClipped() * 0.02f;
-	if (strcmpi(ms_cutsceneName, "end") && TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FLYBY && ms_cutsceneLoadStatus == CUTSCENE_LOADING_0) {
+	if (CGeneral::faststricmp(ms_cutsceneName, "end") && TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FLYBY && ms_cutsceneLoadStatus == CUTSCENE_LOADING_0) {
 		if (CPad::GetPad(0)->GetCrossJustDown()
 			|| (CGame::playingIntro && CPad::GetPad(0)->GetStartJustDown())
 			|| CPad::GetPad(0)->GetLeftMouseJustDown()
diff --git a/src/core/Directory.cpp b/src/core/Directory.cpp
index 3e0d5382..d4b4279d 100644
--- a/src/core/Directory.cpp
+++ b/src/core/Directory.cpp
@@ -1,5 +1,6 @@
 #include "common.h"
 #include "patcher.h"
+#include "General.h"
 #include "FileMgr.h"
 #include "Directory.h"
 
@@ -49,7 +50,7 @@ CDirectory::FindItem(const char *name, uint32 &offset, uint32 &size)
 	int i;
 
 	for(i = 0; i < numEntries; i++)
-		if(strcmpi(entries[i].name, name) == 0){
+		if(!CGeneral::faststricmp(entries[i].name, name)){
 			offset = entries[i].offset;
 			size = entries[i].size;
 			return true;
diff --git a/src/core/General.h b/src/core/General.h
index d73cf36f..a7b240c2 100644
--- a/src/core/General.h
+++ b/src/core/General.h
@@ -104,6 +104,29 @@ public:
 		return (int)floorf(angle / DEGTORAD(45.0f));
 	}
 
+	// Unlike usual string comparison functions, these don't care about greater or lesser
+	static bool faststrcmp(const char *str1, const char *str2)
+	{
+		for (; *str1; str1++, str2++) {
+			if (*str1 != *str2)
+				return true;
+		}
+		return *str2 != '\0';
+	}
+
+	static bool faststricmp(const char *str1, const char *str2)
+	{
+		for (; *str1; str1++, str2++) {
+#if MUCH_SLOWER
+			if (toupper(*str1) != toupper(*str2))
+#else
+			if (__ascii_toupper(*str1) != __ascii_toupper(*str2))
+#endif
+				return true;
+		}
+		return *str2 != '\0';
+	}
+
 	// not too sure about all these...
 	static uint16 GetRandomNumber(void)
 		{ return myrand() & MYRAND_MAX; }
diff --git a/src/core/PlayerSkin.cpp b/src/core/PlayerSkin.cpp
index 82427491..4d2c31df 100644
--- a/src/core/PlayerSkin.cpp
+++ b/src/core/PlayerSkin.cpp
@@ -28,7 +28,7 @@ FindPlayerDff(uint32 &offset, uint32 &size)
 	do {
 		if (!CFileMgr::Read(file, (char*)&info, sizeof(CDirectory::DirectoryInfo)))
 			return;
-	} while (strcmpi("player.dff", info.name));
+	} while (strcasecmp("player.dff", info.name) != 0);
 
 	offset = info.offset;
 	size = info.size;
@@ -94,7 +94,7 @@ CPlayerSkin::GetSkinTexture(const char *texName)
 	CTxdStore::PopCurrentTxd();
 	if (tex) return tex;
 
-	if (!strcmp(DEFAULT_SKIN_NAME, texName))
+	if (strcmp(DEFAULT_SKIN_NAME, texName) == 0)
 		sprintf(gString, "models\\generic\\player.bmp");
 	else
 		sprintf(gString, "skins\\%s.bmp", texName);
diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp
index 69e14869..b0933063 100644
--- a/src/core/Streaming.cpp
+++ b/src/core/Streaming.cpp
@@ -1,5 +1,6 @@
 #include "common.h"
 #include "patcher.h"
+#include "General.h"
 #include "Pad.h"
 #include "Hud.h"
 #include "Text.h"
@@ -347,7 +348,7 @@ CStreaming::LoadCdDirectory(const char *dirname, int n)
 		if(direntry.size > (uint32)ms_streamingBufferSize)
 			ms_streamingBufferSize = direntry.size;
 
-		if(strcmp(dot+1, "DFF") == 0 || strcmp(dot+1, "dff") == 0){
+		if(!CGeneral::faststrcmp(dot+1, "DFF") || !CGeneral::faststrcmp(dot+1, "dff")){
 			if(CModelInfo::GetModelInfo(direntry.name, &modelId)){
 				if(ms_aInfoForModel[modelId].GetCdPosnAndSize(posn, size)){
 					debug("%s appears more than once in %s\n", direntry.name, dirname);
@@ -364,20 +365,20 @@ CStreaming::LoadCdDirectory(const char *dirname, int n)
 				ms_pExtraObjectsDir->AddItem(direntry);
 				lastID = -1;
 			}
-		}else if(strcmp(dot+1, "TXD") == 0 || strcmp(dot+1, "txd") == 0){
+		}else if(!CGeneral::faststrcmp(dot+1, "TXD") || !CGeneral::faststrcmp(dot+1, "txd")){
 			txdId = CTxdStore::FindTxdSlot(direntry.name);
 			if(txdId == -1)
 				txdId = CTxdStore::AddTxdSlot(direntry.name);
-				if(ms_aInfoForModel[txdId + STREAM_OFFSET_TXD].GetCdPosnAndSize(posn, size)){
-					debug("%s appears more than once in %s\n", direntry.name, dirname);
-					lastID = -1;
-				}else{
-					direntry.offset |= imgSelector;
-					ms_aInfoForModel[txdId + STREAM_OFFSET_TXD].SetCdPosnAndSize(direntry.offset, direntry.size);
-					if(lastID != -1)
-						ms_aInfoForModel[lastID].m_nextID = txdId + STREAM_OFFSET_TXD;
-					lastID = txdId + STREAM_OFFSET_TXD;
-				}
+			if(ms_aInfoForModel[txdId + STREAM_OFFSET_TXD].GetCdPosnAndSize(posn, size)){
+				debug("%s appears more than once in %s\n", direntry.name, dirname);
+				lastID = -1;
+			}else{
+				direntry.offset |= imgSelector;
+				ms_aInfoForModel[txdId + STREAM_OFFSET_TXD].SetCdPosnAndSize(direntry.offset, direntry.size);
+				if(lastID != -1)
+					ms_aInfoForModel[lastID].m_nextID = txdId + STREAM_OFFSET_TXD;
+				lastID = txdId + STREAM_OFFSET_TXD;
+			}
 		}else
 			lastID = -1;
 	}
@@ -720,7 +721,7 @@ CStreaming::RequestSpecialModel(int32 modelId, const char *modelName, int32 flag
 	uint32 pos, size;
 
 	mi = CModelInfo::GetModelInfo(modelId);
-	if(strcmp(mi->GetName(), modelName) == 0){
+	if(!CGeneral::faststrcmp(mi->GetName(), modelName)){
 		// Already have the correct name, just request it
 		RequestModel(modelId, flags);
 		return;
diff --git a/src/core/TxdStore.cpp b/src/core/TxdStore.cpp
index 5085c7e4..ab970b99 100644
--- a/src/core/TxdStore.cpp
+++ b/src/core/TxdStore.cpp
@@ -1,6 +1,7 @@
 #include "common.h"
 #include "patcher.h"
 #include "templates.h"
+#include "General.h"
 #include "Streaming.h"
 #include "RwHelper.h"
 #include "TxdStore.h"
@@ -61,7 +62,7 @@ CTxdStore::FindTxdSlot(const char *name)
 	int size = ms_pTxdPool->GetSize();
 	for(int i = 0; i < size; i++){
 		defname = GetTxdName(i);
-		if(defname && _strcmpi(defname, name) == 0)
+		if(defname && !CGeneral::faststricmp(defname, name))
 			return i;
 	}
 	return -1;
diff --git a/src/core/common.h b/src/core/common.h
index fd5f35b0..cadcac1d 100644
--- a/src/core/common.h
+++ b/src/core/common.h
@@ -153,6 +153,10 @@ public:
 #endif
 };
 
+#if (defined(_MSC_VER))
+extern int strcasecmp(const char *str1, const char *str2);
+#endif
+
 #define clamp(v, low, high) ((v)<(low) ? (low) : (v)>(high) ? (high) : (v))
 
 inline float sq(float x) { return x*x; }
diff --git a/src/modelinfo/ClumpModelInfo.cpp b/src/modelinfo/ClumpModelInfo.cpp
index d666313b..c6a6d5d0 100644
--- a/src/modelinfo/ClumpModelInfo.cpp
+++ b/src/modelinfo/ClumpModelInfo.cpp
@@ -1,5 +1,6 @@
 #include "common.h"
 #include "patcher.h"
+#include "General.h"
 #include "NodeName.h"
 #include "VisibilityPlugins.h"
 #include "ModelInfo.h"
@@ -86,7 +87,7 @@ CClumpModelInfo::FindFrameFromNameCB(RwFrame *frame, void *data)
 {
 	RwObjectNameAssociation *assoc = (RwObjectNameAssociation*)data;
 
-	if(_strcmpi(GetFrameNodeName(frame), assoc->name) != 0){
+	if(CGeneral::faststricmp(GetFrameNodeName(frame), assoc->name)){
 		RwFrameForAllChildren(frame, FindFrameFromNameCB, assoc);
 		return assoc->frame ? nil : frame;
 	}else{
@@ -101,7 +102,7 @@ CClumpModelInfo::FindFrameFromNameWithoutIdCB(RwFrame *frame, void *data)
 	RwObjectNameAssociation *assoc = (RwObjectNameAssociation*)data;
 
 	if(CVisibilityPlugins::GetFrameHierarchyId(frame) ||
-	   _strcmpi(GetFrameNodeName(frame), assoc->name) != 0){
+		CGeneral::faststricmp(GetFrameNodeName(frame), assoc->name)){
 		RwFrameForAllChildren(frame, FindFrameFromNameWithoutIdCB, assoc);
 		return assoc->frame ? nil : frame;
 	}else{
diff --git a/src/modelinfo/ModelIndices.cpp b/src/modelinfo/ModelIndices.cpp
index bf6b3905..ec039a0b 100644
--- a/src/modelinfo/ModelIndices.cpp
+++ b/src/modelinfo/ModelIndices.cpp
@@ -1,5 +1,6 @@
 #include "common.h"
 #include "patcher.h"
+#include "General.h"
 #include "ModelIndices.h"
 
 #define X(name, var, addr) int16 &var = *(int16*)addr;
@@ -18,7 +19,7 @@ void
 MatchModelString(const char *modelname, int16 id)
 {
 #define X(name, var, addr) \
-	if(strcmp(name, modelname) == 0){ \
+	if(!CGeneral::faststrcmp(name, modelname)){ \
 		var = id; \
 		return; \
 	}
diff --git a/src/modelinfo/ModelInfo.cpp b/src/modelinfo/ModelInfo.cpp
index 0c3ec76a..c7e18e5f 100644
--- a/src/modelinfo/ModelInfo.cpp
+++ b/src/modelinfo/ModelInfo.cpp
@@ -1,5 +1,6 @@
 #include "common.h"
 #include "patcher.h"
+#include "General.h"
 #include "TempColModels.h"
 #include "ModelIndices.h"
 #include "ModelInfo.h"
@@ -159,7 +160,7 @@ CModelInfo::GetModelInfo(const char *name, int *id)
 	CBaseModelInfo *modelinfo;
 	for(int i = 0; i < MODELINFOSIZE; i++){
 		modelinfo = CModelInfo::ms_modelInfoPtrs[i];
-	 	if(modelinfo && _strcmpi(modelinfo->GetName(), name) == 0){
+	 	if(modelinfo && !CGeneral::faststricmp(modelinfo->GetName(), name)){
 			if(id)
 				*id = i;
 			return modelinfo;
diff --git a/src/modelinfo/PedModelInfo.cpp b/src/modelinfo/PedModelInfo.cpp
index afe177c2..7b087fbd 100644
--- a/src/modelinfo/PedModelInfo.cpp
+++ b/src/modelinfo/PedModelInfo.cpp
@@ -1,5 +1,6 @@
 #include "common.h"
 #include "patcher.h"
+#include "General.h"
 #include "Ped.h"
 #include "NodeName.h"
 #include "VisibilityPlugins.h"
@@ -60,7 +61,7 @@ FindPedFrameFromNameCB(RwFrame *frame, void *data)
 {
 	RwObjectNameAssociation *assoc = (RwObjectNameAssociation*)data;
 
-	if(_strcmpi(GetFrameNodeName(frame)+1, assoc->name+1) != 0){
+	if(CGeneral::faststricmp(GetFrameNodeName(frame)+1, assoc->name+1)){
 		RwFrameForAllChildren(frame, FindPedFrameFromNameCB, assoc);
 		return assoc->frame ? nil : frame;
 	}else{
diff --git a/src/modelinfo/SimpleModelInfo.cpp b/src/modelinfo/SimpleModelInfo.cpp
index dd5010fa..f8742f1e 100644
--- a/src/modelinfo/SimpleModelInfo.cpp
+++ b/src/modelinfo/SimpleModelInfo.cpp
@@ -1,5 +1,6 @@
 #include "common.h"
 #include "patcher.h"
+#include "General.h"
 #include "Camera.h"
 #include "ModelInfo.h"
 
@@ -131,7 +132,7 @@ CSimpleModelInfo::FindRelatedModel(void)
 	for(i = 0; i < MODELINFOSIZE; i++){
 		mi = CModelInfo::GetModelInfo(i);
 		if(mi && mi != this &&
-		   strcmp(GetName()+3, mi->GetName()+3) == 0){
+		   !CGeneral::faststrcmp(GetName()+3, mi->GetName()+3)){
 			assert(mi->IsSimple());
 			this->SetRelatedModel((CSimpleModelInfo*)mi);
 			return;
diff --git a/src/peds/PedStats.cpp b/src/peds/PedStats.cpp
index f6508580..c393fddc 100644
--- a/src/peds/PedStats.cpp
+++ b/src/peds/PedStats.cpp
@@ -1,5 +1,6 @@
 #include "common.h"
 #include "patcher.h"
+#include "General.h"
 #include "FileMgr.h"
 #include "PedStats.h"
 
@@ -112,7 +113,7 @@ CPedStats::GetPedStatType(char *name)
 	int type;
 
 	for(type = 0; type < NUM_PEDSTATS; type++)
-		if(strcmp(ms_apPedStats[type]->m_name, name) == 0)
+		if(!CGeneral::faststrcmp(ms_apPedStats[type]->m_name, name))
 			return type;
 	return NUM_PEDSTATS;
 }
diff --git a/src/skel/win/win.cpp b/src/skel/win/win.cpp
index 5b328d03..2492c2de 100644
--- a/src/skel/win/win.cpp
+++ b/src/skel/win/win.cpp
@@ -3004,6 +3004,13 @@ BOOL _InputIsExtended(INT flag)
 	return (flag & 0x1000000) != 0;
 }
 
+#if (defined(_MSC_VER))
+int strcasecmp(const char *str1, const char *str2)
+{
+	return _strcmpi(str1, str2);
+}
+#endif
+
 
 STARTPATCHES	
 	//InjectHook(0x580B30, &CJoySticks::CJoySticks, PATCH_JUMP);