diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini
index 2357194d8cc9e98fbf7bf478224594be4c172759..dbbd2716222f2db9b388e20466af05d4f84acc5e 100644
--- a/Config/DefaultEngine.ini
+++ b/Config/DefaultEngine.ini
@@ -7,7 +7,7 @@ AppliedDefaultGraphicsPerformance=Maximum
 [/Script/EngineSettings.GameMapsSettings]
 EditorStartupMap=/Game/Maps/Main.Main
 GameDefaultMap=/Game/Maps/Main.Main
-GlobalDefaultGameMode=/Script/nDisplayExtensions.DisplayClusterGameModeCAVE
+GlobalDefaultGameMode=/Script/DisplayClusterExtensions.VirtualRealityGameMode
 
 [/Script/Engine.Engine]
 GameEngine=/Script/DisplayCluster.DisplayClusterGameEngine
diff --git a/Config/DefaultInput.ini b/Config/DefaultInput.ini
index 485b49f020e861608adcfbd03572ae280581feca..6b9aa40377488bb4709a1964b8c5c6d90804e84b 100644
--- a/Config/DefaultInput.ini
+++ b/Config/DefaultInput.ini
@@ -50,6 +50,12 @@ DoubleClickTime=0.200000
 +ActionMappings=(ActionName="Action4",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=DisplayClusterAction4)
 +ActionMappings=(ActionName="Action5",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Five)
 +ActionMappings=(ActionName="Action5",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=DisplayClusterAction5)
++ActionMappings=(ActionName="Fire",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MotionController_Right_Trigger)
++ActionMappings=(ActionName="Action1",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MotionController_Right_FaceButton1)
++ActionMappings=(ActionName="Action2",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MotionController_Right_FaceButton2)
++ActionMappings=(ActionName="Action3",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MotionController_Right_FaceButton3)
++ActionMappings=(ActionName="Action4",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MotionController_Right_FaceButton4)
++ActionMappings=(ActionName="Action5",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MotionController_Right_Grip1)
 +AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=W)
 +AxisMappings=(AxisName="MoveForward",Scale=-1.000000,Key=S)
 +AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=DisplayClusterAxisY)
@@ -64,6 +70,8 @@ DoubleClickTime=0.200000
 +AxisMappings=(AxisName="LookUpRate",Scale=-1.000000,Key=Up)
 +AxisMappings=(AxisName="LookUpRate",Scale=1.000000,Key=Down)
 +AxisMappings=(AxisName="LookUpRate",Scale=-1.000000,Key=MouseY)
++AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=MotionController_Left_Thumbstick_Y)
++AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=MotionController_Left_Thumbstick_X)
 DefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks
 ConsoleKey=None
 -ConsoleKeys=Tilde
diff --git a/Content/Maps/Main.umap b/Content/Maps/Main.umap
index bfb6f44a45cfa1d404091e51719825a835b71825..86bbb202b28ba7d5caecc613eb591f5e5c324f61 100644
Binary files a/Content/Maps/Main.umap and b/Content/Maps/Main.umap differ
diff --git a/Content/Configurations/aixcave.cfg b/Launch/aixcave.cfg
similarity index 94%
rename from Content/Configurations/aixcave.cfg
rename to Launch/aixcave.cfg
index f99a9f548bb8382490fd2d47d35e17288037d464..6e525835bfab0655a73d7c57cfaf325824631d19 100644
--- a/Content/Configurations/aixcave.cfg
+++ b/Launch/aixcave.cfg
@@ -30,8 +30,8 @@
 [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_front_lower_right_eye_left         addr=10.0.1.4   screen=screen_front_lower_right       viewport=vp_1200
+[cluster_node] id=node_front_lower_right_eye_right        addr=10.0.1.4   screen=screen_front_lower_right       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
@@ -106,7 +106,7 @@
 [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_front_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_front_lower_right
 [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 
@@ -203,9 +203,9 @@
 [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=flystick                        loc="X=0,Y=0,Z=0"                       rot="P=0,Y=0,R=0"   parent=cave_origin      tracker_id=dtrack_tracker 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=dtrack_tracker tracker_ch=0
+[scene_node] id=display_main                    loc="X=0.4,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
@@ -215,7 +215,7 @@
 [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_front_lower_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_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
@@ -233,14 +233,14 @@
 [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_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_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_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
+[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
 #####################################################################
 
 
@@ -272,9 +272,9 @@
 # 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 
+[input] id=dtrack_axis    type=analog  addr=DTrack2@10.0.1.29
+[input] id=dtrack_buttons type=buttons addr=DTrack2@10.0.1.29
+[input] id=dtrack_tracker 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 
 #####################################################################
 
 
diff --git a/Content/Configurations/aixcave_infiniband.cfg b/Launch/aixcave_infiniband.cfg
similarity index 96%
rename from Content/Configurations/aixcave_infiniband.cfg
rename to Launch/aixcave_infiniband.cfg
index f2cb3edd0dfdb692988dfa5900bf5b6fdbcde265..59a6d6c80b2893cc1d32b91ed4838bb003b6b4db 100644
--- a/Content/Configurations/aixcave_infiniband.cfg
+++ b/Launch/aixcave_infiniband.cfg
@@ -30,8 +30,8 @@
 [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_front_lower_right_eye_left         addr=134.61.47.135  screen=screen_front_lower_right       viewport=vp_1200
+[cluster_node] id=node_front_lower_right_eye_right        addr=134.61.47.135  screen=screen_front_lower_right       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
@@ -106,7 +106,7 @@
 [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_front_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_front_lower_right
 [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 
@@ -205,7 +205,7 @@
 
 [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=display_main                    loc="X=0.4,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
@@ -215,7 +215,7 @@
 [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_front_lower_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_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
@@ -233,14 +233,14 @@
 [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_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_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_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
+[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
 #####################################################################
 
 
diff --git a/Launch/clean_aixcave.sh b/Launch/clean_aixcave.sh
new file mode 100644
index 0000000000000000000000000000000000000000..344b0638971a7b7671945a1ffe24d70aa05e3bf9
--- /dev/null
+++ b/Launch/clean_aixcave.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+pkill -f DTrack
+pkill -f vrpn
+pkill -f 'ssh ng'
diff --git a/Launch/launch_aixcave.py b/Launch/launch_aixcave.py
new file mode 100644
index 0000000000000000000000000000000000000000..a3360cff8cc985ec0aa2424f9d66c9b9a1155795
--- /dev/null
+++ b/Launch/launch_aixcave.py
@@ -0,0 +1,88 @@
+import os
+import sys
+import time
+
+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():
+  if len(sys.argv) != 2:
+    print("Invalid arguments. Format: python launch_aixcave.py FULL_PATH_TO_APPLICATION")
+    return
+
+  application_filepath   = sys.argv[1]
+  slave_logs_folder      = os.path.dirname(application_filepath) + "/slave_logs"
+  configuration_filepath = os.path.dirname(os.path.realpath(__file__)) + "/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"
+
+  print("Reading configuration.")
+  with open(configuration_filepath) as configuration_file:
+    configuration = configuration_file.readlines()
+  
+  print("Creating slave_logs directory if not existent.")
+  os.system("mkdir -p " + slave_logs_folder)
+  
+  print("Launching DTrack.")
+  os.system(dtrack_filepath + " -directstart -measure -wakeup &")
+  time.sleep(2)
+
+  print("Launching VRPN.")
+  os.system(vrpn_filepath + " -f " + vrpn_config_filepath + " -millisleep 0 &")
+  time.sleep(2)
+
+  print("Launching slave nodes.")
+  for line in configuration:
+    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:]
+
+    print("Launching slave " + name + " (IP: " + ip + ").")
+    os.system(
+      "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_folder + "/" + name + ".log\" &")
+    time.sleep(0.1)
+
+  print("Launching master node.")
+  os.system(
+    "/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")
+
+if __name__ == "__main__":
+  main()
\ No newline at end of file
diff --git a/Launch/launch_aixcave.sh b/Launch/launch_aixcave.sh
new file mode 100644
index 0000000000000000000000000000000000000000..f6710772fd6cdacf22faab6c9e643d525a1af587
--- /dev/null
+++ b/Launch/launch_aixcave.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+module load clang/5.0
+python ./launch_aixcave.py $1
+./clean_aixcave.sh
diff --git a/Launch/readme.txt b/Launch/readme.txt
new file mode 100644
index 0000000000000000000000000000000000000000..42f1d1bcbe39d86638d823d3b3ec4e6204c0b574
--- /dev/null
+++ b/Launch/readme.txt
@@ -0,0 +1,5 @@
+- Copy this folder to a permanent location in the CAVE master node (consider adding it to path).
+- To launch UE4 CAVE applications use: 
+  ./launch_aixcave.sh FULL_PATH_TO_APPLICATION
+- To kill all relevant processes use:
+  ./clean_aixcave.sh
\ No newline at end of file
diff --git a/Launch/rolv.cfg b/Launch/rolv.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..93bc4e50361ec05c1de8be665852d03da8e4daca
--- /dev/null
+++ b/Launch/rolv.cfg
@@ -0,0 +1,199 @@
+#####################################################################
+# nDisplay config file
+# 
+# This file demonstrates how to configure for the ROLV.
+#####################################################################
+
+#####################################################################
+# 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=127.0.0.1 screen=screen_main   viewport=vp_1600 port_cs=41001 port_ss=41002 master=true sound=true
+[cluster_node] id=node_front_eye_left   addr=127.0.0.1 screen=screen_front  viewport=vp_1600
+[cluster_node] id=node_front_eye_right  addr=127.0.0.1 screen=screen_front  viewport=vp_1600
+#####################################################################
+
+
+#####################################################################
+# 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=3.0,Y=1.85" parent=display_main
+[screen] id=screen_front  loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.0,Y=1.85" parent=display_front
+###############################################################
+
+
+#####################################################################
+# 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_1600 x=0 y=0 width=2560 height=1600 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=rolv_origin     loc="X=0,Y=0,Z=0"     rot="P=0,Y=0,R=0"
+[scene_node] id=flystick        loc="X=0,Y=0,Z=0"     rot="P=0,Y=0,R=0" parent=rolv_origin      tracker_id=dtrack_tracker tracker_ch=2
+[scene_node] id=shutter_glasses loc="X=0,Y=0,Z=0"     rot="P=0,Y=0,R=0" parent=rolv_origin      tracker_id=dtrack_tracker tracker_ch=0
+[scene_node] id=display_main    loc="X=0.4,Y=0,Z=0"   rot="P=0,Y=0,R=0" parent=shutter_glasses
+[scene_node] id=display_front   loc="X=0,Y=0,Z=0.952" rot="P=0,Y=0,R=0" parent=rolv_origin
+#####################################################################
+
+
+#####################################################################
+# 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=dtrack_axis    type=analog  addr=DTrack2@10.0.1.160
+[input] id=dtrack_buttons type=buttons addr=DTrack2@10.0.1.160
+[input] id=dtrack_tracker type=tracker addr=DTrack2@10.0.1.160 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/Plugins/nDisplayExtensions b/Plugins/nDisplayExtensions
index 2c957ae50351a527617f6701b178f6128f6fbdee..bfd69b81e94a32ae54e5e3bd792e7b218eb9cef9 160000
--- a/Plugins/nDisplayExtensions
+++ b/Plugins/nDisplayExtensions
@@ -1 +1 @@
-Subproject commit 2c957ae50351a527617f6701b178f6128f6fbdee
+Subproject commit bfd69b81e94a32ae54e5e3bd792e7b218eb9cef9
diff --git a/Shell/run_cave.py b/Shell/run_cave.py
deleted file mode 100644
index f8528960291068ec1a8ef9212d08843e79464433..0000000000000000000000000000000000000000
--- a/Shell/run_cave.py
+++ /dev/null
@@ -1,84 +0,0 @@
-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
deleted file mode 100644
index 73c9e813b01fe6c2f70bf7df08da014184821b20..0000000000000000000000000000000000000000
--- a/Shell/run_cave.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-python ./run_cave.py
\ No newline at end of file