function EsoPL_doubleNamesBoth(EsoPL)
	local GetGameCameraInteractableActionInfoOld = GetGameCameraInteractableActionInfo
	local prevInteractNpcEn = ""
	local prevInteractNpcPl = ""
	
	function GetGameCameraInteractableActionInfo(...)		
		local action, interactableName, interactionBlocked, isOwned, additionalInteractInfo, context, contextLink, isCriminalInteract = GetGameCameraInteractableActionInfoOld()
		local newNpcName, temp1, temp2, interactionType, settingType
		
		if action == GetString(SI_GAMECAMERAACTIONTYPE2) or action == GetString(SI_GAMECAMERAACTIONTYPE21) or action == GetString(SI_GAMECAMERAACTIONTYPE1) or action == GetString(SI_GAMECAMERAACTIONTYPE7) then
			interactionType = "npc"
			settingType = EsoPL.Settings.ShowNPC
		elseif action == GetString(SI_GAMECAMERAACTIONTYPE5) then
			interactionType = "craft"
			settingType = EsoPL.Settings.ShowCraft
		end
		
		if not settingType or settingType == "pl" or interactableName == nil then
			return action, interactableName, interactionBlocked, isOwned, additionalInteractInfo, context, contextLink, isCriminalInteract
		end
		
		if interactionType == "npc" then
			if interactableName == prevInteractNpcPl then
				newNpcName = prevInteractNpcEn
			else
				newNpcName = npcNames[zo_strlower(interactableName)]
				
				if newNpcName == nil then
					return action, interactableName, interactionBlocked, isOwned, additionalInteractInfo, context, contextLink, isCriminalInteract
				end
					
				if interactableName ~= nil then
					prevInteractNpcEn = newNpcName
					prevInteractNpcPl = interactableName
				end
			end
			
			if newNpcName ~= interactableName then
				if settingType == "plen" then
					interactableName = ZO_CachedStrFormat(SI_ZONE_NAME, interactableName) .. "\n" .. newNpcName
				elseif (settingType == "enpl") then
					interactableName = newNpcName .. "\n" .. ZO_CachedStrFormat(SI_ZONE_NAME, interactableName)
				else
					interactableName = newNpcName
				end
			end
		elseif interactionType == "craft" then
			local plName = string.match(interactableName, "%((.*)%)$")
			
			if interactableName == prevInteractNpcPl then
				newNpcName = prevInteractNpcEn
			else				
				if plName and EsoPL.Settings.Data.SetsNames[zo_strlower(plName)] then
					newNpcName = EsoPL.Settings.Data.SetsNames[zo_strlower(plName)] -- EsoPL:MagicReplace(interactableName, plName, EsoPL.Settings.Data.SetsNames[zo_strlower(plName)])
				end
				
				if newNpcName == nil then
					return action, interactableName, interactionBlocked, isOwned, additionalInteractInfo, context, contextLink, isCriminalInteract
				end
					
				if interactableName ~= nil then
					prevInteractNpcEn = newNpcName
					prevInteractNpcPl = interactableName
				end
			end
			
			if newNpcName ~= interactableName and plName then
				local firstPart = string.match(interactableName, "^(.*) %(")
				
				if settingType == "plen" then
					interactableName = string.format("%s (%s — %s)", firstPart, plName, EsoPL.Settings.Data.SetsNames[zo_strlower(plName)])
				elseif (settingType == "enpl") then
					interactableName = string.format("%s (%s — %s)", firstPart, EsoPL.Settings.Data.SetsNames[zo_strlower(plName)], plName)
				else
					interactableName = string.format("%s (%s)", firstPart, EsoPL.Settings.Data.SetsNames[zo_strlower(plName)])
				end
			end
		end
		
		return action, interactableName, interactionBlocked, isOwned, additionalInteractInfo, context, contextLink, isCriminalInteract
	end
	
	EsoPL_doubleNamesBoth = nil
end