diff --git a/.gitmodules b/.gitmodules
index 5be8e419afae3caebb11321c07dd0b3d4c52bd8a..242fdcce6f5f92f8fb5392d0af2bb108a9142b1c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,6 +1,4 @@
-[submodule "Plugins/nDisplayExtensions"]
-	path = Plugins/nDisplayExtensions
-	url = https://devhub.vr.rwth-aachen.de/VR-Group/unreal-development/ndisplayextensions.git
-[submodule "Plugins/CaveOverlay"]
-	path = Plugins/CaveOverlay
-	url = https://devhub.vr.rwth-aachen.de/VR-Group/unreal-development/unreal-cave-overlay.git
+[submodule "setup"]
+	path = setup
+	url = https://devhub.vr.rwth-aachen.de/VR-Group/unreal-development/unreal-project-setup-script.git
+	branch = master
diff --git a/Plugins/CaveOverlay b/Plugins/CaveOverlay
deleted file mode 160000
index 6418ac3acb3b522f6f06fb1b79928f357afdec81..0000000000000000000000000000000000000000
--- a/Plugins/CaveOverlay
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 6418ac3acb3b522f6f06fb1b79928f357afdec81
diff --git a/Plugins/nDisplayExtensions b/Plugins/nDisplayExtensions
deleted file mode 160000
index 13607574073f0bb3cdea6154a2a1924e7e51b543..0000000000000000000000000000000000000000
--- a/Plugins/nDisplayExtensions
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 13607574073f0bb3cdea6154a2a1924e7e51b543
diff --git a/RwthVrTemplate.uproject b/RwthVrTemplate.uproject
index 855ae9ec867b4f42178b8fa84bdf1b6d30d0e932..6614b458a265230584dd8079294a5356ee30b2cf 100644
--- a/RwthVrTemplate.uproject
+++ b/RwthVrTemplate.uproject
@@ -17,10 +17,6 @@
 		{
 			"Name": "nDisplay",
 			"Enabled": true
-		},
-		{
-			"Name": "nDisplayExtensions",
-			"Enabled": true
 		}
 	],
 	"TargetPlatforms": [
diff --git a/Source/RwthVrTemplate/RwthVrTemplate.Build.cs b/Source/RwthVrTemplate/RwthVrTemplate.Build.cs
index 833e3eba3bba41f0b20c747d3fc72e7f5629fd5c..1dae871ef02f683f69853ad4ddb46b241975b708 100644
--- a/Source/RwthVrTemplate/RwthVrTemplate.Build.cs
+++ b/Source/RwthVrTemplate/RwthVrTemplate.Build.cs
@@ -8,7 +8,7 @@ public class RwthVrTemplate : ModuleRules
 	{
 		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
 	
-		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "DisplayClusterExtensions", "DisplayCluster", "Engine", "InputCore" });
+		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "DisplayCluster", "Engine", "InputCore" });
 
 		PrivateDependencyModuleNames.AddRange(new string[] {  });
 
diff --git a/setup b/setup
new file mode 160000
index 0000000000000000000000000000000000000000..7a755e44b93e97ad7ade3c78512e5196f9f53f06
--- /dev/null
+++ b/setup
@@ -0,0 +1 @@
+Subproject commit 7a755e44b93e97ad7ade3c78512e5196f9f53f06
diff --git a/setup.sh b/setup.sh
old mode 100644
new mode 100755
index 10157c330823914d30336beaca46351f70d87d54..0a9e9057b5931ae77ba732e68f2faad577616f40
--- a/setup.sh
+++ b/setup.sh
@@ -1,57 +1,4 @@
 #!/bin/sh
 
-if [ ! -f "update.txt" ]
-then
-    remote_branch=$(git rev-parse --abbrev-ref @{u})
-
-    if [[ "$remote_branch" != "origin/"* ]]
-    then
-        echo "This script can only handle remotes named origin!"
-        exit -1
-    fi
-
-    remote_branch=${remote_branch#"origin/"}
-
-    repository_url=$(git remote get-url origin)
-    echo "$repository_url"
-
-    echo "$repository_url" >> update.txt
-    echo "$remote_branch" >> update.txt
-fi
-
-current_branch=$(git rev-parse --abbrev-ref HEAD)
-branches_to_delete=$(git for-each-ref --format='%(refname:short)' refs/heads/)
-
-for branch in $branches_to_delete
-do
-    if [ "$branch" != "$current_branch" ]
-    then
-        git branch -d "$branch"
-    fi
-done
-
-if [ "$current_branch" != "develop" ]
-then
-    git checkout -b develop
-    git branch -d "$current_branch"
-fi
-
-git remote remove origin
-git add .
-git commit -m "Initial commit"
-git branch master
-
-echo "Enter URL of the project's git repository (Leave empty to skip this step):"
-read new_remote
-
-if [ -n "$new_remote" ]
-then
-    echo "Setting up repository..."
-    git remote add origin $new_remote
-    git push -u origin develop
-    git checkout master
-    git push -u origin master
-    git checkout develop
-fi
-
-echo "Done!"
\ No newline at end of file
+git submodule update --init -- setup
+/bin/sh setup/setup.sh
\ No newline at end of file
diff --git a/update.sh b/update.sh
deleted file mode 100644
index b156be8000889bad98d254d1dc37c40634e88710..0000000000000000000000000000000000000000
--- a/update.sh
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/sh
-
-if [ ! -f "update.txt" ]
-then
-    echo "The file update.txt does not exists."
-    echo "Make sure setup.sh has been run and the file is checked in into git."
-    exit -1
-fi
-readarray -n 2 -t update < update.txt
-remote=${update[0]}
-branch=${update[1]}
-
-template_remote=$(git remote | grep template-origin)
-if [ -z "$template_remote" ]
-then
-    echo "Add remote for the template."
-    git remote add template-origin "${update[0]}"
-else
-    old_remote=$(git remote get-url template-origin)
-    if [ $old_remote != $remote ]
-    then
-        echo "The remote for the template changed, updating it."
-        git remote remove template-origin
-        git remote add template-origin "${update[0]}"
-    fi
-fi
-
-# Check if remote exists
-if ! git ls-remote "$remote" &> /dev/null
-then
-    echo "The remote '$remote' is not a valid git repository."
-    echo "Please update the first line in 'update.txt'."
-    exit -1
-fi
-
-# Check if remote branch exists
-if ! git ls-remote --exit-code --heads "$remote" "$branch" &> /dev/null
-then
-    echo "The branch '$branch' does not exist on the remote repository."
-    echo "Please update the second line in 'update.txt'."
-    exit -2
-fi
-
-git fetch template-origin $branch
-git merge template-origin/$branch
-echo "Done!"