diff --git a/Source/CAVEOverlay/Private/CAVEOverlay.cpp b/Source/CAVEOverlay/Private/CAVEOverlay.cpp
index a980703080b4df9a46a191adffe60e4891886c1f..35d99873da710ba82f2e54a65bdefccfdb814d28 100644
--- a/Source/CAVEOverlay/Private/CAVEOverlay.cpp
+++ b/Source/CAVEOverlay/Private/CAVEOverlay.cpp
@@ -1,14 +1,40 @@
 // Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
 
 #include "CAVEOverlay.h"
+#include "CAVEOverlaySettings.h"
+#include "CAVEOverlayController.h"
+#include "Kismet/GameplayStatics.h"
 
 #define LOCTEXT_NAMESPACE "FCAVEOverlayModule"
 
 void FCAVEOverlayModule::StartupModule()
 {
 	// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module
+
+	On_Post_World_Initialization_Delegate.BindRaw(this, &FCAVEOverlayModule::OnSessionStart);
+	FWorldDelegates::OnPostWorldInitialization.Add(On_Post_World_Initialization_Delegate);
+}
+
+void FCAVEOverlayModule::OnSessionStart(UWorld* World, const UWorld::InitializationValues)
+{
+	if (!World->IsGameWorld())
+		return;
+
+	const UCAVEOverlaySettings* Settings = GetDefault<UCAVEOverlaySettings>();
+
+	//Test if already in
+	TArray<AActor*> Actors;
+	UGameplayStatics::GetAllActorsOfClass(World, ACAVEOverlayController::StaticClass(), Actors);
+
+	if((Settings->DefaultActivationType == DefaultActivationType_ON
+		^ Settings->excludedMaps.ContainsByPredicate(
+			[World](const FSoftObjectPath& Map)	{return Map.GetAssetName() == World->GetName();}
+		)) && Actors.Num() == 0){
+		World->SpawnActor(ACAVEOverlayController::StaticClass());
+	}
 }
 
+
 void FCAVEOverlayModule::ShutdownModule()
 {
 	// This function may be called during shutdown to clean up your module.  For modules that support dynamic reloading,
@@ -17,4 +43,4 @@ void FCAVEOverlayModule::ShutdownModule()
 
 #undef LOCTEXT_NAMESPACE
 	
-IMPLEMENT_MODULE(FCAVEOverlayModule, CAVEOverlay)
\ No newline at end of file
+IMPLEMENT_MODULE(FCAVEOverlayModule, CAVEOverlay)
diff --git a/Source/CAVEOverlay/Public/CAVEOverlay.h b/Source/CAVEOverlay/Public/CAVEOverlay.h
index 9c40bae6cc3ece9f571c7513dbde291ec1670486..0265d6ccea420b1614358eb609946243e2d8763e 100644
--- a/Source/CAVEOverlay/Public/CAVEOverlay.h
+++ b/Source/CAVEOverlay/Public/CAVEOverlay.h
@@ -4,6 +4,7 @@
 
 #include "CoreMinimal.h"
 #include "Modules/ModuleManager.h"
+#include "Engine/World.h"
 
 class FCAVEOverlayModule : public IModuleInterface
 {
@@ -12,4 +13,7 @@ public:
 	/** IModuleInterface implementation */
 	virtual void StartupModule() override;
 	virtual void ShutdownModule() override;
+private:
+	TBaseDelegate<void, UWorld*, const UWorld::InitializationValues> On_Post_World_Initialization_Delegate;
+	void OnSessionStart(UWorld* World, UWorld::InitializationValues);
 };
diff --git a/Source/CAVEOverlay/Public/CAVEOverlaySettings.h b/Source/CAVEOverlay/Public/CAVEOverlaySettings.h
new file mode 100644
index 0000000000000000000000000000000000000000..90bdf480f2b1a2b8d8b3b4b3e2597d3803b6bded
--- /dev/null
+++ b/Source/CAVEOverlay/Public/CAVEOverlaySettings.h
@@ -0,0 +1,25 @@
+#pragma once
+#include "CoreMinimal.h"
+#include "Engine/EngineTypes.h"
+#include "Engine/DeveloperSettings.h"
+#include "CAVEOverlaySettings.generated.h"
+
+UENUM(BlueprintType)
+enum DefaultActivationType
+{
+	DefaultActivationType_OFF UMETA(DisplayName = "Off by default"),
+	DefaultActivationType_ON UMETA(DisplayName = "On by default")
+};
+
+UCLASS(config=Game, defaultconfig, meta=(DisplayName="CAVE Overlay"))
+class UCAVEOverlaySettings : public UDeveloperSettings
+{
+	GENERATED_BODY()
+
+public:
+	UPROPERTY(EditAnywhere, config, Category = "General", meta = (DisplayName = "Default Activation Type"))
+	TEnumAsByte<DefaultActivationType> DefaultActivationType = DefaultActivationType_ON;
+
+	UPROPERTY(EditAnywhere, config, Category = Maps, meta=(AllowedClasses="World"))
+	TArray<FSoftObjectPath> excludedMaps;
+};