diff --git a/Sources/epoch_code/compile/EPOCH_CamUse.sqf b/Sources/epoch_code/compile/EPOCH_CamUse.sqf
new file mode 100644
index 00000000..3163fb49
--- /dev/null
+++ b/Sources/epoch_code/compile/EPOCH_CamUse.sqf
@@ -0,0 +1,119 @@
+/*
+	Author: He-Man
+
+    Contributors:
+
+	Description: BaseCam Script
+
+    Licence:
+    Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike
+
+    Github:
+    https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/EPOCH_CamUse.sqf
+*/
+
+private ["_mycams","_buildingJammerRange","_curcam","_display","_AutoCam","_ActiveCam","_campos","_CamFov","_CamDir","_CamDist","_EpochCam","_targetpos","_dirs"];
+
+_mycams = EPOCH_BaseCams select {(_x getVariable["BUILD_OWNER", "-1"]) in [getPlayerUID player, Epoch_my_GroupUID]};
+if (["CfgEpochClient", "BaseCamOnlyHome",true] call EPOCH_fnc_returnConfigEntryV2) then {
+	_buildingJammerRange = ["CfgEpochClient", "buildingJammerRange",75] call EPOCH_fnc_returnConfigEntryV2;
+	_mycams = _mycams select {!(((nearestobjects [_x,["Plotpole_EPOCH"],_buildingJammerRange]) select {(_x getVariable["BUILD_OWNER", "-1"]) in [getPlayerUID player, Epoch_my_GroupUID]}) isequalto [])};
+};
+if !(_mycams isequalto []) then {
+	_curcam = EPOCH_BaseCams find Epoch_ActiveCam;
+	if (_curcam > -1 && (count _mycams) > (_curcam + 1)) then {
+		Epoch_ActiveCam = _mycams select (_curcam + 1);
+	}
+	else {
+		Epoch_ActiveCam = _mycams select 0;
+	};
+};
+
+if !(isnull (finddisplay -1200)) exitwith {};
+if (isnull Epoch_ActiveCam) exitwith {
+	["No Camera found",5] call Epoch_Message;
+};
+
+[] spawn {
+	createdialog 'Epoch_CamDialog';
+	waituntil {!isnull finddisplay -1200};
+	_display = finddisplay -1200;
+	(_display displayctrl 1000) ctrlsettext format ["Cam %1",(EPOCH_BaseCams find Epoch_ActiveCam) + 1];
+	(_display displayctrl 1001) ctrlsetstructuredtext parseText format [
+		"<t align='center' color='#FFFF00' size='1'>Controls:</t><br/><br/>Cam Up: %1<br/>Cam Down: %2<br/>Cam Left: %3<br/>Cam Right: %4<br/>Zoom In: %5<br/>Zoom Out: %6<br/><br/>AutoCam: %7<br/>NextCam: %8",
+		keyName Epoch_KB_BaseCamUp,keyName Epoch_KB_BaseCamDown,keyName Epoch_KB_BaseCamLeft,keyName Epoch_KB_BaseCamRight,keyName Epoch_KB_BaseCamZoomIn,keyName Epoch_KB_BaseCamZoomOut,keyName Epoch_KB_BaseCamAutoCam,keyName Epoch_KB_BaseCamNextCam
+	];
+	Epoch_AutoCam = true;
+	_AutoCam = Epoch_AutoCam; 
+	Epoch_CamAdjust = [0,0,0];
+	_ActiveCam = Epoch_ActiveCam;
+	_campos = Epoch_ActiveCam getRelPos [0.15,180];
+	_campos set [2,(getposatl Epoch_ActiveCam select 2)];
+	if (isnil "Epoch_CamFilmGrain") then {
+		Epoch_CamFilmGrain = ppEffectCreate ["FilmGrain", 2000 + 25];
+	};
+	Epoch_CamFilmGrain ppEffectEnable true;
+	_intensity = ((player distance Epoch_ActiveCam) / 10000) min 1;
+	_sharpness = 1.25 - _intensity;
+	Epoch_CamFilmGrain ppEffectAdjust [_intensity,_sharpness,2.01,0.75,1.0,true];
+	Epoch_CamFilmGrain ppEffectCommit 0;
+	_CamFov = 0.7;
+	_CamDir = 0;
+	_CamDist = 200;
+	_EpochCam = 'camera' camCreate _campos;
+	showCinemaBorder true;
+	_EpochCam cameraEffect ['internal', 'front'];
+	_EpochCam camCommit 0;
+	_targetpos = Epoch_ActiveCam getRelPos [_CamDist, 180+_CamDir];
+	_EpochCam camSetTarget _targetpos;
+	_EpochCam camCommit 0;
+	_dirs = [5,10,15,20,25,30,35,40,45,40,35,30,25,20,15,10,5,0,-5,-10,-15,-20,-25,-30,-35,-40,-45,-40,-35,-30,-25,-20,-15,-10,-5,0];
+	while {!isnull _display} do {
+		Epoch_CamAdjust params ["_dir","_dist","_zoom"];
+		_AutoCam = Epoch_AutoCam; 
+		if !(_ActiveCam isequalto Epoch_ActiveCam) then {
+			_ActiveCam = Epoch_ActiveCam;
+			camDestroy _EpochCam;
+			_campos = Epoch_ActiveCam getRelPos [0.15,180];
+			_campos set [2,(getposatl Epoch_ActiveCam select 2)];
+			_CamFov = 0.7;
+			_CamDir = 0;
+			_CamDist = 200;
+			_EpochCam = 'camera' camCreate _campos;
+			showCinemaBorder true;
+			_EpochCam cameraEffect ['internal', 'front'];
+			_EpochCam camCommit 0;
+			_intensity = ((player distance Epoch_ActiveCam) / 10000) min 1;
+			_sharpness = 1.25 - _intensity;
+			Epoch_CamFilmGrain ppEffectAdjust [_intensity,_sharpness,2.01,0.75,1.0,true];
+			Epoch_CamFilmGrain ppEffectCommit 0;
+			(_display displayctrl 1000) ctrlsettext format ["Cam %1",(EPOCH_BaseCams find Epoch_ActiveCam) + 1];
+		};
+		if !(Epoch_AutoCam) then {
+			_h = getposatl Epoch_ActiveCam select 2;
+			_oldalpha = atan (_h/_CamDist);
+			_newalpha = (_oldalpha + _dist) max 1;
+			_CamDist = _h/(tan _newalpha);
+			_CamDir = ((_CamDir + _dir) max -45) min 45;
+			_CamFov = ((_CamFov + _zoom) min 2) max 0.1;
+		}
+		else {
+			_CamDist = 200;
+			_CamFov = 0.7;
+			_CamDir = _dirs deleteat 0;
+			_dirs pushback _CamDir;
+		};
+		_targetpos = Epoch_ActiveCam getRelPos [_CamDist, 180+_CamDir];
+		_EpochCam camSetTarget _targetpos;
+		_EpochCam camSetFov _CamFov;
+		_EpochCam camCommit 0.75;
+		Epoch_CamAdjust = [0,0,0];
+		waitUntil {camCommitted _EpochCam ||  isnull _display || isnull Epoch_ActiveCam || !(_ActiveCam isequalto Epoch_ActiveCam)};
+		if (isnull Epoch_ActiveCam) exitwith {};
+	};
+	player cameraEffect ['Terminate', 'FRONT'];
+	camDestroy _EpochCam;
+	_display closedisplay 0;
+	Epoch_ActiveCam = objnull;
+	Epoch_CamFilmGrain ppEffectEnable false;
+};
diff --git a/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf b/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf
index 9a456045..f80b8879 100644
--- a/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf
+++ b/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf
@@ -296,4 +296,48 @@ if(!_ctrl && (_dikCode in (actionKeys "HeliRopeAction")))then{
 		[_msg,5,[[0,0,0,0.2],[1,1,1,1]]] call Epoch_message_stack;
 	};
 };
+
+if (!isnull (finddisplay -1200) && !isnull Epoch_ActiveCam) then {
+	_multi = 1;
+	if (isnil 'Epoch_CamTrigger') then {
+		Epoch_CamTrigger = diag_ticktime - 0.2;
+	};
+	if (diag_ticktime - Epoch_CamTrigger < 0.1) then {
+		_multi = 2;
+	};
+	Epoch_CamTrigger = diag_ticktime;
+	switch _dikCode do {
+		case Epoch_KB_BaseCamNextCam: {	/* Num Enter */
+			call Epoch_CamUse;
+		};
+		case Epoch_KB_BaseCamLeft: {	/* Num 4 */
+			Epoch_AutoCam = false;
+			Epoch_CamAdjust = [-3*_multi,0,0];
+		};
+		case Epoch_KB_BaseCamRight: {	/* Num 6 */
+			Epoch_AutoCam = false;
+			Epoch_CamAdjust = [3*_multi,0,0];
+		};
+		case Epoch_KB_BaseCamUp: {	/* Num 8 */
+			Epoch_AutoCam = false;
+			Epoch_CamAdjust = [0,-4*_multi,0];
+		};
+		case Epoch_KB_BaseCamDown: {	/* Num 2 */
+			Epoch_AutoCam = false;
+			Epoch_CamAdjust = [0,4*_multi,0];
+		};
+		case Epoch_KB_BaseCamZoomOut: {	/* Num - */
+			Epoch_AutoCam = false;
+			Epoch_CamAdjust = [0,0,0.1*_multi];
+		};
+		case Epoch_KB_BaseCamZoomIn: { /* Num + */
+			Epoch_AutoCam = false;
+			Epoch_CamAdjust = [0,0,-0.1*_multi];
+		};
+		case Epoch_KB_BaseCamAutoCam: { /* Num 0 */
+			Epoch_AutoCam = true;
+			Epoch_CamAdjust = [0,0,0];
+		};
+	};
+};
 _handled
diff --git a/Sources/epoch_code/compile/setup/EPOCH_clientKeyMap.sqf b/Sources/epoch_code/compile/setup/EPOCH_clientKeyMap.sqf
index 0452d8fb..47c71afb 100644
--- a/Sources/epoch_code/compile/setup/EPOCH_clientKeyMap.sqf
+++ b/Sources/epoch_code/compile/setup/EPOCH_clientKeyMap.sqf
@@ -57,7 +57,16 @@ _keyMap =
 	["Build: Vector RIGHT", "eXpoch_keysVectorTiltR", 0xCD],
 	["Build: Vector AWAY", "eXpoch_keysVectorTiltAwy", 0xC8],
 	["Build: Vector TOWARD", "eXpoch_keysVectorTiltTwd", 0xD0],
-	["Build: Reset Object", "eXpoch_keysVectorResetObject", 0x4C]
+	["Build: Reset Object", "eXpoch_keysVectorResetObject", 0x4C],
+	
+	["BaseCam: NextCam","Epoch_KB_BaseCamNextCam",0x9C],
+	["BaseCam: Left","Epoch_KB_BaseCamLeft",0x4B],
+	["BaseCam: Right","Epoch_KB_BaseCamRight",0x4D],
+	["BaseCam: Up","Epoch_KB_BaseCamUp",0x48],
+	["BaseCam: Down","Epoch_KB_BaseCamDown",0x50],
+	["BaseCam: Zoom -","Epoch_KB_BaseCamZoomOut",74],
+	["BaseCam: Zoom +","Epoch_KB_BaseCamZoomIn",78],
+	["BaseCam: AutoCam","Epoch_KB_BaseCamAutoCam",0x52]
 ];
 
 _keyMap call EPOCH_custom_KeyMap;
diff --git a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp
index 9d954443..1b680520 100644
--- a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp
+++ b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp
@@ -550,3 +550,13 @@ class player_revive
 	icon = "x\addons\a3_epoch_code\Data\UI\buttons\Revive.paa";
 	tooltipcode = "format ['Revive %1',name dyna_cursorTarget]";
 };
+
+class BaseCam
+{
+	condition = "dyna_cursorTargetType isEqualTo 'BaseCamTerminal_EPOCH'";
+	action = "call Epoch_CamUse;";
+	icon = "x\addons\a3_epoch_code\Data\UI\buttons\Camera.paa";
+	tooltip = "Watch BaseCam";
+};
+
+
diff --git a/Sources/epoch_config/Configs/CfgClientFunctions.hpp b/Sources/epoch_config/Configs/CfgClientFunctions.hpp
index 41081da1..581803bf 100644
--- a/Sources/epoch_config/Configs/CfgClientFunctions.hpp
+++ b/Sources/epoch_config/Configs/CfgClientFunctions.hpp
@@ -52,6 +52,7 @@ class CfgClientFunctions
 			class AutoRun_Check {};
 			class AutoRun {};
 			class DefibrillatorUse {};
+			class CamUse {};
 		};
 		class building
 		{
diff --git a/Sources/epoch_config/Configs/CfgItemInteractions.hpp b/Sources/epoch_config/Configs/CfgItemInteractions.hpp
index 8089a97d..42c98c04 100644
--- a/Sources/epoch_config/Configs/CfgItemInteractions.hpp
+++ b/Sources/epoch_config/Configs/CfgItemInteractions.hpp
@@ -1064,5 +1064,9 @@ class CfgItemInteractions
         interactAction = 17;
         interactText = "ReCharge";
     };
+    class BaseCamTerminal : Default
+    {
+        interactActions[] = {{"Watch","call Epoch_CamUse;"}};
+    };
 };
 /*[[[end]]]*/