diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..56a33f06425feaaf69a41c710b30f9f990a3dbb6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,74 @@
+# Visual Studio 2015 user specific files
+.vs/
+
+# Compiled Object files
+*.slo
+*.lo
+*.o
+*.obj
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+
+# Fortran module files
+*.mod
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.exe
+*.out
+*.app
+*.ipa
+
+# These project files can be generated by the engine
+*.xcodeproj
+*.xcworkspace
+*.sln
+*.suo
+*.opensdf
+*.sdf
+*.VC.db
+*.VC.opendb
+
+# Precompiled Assets
+SourceArt/**/*.png
+SourceArt/**/*.tga
+
+# Binary Files
+Binaries/*
+Plugins/*/Binaries/*
+
+# Builds
+Build/*
+
+# Whitelist PakBlacklist-<BuildConfiguration>.txt files
+!Build/*/
+Build/*/**
+!Build/*/PakBlacklist*.txt
+
+# Don't ignore icon files in Build
+!Build/**/*.ico
+
+# Built data for maps
+*_BuiltData.uasset
+
+# Configuration files generated by the Editor
+Saved/*
+
+# Compiled source files for the engine to use
+Intermediate/*
+Plugins/*/Intermediate/*
+
+# Cache files for the editor to use
+DerivedDataCache/*
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000000000000000000000000000000000000..1a67650303907e8c90aec83bb780360d216fb33a
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,4 @@
+[submodule "Plugins/nDisplayExtensions"]
+	path = Plugins/nDisplayExtensions
+	url = https://devhub.vr.rwth-aachen.de/VR-Group/ndisplayextensions.git
+	branch = develop
diff --git a/Config/DefaultEditor.ini b/Config/DefaultEditor.ini
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini
new file mode 100644
index 0000000000000000000000000000000000000000..2357194d8cc9e98fbf7bf478224594be4c172759
--- /dev/null
+++ b/Config/DefaultEngine.ini
@@ -0,0 +1,94 @@
+[/Script/HardwareTargeting.HardwareTargetingSettings]
+TargetedHardwareClass=Desktop
+AppliedTargetedHardwareClass=Desktop
+DefaultGraphicsPerformance=Maximum
+AppliedDefaultGraphicsPerformance=Maximum
+
+[/Script/EngineSettings.GameMapsSettings]
+EditorStartupMap=/Game/Maps/Main.Main
+GameDefaultMap=/Game/Maps/Main.Main
+GlobalDefaultGameMode=/Script/nDisplayExtensions.DisplayClusterGameModeCAVE
+
+[/Script/Engine.Engine]
+GameEngine=/Script/DisplayCluster.DisplayClusterGameEngine
+UnrealEdEngine=/Script/DisplayClusterEditor.DisplayClusterEditorEngine
+
++ActiveGameNameRedirects=(OldGameName="TP_nDisplayBP",NewGameName="/Script/template")
++ActiveGameNameRedirects=(OldGameName="/Script/TP_nDisplayBP",NewGameName="/Script/template")
+
+[/Script/DisplayClusterEditor.DisplayClusterEditorSettings]
+bEnabled=True
+
+[/Script/WindowsTargetPlatform.WindowsTargetSettings]
+Compiler=Default
+-TargetedRHIs=PCD3D_SM5
+-TargetedRHIs=PCD3D_SM4
++TargetedRHIs=PCD3D_SM5
++TargetedRHIs=PCD3D_SM4
++TargetedRHIs=GLSL_430
++TargetedRHIs=GLSL_150
+MinimumOSVersion=MSOS_Vista
+AudioDevice=
+AudioSampleRate=48000
+AudioCallbackBufferFrameSize=1024
+AudioNumBuffersToEnqueue=1
+AudioMaxChannels=0
+AudioNumSourceWorkers=4
+SpatializationPlugin=
+ReverbPlugin=
+OcclusionPlugin=
+
+[/Script/Engine.RendererSettings]
+r.DefaultFeature.Bloom=False
+r.DefaultFeature.AutoExposure=False
+r.DefaultFeature.MotionBlur=False
+
+[/Script/HardwareTargeting.HardwareTargetingSettings]
+TargetedHardwareClass=Desktop
+DefaultGraphicsPerformance=Maximum
+
+[/Script/Engine.PhysicsSettings]
+DefaultGravityZ=-980.000000
+DefaultTerminalVelocity=4000.000000
+DefaultFluidFriction=0.300000
+SimulateScratchMemorySize=262144
+RagdollAggregateThreshold=4
+TriangleMeshTriangleMinAreaThreshold=5.000000
+bEnableAsyncScene=False
+bEnableShapeSharing=False
+bEnablePCM=True
+bEnableStabilization=False
+bWarnMissingLocks=True
+bEnable2DPhysics=False
+PhysicErrorCorrection=(PingExtrapolation=0.100000,ErrorPerLinearDifference=1.000000,ErrorPerAngularDifference=1.000000,MaxRestoredStateError=1.000000,PositionLerp=0.000000,AngleLerp=0.400000,LinearVelocityCoefficient=100.000000,AngularVelocityCoefficient=10.000000,ErrorAccumulationSeconds=0.500000,ErrorAccumulationDistanceSq=15.000000,ErrorAccumulationSimilarity=100.000000)
+LockedAxis=Invalid
+DefaultDegreesOfFreedom=Full3D
+BounceThresholdVelocity=200.000000
+FrictionCombineMode=Average
+RestitutionCombineMode=Average
+MaxAngularVelocity=3600.000000
+MaxDepenetrationVelocity=0.000000
+ContactOffsetMultiplier=0.020000
+MinContactOffset=2.000000
+MaxContactOffset=8.000000
+bSimulateSkeletalMeshOnDedicatedServer=True
+DefaultShapeComplexity=CTF_UseSimpleAndComplex
+bDefaultHasComplexCollision=True
+bSuppressFaceRemapTable=False
+bSupportUVFromHitResults=False
+bDisableActiveActors=False
+bDisableKinematicStaticPairs=False
+bDisableKinematicKinematicPairs=False
+bDisableCCD=False
+bEnableEnhancedDeterminism=False
+MaxPhysicsDeltaTime=0.033333
+bSubstepping=False
+bSubsteppingAsync=False
+MaxSubstepDeltaTime=0.016667
+MaxSubsteps=6
+SyncSceneSmoothingFactor=0.000000
+AsyncSceneSmoothingFactor=0.990000
+InitialAverageFrameRate=0.016667
+PhysXTreeRebuildRate=10
+DefaultBroadphaseSettings=(bUseMBPOnClient=False,bUseMBPOnServer=False,MBPBounds=(Min=(X=0.000000,Y=0.000000,Z=0.000000),Max=(X=0.000000,Y=0.000000,Z=0.000000),IsValid=0),MBPNumSubdivs=2)
+
diff --git a/Config/DefaultGame.ini b/Config/DefaultGame.ini
new file mode 100644
index 0000000000000000000000000000000000000000..0e5b13c42aa0ab1d5f04e41f4dcc96f02c914c27
--- /dev/null
+++ b/Config/DefaultGame.ini
@@ -0,0 +1,8 @@
+[/Script/EngineSettings.GeneralProjectSettings]
+ProjectID=6F40C2084FB7D1EAFCAEF3B2C978D28C
+ProjectName=template
+bUseBorderlessWindow=True
+
+[/Script/UnrealEd.ProjectPackagingSettings]
++DirectoriesToAlwaysStageAsNonUFS=(Path="ExampleConfigs")
+
diff --git a/Config/DefaultInput.ini b/Config/DefaultInput.ini
new file mode 100644
index 0000000000000000000000000000000000000000..e897848a946791df6ce2a59e3498340724d17f9c
--- /dev/null
+++ b/Config/DefaultInput.ini
@@ -0,0 +1,61 @@
+
+[/Script/Engine.InputSettings]
+-AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
+-AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
+-AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
+-AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
+-AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
+-AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
++AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Left_TriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Left_Grip1Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Left_Grip2Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Right_TriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Right_Grip1Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Right_Grip2Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="Gamepad_Special_Left_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+bAltEnterTogglesFullscreen=True
+bF11TogglesFullscreen=True
+bUseMouseForTouch=False
+bEnableMouseSmoothing=True
+bEnableFOVScaling=True
+bCaptureMouseOnLaunch=True
+bDefaultViewportMouseLock=False
+bAlwaysShowTouchInterface=False
+bShowConsoleOnFourFingerTap=True
+bEnableGestureRecognizer=False
+DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown
+DefaultViewportMouseLockMode=LockOnCapture
+FOVScale=0.011110
+DoubleClickTime=0.200000
++AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=W)
++AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=D)
++AxisMappings=(AxisName="MoveUp",Scale=1.000000,Key=E)
++AxisMappings=(AxisName="TurnRate",Scale=-1.000000,Key=Left)
++AxisMappings=(AxisName="LookUpRate",Scale=-1.000000,Key=Up)
++AxisMappings=(AxisName="MoveForward",Scale=-1.000000,Key=S)
++AxisMappings=(AxisName="MoveRight",Scale=-1.000000,Key=A)
++AxisMappings=(AxisName="MoveUp",Scale=-1.000000,Key=Q)
++AxisMappings=(AxisName="TurnRate",Scale=1.000000,Key=Right)
++AxisMappings=(AxisName="TurnRate",Scale=1.000000,Key=MouseX)
++AxisMappings=(AxisName="LookUpRate",Scale=1.000000,Key=Down)
++AxisMappings=(AxisName="LookUpRate",Scale=-1.000000,Key=MouseY)
+DefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks
+ConsoleKey=None
+-ConsoleKeys=Tilde
++ConsoleKeys=Tilde
+
+
diff --git a/Config/TemplateDefs.ini b/Config/TemplateDefs.ini
new file mode 100644
index 0000000000000000000000000000000000000000..70be5f169bb3ca74a9f970ccf31a36a2240d7109
--- /dev/null
+++ b/Config/TemplateDefs.ini
@@ -0,0 +1,37 @@
+[/Script/GameProjectGeneration.TemplateProjectDefs]
+LocalizedDisplayNames=(Language="en",Text="RWTH VR")
+LocalizedDescriptions=(Language="en",Text="Template catering to the common use cases at RWTH VR. Contains nDisplayExtensions, AixCAVE config files, launch scripts and more.")
+
+ClassTypes=Character, GameMode, HUD, Actor
+AssetTypes=Animation Sequence, Animation Montage, Sound Wave, Skeletal Mesh, Animation Blueprint, Skeleton, Static Mesh, Texture.
+
+FoldersToIgnore=Binaries
+FoldersToIgnore=Build
+FoldersToIgnore=Intermediate
+FoldersToIgnore=Saved
+FoldersToIgnore=Media
+
+FilesToIgnore="%TEMPLATENAME%.uproject"
+FilesToIgnore="%TEMPLATENAME%.png"
+FilesToIgnore="Config/TemplateDefs.ini"
+FilesToIgnore="Config/config.ini"
+FilesToIgnore="%TEMPLATENAME%.opensdf"
+FilesToIgnore="%TEMPLATENAME%.sdf"
+FilesToIgnore="%TEMPLATENAME%.v11.suo"
+FilesToIgnore="%TEMPLATENAME%.v12.suo"
+FilesToIgnore="%TEMPLATENAME%.sln"
+FilesToIgnore="Manifest.json"
+FilesToIgnore="contents.txt"
+FilesToIgnore="README.md"
+
+
+FolderRenames=(From="Source/%TEMPLATENAME%",To="Source/%PROJECTNAME%")
+FolderRenames=(From="Source/%TEMPLATENAME%Editor",To="Source/%PROJECTNAME%Editor")
+
+FilenameReplacements=(Extensions=("cpp","h","ini","cs"),From="%TEMPLATENAME_UPPERCASE%",To="%PROJECTNAME_UPPERCASE%",bCaseSensitive=true)
+FilenameReplacements=(Extensions=("cpp","h","ini","cs"),From="%TEMPLATENAME_LOWERCASE%",To="%PROJECTNAME_LOWERCASE%",bCaseSensitive=true)
+FilenameReplacements=(Extensions=("cpp","h","ini","cs"),From="%TEMPLATENAME%",To="%PROJECTNAME%",bCaseSensitive=false)
+
+ReplacementsInFiles=(Extensions=("cpp","h","ini","cs"),From="%TEMPLATENAME_UPPERCASE%",To="%PROJECTNAME_UPPERCASE%",bCaseSensitive=true)
+ReplacementsInFiles=(Extensions=("cpp","h","ini","cs"),From="%TEMPLATENAME_LOWERCASE%",To="%PROJECTNAME_LOWERCASE%",bCaseSensitive=true)
+ReplacementsInFiles=(Extensions=("cpp","h","ini","cs"),From="%TEMPLATENAME%",To="%PROJECTNAME%",bCaseSensitive=false)
diff --git a/Content/Configurations/aixcave.cfg b/Content/Configurations/aixcave.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..f99a9f548bb8382490fd2d47d35e17288037d464
--- /dev/null
+++ b/Content/Configurations/aixcave.cfg
@@ -0,0 +1,311 @@
+#####################################################################
+# nDisplay config file
+# 
+# This file demonstrates how to configure for the AixCAVE.
+#####################################################################
+
+#####################################################################
+# List of cluster nodes 
+#******************************************************************** 
+# Cluster node is an application instance. It's allowed to use
+# multiple instances on the same PC. Sometimes its necessary.
+#
+# Properties:
+# id       - unique node name
+# addr     - network address (IPv4 only)
+# screen   - projection screen ID to use
+# viewport - viewport ID to use
+# master   - specifies if current node is master; default is 'false'
+# port_cs  - Cluster Synchronization port (required on master node only)
+# port_ss  - Swap Synchronization port (required on master node only)
+#
+# Optional properties:
+# sound    - turns on/off sound for this application instance; default is 'false'
+#******************************************************************** 
+[cluster_node] id=node_main                               addr=10.0.1.29  screen=screen_main                    viewport=vp_1000 port_cs=41001 port_ss=41002 master=true sound=true
+
+[cluster_node] id=node_front_upper_left_eye_left          addr=10.0.1.1   screen=screen_front_upper_left        viewport=vp_1200
+[cluster_node] id=node_front_upper_left_eye_right         addr=10.0.1.1   screen=screen_front_upper_left        viewport=vp_1200
+[cluster_node] id=node_front_upper_right_eye_left         addr=10.0.1.2   screen=screen_front_upper_right       viewport=vp_1200
+[cluster_node] id=node_front_upper_right_eye_right        addr=10.0.1.2   screen=screen_front_upper_right       viewport=vp_1200
+[cluster_node] id=node_front_lower_left_eye_left          addr=10.0.1.3   screen=screen_front_lower_left        viewport=vp_1200
+[cluster_node] id=node_front_lower_left_eye_right         addr=10.0.1.3   screen=screen_front_lower_left        viewport=vp_1200
+[cluster_node] id=node_front_lower_right_eye_left         addr=10.0.1.4   screen=screen_front_lower_left        viewport=vp_1200
+[cluster_node] id=node_front_lower_right_eye_right        addr=10.0.1.4   screen=screen_front_lower_left        viewport=vp_1200
+
+[cluster_node] id=node_left_upper_left_eye_left           addr=10.0.1.5   screen=screen_left_upper_left         viewport=vp_1200
+[cluster_node] id=node_left_upper_left_eye_right          addr=10.0.1.5   screen=screen_left_upper_left         viewport=vp_1200
+[cluster_node] id=node_left_upper_right_eye_left          addr=10.0.1.6   screen=screen_left_upper_right        viewport=vp_1200
+[cluster_node] id=node_left_upper_right_eye_right         addr=10.0.1.6   screen=screen_left_upper_right        viewport=vp_1200
+[cluster_node] id=node_left_lower_left_eye_left           addr=10.0.1.7   screen=screen_left_lower_left         viewport=vp_1200
+[cluster_node] id=node_left_lower_left_eye_right          addr=10.0.1.7   screen=screen_left_lower_left         viewport=vp_1200
+[cluster_node] id=node_left_lower_right_eye_left          addr=10.0.1.8   screen=screen_left_lower_right        viewport=vp_1200
+[cluster_node] id=node_left_lower_right_eye_right         addr=10.0.1.8   screen=screen_left_lower_right        viewport=vp_1200
+
+[cluster_node] id=node_right_upper_left_eye_left          addr=10.0.1.9   screen=screen_right_upper_left        viewport=vp_1200
+[cluster_node] id=node_right_upper_left_eye_right         addr=10.0.1.9   screen=screen_right_upper_left        viewport=vp_1200
+[cluster_node] id=node_right_upper_right_eye_left         addr=10.0.1.10  screen=screen_right_upper_right       viewport=vp_1200
+[cluster_node] id=node_right_upper_right_eye_right        addr=10.0.1.10  screen=screen_right_upper_right       viewport=vp_1200
+[cluster_node] id=node_right_lower_left_eye_left          addr=10.0.1.11  screen=screen_right_lower_left        viewport=vp_1200
+[cluster_node] id=node_right_lower_left_eye_right         addr=10.0.1.11  screen=screen_right_lower_left        viewport=vp_1200
+[cluster_node] id=node_right_lower_right_eye_left         addr=10.0.1.12  screen=screen_right_lower_right       viewport=vp_1200
+[cluster_node] id=node_right_lower_right_eye_right        addr=10.0.1.12  screen=screen_right_lower_right       viewport=vp_1200
+
+[cluster_node] id=node_back_upper_left_eye_left           addr=10.0.1.13  screen=screen_back_upper_left         viewport=vp_1200
+[cluster_node] id=node_back_upper_left_eye_right          addr=10.0.1.13  screen=screen_back_upper_left         viewport=vp_1200
+[cluster_node] id=node_back_upper_right_eye_left          addr=10.0.1.14  screen=screen_back_upper_right        viewport=vp_1200
+[cluster_node] id=node_back_upper_right_eye_right         addr=10.0.1.14  screen=screen_back_upper_right        viewport=vp_1200
+[cluster_node] id=node_back_lower_left_eye_left           addr=10.0.1.15  screen=screen_back_lower_left         viewport=vp_1200
+[cluster_node] id=node_back_lower_left_eye_right          addr=10.0.1.15  screen=screen_back_lower_left         viewport=vp_1200
+[cluster_node] id=node_back_lower_right_eye_left          addr=10.0.1.16  screen=screen_back_lower_right        viewport=vp_1200
+[cluster_node] id=node_back_lower_right_eye_right         addr=10.0.1.16  screen=screen_back_lower_right        viewport=vp_1200
+
+[cluster_node] id=node_floor_front_upper_left_eye_left    addr=10.0.1.17  screen=screen_floor_front_upper_left  viewport=vp_1200
+[cluster_node] id=node_floor_front_upper_left_eye_right   addr=10.0.1.17  screen=screen_floor_front_upper_left  viewport=vp_1200
+[cluster_node] id=node_floor_front_upper_right_eye_left   addr=10.0.1.19  screen=screen_floor_front_upper_right viewport=vp_1200
+[cluster_node] id=node_floor_front_upper_right_eye_right  addr=10.0.1.19  screen=screen_floor_front_upper_right viewport=vp_1200
+[cluster_node] id=node_floor_front_lower_left_eye_left    addr=10.0.1.18  screen=screen_floor_front_lower_left  viewport=vp_1200
+[cluster_node] id=node_floor_front_lower_left_eye_right   addr=10.0.1.18  screen=screen_floor_front_lower_left  viewport=vp_1200
+[cluster_node] id=node_floor_front_lower_right_eye_left   addr=10.0.1.20  screen=screen_floor_front_lower_right viewport=vp_1200
+[cluster_node] id=node_floor_front_lower_right_eye_right  addr=10.0.1.20  screen=screen_floor_front_lower_right viewport=vp_1200
+
+[cluster_node] id=node_floor_back_upper_left_eye_left     addr=10.0.1.21  screen=screen_floor_back_upper_left   viewport=vp_1200
+[cluster_node] id=node_floor_back_upper_left_eye_right    addr=10.0.1.21  screen=screen_floor_back_upper_left   viewport=vp_1200
+[cluster_node] id=node_floor_back_upper_right_eye_left    addr=10.0.1.23  screen=screen_floor_back_upper_right  viewport=vp_1200
+[cluster_node] id=node_floor_back_upper_right_eye_right   addr=10.0.1.23  screen=screen_floor_back_upper_right  viewport=vp_1200
+[cluster_node] id=node_floor_back_lower_left_eye_left     addr=10.0.1.22  screen=screen_floor_back_lower_left   viewport=vp_1200
+[cluster_node] id=node_floor_back_lower_left_eye_right    addr=10.0.1.22  screen=screen_floor_back_lower_left   viewport=vp_1200
+[cluster_node] id=node_floor_back_lower_right_eye_left    addr=10.0.1.24  screen=screen_floor_back_lower_right  viewport=vp_1200
+[cluster_node] id=node_floor_back_lower_right_eye_right   addr=10.0.1.24  screen=screen_floor_back_lower_right  viewport=vp_1200
+#####################################################################
+
+
+#####################################################################
+# List of projection screens
+#******************************************************************** 
+# Projection screen is a rectangle which determines the camera frustum.
+# Usually the projection screen has the same dimensions as an output
+# display but in some cases it may differ.
+#
+# Properties:
+# id     - unique projection screen name
+# loc    - relative location to the parent component. Location is relative
+#          to the VR root if no parent specified. The pivot is a screen's
+#          center and the values are in meters.
+# rot    - relative rotation to the parent component. Rotation is relative
+#          to the VR root if no parent specified. The pivot is a screen's
+#          center and the values are in degrees.
+# size   - width (X) and height (Y) of the screen. Values are in meters.
+#
+# Optional properties:
+# parent     - ID of parent component in VR hierarchy; default is VR root.
+# tracker_id - ID of tracking device; no tracking by default.
+# tracker_ch - ID of tracking device's channel; no tracking by default.
+#******************************************************************** 
+[screen] id=screen_main                    loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=0.433333,Y=0.270833" parent=display_main
+[screen] id=screen_front_upper_left        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_front_upper_left
+[screen] id=screen_front_upper_right       loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_front_upper_right 
+[screen] id=screen_front_lower_left        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_front_lower_left 
+[screen] id=screen_front_lower_left        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_front_lower_left
+[screen] id=screen_left_upper_left         loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_left_upper_left
+[screen] id=screen_left_upper_right        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_left_upper_right 
+[screen] id=screen_left_lower_left         loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_left_lower_left 
+[screen] id=screen_left_lower_right        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_left_lower_right
+[screen] id=screen_right_upper_left        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_right_upper_left
+[screen] id=screen_right_upper_right       loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_right_upper_right 
+[screen] id=screen_right_lower_left        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_right_lower_left 
+[screen] id=screen_right_lower_right       loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_right_lower_right
+[screen] id=screen_back_upper_left         loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_back_upper_left
+[screen] id=screen_back_upper_right        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_back_upper_right 
+[screen] id=screen_back_lower_left         loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_back_lower_left 
+[screen] id=screen_back_lower_right        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_back_lower_right
+[screen] id=screen_floor_front_upper_left  loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_front_upper_left
+[screen] id=screen_floor_front_upper_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_front_upper_right 
+[screen] id=screen_floor_front_lower_left  loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_front_lower_left 
+[screen] id=screen_floor_front_lower_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_front_lower_right
+[screen] id=screen_floor_back_upper_left   loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_back_upper_left
+[screen] id=screen_floor_back_upper_right  loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_back_upper_right 
+[screen] id=screen_floor_back_lower_left   loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_back_lower_left
+[screen] id=screen_floor_back_lower_right  loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_back_lower_right
+###############################################################
+
+
+#####################################################################
+# List of viewport configurations 
+#******************************************************************** 
+# Viewport is a rectangle area of game window where rendered frame is
+# mapped. Usually the viewport starts at 0:0 and has the same size as
+# its parent window but in some cases these settings may differ.
+#
+# Properties:
+# id     - unique viewport name
+# x      - X coordinate of viewport's top left corner
+# y      - Y coordinate of viewport's top left corner
+# width  - width of viewport in pixels
+# height - height of viewport in pixels
+#
+# Optional properties:
+# flip_h - flip image horizontally; default is 'false'
+# flip_v - flip image vertically; default is 'false'
+#******************************************************************** 
+[viewport] id=vp_1000 x=0 y=0 width=1600 height=1000 flip_h=False flip_v=False
+[viewport] id=vp_1200 x=0 y=0 width=1920 height=1200 flip_h=False flip_v=False
+#####################################################################
+
+
+#####################################################################
+# List of cameras 
+#******************************************************************** 
+# Camera is a predefined point frome where the stereoscopic view built.
+# It's possible to define multiple cameras and swith the active one
+# during runtime. You're free to attach any camera to a tracking device
+# for head tracking. Consider a camera as a viewer's head.
+#
+# Properties:
+# id  - unique camera name
+# loc - relative location to the parent component. Location is relative
+#       to the VR root if no parent specified.
+# rot - relative rotation to the parent component. Rotation is relative
+#       to the VR root if no parent specified.
+#
+# Optional properties:
+# parent     - ID of parent component in VR hierarchy; default is VR root.
+# tracker_id - ID of tracking device; no tracking by default.
+# tracker_ch - ID of tracking device's channel; no tracking by default.
+#******************************************************************** 
+[camera] id=camera_dynamic loc="X=0,Y=0,Z=0" parent=shutter_glasses
+#####################################################################
+
+
+#####################################################################
+# List of scene nodes nodes (hierarchy transforms) 
+#******************************************************************** 
+# Scene node is an actor component which is basically a transformation
+# matrix. Scene nodes can be helpful to build a component hierarchy, to
+# define some special places (like a socket) within VR space.
+#
+# It might be difficult to understand what VR space origin is. Consider
+# it as a point in space where VR space starts. Any componenent listed
+# in this config file is relative to its parent or this origin.
+#
+# Properties:
+# id  - unique scene node name
+# loc - relative location to the parent component. Location is relative
+#       to the VR root if no parent specified.
+# rot - relative rotation to the parent component. Rotation is relative
+#       to the VR root if no parent specified.
+#
+# Optional properties:
+# parent     - ID of parent component in VR hierarchy; default is VR root.
+# tracker_id - ID of tracking device; no tracking by default.
+# tracker_ch - ID of tracking device's channel; no tracking by default.
+#******************************************************************** 
+[scene_node] id=cave_origin                     loc="X=0,Y=0,Z=0"                       rot="P=0,Y=0,R=0"
+[scene_node] id=cave_center                     loc="X=0,Y=0,Z=1.65"                    rot="P=0,Y=0,R=0"   parent=cave_origin
+
+[scene_node] id=flystick                        loc="X=0,Y=0,Z=0"                       rot="P=0,Y=0,R=0"   parent=cave_origin      tracker_id=DTrackTracker tracker_ch=7
+[scene_node] id=shutter_glasses                 loc="X=0,Y=0,Z=0"                       rot="P=0,Y=0,R=0"   parent=cave_origin      tracker_id=DTrackTracker tracker_ch=0
+[scene_node] id=display_main                    loc="X=0.40.0,Y=0,Z=0"                  rot="P=0,Y=0,R=0"   parent=shutter_glasses
+
+[scene_node] id=angle_left                      loc="X=0,Y=0,Z=0"                       rot="P=0,Y=-90,R=0" parent=cave_center
+[scene_node] id=angle_right                     loc="X=0,Y=0,Z=0"                       rot="P=0,Y=90,R=0"  parent=cave_center
+[scene_node] id=angle_back                      loc="X=0,Y=0,Z=0"                       rot="P=0,Y=180,R=0" parent=cave_center
+[scene_node] id=angle_floor                     loc="X=0,Y=0,Z=0"                       rot="P=-90,Y=0,R=0" parent=cave_origin
+
+[scene_node] id=display_front_upper_left        loc="X=2.625,Y=-1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=cave_center
+[scene_node] id=display_front_upper_right       loc="X=2.625,Y=+1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=cave_center
+[scene_node] id=display_front_lower_left        loc="X=2.625,Y=-1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=cave_center
+[scene_node] id=display_front_lower_left        loc="X=2.625,Y=+1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=cave_center
+
+[scene_node] id=display_left_upper_left         loc="X=2.625,Y=-1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_left
+[scene_node] id=display_left_upper_right        loc="X=2.625,Y=+1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_left
+[scene_node] id=display_left_lower_left         loc="X=2.625,Y=-1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_left
+[scene_node] id=display_left_lower_right        loc="X=2.625,Y=+1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_left
+
+[scene_node] id=display_right_upper_left        loc="X=2.625,Y=-1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_right
+[scene_node] id=display_right_upper_right       loc="X=2.625,Y=+1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_right
+[scene_node] id=display_right_lower_left        loc="X=2.625,Y=-1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_right
+[scene_node] id=display_right_lower_right       loc="X=2.625,Y=+1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_right
+
+[scene_node] id=display_back_upper_left         loc="X=2.625,Y=-1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_back
+[scene_node] id=display_back_upper_right        loc="X=2.625,Y=+1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_back
+[scene_node] id=display_back_lower_left         loc="X=2.625,Y=-1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_back
+[scene_node] id=display_back_lower_right        loc="X=2.625,Y=+1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_back
+
+[scene_node] id=display_floor_front_upper_left  loc="X=0,Y=-1.125,Z=+1.6875"            rot="P=0,Y=0,R=0"   parent=angle_floor
+[scene_node] id=display_floor_front_upper_right loc="X=0,Y=1.125,Z=+1.6875"             rot="P=0,Y=0,R=0"   parent=angle_floor
+[scene_node] id=display_floor_front_lower_left  loc="X=0,Y=-1.125,Z=+0.9375"            rot="P=0,Y=0,R=0"   parent=angle_floor
+[scene_node] id=display_floor_front_lower_right loc="X=0,Y=1.125,Z=+0.9375"             rot="P=0,Y=0,R=0"   parent=angle_floor
+
+[scene_node] id=display_floor_back_upper_left   loc="X=0,Y=-1.125,Z=-0.9375"            rot="P=0,Y=0,R=0"   parent=angle_floor
+[scene_node] id=display_floor_back_upper_right  loc="X=0,Y=1.125,Z=-0.9375"             rot="P=0,Y=0,R=0"   parent=angle_floor
+[scene_node] id=display_floor_back_lower_left   loc="X=0,Y=-1.125,Z=-1.6875"            rot="P=0,Y=0,R=0"   parent=angle_floor
+[scene_node] id=display_floor_back_lower_right  loc="X=0,Y=1.125,Z=-1.6875"             rot="P=0,Y=0,R=0"   parent=angle_floor
+#####################################################################
+
+
+#####################################################################
+# List of input devices
+#******************************************************************** 
+# Input devices are VRPN devices. The nDisplay supports the following
+# types: analog, button and tracker. Many of physical input devices
+# can be connected via VRPN.
+#
+# Properties:
+# id    - nique device name
+# type  - VRPN type (analog, button or tracker).
+# addr  - address of a VRPN server which handles this particular device.
+#         The value must match the following format: DEVICENAME@SERVER_ADDRESS
+#         where DEVICENAME is a VRPN name of this device and SERVER_ADDRESS
+#         is IPv4 address of VRPN server.
+# loc   - relative location to the parent component. Location is relative
+#         to the VR root if no parent specified.
+# rot   - relative rotation to the parent component. Rotation is relative
+#         to the VR root if no parent specified.
+#
+# front (tracker only) - mapping of a tracking system axis to X axis of VR origin
+# right (tracker only) - mapping of a tracking system axis to Y axis of VR origin
+# up    (tracker only) - mapping of a tracking system axis to Z axis of VR origin
+# * The following values are allowed for axes mapping: X, -X, Y, -Y, Z, -Z
+#
+# Optional properties:
+# remap - VRPN device channel remapping. Value format is: "from0:to0,from1:to1,...,fromN:toN".
+#         For example: remap="0:3,1:4,5:2"
+#******************************************************************** 
+[input] id=DTrackAxis    type=analog  addr=DTrack2@10.0.1.29
+[input] id=DTrackButtons type=buttons addr=DTrack2@10.0.1.29
+[input] id=DTrackTracker type=tracker addr=DTrack2@10.0.1.29 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" right=X up=Y front=-Z 
+#####################################################################
+
+
+#####################################################################
+# Stereoscopic settings
+#******************************************************************** 
+# Properties:
+# eye_swap - swap left and right eyes:
+#            false - L|R
+#            true  - R|L
+# eye_dist - interoccular distance in meters
+[stereo] eye_swap=True eye_dist=0.064
+#####################################################################
+
+
+#####################################################################
+# General settings
+#******************************************************************** 
+# Properties:
+# swap_sync_policy - swap synchronization policy
+#                  - 0 - no synchronization
+#                  - 1 - software swap synchronization
+#                  - 2 - NV swap lock (Nvidia cards only, OpenGL only)
+[general] swap_sync_policy=2
+#####################################################################
+
+
+#####################################################################
+# Custom arguments
+#******************************************************************** 
+# Any custom arguments available in runtime can be specified here.
+# Format:  ARG_NAME=ARG_VAL
+[custom] 
+#####################################################################
diff --git a/Content/Configurations/aixcave_infiniband.cfg b/Content/Configurations/aixcave_infiniband.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..f2cb3edd0dfdb692988dfa5900bf5b6fdbcde265
--- /dev/null
+++ b/Content/Configurations/aixcave_infiniband.cfg
@@ -0,0 +1,311 @@
+#####################################################################
+# nDisplay config file
+# 
+# This file demonstrates how to configure for the AixCAVE.
+#####################################################################
+
+#####################################################################
+# List of cluster nodes 
+#******************************************************************** 
+# Cluster node is an application instance. It's allowed to use
+# multiple instances on the same PC. Sometimes its necessary.
+#
+# Properties:
+# id       - unique node name
+# addr     - network address (IPv4 only)
+# screen   - projection screen ID to use
+# viewport - viewport ID to use
+# master   - specifies if current node is master; default is 'false'
+# port_cs  - Cluster Synchronization port (required on master node only)
+# port_ss  - Swap Synchronization port (required on master node only)
+#
+# Optional properties:
+# sound    - turns on/off sound for this application instance; default is 'false'
+#******************************************************************** 
+[cluster_node] id=node_main                               addr=134.61.47.29   screen=screen_main                    viewport=vp_1000 port_cs=41001 port_ss=41002 master=true sound=true
+
+[cluster_node] id=node_front_upper_left_eye_left          addr=134.61.47.132  screen=screen_front_upper_left        viewport=vp_1200
+[cluster_node] id=node_front_upper_left_eye_right         addr=134.61.47.132  screen=screen_front_upper_left        viewport=vp_1200
+[cluster_node] id=node_front_upper_right_eye_left         addr=134.61.47.133  screen=screen_front_upper_right       viewport=vp_1200
+[cluster_node] id=node_front_upper_right_eye_right        addr=134.61.47.133  screen=screen_front_upper_right       viewport=vp_1200
+[cluster_node] id=node_front_lower_left_eye_left          addr=134.61.47.134  screen=screen_front_lower_left        viewport=vp_1200
+[cluster_node] id=node_front_lower_left_eye_right         addr=134.61.47.134  screen=screen_front_lower_left        viewport=vp_1200
+[cluster_node] id=node_front_lower_right_eye_left         addr=134.61.47.135  screen=screen_front_lower_left        viewport=vp_1200
+[cluster_node] id=node_front_lower_right_eye_right        addr=134.61.47.135  screen=screen_front_lower_left        viewport=vp_1200
+
+[cluster_node] id=node_left_upper_left_eye_left           addr=134.61.47.136  screen=screen_left_upper_left         viewport=vp_1200
+[cluster_node] id=node_left_upper_left_eye_right          addr=134.61.47.136  screen=screen_left_upper_left         viewport=vp_1200
+[cluster_node] id=node_left_upper_right_eye_left          addr=134.61.47.137  screen=screen_left_upper_right        viewport=vp_1200
+[cluster_node] id=node_left_upper_right_eye_right         addr=134.61.47.137  screen=screen_left_upper_right        viewport=vp_1200
+[cluster_node] id=node_left_lower_left_eye_left           addr=134.61.47.138  screen=screen_left_lower_left         viewport=vp_1200
+[cluster_node] id=node_left_lower_left_eye_right          addr=134.61.47.138  screen=screen_left_lower_left         viewport=vp_1200
+[cluster_node] id=node_left_lower_right_eye_left          addr=134.61.47.139  screen=screen_left_lower_right        viewport=vp_1200
+[cluster_node] id=node_left_lower_right_eye_right         addr=134.61.47.139  screen=screen_left_lower_right        viewport=vp_1200
+
+[cluster_node] id=node_right_upper_left_eye_left          addr=134.61.47.140  screen=screen_right_upper_left        viewport=vp_1200
+[cluster_node] id=node_right_upper_left_eye_right         addr=134.61.47.140  screen=screen_right_upper_left        viewport=vp_1200
+[cluster_node] id=node_right_upper_right_eye_left         addr=134.61.47.141  screen=screen_right_upper_right       viewport=vp_1200
+[cluster_node] id=node_right_upper_right_eye_right        addr=134.61.47.141  screen=screen_right_upper_right       viewport=vp_1200
+[cluster_node] id=node_right_lower_left_eye_left          addr=134.61.47.142  screen=screen_right_lower_left        viewport=vp_1200
+[cluster_node] id=node_right_lower_left_eye_right         addr=134.61.47.142  screen=screen_right_lower_left        viewport=vp_1200
+[cluster_node] id=node_right_lower_right_eye_left         addr=134.61.47.143  screen=screen_right_lower_right       viewport=vp_1200
+[cluster_node] id=node_right_lower_right_eye_right        addr=134.61.47.143  screen=screen_right_lower_right       viewport=vp_1200
+
+[cluster_node] id=node_back_upper_left_eye_left           addr=134.61.47.144  screen=screen_back_upper_left         viewport=vp_1200
+[cluster_node] id=node_back_upper_left_eye_right          addr=134.61.47.144  screen=screen_back_upper_left         viewport=vp_1200
+[cluster_node] id=node_back_upper_right_eye_left          addr=134.61.47.145  screen=screen_back_upper_right        viewport=vp_1200
+[cluster_node] id=node_back_upper_right_eye_right         addr=134.61.47.145  screen=screen_back_upper_right        viewport=vp_1200
+[cluster_node] id=node_back_lower_left_eye_left           addr=134.61.47.146  screen=screen_back_lower_left         viewport=vp_1200
+[cluster_node] id=node_back_lower_left_eye_right          addr=134.61.47.146  screen=screen_back_lower_left         viewport=vp_1200
+[cluster_node] id=node_back_lower_right_eye_left          addr=134.61.47.147  screen=screen_back_lower_right        viewport=vp_1200
+[cluster_node] id=node_back_lower_right_eye_right         addr=134.61.47.147  screen=screen_back_lower_right        viewport=vp_1200
+
+[cluster_node] id=node_floor_front_upper_left_eye_left    addr=134.61.47.148  screen=screen_floor_front_upper_left  viewport=vp_1200
+[cluster_node] id=node_floor_front_upper_left_eye_right   addr=134.61.47.148  screen=screen_floor_front_upper_left  viewport=vp_1200
+[cluster_node] id=node_floor_front_upper_right_eye_left   addr=134.61.47.150  screen=screen_floor_front_upper_right viewport=vp_1200
+[cluster_node] id=node_floor_front_upper_right_eye_right  addr=134.61.47.150  screen=screen_floor_front_upper_right viewport=vp_1200
+[cluster_node] id=node_floor_front_lower_left_eye_left    addr=134.61.47.149  screen=screen_floor_front_lower_left  viewport=vp_1200
+[cluster_node] id=node_floor_front_lower_left_eye_right   addr=134.61.47.149  screen=screen_floor_front_lower_left  viewport=vp_1200
+[cluster_node] id=node_floor_front_lower_right_eye_left   addr=134.61.47.151  screen=screen_floor_front_lower_right viewport=vp_1200
+[cluster_node] id=node_floor_front_lower_right_eye_right  addr=134.61.47.151  screen=screen_floor_front_lower_right viewport=vp_1200
+
+[cluster_node] id=node_floor_back_upper_left_eye_left     addr=134.61.47.152  screen=screen_floor_back_upper_left   viewport=vp_1200
+[cluster_node] id=node_floor_back_upper_left_eye_right    addr=134.61.47.152  screen=screen_floor_back_upper_left   viewport=vp_1200
+[cluster_node] id=node_floor_back_upper_right_eye_left    addr=134.61.47.154  screen=screen_floor_back_upper_right  viewport=vp_1200
+[cluster_node] id=node_floor_back_upper_right_eye_right   addr=134.61.47.154  screen=screen_floor_back_upper_right  viewport=vp_1200
+[cluster_node] id=node_floor_back_lower_left_eye_left     addr=134.61.47.153  screen=screen_floor_back_lower_left   viewport=vp_1200
+[cluster_node] id=node_floor_back_lower_left_eye_right    addr=134.61.47.153  screen=screen_floor_back_lower_left   viewport=vp_1200
+[cluster_node] id=node_floor_back_lower_right_eye_left    addr=134.61.47.155  screen=screen_floor_back_lower_right  viewport=vp_1200
+[cluster_node] id=node_floor_back_lower_right_eye_right   addr=134.61.47.155  screen=screen_floor_back_lower_right  viewport=vp_1200
+#####################################################################
+
+
+#####################################################################
+# List of projection screens
+#******************************************************************** 
+# Projection screen is a rectangle which determines the camera frustum.
+# Usually the projection screen has the same dimensions as an output
+# display but in some cases it may differ.
+#
+# Properties:
+# id     - unique projection screen name
+# loc    - relative location to the parent component. Location is relative
+#          to the VR root if no parent specified. The pivot is a screen's
+#          center and the values are in meters.
+# rot    - relative rotation to the parent component. Rotation is relative
+#          to the VR root if no parent specified. The pivot is a screen's
+#          center and the values are in degrees.
+# size   - width (X) and height (Y) of the screen. Values are in meters.
+#
+# Optional properties:
+# parent     - ID of parent component in VR hierarchy; default is VR root.
+# tracker_id - ID of tracking device; no tracking by default.
+# tracker_ch - ID of tracking device's channel; no tracking by default.
+#******************************************************************** 
+[screen] id=screen_main                    loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=0.433333,Y=0.270833" parent=display_main
+[screen] id=screen_front_upper_left        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_front_upper_left
+[screen] id=screen_front_upper_right       loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_front_upper_right 
+[screen] id=screen_front_lower_left        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_front_lower_left 
+[screen] id=screen_front_lower_left        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_front_lower_left
+[screen] id=screen_left_upper_left         loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_left_upper_left
+[screen] id=screen_left_upper_right        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_left_upper_right 
+[screen] id=screen_left_lower_left         loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_left_lower_left 
+[screen] id=screen_left_lower_right        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_left_lower_right
+[screen] id=screen_right_upper_left        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_right_upper_left
+[screen] id=screen_right_upper_right       loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_right_upper_right 
+[screen] id=screen_right_lower_left        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_right_lower_left 
+[screen] id=screen_right_lower_right       loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_right_lower_right
+[screen] id=screen_back_upper_left         loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_back_upper_left
+[screen] id=screen_back_upper_right        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_back_upper_right 
+[screen] id=screen_back_lower_left         loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_back_lower_left 
+[screen] id=screen_back_lower_right        loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285"  parent=display_back_lower_right
+[screen] id=screen_floor_front_upper_left  loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_front_upper_left
+[screen] id=screen_floor_front_upper_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_front_upper_right 
+[screen] id=screen_floor_front_lower_left  loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_front_lower_left 
+[screen] id=screen_floor_front_lower_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_front_lower_right
+[screen] id=screen_floor_back_upper_left   loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_back_upper_left
+[screen] id=screen_floor_back_upper_right  loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_back_upper_right 
+[screen] id=screen_floor_back_lower_left   loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_back_lower_left
+[screen] id=screen_floor_back_lower_right  loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875"           parent=display_floor_back_lower_right
+###############################################################
+
+
+#####################################################################
+# List of viewport configurations 
+#******************************************************************** 
+# Viewport is a rectangle area of game window where rendered frame is
+# mapped. Usually the viewport starts at 0:0 and has the same size as
+# its parent window but in some cases these settings may differ.
+#
+# Properties:
+# id     - unique viewport name
+# x      - X coordinate of viewport's top left corner
+# y      - Y coordinate of viewport's top left corner
+# width  - width of viewport in pixels
+# height - height of viewport in pixels
+#
+# Optional properties:
+# flip_h - flip image horizontally; default is 'false'
+# flip_v - flip image vertically; default is 'false'
+#******************************************************************** 
+[viewport] id=vp_1000 x=0 y=0 width=1600 height=1000 flip_h=False flip_v=False
+[viewport] id=vp_1200 x=0 y=0 width=1920 height=1200 flip_h=False flip_v=False
+#####################################################################
+
+
+#####################################################################
+# List of cameras 
+#******************************************************************** 
+# Camera is a predefined point frome where the stereoscopic view built.
+# It's possible to define multiple cameras and swith the active one
+# during runtime. You're free to attach any camera to a tracking device
+# for head tracking. Consider a camera as a viewer's head.
+#
+# Properties:
+# id  - unique camera name
+# loc - relative location to the parent component. Location is relative
+#       to the VR root if no parent specified.
+# rot - relative rotation to the parent component. Rotation is relative
+#       to the VR root if no parent specified.
+#
+# Optional properties:
+# parent     - ID of parent component in VR hierarchy; default is VR root.
+# tracker_id - ID of tracking device; no tracking by default.
+# tracker_ch - ID of tracking device's channel; no tracking by default.
+#******************************************************************** 
+[camera] id=camera_dynamic loc="X=0,Y=0,Z=0" parent=shutter_glasses
+#####################################################################
+
+
+#####################################################################
+# List of scene nodes nodes (hierarchy transforms) 
+#******************************************************************** 
+# Scene node is an actor component which is basically a transformation
+# matrix. Scene nodes can be helpful to build a component hierarchy, to
+# define some special places (like a socket) within VR space.
+#
+# It might be difficult to understand what VR space origin is. Consider
+# it as a point in space where VR space starts. Any componenent listed
+# in this config file is relative to its parent or this origin.
+#
+# Properties:
+# id  - unique scene node name
+# loc - relative location to the parent component. Location is relative
+#       to the VR root if no parent specified.
+# rot - relative rotation to the parent component. Rotation is relative
+#       to the VR root if no parent specified.
+#
+# Optional properties:
+# parent     - ID of parent component in VR hierarchy; default is VR root.
+# tracker_id - ID of tracking device; no tracking by default.
+# tracker_ch - ID of tracking device's channel; no tracking by default.
+#******************************************************************** 
+[scene_node] id=cave_origin                     loc="X=0,Y=0,Z=0"                       rot="P=0,Y=0,R=0"
+[scene_node] id=cave_center                     loc="X=0,Y=0,Z=1.65"                    rot="P=0,Y=0,R=0"   parent=cave_origin
+
+[scene_node] id=flystick                        loc="X=0,Y=0,Z=0"                       rot="P=0,Y=0,R=0"   parent=cave_origin      tracker_id=DTrackTracker tracker_ch=7
+[scene_node] id=shutter_glasses                 loc="X=0,Y=0,Z=0"                       rot="P=0,Y=0,R=0"   parent=cave_origin      tracker_id=DTrackTracker tracker_ch=0
+[scene_node] id=display_main                    loc="X=0.40.0,Y=0,Z=0"                  rot="P=0,Y=0,R=0"   parent=shutter_glasses
+
+[scene_node] id=angle_left                      loc="X=0,Y=0,Z=0"                       rot="P=0,Y=-90,R=0" parent=cave_center
+[scene_node] id=angle_right                     loc="X=0,Y=0,Z=0"                       rot="P=0,Y=90,R=0"  parent=cave_center
+[scene_node] id=angle_back                      loc="X=0,Y=0,Z=0"                       rot="P=0,Y=180,R=0" parent=cave_center
+[scene_node] id=angle_floor                     loc="X=0,Y=0,Z=0"                       rot="P=-90,Y=0,R=0" parent=cave_origin
+
+[scene_node] id=display_front_upper_left        loc="X=2.625,Y=-1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=cave_center
+[scene_node] id=display_front_upper_right       loc="X=2.625,Y=+1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=cave_center
+[scene_node] id=display_front_lower_left        loc="X=2.625,Y=-1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=cave_center
+[scene_node] id=display_front_lower_left        loc="X=2.625,Y=+1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=cave_center
+
+[scene_node] id=display_left_upper_left         loc="X=2.625,Y=-1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_left
+[scene_node] id=display_left_upper_right        loc="X=2.625,Y=+1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_left
+[scene_node] id=display_left_lower_left         loc="X=2.625,Y=-1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_left
+[scene_node] id=display_left_lower_right        loc="X=2.625,Y=+1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_left
+
+[scene_node] id=display_right_upper_left        loc="X=2.625,Y=-1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_right
+[scene_node] id=display_right_upper_right       loc="X=2.625,Y=+1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_right
+[scene_node] id=display_right_lower_left        loc="X=2.625,Y=-1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_right
+[scene_node] id=display_right_lower_right       loc="X=2.625,Y=+1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_right
+
+[scene_node] id=display_back_upper_left         loc="X=2.625,Y=-1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_back
+[scene_node] id=display_back_upper_right        loc="X=2.625,Y=+1.053575,Z=+0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_back
+[scene_node] id=display_back_lower_left         loc="X=2.625,Y=-1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_back
+[scene_node] id=display_back_lower_right        loc="X=2.625,Y=+1.053575,Z=-0.6678575"  rot="P=0,Y=0,R=0"   parent=angle_back
+
+[scene_node] id=display_floor_front_upper_left  loc="X=0,Y=-1.125,Z=+1.6875"            rot="P=0,Y=0,R=0"   parent=angle_floor
+[scene_node] id=display_floor_front_upper_right loc="X=0,Y=1.125,Z=+1.6875"             rot="P=0,Y=0,R=0"   parent=angle_floor
+[scene_node] id=display_floor_front_lower_left  loc="X=0,Y=-1.125,Z=+0.9375"            rot="P=0,Y=0,R=0"   parent=angle_floor
+[scene_node] id=display_floor_front_lower_right loc="X=0,Y=1.125,Z=+0.9375"             rot="P=0,Y=0,R=0"   parent=angle_floor
+
+[scene_node] id=display_floor_back_upper_left   loc="X=0,Y=-1.125,Z=-0.9375"            rot="P=0,Y=0,R=0"   parent=angle_floor
+[scene_node] id=display_floor_back_upper_right  loc="X=0,Y=1.125,Z=-0.9375"             rot="P=0,Y=0,R=0"   parent=angle_floor
+[scene_node] id=display_floor_back_lower_left   loc="X=0,Y=-1.125,Z=-1.6875"            rot="P=0,Y=0,R=0"   parent=angle_floor
+[scene_node] id=display_floor_back_lower_right  loc="X=0,Y=1.125,Z=-1.6875"             rot="P=0,Y=0,R=0"   parent=angle_floor
+#####################################################################
+
+
+#####################################################################
+# List of input devices
+#******************************************************************** 
+# Input devices are VRPN devices. The nDisplay supports the following
+# types: analog, button and tracker. Many of physical input devices
+# can be connected via VRPN.
+#
+# Properties:
+# id    - nique device name
+# type  - VRPN type (analog, button or tracker).
+# addr  - address of a VRPN server which handles this particular device.
+#         The value must match the following format: DEVICENAME@SERVER_ADDRESS
+#         where DEVICENAME is a VRPN name of this device and SERVER_ADDRESS
+#         is IPv4 address of VRPN server.
+# loc   - relative location to the parent component. Location is relative
+#         to the VR root if no parent specified.
+# rot   - relative rotation to the parent component. Rotation is relative
+#         to the VR root if no parent specified.
+#
+# front (tracker only) - mapping of a tracking system axis to X axis of VR origin
+# right (tracker only) - mapping of a tracking system axis to Y axis of VR origin
+# up    (tracker only) - mapping of a tracking system axis to Z axis of VR origin
+# * The following values are allowed for axes mapping: X, -X, Y, -Y, Z, -Z
+#
+# Optional properties:
+# remap - VRPN device channel remapping. Value format is: "from0:to0,from1:to1,...,fromN:toN".
+#         For example: remap="0:3,1:4,5:2"
+#******************************************************************** 
+[input] id=DTrackAxis    type=analog  addr=DTrack2@10.0.1.29
+[input] id=DTrackButtons type=buttons addr=DTrack2@10.0.1.29
+[input] id=DTrackTracker type=tracker addr=DTrack2@10.0.1.29 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" right=X up=Y front=-Z 
+#####################################################################
+
+
+#####################################################################
+# Stereoscopic settings
+#******************************************************************** 
+# Properties:
+# eye_swap - swap left and right eyes:
+#            false - L|R
+#            true  - R|L
+# eye_dist - interoccular distance in meters
+[stereo] eye_swap=True eye_dist=0.064
+#####################################################################
+
+
+#####################################################################
+# General settings
+#******************************************************************** 
+# Properties:
+# swap_sync_policy - swap synchronization policy
+#                  - 0 - no synchronization
+#                  - 1 - software swap synchronization
+#                  - 2 - NV swap lock (Nvidia cards only, OpenGL only)
+[general] swap_sync_policy=2
+#####################################################################
+
+
+#####################################################################
+# Custom arguments
+#******************************************************************** 
+# Any custom arguments available in runtime can be specified here.
+# Format:  ARG_NAME=ARG_VAL
+[custom] 
+#####################################################################
diff --git a/Content/Maps/Main.umap b/Content/Maps/Main.umap
new file mode 100644
index 0000000000000000000000000000000000000000..bfb6f44a45cfa1d404091e51719825a835b71825
Binary files /dev/null and b/Content/Maps/Main.umap differ
diff --git a/Plugins/nDisplayExtensions b/Plugins/nDisplayExtensions
new file mode 160000
index 0000000000000000000000000000000000000000..986c727e2d633d44028b7c44a9ef8f17dda1baeb
--- /dev/null
+++ b/Plugins/nDisplayExtensions
@@ -0,0 +1 @@
+Subproject commit 986c727e2d633d44028b7c44a9ef8f17dda1baeb
diff --git a/Shell/run_cave.py b/Shell/run_cave.py
new file mode 100644
index 0000000000000000000000000000000000000000..f8528960291068ec1a8ef9212d08843e79464433
--- /dev/null
+++ b/Shell/run_cave.py
@@ -0,0 +1,84 @@
+import subprocess
+import sys
+import time
+
+application_filepath   = "../Binaries/Linux/template.bin"
+configuration_filepath = "../Content/Configurations/aixcave.cfg"
+dtrack_filepath        = "/home/vrsw/DTrack/DTrack2_v2.13.0/bin/DTrack2.bin"
+vrpn_filepath          = "/home/vrsw/vrpn/vrpn_git/build_clang/server_src/vrpn_server"
+vrpn_config_filepath   = "/home/vrsw/vrpn/vrpn_git/build_clang/server_src/vrpn.cfg"
+
+hostname_lookup_table  = {
+  "10.0.1.1" : "ngs01",
+  "10.0.1.2" : "ngs02",
+  "10.0.1.3" : "ngs03",
+  "10.0.1.4" : "ngs04",
+  "10.0.1.5" : "ngs05",
+  "10.0.1.6" : "ngs06",
+  "10.0.1.7" : "ngs07",
+  "10.0.1.8" : "ngs08",
+  "10.0.1.9" : "ngs09",
+  "10.0.1.10": "ngs10",
+  "10.0.1.11": "ngs11",
+  "10.0.1.12": "ngs12",
+  "10.0.1.13": "ngs13",
+  "10.0.1.14": "ngs14",
+  "10.0.1.15": "ngs15",
+  "10.0.1.16": "ngs16",
+  "10.0.1.17": "ngs17",
+  "10.0.1.18": "ngs18",
+  "10.0.1.19": "ngs19",
+  "10.0.1.20": "ngs20",
+  "10.0.1.21": "ngs21",
+  "10.0.1.22": "ngs22",
+  "10.0.1.23": "ngs23",
+  "10.0.1.24": "ngs24",
+  "10.0.1.25": "ngd01",
+  "10.0.1.26": "ngd02",
+  "10.0.1.29": "ngm01"
+}
+
+def main():
+  subprocess.call(["source module load clang/5.0"], shell=True)
+  subprocess.call(["mkdir -p slave_logs"         ], shell=True)
+
+  dtrack_process = subprocess.Popen([dtrack_filepath + " -directstart -measure -wakeup"              ], shell=True)
+  time.sleep(2)
+  vrpn_process   = subprocess.Popen([vrpn_filepath + " -f " + vrpn_config_filepath + " -millisleep 0"], shell=True)
+  time.sleep(2)
+
+  processes = []
+
+  with open(configuration_filepath) as configuration_file:
+    lines = configuration_file.readlines()
+  
+  for line in lines:
+    if line.startsWith("#") or ("[cluster_node]" not in line) or ("master" in line):
+      continue
+
+    split_line = line.split()
+    name       = split_line[1][3:]
+    ip         = split_line[2][5:]
+
+    processes.append(subprocess.Popen([
+      "ssh " + hostname_lookup_table[ip] +
+      " export XAUTHORITY=/var/run/Xauthority-vr; export DISPLAY=:0." + ("1" if ("eye_left" in name) else "0") + ";"
+      " /bin/nice_av00 -n -15 " + application_filepath +
+      " ResX=1920 ResY=1200 WinX=0 WinY=0 -fixedseed -nosplash -opengl4 -fullscreen" +
+      " dc_cfg=" + configuration_filepath + " dc_node=" + name + " -dc_cluster -dc_dev_mono" 
+      " > slave_logs/slave_" + name + ".log"], shell=True))
+    sleep(0.1)
+
+  subprocess.call([
+    "/bin/nice_av00 -n -15 " + application_filepath + 
+    " ResX=1600 ResY=1000 WinX=0 WinY=0 -fixedseed -nosplash -opengl4 -useallavailablecores -windowed" + 
+    " dc_cfg=" + configuration_filepath + " dc_node=node_main -dc_cluster -dc_dev_mono"], shell=True)
+
+  for process in processes:
+    process.kill()
+
+  vrpn_process  .kill()
+  dtrack_process.kill()
+
+if __name__ == "__main__":
+  main()
\ No newline at end of file
diff --git a/Shell/run_cave.sh b/Shell/run_cave.sh
new file mode 100644
index 0000000000000000000000000000000000000000..73c9e813b01fe6c2f70bf7df08da014184821b20
--- /dev/null
+++ b/Shell/run_cave.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+python ./run_cave.py
\ No newline at end of file
diff --git a/Source/template.Target.cs b/Source/template.Target.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c86e05d30c3f395eee54a7a8ba79dd8ea8ec0df1
--- /dev/null
+++ b/Source/template.Target.cs
@@ -0,0 +1,14 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+using UnrealBuildTool;
+using System.Collections.Generic;
+
+public class templateTarget : TargetRules
+{
+	public templateTarget(TargetInfo Target) : base(Target)
+	{
+		Type = TargetType.Game;
+
+		ExtraModuleNames.AddRange( new string[] { "template" } );
+	}
+}
diff --git a/Source/template/nothing.cpp b/Source/template/nothing.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bc209f31730df6167aad7fd78995dcb42f1fe0db
--- /dev/null
+++ b/Source/template/nothing.cpp
@@ -0,0 +1,10 @@
+#include "nothing.h"
+
+nothing::nothing()
+{
+
+}
+nothing::~nothing()
+{
+
+}
diff --git a/Source/template/nothing.h b/Source/template/nothing.h
new file mode 100644
index 0000000000000000000000000000000000000000..94bb46ccd2876b015581e475136c1c301ebdaaab
--- /dev/null
+++ b/Source/template/nothing.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#include "CoreMinimal.h"
+
+class TEMPLATE_API nothing
+{
+public:
+	nothing();
+	~nothing();
+};
diff --git a/Source/template/template.Build.cs b/Source/template/template.Build.cs
new file mode 100644
index 0000000000000000000000000000000000000000..286c427b71faf64d3db7731baf24a2125cbbf296
--- /dev/null
+++ b/Source/template/template.Build.cs
@@ -0,0 +1,23 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+using UnrealBuildTool;
+
+public class template : ModuleRules
+{
+	public template(ReadOnlyTargetRules Target) : base(Target)
+	{
+		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
+	
+		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
+
+		PrivateDependencyModuleNames.AddRange(new string[] {  });
+
+		// Uncomment if you are using Slate UI
+		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
+		
+		// Uncomment if you are using online features
+		// PrivateDependencyModuleNames.Add("OnlineSubsystem");
+
+		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
+	}
+}
diff --git a/Source/template/template.cpp b/Source/template/template.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cd63fb06f09e036972d4048b824a956cfbf4828c
--- /dev/null
+++ b/Source/template/template.cpp
@@ -0,0 +1,4 @@
+#include "template.h"
+#include "Modules/ModuleManager.h"
+
+IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, template, "template" );
diff --git a/Source/template/template.h b/Source/template/template.h
new file mode 100644
index 0000000000000000000000000000000000000000..fe82abe038ecee3f8bfa5dd7306707c14b18ee2b
--- /dev/null
+++ b/Source/template/template.h
@@ -0,0 +1,4 @@
+#pragma once
+
+#include "CoreMinimal.h"
+
diff --git a/Source/templateEditor.Target.cs b/Source/templateEditor.Target.cs
new file mode 100644
index 0000000000000000000000000000000000000000..0ef678778a8098a42cfc78ff5dd4625ee0ca4953
--- /dev/null
+++ b/Source/templateEditor.Target.cs
@@ -0,0 +1,14 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+using UnrealBuildTool;
+using System.Collections.Generic;
+
+public class templateEditorTarget : TargetRules
+{
+	public templateEditorTarget(TargetInfo Target) : base(Target)
+	{
+		Type = TargetType.Editor;
+
+		ExtraModuleNames.AddRange( new string[] { "template" } );
+	}
+}
diff --git a/template.png b/template.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea40b3fd616f3f14ea10d11463460a8cbf16d602
Binary files /dev/null and b/template.png differ
diff --git a/template.uproject b/template.uproject
new file mode 100644
index 0000000000000000000000000000000000000000..7dd8b048fd9d3b765bd5ed48fe755dca0238c98c
--- /dev/null
+++ b/template.uproject
@@ -0,0 +1,22 @@
+{
+	"FileVersion": 3,
+	"EngineAssociation": "4.20",
+	"Category": "",
+	"Description": "",
+	"Modules": [
+		{
+			"Name": "template",
+			"Type": "Runtime",
+			"LoadingPhase": "Default"
+		}
+	],
+	"Plugins": [
+		{
+			"Name": "nDisplay",
+			"Enabled": true
+		}
+	],
+	"TargetPlatforms": [
+		"WindowsNoEditor"
+	]
+}
\ No newline at end of file