Index: binaries/data/mods/public/simulation/components/interfaces/TechnologyManager.js
===================================================================
--- binaries/data/mods/public/simulation/components/interfaces/TechnologyManager.js	(revision 0)
+++ binaries/data/mods/public/simulation/components/interfaces/TechnologyManager.js	(working copy)
@@ -0,0 +1 @@
+Engine.RegisterInterface("TechnologyManager");
Index: source/simulation2/TypeList.h
===================================================================
--- source/simulation2/TypeList.h	(revision 13634)
+++ source/simulation2/TypeList.h	(working copy)
@@ -138,9 +138,6 @@
 INTERFACE(SoundManager)
 COMPONENT(SoundManager)
 
-INTERFACE(TechnologyManager)
-COMPONENT(TechnologyManagerScripted)
-
 INTERFACE(TechnologyTemplateManager)
 COMPONENT(TechnologyTemplateManagerScripted)
 
Index: source/simulation2/components/CCmpTerritoryInfluence.cpp
===================================================================
--- source/simulation2/components/CCmpTerritoryInfluence.cpp	(revision 13634)
+++ source/simulation2/components/CCmpTerritoryInfluence.cpp	(working copy)
@@ -22,7 +22,6 @@
 
 #include "simulation2/components/ICmpOwnership.h"
 #include "simulation2/components/ICmpPlayerManager.h"
-#include "simulation2/components/ICmpTechnologyManager.h"
 
 class CCmpTerritoryInfluence : public ICmpTerritoryInfluence
 {
@@ -101,23 +100,18 @@
 
 	virtual u32 GetRadius()
 	{
-		u32 newRadius = m_Radius;
+		u32 newRadius;
+		entity_id_t ent = GetEntityId();
+		const char* valueName = "TerritoryInfluence/Radius";
+		ScriptInterface& scriptInterface = GetSimContext().GetScriptInterface();
 
-		CmpPtr<ICmpOwnership> cmpOwnership(GetSimContext(), GetEntityId());
-		if (cmpOwnership && cmpOwnership->GetOwner() != INVALID_PLAYER)
+		bool ok = scriptInterface.CallFunction(scriptInterface.GetGlobalObject(), "ApplyTechModificationsToEntity", valueName, m_Radius, ent, newRadius);
+
+		if (ok)
 		{
-			CmpPtr<ICmpPlayerManager> cmpPlayerManager(GetSimContext(), SYSTEM_ENTITY);
-			entity_id_t playerEnt = cmpPlayerManager->GetPlayerByID(cmpOwnership->GetOwner());
-
-			if (playerEnt != INVALID_ENTITY)
-			{
-				CmpPtr<ICmpTechnologyManager> cmpTechnologyManager(GetSimContext(), playerEnt);
-				if (cmpTechnologyManager)
-					newRadius = cmpTechnologyManager->ApplyModifications(L"TerritoryInfluence/Radius", m_Radius, GetEntityId());
-			}
+			return newRadius;
 		}
-
-		return newRadius;
+		return m_Radius;
 	}
 };
 
Index: source/simulation2/components/CCmpVision.cpp
===================================================================
--- source/simulation2/components/CCmpVision.cpp	(revision 13634)
+++ source/simulation2/components/CCmpVision.cpp	(working copy)
@@ -21,9 +21,6 @@
 #include "ICmpVision.h"
 
 #include "simulation2/MessageTypes.h"
-#include "simulation2/components/ICmpOwnership.h"
-#include "simulation2/components/ICmpPlayerManager.h"
-#include "simulation2/components/ICmpTechnologyManager.h"
 
 class CCmpVision : public ICmpVision
 {
@@ -85,28 +82,18 @@
 			const CMessageTechnologyModification& msgData = static_cast<const CMessageTechnologyModification&> (msg);
 			if (msgData.component == L"Vision")
 			{
-				CmpPtr<ICmpOwnership> cmpOwnership(GetSimContext(), GetEntityId());
-				if (cmpOwnership)
+				ScriptInterface& scriptInterface = GetSimContext().GetScriptInterface();
+				entity_pos_t newRange;
+				const char* valueName = "Vision/Range";
+				bool ok = scriptInterface.CallFunction(scriptInterface.GetGlobalObject(), "ApplyTechModificationsToEntity", valueName, m_BaseRange, GetEntityId(), newRange);
+
+				if (ok && newRange != m_Range)
 				{
-					player_id_t owner = cmpOwnership->GetOwner();
-					if (owner != INVALID_PLAYER && owner == msgData.player)
-					{
-						CmpPtr<ICmpPlayerManager> cmpPlayerManager(GetSimContext(), SYSTEM_ENTITY);
-						entity_id_t playerEnt = cmpPlayerManager->GetPlayerByID(owner);
-						CmpPtr<ICmpTechnologyManager> cmpTechnologyManager(GetSimContext(), playerEnt);
-						if (playerEnt != INVALID_ENTITY && cmpTechnologyManager)
-						{
-							entity_pos_t newRange = cmpTechnologyManager->ApplyModifications(L"Vision/Range", m_BaseRange, GetEntityId());
-							if (newRange != m_Range)
-							{
-								// Update our vision range and broadcast message
-								entity_pos_t oldRange = m_Range;
-								m_Range = newRange;
-								CMessageVisionRangeChanged msg(GetEntityId(), oldRange, newRange);
-								GetSimContext().GetComponentManager().BroadcastMessage(msg);
-							}
-						}
-					}
+					// Update our vision range and broadcast message
+					entity_pos_t oldRange = m_Range;
+					m_Range = newRange;
+					CMessageVisionRangeChanged msg(GetEntityId(), oldRange, newRange);
+					GetSimContext().GetComponentManager().BroadcastMessage(msg);
 				}
 			}
 			break;
Index: source/simulation2/components/ICmpTechnologyManager.cpp
===================================================================
--- source/simulation2/components/ICmpTechnologyManager.cpp	(revision 13634)
+++ source/simulation2/components/ICmpTechnologyManager.cpp	(working copy)
@@ -1,44 +0,0 @@
-/* Copyright (C) 2012 Wildfire Games.
- * This file is part of 0 A.D.
- *
- * 0 A.D. is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * 0 A.D. is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with 0 A.D.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "precompiled.h"
-
-#include "ICmpTechnologyManager.h"
-
-#include "simulation2/system/InterfaceScripted.h"
-#include "simulation2/scripting/ScriptComponent.h"
-
-BEGIN_INTERFACE_WRAPPER(TechnologyManager)
-END_INTERFACE_WRAPPER(TechnologyManager)
-
-class CCmpTechnologyManagerScripted : public ICmpTechnologyManager
-{
-public:
-	DEFAULT_SCRIPT_WRAPPER(TechnologyManagerScripted)
-
-	virtual fixed ApplyModifications(std::wstring valueName, fixed currentValue, entity_id_t entity)
-	{
-		return m_Script.Call<fixed>("ApplyModifications", valueName, currentValue, entity);
-	}
-
-	virtual u32 ApplyModifications(std::wstring valueName, u32 currentValue, entity_id_t entity)
-	{
-		return m_Script.Call<u32>("ApplyModifications", valueName, currentValue, entity);
-	}
-};
-
-REGISTER_COMPONENT_SCRIPT_WRAPPER(TechnologyManagerScripted)
Index: source/simulation2/components/ICmpTechnologyManager.h
===================================================================
--- source/simulation2/components/ICmpTechnologyManager.h	(revision 13634)
+++ source/simulation2/components/ICmpTechnologyManager.h	(working copy)
@@ -1,39 +0,0 @@
-/* Copyright (C) 2012 Wildfire Games.
- * This file is part of 0 A.D.
- *
- * 0 A.D. is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * 0 A.D. is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with 0 A.D.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef INCLUDED_ICMPTECHNOLOGYMANAGER
-#define INCLUDED_ICMPTECHNOLOGYMANAGER
-
-#include "simulation2/system/Interface.h"
-
-#include "maths/Fixed.h"
-
-/**
- * Technology manager interface.
- * (This interface only includes the functions needed by native code for accessing
- *	technology modification data, the associated logic is handled in scripts)
- */
-class ICmpTechnologyManager : public IComponent
-{
-public:
-	virtual fixed ApplyModifications(std::wstring valueName, fixed currentValue, entity_id_t entity) = 0;
-	virtual u32 ApplyModifications(std::wstring valueName, u32 currentValue, entity_id_t entity) = 0;
-
-	DECLARE_INTERFACE_TYPE(TechnologyManager)
-};
-
-#endif // INCLUDED_ICMPTECHNOLOGYMANAGER
