diff --git a/Content/Configurations/aixcave.cfg b/Content/Configurations/aixcave.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..4b6b49d60c45ffc5848331061a95844073fb0570
--- /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=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.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=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 
+#####################################################################
+
+
+#####################################################################
+# 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/Source/nDisplayExtensions/nDisplayExtensions.Build.cs b/Source/DisplayClusterExtensions/DisplayClusterExtensions.Build.cs
similarity index 79%
rename from Source/nDisplayExtensions/nDisplayExtensions.Build.cs
rename to Source/DisplayClusterExtensions/DisplayClusterExtensions.Build.cs
index 22f9d9dcf3e85da6b4565f32f5543364fc735762..6b3217d6f6fc3cfb2d7e8b3ca0b81f3b493b7b78 100644
--- a/Source/nDisplayExtensions/nDisplayExtensions.Build.cs
+++ b/Source/DisplayClusterExtensions/DisplayClusterExtensions.Build.cs
@@ -1,8 +1,8 @@
 using UnrealBuildTool;
 
-public class nDisplayExtensions : ModuleRules
+public class DisplayClusterExtensions : ModuleRules
 {
-  public nDisplayExtensions(ReadOnlyTargetRules Target) : base(Target)
+  public DisplayClusterExtensions(ReadOnlyTargetRules Target) : base(Target)
   {
     PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
 
@@ -28,6 +28,7 @@ public class nDisplayExtensions : ModuleRules
         "Core",
         "CoreUObject",
         "DisplayCluster",
+        "DisplayClusterInput",
         "Engine",
         "InputCore"
       }
diff --git a/Source/DisplayClusterExtensions/Private/DisplayClusterExtensions.cpp b/Source/DisplayClusterExtensions/Private/DisplayClusterExtensions.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c715f682a56cb1a01f8c9230313022bb93567144
--- /dev/null
+++ b/Source/DisplayClusterExtensions/Private/DisplayClusterExtensions.cpp
@@ -0,0 +1,16 @@
+#include "DisplayClusterExtensions.h"
+
+#define LOCTEXT_NAMESPACE "FnDisplayExtensionsModule"
+
+void FDisplayClusterExtensionsModule::StartupModule ()
+{
+
+}
+void FDisplayClusterExtensionsModule::ShutdownModule()
+{
+
+}
+
+#undef LOCTEXT_NAMESPACE
+
+IMPLEMENT_MODULE(FDisplayClusterExtensionsModule, DisplayClusterExtensions)
\ No newline at end of file
diff --git a/Source/nDisplayExtensions/Private/DisplayClusterGameModeCAVE.cpp b/Source/DisplayClusterExtensions/Private/DisplayClusterGameModeCAVE.cpp
similarity index 100%
rename from Source/nDisplayExtensions/Private/DisplayClusterGameModeCAVE.cpp
rename to Source/DisplayClusterExtensions/Private/DisplayClusterGameModeCAVE.cpp
diff --git a/Source/DisplayClusterExtensions/Private/DisplayClusterPawnCAVE.cpp b/Source/DisplayClusterExtensions/Private/DisplayClusterPawnCAVE.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5855da424d51b3c12c40d013042cb450eff123e0
--- /dev/null
+++ b/Source/DisplayClusterExtensions/Private/DisplayClusterPawnCAVE.cpp
@@ -0,0 +1,142 @@
+#include "DisplayClusterPawnCAVE.h"
+
+#include "Cluster/IDisplayClusterClusterManager.h"
+#include "Engine/World.h"
+#include "Game/IDisplayClusterGameManager.h"
+#include "GameFramework/WorldSettings.h"
+#include "Input/IDisplayClusterInputManager.h"
+#include "Kismet/GameplayStatics.h"
+#include "DisplayClusterSettings.h"
+#include "IDisplayCluster.h"
+
+ADisplayClusterPawnCAVE::ADisplayClusterPawnCAVE(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
+{
+	MovementComponent                        = CreateDefaultSubobject<UFloatingPawnMovement>     (TEXT("MovementComponent0"));
+	MovementComponent->UpdatedComponent      = RootComponent;
+
+	RotatingComponent                        = CreateDefaultSubobject<URotatingMovementComponent>(TEXT("RotatingComponent0"));
+	RotatingComponent->UpdatedComponent      = RootComponent;
+	RotatingComponent->bRotationInLocalSpace = false;
+	RotatingComponent->PivotTranslation      = FVector::ZeroVector;
+	RotatingComponent->RotationRate          = FRotator::ZeroRotator;
+}
+
+void                    ADisplayClusterPawnCAVE::OnForward_Implementation   (float Value) 
+{
+  if (Flystick)
+  {
+    if (IDisplayCluster::Get().GetClusterMgr()->IsMaster()) 
+      AddMovementInput(Flystick->GetForwardVector(), Value);
+  }
+  else
+  {
+    AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetForwardVector(), Value);
+  }
+}
+void                    ADisplayClusterPawnCAVE::OnRight_Implementation     (float Value)
+{ 
+  if (Flystick)
+  {
+    if (IDisplayCluster::Get().GetClusterMgr()->IsMaster())
+      AddMovementInput(Flystick->GetRightVector(), Value);
+  }
+  else
+  {
+    AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetRightVector(), Value);
+  }
+}
+void                    ADisplayClusterPawnCAVE::OnTurnRate_Implementation  (float Rate )
+{
+  if (Flystick)
+  {
+    if (!RotatingComponent->UpdatedComponent || !IDisplayCluster::Get().GetGameMgr() || !IDisplayCluster::Get().GetGameMgr()->GetActiveCamera()) return;
+
+    const FVector CameraLocation = IDisplayCluster::Get().GetGameMgr()->GetActiveCamera()->GetComponentLocation();
+    RotatingComponent->PivotTranslation = RotatingComponent->UpdatedComponent->GetComponentTransform().InverseTransformPositionNoScale(CameraLocation);
+    RotatingComponent->RotationRate     = FRotator(RotatingComponent->RotationRate.Pitch, Rate * BaseTurnRate, 0.0f);
+  }
+  else
+  {
+    AddControllerYawInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
+  }
+}
+void                    ADisplayClusterPawnCAVE::OnLookUpRate_Implementation(float Rate )
+{ 
+  if (Flystick)
+  {
+    // User-centered projection causes motion sickness on look up interaction hence not implemented.
+  }
+  else
+  {
+    AddControllerPitchInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
+  }
+}
+void                    ADisplayClusterPawnCAVE::OnFire_Implementation      ()
+{ 
+
+}
+void                    ADisplayClusterPawnCAVE::OnAction_Implementation    (int32 Index)
+{ 
+
+}
+
+void                    ADisplayClusterPawnCAVE::BeginPlay                  ()
+{
+  Super::BeginPlay();
+  
+	if (!IDisplayCluster::Get().IsModuleInitialized() || !IDisplayCluster::Get().IsAvailable()) return;
+
+  auto IsCluster = (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster);
+  bUseControllerRotationYaw   = !IsCluster;
+  bUseControllerRotationPitch = !IsCluster;
+  bUseControllerRotationRoll  = !IsCluster;
+
+  TArray<AActor*> SettingsActors;
+  UGameplayStatics::GetAllActorsOfClass(GetWorld(), ADisplayClusterSettings::StaticClass(), SettingsActors);
+  if (SettingsActors.Num() == 0) return;
+
+  ADisplayClusterSettings* Settings = Cast<ADisplayClusterSettings>(SettingsActors[0]);
+  MovementComponent->MaxSpeed       = Settings->MovementMaxSpeed    ;
+  MovementComponent->Acceleration   = Settings->MovementAcceleration;
+  MovementComponent->Deceleration   = Settings->MovementDeceleration;
+  MovementComponent->TurningBoost   = Settings->MovementTurningBoost;
+  BaseTurnRate                      = Settings->RotationSpeed       ;
+}
+void                    ADisplayClusterPawnCAVE::Tick                       (float DeltaSeconds)
+{
+	Super::Tick(DeltaSeconds);
+
+  // Is this really necessary?
+	const float Mult = GetWorld()->GetWorldSettings()->WorldToMeters / 100.f;
+	SetActorScale3D(FVector(Mult, Mult, Mult));
+
+  if (!Flystick) 
+    Flystick = IDisplayCluster::Get().GetGameMgr()->GetNodeById(TEXT("flystick")); // There MUST be an scene node called flystick in the config.
+}
+void                    ADisplayClusterPawnCAVE::BeginDestroy               ()
+{
+  Super::BeginDestroy();
+}
+
+void                    ADisplayClusterPawnCAVE::SetupPlayerInputComponent  (UInputComponent* PlayerInputComponent)
+{
+  check(PlayerInputComponent);
+  Super::SetupPlayerInputComponent(PlayerInputComponent);
+  if (PlayerInputComponent)
+  {
+    PlayerInputComponent->BindAxis                   ("MoveForward"             , this, &ADisplayClusterPawnCAVE::OnForward   );
+    PlayerInputComponent->BindAxis                   ("MoveRight"               , this, &ADisplayClusterPawnCAVE::OnRight     );
+    PlayerInputComponent->BindAxis                   ("TurnRate"                , this, &ADisplayClusterPawnCAVE::OnTurnRate  );
+    PlayerInputComponent->BindAxis                   ("LookUpRate"              , this, &ADisplayClusterPawnCAVE::OnLookUpRate);
+    PlayerInputComponent->BindAction                 ("Fire"       , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnFire      );
+    PlayerInputComponent->BindAction<FButtonDelegate>("Action1"    , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 1);
+    PlayerInputComponent->BindAction<FButtonDelegate>("Action2"    , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 2);
+    PlayerInputComponent->BindAction<FButtonDelegate>("Action3"    , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 3);
+    PlayerInputComponent->BindAction<FButtonDelegate>("Action4"    , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 4);
+    PlayerInputComponent->BindAction<FButtonDelegate>("Action5"    , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 5);
+  }
+}
+UPawnMovementComponent* ADisplayClusterPawnCAVE::GetMovementComponent       () const
+{
+  return MovementComponent;
+}
diff --git a/Source/nDisplayExtensions/Public/nDisplayExtensions.h b/Source/DisplayClusterExtensions/Public/DisplayClusterExtensions.h
similarity index 51%
rename from Source/nDisplayExtensions/Public/nDisplayExtensions.h
rename to Source/DisplayClusterExtensions/Public/DisplayClusterExtensions.h
index d5e9096991ad70694240b1ce329f2222ba2456cb..37d22333b3a096af9f8dd93956bd0e51de38f3c5 100644
--- a/Source/nDisplayExtensions/Public/nDisplayExtensions.h
+++ b/Source/DisplayClusterExtensions/Public/DisplayClusterExtensions.h
@@ -3,9 +3,9 @@
 #include "CoreMinimal.h"
 #include "Modules/ModuleManager.h"
 
-class NDISPLAYEXTENSIONS_API FnDisplayExtensionsModule : public IModuleInterface
+class FDisplayClusterExtensionsModule : public IModuleInterface
 {
 public:
-  virtual void StartupModule() override;
+  virtual void StartupModule () override;
   virtual void ShutdownModule() override;
 };
diff --git a/Source/nDisplayExtensions/Public/DisplayClusterGameModeCAVE.h b/Source/DisplayClusterExtensions/Public/DisplayClusterGameModeCAVE.h
similarity index 67%
rename from Source/nDisplayExtensions/Public/DisplayClusterGameModeCAVE.h
rename to Source/DisplayClusterExtensions/Public/DisplayClusterGameModeCAVE.h
index 2c68f15d371f05d18fb4f6fc97196b3e772fe0b6..395eba444e2f43b96535d93805cad88ee2e413f3 100644
--- a/Source/nDisplayExtensions/Public/DisplayClusterGameModeCAVE.h
+++ b/Source/DisplayClusterExtensions/Public/DisplayClusterGameModeCAVE.h
@@ -2,10 +2,11 @@
 
 #include "CoreMinimal.h"
 #include "DisplayClusterGameMode.h"
+
 #include "DisplayClusterGameModeCAVE.generated.h"
 
 UCLASS()
-class NDISPLAYEXTENSIONS_API ADisplayClusterGameModeCAVE : public ADisplayClusterGameMode
+class DISPLAYCLUSTEREXTENSIONS_API ADisplayClusterGameModeCAVE : public ADisplayClusterGameMode
 {
 	GENERATED_BODY()
 	
diff --git a/Source/DisplayClusterExtensions/Public/DisplayClusterPawnCAVE.h b/Source/DisplayClusterExtensions/Public/DisplayClusterPawnCAVE.h
new file mode 100644
index 0000000000000000000000000000000000000000..09ec2f3f376c95ffce7750f5f76c3044bb765852
--- /dev/null
+++ b/Source/DisplayClusterExtensions/Public/DisplayClusterPawnCAVE.h
@@ -0,0 +1,39 @@
+#pragma once
+
+#include "GameFramework/FloatingPawnMovement.h"
+#include "GameFramework/PawnMovementComponent.h"
+#include "GameFramework/RotatingMovementComponent.h"
+#include "CoreMinimal.h"
+#include "DisplayClusterPawn.h"
+#include "DisplayClusterSceneComponent.h"
+
+#include "DisplayClusterPawnCAVE.generated.h"
+
+UCLASS()
+class DISPLAYCLUSTEREXTENSIONS_API ADisplayClusterPawnCAVE : public ADisplayClusterPawn
+{
+  GENERATED_UCLASS_BODY()
+
+public:
+  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnForward   (float Value);
+  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnRight     (float Value);
+  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnTurnRate  (float Rate );
+  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnLookUpRate(float Rate );
+  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnFire      ();
+  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnAction    (int32 Index);
+
+  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") float                          BaseTurnRate = 45.0f  ;
+  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") UDisplayClusterSceneComponent* Flystick     = nullptr;
+
+protected:
+  DECLARE_DELEGATE_OneParam(FButtonDelegate, int32);
+
+  virtual void                    BeginPlay                ()                                            override;
+  virtual void                    Tick                     (float            DeltaSeconds        )       override;
+  virtual void                    BeginDestroy             ()                                            override;
+  virtual void                    SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)       override;
+  virtual UPawnMovementComponent* GetMovementComponent     ()                                      const override;
+  
+  UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn", meta = (AllowPrivateAccess = "true")) UFloatingPawnMovement*      MovementComponent = nullptr;
+  UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn", meta = (AllowPrivateAccess = "true")) URotatingMovementComponent* RotatingComponent = nullptr;
+};
diff --git a/Source/nDisplayExtensions/Private/DisplayClusterPawnBase.cpp b/Source/nDisplayExtensions/Private/DisplayClusterPawnBase.cpp
deleted file mode 100644
index 270e3f17e86eca27e4a5ce3d22b4901766d7762c..0000000000000000000000000000000000000000
--- a/Source/nDisplayExtensions/Private/DisplayClusterPawnBase.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-#include "DisplayClusterPawnBase.h"
-
-#include "Engine/World.h"
-#include "Game/IDisplayClusterGameManager.h"
-#include "GameFramework/WorldSettings.h"
-#include "DisplayClusterSceneComponentSyncParent.h"
-#include "DisplayClusterSettings.h"
-#include "DisplayClusterGameMode.h"
-#include "IDisplayCluster.h"
-#include "Kismet/GameplayStatics.h"
-
-ADisplayClusterPawnBase::ADisplayClusterPawnBase(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
-{
-	MovementComponent                         = CreateDefaultSubobject<UFloatingPawnMovement>     (TEXT("MovementComponent0"));
-	MovementComponent->UpdatedComponent       = RootComponent;
-
-	RotatingComponent                         = CreateDefaultSubobject<URotatingMovementComponent>(TEXT("RotatingComponent0"));
-	RotatingComponent->UpdatedComponent       = RootComponent;
-	RotatingComponent->bRotationInLocalSpace  = true;
-	RotatingComponent->PivotTranslation       = FVector::ZeroVector;
-	RotatingComponent->RotationRate           = FRotator::ZeroRotator;
-
-	RotatingComponent2                        = CreateDefaultSubobject<URotatingMovementComponent>(TEXT("RotatingComponent1"));
-	RotatingComponent2->UpdatedComponent      = RootComponent;
-	RotatingComponent2->bRotationInLocalSpace = false;
-	RotatingComponent2->PivotTranslation      = FVector::ZeroVector;
-	RotatingComponent2->RotationRate          = FRotator::ZeroRotator;
-
-	BaseTurnRate   = 45.f;
-	BaseLookUpRate = 45.f;
-}
-
-void ADisplayClusterPawnBase::MoveForward (float Value)
-{
-  if (Value == 0.f) return;
-	AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetForwardVector(), Value);
-}
-void ADisplayClusterPawnBase::MoveRight   (float Value)
-{
-  if (Value == 0.f) return;
-  AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetRightVector  (), Value);
-}
-void ADisplayClusterPawnBase::MoveUp      (float Value)
-{
-  if (Value == 0.f) return;
-  AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetUpVector     (), Value);
-}
-void ADisplayClusterPawnBase::TurnAtRate  (float Rate )
-{
-	if (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster)
-	{
-    if (!RotatingComponent->UpdatedComponent) return;
-		auto Manager = IDisplayCluster::Get().GetGameMgr();
-    if (!Manager) return;
-    auto Camera = Manager->GetActiveCamera();
-    if (!Camera ) return;
-
-		const FTransform TransformToRotate  = RotatingComponent->UpdatedComponent->GetComponentTransform();
-		const FVector    RotateAroundPivot  = TransformToRotate.InverseTransformPositionNoScale(Camera->GetComponentLocation());
-		RotatingComponent->PivotTranslation = RotateAroundPivot;
-		RotatingComponent->RotationRate     = FRotator(RotatingComponent->RotationRate.Pitch, Rate * BaseTurnRate, 0.f);
-	}
-  else if (Rate != 0.f)
-		AddControllerYawInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
-}
-void ADisplayClusterPawnBase::TurnAtRate2 (float Rate )
-{
-	if (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster)
-	{
-    if (!RotatingComponent2->UpdatedComponent) return;
-    auto Manager = IDisplayCluster::Get().GetGameMgr();
-    if (!Manager) return;
-    auto Camera  = Manager->GetActiveCamera();
-    if (!Camera ) return;
-
-		const FTransform TransformToRotate   = RotatingComponent2->UpdatedComponent->GetComponentTransform();
-		const FVector    RotateAroundPivot   = TransformToRotate.InverseTransformPositionNoScale(Camera->GetComponentLocation());
-		RotatingComponent2->PivotTranslation = RotateAroundPivot;
-		RotatingComponent2->RotationRate     = FRotator(RotatingComponent2->RotationRate.Pitch, Rate * BaseTurnRate, 0.f);
-	}
-	else if (Rate != 0.f)
-		AddControllerYawInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
-}
-void ADisplayClusterPawnBase::LookUpAtRate(float Rate )
-{
-	if (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster)
-	{
-		//@note: usually CAVE-like systems don't use roll and pitch rotation since it can cause dizziness.
-#if 0
-		//@todo: rotate around active camera
-    auto Manager = IDisplayCluster::Get().GetGameMgr();
-    if (!Manager) return;
-    auto Camera = Manager->GetActiveCamera();
-    if (!Camera ) return;
-
-		RotatingComponent->bRotationInLocalSpace = true;
-		RotatingComponent->PivotTranslation      = FVector::ZeroVector;
-		
-#endif
-	}
-	else if (Rate != 0.f)
-	{
-		AddControllerPitchInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
-	}
-}
-
-void                    ADisplayClusterPawnBase::BeginPlay           ()
-{
-	Super::BeginPlay();
-
-	if (!IDisplayCluster::Get().IsModuleInitialized() || !IDisplayCluster::Get().IsAvailable()) return;
-
-	auto IsCluster = (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster);
-	bUseControllerRotationYaw   = !IsCluster;
-	bUseControllerRotationPitch = !IsCluster;
-	bUseControllerRotationRoll  = !IsCluster;
-
-  TArray<AActor*> SettingsActors;
-  UGameplayStatics::GetAllActorsOfClass(GetWorld(), ADisplayClusterSettings::StaticClass(), SettingsActors);
-  if (SettingsActors.Num() == 0) return;
-
-  ADisplayClusterSettings* Settings = Cast<ADisplayClusterSettings>(SettingsActors[0]);
-  MovementComponent->MaxSpeed     = Settings->MovementMaxSpeed;
-  MovementComponent->Acceleration = Settings->MovementAcceleration;
-  MovementComponent->Deceleration = Settings->MovementDeceleration;
-  MovementComponent->TurningBoost = Settings->MovementTurningBoost;
-  BaseTurnRate                    = Settings->RotationSpeed;
-  BaseLookUpRate                  = Settings->RotationSpeed;
-}
-void                    ADisplayClusterPawnBase::Tick                (float DeltaSeconds)
-{
-	Super::Tick(DeltaSeconds);
-	const float Mult = GetWorld()->GetWorldSettings()->WorldToMeters / 100.f;
-	SetActorScale3D(FVector(Mult, Mult, Mult));
-}
-UPawnMovementComponent* ADisplayClusterPawnBase::GetMovementComponent() const
-{
-  return MovementComponent;
-}
-
-void ADisplayClusterPawnBase::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
-{
-	check(PlayerInputComponent);
-	Super::SetupPlayerInputComponent(PlayerInputComponent);
-	if (PlayerInputComponent)
-	{
-		PlayerInputComponent->BindAxis("MoveForward", this, &ADisplayClusterPawnBase::MoveForward );
-		PlayerInputComponent->BindAxis("MoveRight"  , this, &ADisplayClusterPawnBase::MoveRight   );
-		PlayerInputComponent->BindAxis("MoveUp"     , this, &ADisplayClusterPawnBase::MoveUp      );
-		PlayerInputComponent->BindAxis("TurnRate"   , this, &ADisplayClusterPawnBase::TurnAtRate2 );
-		PlayerInputComponent->BindAxis("LookUpRate" , this, &ADisplayClusterPawnBase::LookUpAtRate);
-	}
-}
diff --git a/Source/nDisplayExtensions/Private/DisplayClusterPawnCAVE.cpp b/Source/nDisplayExtensions/Private/DisplayClusterPawnCAVE.cpp
deleted file mode 100644
index 12e1c92000883c06400fdfaa39d25b530146dbee..0000000000000000000000000000000000000000
--- a/Source/nDisplayExtensions/Private/DisplayClusterPawnCAVE.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#include "DisplayClusterPawnCAVE.h"
-
-#include "Game/IDisplayClusterGameManager.h"
-#include "IDisplayCluster.h"
-
-void ADisplayClusterPawnCAVE::BeginPlay()
-{
-  Flystick = IDisplayCluster::Get().GetGameMgr()->GetNodeById("flystick");
-}
-void ADisplayClusterPawnCAVE::MoveForward(float value)
-{
-  if (!Flystick)
-    Flystick = IDisplayCluster::Get().GetGameMgr()->GetNodeById("flystick");
-  if (!Flystick || value == 0.0f)
-    return;
-  AddMovementInput(Flystick->GetForwardVector(), value);
-}
diff --git a/Source/nDisplayExtensions/Private/nDisplayExtensions.cpp b/Source/nDisplayExtensions/Private/nDisplayExtensions.cpp
deleted file mode 100644
index 8b2d5aadf5dd4a4a3f1d9405205cc4f530ac3b9c..0000000000000000000000000000000000000000
--- a/Source/nDisplayExtensions/Private/nDisplayExtensions.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#include "nDisplayExtensions.h"
-
-#define LOCTEXT_NAMESPACE "FnDisplayExtensionsModule"
-
-void FnDisplayExtensionsModule::StartupModule()
-{
-
-}
-void FnDisplayExtensionsModule::ShutdownModule()
-{
-
-}
-
-#undef LOCTEXT_NAMESPACE
-
-IMPLEMENT_MODULE(FnDisplayExtensionsModule, nDisplayExtensions)
\ No newline at end of file
diff --git a/Source/nDisplayExtensions/Public/DisplayClusterPawnBase.h b/Source/nDisplayExtensions/Public/DisplayClusterPawnBase.h
deleted file mode 100644
index 5eb76f52ff42409c369b56f14f3ff7f3e0403217..0000000000000000000000000000000000000000
--- a/Source/nDisplayExtensions/Public/DisplayClusterPawnBase.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#pragma once
-
-#include "Components/InputComponent.h"
-#include "GameFramework/FloatingPawnMovement.h"
-#include "GameFramework/PawnMovementComponent.h"
-#include "GameFramework/RotatingMovementComponent.h"
-#include "CoreMinimal.h"
-#include "DisplayClusterPawn.h"
-#include "DisplayClusterPawnBase.generated.h"
-
-UCLASS()
-class NDISPLAYEXTENSIONS_API ADisplayClusterPawnBase : public ADisplayClusterPawn
-{
-  GENERATED_UCLASS_BODY()
-
-public:
-  UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void MoveForward (float Value);
-  UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void MoveRight   (float Value);
-  UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void MoveUp      (float Value);
-  UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void TurnAtRate  (float Rate );
-  UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void TurnAtRate2 (float Rate );
-  UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void LookUpAtRate(float Rate );
-
-  virtual void                    BeginPlay           ()                         override;
-  virtual void                    Tick                (float DeltaSeconds)       override;
-  virtual UPawnMovementComponent* GetMovementComponent()                   const override;
-
-  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") float BaseTurnRate  ;
-  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") float BaseLookUpRate;
-
-protected:
-  virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override;
-
-  UPROPERTY(Category = Pawn, VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) UFloatingPawnMovement*      MovementComponent ;
-  UPROPERTY(Category = Pawn, VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) URotatingMovementComponent* RotatingComponent ;
-  UPROPERTY(Category = Pawn, VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) URotatingMovementComponent* RotatingComponent2;
-};
\ No newline at end of file
diff --git a/Source/nDisplayExtensions/Public/DisplayClusterPawnCAVE.h b/Source/nDisplayExtensions/Public/DisplayClusterPawnCAVE.h
deleted file mode 100644
index 48c64c90681f0aadf6b293247bfc3a9df5eb5b0b..0000000000000000000000000000000000000000
--- a/Source/nDisplayExtensions/Public/DisplayClusterPawnCAVE.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#pragma once
-
-#include "CoreMinimal.h"
-#include "DisplayClusterPawnBase.h"
-#include "DisplayClusterSceneComponent.h"
-#include "DisplayClusterPawnCAVE.generated.h"
-
-UCLASS()
-class NDISPLAYEXTENSIONS_API ADisplayClusterPawnCAVE : public ADisplayClusterPawnBase
-{
-  GENERATED_BODY()
-
-public:
-  virtual void BeginPlay() override;
-  virtual void MoveForward(float value) override;
-
-  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Pawn")
-  UDisplayClusterSceneComponent* Flystick = nullptr;
-};
diff --git a/nDisplayExtensions.uplugin b/nDisplayExtensions.uplugin
index 31dbd3836665bce4091212b10f9e0d711e258bc8..b7529ae0b42fa4bfd40e543d3c9f90d879645a8f 100644
--- a/nDisplayExtensions.uplugin
+++ b/nDisplayExtensions.uplugin
@@ -13,9 +13,10 @@
   "CanContainContent": true,
   "IsBetaVersion": false,
   "Installed": false,
+  "EnabledByDefault": true,
   "Modules": [
     {
-      "Name": "nDisplayExtensions",
+      "Name": "DisplayClusterExtensions",
       "Type": "Developer",
       "LoadingPhase": "Default"
     }
@@ -24,6 +25,10 @@
     {
       "Name": "nDisplay",
       "Enabled": true
+    },
+    {
+      "Name": "nDisplayInput",
+      "Enabled": true
     }
   ]
 }
\ No newline at end of file