diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f0e209d1e6c523451216c9a6de49291404703839..30fad310fb822f2c826dc890ae955015b29697f6 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -32,7 +32,7 @@ variables:
     - .\.venv\Scripts\activate.ps1
     - pip3 install --upgrade llbase autobuild
   script:
-    - autobuild configure -c ReleaseOS -- -DUSE_FMODSTUDIO=ON -DUSE_NVAPI=ON -DUSE_LTO=ON -DDISABLE_FATAL_WARNINGS=ON -DREVISION_FROM_VCS=FALSE
+    - autobuild configure -c ReleaseOS -- -DUSE_FMODSTUDIO=ON -DUSE_NVAPI=ON -DUSE_DISCORD=ON -DUSE_LTO=ON -DDISABLE_FATAL_WARNINGS=ON -DREVISION_FROM_VCS=FALSE
     - autobuild build -c ReleaseOS --no-configure
     - autobuild graph -c ReleaseOS --graph-file alchemy-windows${AUTOBUILD_ADDRSIZE}-dependencies.svg build-vc-64/autobuild-package.xml
     - |
@@ -138,7 +138,7 @@ variables:
     - source .venv/bin/activate
     - pip3 install --upgrade llbase autobuild
   script:
-    - autobuild configure -c ReleaseOS -- -DUSE_FMODSTUDIO=ON -DUSE_NVAPI=ON -DUSE_LTO=ON -DDISABLE_FATAL_WARNINGS=ON -DREVISION_FROM_VCS=FALSE
+    - autobuild configure -c ReleaseOS -- -DUSE_FMODSTUDIO=ON -DUSE_NVAPI=ON -DUSE_DISCORD=ON -DUSE_LTO=ON -DDISABLE_FATAL_WARNINGS=ON -DREVISION_FROM_VCS=FALSE
     - autobuild build -c ReleaseOS --no-configure
     - autobuild graph -c ReleaseOS --graph-file alchemy-linuxs${AUTOBUILD_ADDRSIZE}-dependencies.svg build-linux-${AUTOBUILD_ADDRSIZE}/autobuild-package.xml
     - |
diff --git a/autobuild.xml b/autobuild.xml
index 641aa2b4f06381e358fd716fd735c856dd10d2e9..f7cca9ed4c4aa8c57eb29ad655aff488ee2b85f1 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -455,6 +455,68 @@
         <key>version</key>
         <string>1.0.0</string>
       </map>
+      <key>discord-gamesdk</key>
+      <map>
+        <key>canonical_repo</key>
+        <string>https://git.alchemyviewer.org/alchemy/thirdparty/3p-discord-gamesdk</string>
+        <key>copyright</key>
+        <string>Copyright (c) Discord.</string>
+        <key>description</key>
+        <string>Discord GameSDK for integrating with Discord</string>
+        <key>license</key>
+        <string>proprietary</string>
+        <key>license_file</key>
+        <string>LICENSES/discord-gamesdk.txt</string>
+        <key>name</key>
+        <string>discord-gamesdk</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>bea8b6231ebe028863654cceaae0a38bd625b722a18ed0f494d8bd2baa8de654454d1d80468308af00c501ed39ff32f942e2ae323efa955d34e9d97cd066525f</string>
+              <key>hash_algorithm</key>
+              <string>blake2b</string>
+              <key>url</key>
+              <string>https://git.alchemyviewer.org/api/v4/projects/191/packages/generic/discord-gamesdk/3.2.1.1755/discord_gamesdk-3.2.1-darwin64-1755.tar.zst</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>d8d7ea887b53e132a51c92a0bcf324675404906e53fac2f28a0519a6e021e2ee2d5edf48d86c4527ffa3b4771b902c4cf7c1682bf9adbb37e35782dcb4d3efc8</string>
+              <key>hash_algorithm</key>
+              <string>blake2b</string>
+              <key>url</key>
+              <string>https://git.alchemyviewer.org/api/v4/projects/191/packages/generic/discord-gamesdk/3.2.1.1755/discord_gamesdk-3.2.1-linux64-1755.tar.zst</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>b8854ca9543c56c3d44cdad48cfdc58beb8daeaa5d6419b7220cf82c7f53a558f955677da194f72011a0621ebf72c65f823bd50e9b97dc3901b7b74e6061a26a</string>
+              <key>hash_algorithm</key>
+              <string>blake2b</string>
+              <key>url</key>
+              <string>https://git.alchemyviewer.org/api/v4/projects/191/packages/generic/discord-gamesdk/3.2.1.1755/discord_gamesdk-3.2.1-windows64-1755.tar.zst</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
+        </map>
+        <key>version</key>
+        <string>3.2.1</string>
+      </map>
       <key>dullahan</key>
       <map>
         <key>copyright</key>
diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt
index e83871eb459693d5c963e8e367b57b5ff1627500..87e0281a900467cc741a22c34ad6f01f4e79bc8d 100644
--- a/indra/cmake/CMakeLists.txt
+++ b/indra/cmake/CMakeLists.txt
@@ -19,6 +19,7 @@ set(cmake_SOURCE_FILES
     Copy3rdPartyLibs.cmake
     DBusGlib.cmake
     DeploySharedLibs.cmake
+    DiscordSDK.cmake
     DragDrop.cmake
     EXPAT.cmake
     FindAPR.cmake
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 30256cc993f5416a3f2fa3b031273b2b93fcbc3f..378157180c1e3eb951aa2a0d6148e5e48a78f9a8 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -115,6 +115,10 @@ if(WINDOWS)
       list(APPEND debug_files kdud.dll)
       list(APPEND release_files kdu.dll)
     endif (USE_KDU)
+
+    if(USE_DISCORD)
+      list(APPEND release_files discord_game_sdk.dll)
+    endif()
     
     #*******************************
     # Copy MS C runtime dlls, required for packaging.
diff --git a/indra/cmake/DiscordSDK.cmake b/indra/cmake/DiscordSDK.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..9e84ad5811dac350fc74c27e31148ecd99347514
--- /dev/null
+++ b/indra/cmake/DiscordSDK.cmake
@@ -0,0 +1,46 @@
+# -*- cmake -*-
+include(Linking)
+include(Prebuilt)
+
+if (INSTALL_PROPRIETARY)
+  set(USE_DISCORD ON)
+endif (INSTALL_PROPRIETARY)
+
+if (USE_DISCORD)
+  if (STANDALONE)
+    # In that case, we use the version of the library installed on the system
+    set(DISCORD_FIND_REQUIRED ON)
+    include(FindFMODSTUDIO)
+  else (STANDALONE)
+    use_prebuilt_binary(discord-gamesdk)    
+    if (WINDOWS)
+      set(DISCORD_LIBRARY 
+          ${ARCH_PREBUILT_DIRS_RELEASE}/discordgamesdk.lib
+          ${ARCH_PREBUILT_DIRS_RELEASE}/discord_game_sdk.dll.lib)
+    elseif (DARWIN)
+      set(DISCORD_LIBRARY 
+          ${ARCH_PREBUILT_DIRS_RELEASE}/libdiscordgamesdk.a
+          ${ARCH_PREBUILT_DIRS_RELEASE}/discord_game_sdk.dylib)
+    elseif (LINUX)
+      set(DISCORD_LIBRARY 
+          ${ARCH_PREBUILT_DIRS_RELEASE}/libdiscordgamesdk.a
+          ${ARCH_PREBUILT_DIRS_RELEASE}/discord_game_sdk.so)
+    endif (WINDOWS)
+    set(DISCORD_LIBRARIES ${DISCORD_LIBRARY})
+    set(DISCORD_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/discord/)
+
+    add_definitions(-DUSE_DISCORD=1)
+  endif (STANDALONE)
+
+  if(DEFINED ENV{DISCORD_CLIENTID})
+    set(DISCORD_CLIENTID $ENV{SENTRY_DSN} CACHE STRING "Discord Client ID" FORCE)
+  else()
+    set(DISCORD_CLIENTID "" CACHE STRING "Discord Client ID")
+  endif()
+
+  if(DISCORD_CLIENTID STREQUAL "")
+    message(FATAL_ERROR "You must set a ClientID with -DDISCORD_CLIENTID= to enable Discord integration")
+  endif()
+
+endif (USE_DISCORD)
+
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index 656966cb56c2b033c16206d3574ed1212b105a34..78fb64fcb7a2e7993f14a83adfb6bd4ae7285e29 100644
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -57,6 +57,12 @@ if (DEFINED ENV{USE_SENTRY})
   set(USE_SENTRY $ENV{USE_SENTRY} CACHE BOOL "" FORCE)
 endif()
 
+#Discord Integration
+option(USE_DISCORD "Enable Discord client integration" OFF)
+if (DEFINED ENV{USE_DISCORD})
+  set(USE_DISCORD $ENV{USE_DISCORD} CACHE BOOL "" FORCE)
+endif()
+
 if(LIBS_CLOSED_DIR)
   file(TO_CMAKE_PATH "${LIBS_CLOSED_DIR}" LIBS_CLOSED_DIR)
 else(LIBS_CLOSED_DIR)
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 785e2b4eee9af38f2610f3e664da2b8e25ad175e..ce71a53353c8b886f4e5e8596df08f17f5959f9e 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -14,6 +14,7 @@ include(BuildVersion)
 include(CMakeCopyIfDifferent)
 include(CubemapToEquirectangularJS)
 include(DBusGlib)
+include(DiscordSDK)
 include(DragDrop)
 include(EXPAT)
 include(FMODSTUDIO)
@@ -101,6 +102,7 @@ include_directories(
     "${LIBS_PREBUILT_DIR}/include/collada/1.4"
     ${LLAPPEARANCE_INCLUDE_DIRS}
     ${TRACY_INCLUDE_DIR}
+    ${DISCORD_INCLUDE_DIRS}
     )
 
 if(USE_FMODSTUDIO)
@@ -1528,6 +1530,11 @@ set(viewer_HEADER_FILES
     VorbisFramework.h
     )
 
+if(USE_DISCORD)
+  LIST(APPEND viewer_HEADER_FILES aldiscordmanager.h)
+  LIST(APPEND viewer_SOURCE_FILES aldiscordmanager.cpp)
+endif()
+
 source_group("CMake Rules" FILES ViewerInstall.cmake)
 
 #build_data.json creation moved to viewer_manifest.py MAINT-6413
@@ -2034,6 +2041,7 @@ if (WINDOWS)
         --actions=copy
         --arch=${ARCH}
         --artwork=${ARTWORK_DIR}
+        "--discord=${USE_DISCORD}"
         "--sentry=${SENTRY_DSN}"
         "--fmodstudio=${USE_FMODSTUDIO}"
         "--openal=${USE_OPENAL}"
@@ -2095,6 +2103,7 @@ if (WINDOWS)
           ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
           --arch=${ARCH}
           --artwork=${ARTWORK_DIR}
+          "--discord=${USE_DISCORD}"
           "--sentry=${SENTRY_DSN}"
           "--fmodstudio=${USE_FMODSTUDIO}"
           "--openal=${USE_OPENAL}"
@@ -2211,6 +2220,7 @@ target_link_libraries(${VIEWER_BINARY_NAME}
     ${LLAPPEARANCE_LIBRARIES}
     ${TRACY_LIBRARY}
     ${MINIZIP_LIBRARIES}
+    ${DISCORD_LIBRARIES}
     absl::flat_hash_map
     absl::node_hash_map
     absl::strings
@@ -2263,6 +2273,7 @@ if (LINUX)
         ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
         --arch=${ARCH}
         --artwork=${ARTWORK_DIR}
+        "--discord=${USE_DISCORD}"
         "--sentry=${SENTRY_DSN}"
         "--fmodstudio=${USE_FMODSTUDIO}"
         "--openal=${USE_OPENAL}"
@@ -2290,6 +2301,7 @@ if (LINUX)
       --actions=copy
       --arch=${ARCH}
       --artwork=${ARTWORK_DIR}
+      "--discord=${USE_DISCORD}"
       "--sentry=${SENTRY_DSN}"
       "--fmodstudio=${USE_FMODSTUDIO}"
       "--openal=${USE_OPENAL}"
diff --git a/indra/newview/aldiscordmanager.cpp b/indra/newview/aldiscordmanager.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..858297b50e83b128dfc9fc0d63fda75b7a69fdb7
--- /dev/null
+++ b/indra/newview/aldiscordmanager.cpp
@@ -0,0 +1,226 @@
+/**
+* @file aldiscordmanager.cpp
+* @brief Alchemy Discord Integration
+*
+* $LicenseInfo:firstyear=2021&license=viewerlgpl$
+* Alchemy Viewer Source Code
+* Copyright (C) 2022, Alchemy Viewer Project.
+* Copyright (C) 2022, Rye Mutt <rye@alchemyviewer.org>
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "aldiscordmanager.h"
+
+// library
+#include "llevents.h"
+#include "lltrans.h"
+
+// newview
+#include "llagent.h"
+#include "llappviewer.h"
+#include "llviewernetwork.h"
+#include "llregioninfomodel.h"
+#include "llviewerbuildconfig.h"
+#include "llviewercontrol.h"
+#include "llviewerregion.h"
+#include "rlvactions.h"
+
+#include "discord.h"
+
+ALDiscordManager::ALDiscordManager()
+{
+	LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&ALDiscordManager::onLoginCompleted, this));
+
+	gSavedPerAccountSettings.getControl("ALDiscordIntegration")->getSignal()->connect([this](LLControlVariable* control, const LLSD& new_val, const LLSD& old_val)
+    {
+		bool discord_enabled = new_val;
+        if(discord_enabled)
+		{
+			init();
+		}
+		else
+		{
+			shutdown();
+		}
+    });
+
+	if(gSavedPerAccountSettings.getBool("ALDiscordIntegration"))
+	{
+		init();
+	}
+}
+
+ALDiscordManager::~ALDiscordManager()
+{
+	shutdown();
+}
+
+void ALDiscordManager::init()
+{
+	if(initialized()) return;
+
+    discord::Core* core{};
+    auto result = discord::Core::Create(DISCORD_CLIENTID, DiscordCreateFlags_NoRequireDiscord, &core);
+    mDiscord.reset(core);
+    if (!mDiscord) {
+        LL_WARNS() << "Failed to instantiate discord core! (err " << static_cast<int>(result)
+                  << ")" << LL_ENDL;
+        return;
+    }
+
+	mDiscord->SetLogHook(
+		discord::LogLevel::Info, [](discord::LogLevel level, const char* message)
+		{
+			switch (level)
+			{
+			case discord::LogLevel::Error:
+			case discord::LogLevel::Warn:
+			{
+				LL_WARNS() << "Discord: " << message << LL_ENDL;
+				break;
+			}
+			case discord::LogLevel::Info:
+			{
+				LL_INFOS() << "Discord: " << message << LL_ENDL;
+				break;
+			}
+			case discord::LogLevel::Debug:
+			{
+				LL_DEBUGS() << "Discord: " << message << LL_ENDL;
+				break;
+			}
+			}
+		});
+
+    discord::Activity activity{};
+    activity.GetAssets().SetLargeImage("alchemy_1024");
+    activity.GetAssets().SetLargeText("Alchemy Viewer");
+    activity.SetType(discord::ActivityType::Playing);
+    mDiscord->ActivityManager().UpdateActivity(activity, [](discord::Result result) {
+        LL_INFOS() << ((result == discord::Result::Ok) ? "Succeeded" : "Failed")
+                  << " updating activity!" << LL_ENDL;
+    });
+
+	LLEventPumps::instance().obtain("mainloop").listen("ALDiscordManager", boost::bind(&ALDiscordManager::update, this, _1));
+}
+
+void ALDiscordManager::shutdown()
+{
+	LLEventPumps::instance().obtain("mainloop").stopListening("ALDiscordManager");
+	mDiscord.reset();
+}
+
+bool ALDiscordManager::update(const LLSD&)
+{
+	if(mDiscord)
+	{
+		mDiscord->RunCallbacks();
+	}
+	static LLFrameTimer timer;
+	if(timer.checkExpirationAndReset(5.f))
+	{
+		updateActivity();
+	}
+
+	return true;
+}
+
+void ALDiscordManager::onLoginCompleted()
+{
+	mLoggedInTime = LLDate::now().secondsSinceEpoch();
+	updateActivity();
+}
+
+void ALDiscordManager::updateActivity()
+{
+	LLViewerRegion* region = gAgent.getRegion();
+	if (!mDiscord || !region)
+	{
+		return;
+	}
+
+	discord::Activity activity{};
+	activity.SetType(discord::ActivityType::Playing);
+
+	static LLCachedControl<bool> discord_shared_region(gSavedPerAccountSettings, "ALDiscordShareLocationRegion", true);
+	static LLCachedControl<U32> discord_shared_region_maturity(gSavedPerAccountSettings, "ALDiscordShareRegionMaxMaturity", true);
+	std::string region_name;
+	if (RlvActions::canShowLocation() && discord_shared_region && region->getSimAccess() > discord_shared_region_maturity)
+	{
+		const LLVector3& pos = gAgent.getPositionAgent();
+		region_name = fmt::format(FMT_COMPILE("{} ({:.0f}, {:.0f}, {:.0f})"), region->getName(), pos.mV[VX], pos.mV[VY], pos.mV[VZ]);
+	}
+	else
+	{
+		region_name = "Hidden Region";
+	}
+	activity.SetState(region_name.c_str());
+
+	static LLCachedControl<bool> discord_shared_name(gSavedPerAccountSettings, "ALDiscordShareName", true);
+	if (RlvActions::canShowName(RlvActions::SNC_DEFAULT, gAgentID) && discord_shared_name)
+	{
+		std::string name;
+		LLAvatarName av_name;
+		if (LLAvatarNameCache::get(gAgentID, &av_name))
+		{
+			name = av_name.getCompleteName(true, true);
+		}
+		else
+		{
+			name = gAgentUsername;
+		}
+		activity.SetDetails(name.c_str());
+	}
+
+	if(mLoggedInTime > 0.0)
+	{
+		activity.GetTimestamps().SetStart(mLoggedInTime);
+	}
+
+	if (LLGridManager::getInstance()->isInSecondlife())
+	{
+		activity.GetAssets().SetLargeImage("secondlife_512");
+	}
+	else
+	{
+		activity.GetAssets().SetLargeImage("opensim_512");
+	}
+
+	activity.GetAssets().SetLargeText(LLGridManager::getInstance()->getGridLabel().c_str());
+	activity.GetAssets().SetSmallImage("alchemy_1024");
+
+	static std::string app_str = fmt::format("via {}", LLTrans::getString("APP_NAME"));
+	activity.GetAssets().SetSmallText(app_str.c_str());
+
+	std::string regionId = region->getRegionID().asString();
+	activity.GetParty().GetSize().SetCurrentSize(region->mMapAvatars.size());
+	S32 max_agents = LLRegionInfoModel::instance().mAgentLimit;
+	if(max_agents > 1)
+	{
+		activity.GetParty().GetSize().SetMaxSize(max_agents);
+	}
+	activity.GetParty().SetId(regionId.c_str());
+	activity.GetParty().SetPrivacy(discord::ActivityPartyPrivacy::Public);
+
+	mDiscord->ActivityManager().UpdateActivity(activity, [](discord::Result result) {
+		LL_INFOS() << ((result == discord::Result::Ok) ? "Succeeded" : "Failed")
+		<< " updating activity!" << LL_ENDL;
+		});
+}
diff --git a/indra/newview/aldiscordmanager.h b/indra/newview/aldiscordmanager.h
new file mode 100644
index 0000000000000000000000000000000000000000..5cf39d1d14da2dfd62cad08a78707bb5cde9c550
--- /dev/null
+++ b/indra/newview/aldiscordmanager.h
@@ -0,0 +1,55 @@
+/**
+* @file aldiscordmanager.h
+* @brief Alchemy Discord Integration
+*
+* $LicenseInfo:firstyear=2021&license=viewerlgpl$
+* Alchemy Viewer Source Code
+* Copyright (C) 2022, Alchemy Viewer Project.
+* Copyright (C) 2022, Rye Mutt <rye@alchemyviewer.org>
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* $/LicenseInfo$
+*/
+
+#ifndef AL_DISCORDMANAGER_H
+#define AL_DISCORDMANAGER_H
+
+#include "llsingleton.h"
+
+#include "discord.h"
+
+class ALDiscordManager final
+:	public LLSingleton<ALDiscordManager>
+{
+    LLSINGLETON(ALDiscordManager);
+    ~ALDiscordManager();
+    
+public:
+    bool initialized() { return mDiscord != nullptr; }
+    void init();
+    void shutdown();
+    bool update(const LLSD&);
+
+private:
+    void onLoginCompleted();
+    void updateActivity();
+
+    std::unique_ptr<discord::Core> mDiscord;
+    F64 mLoggedInTime = 0.0;
+};
+
+
+#endif // AL_DISCORDMANAGER_H
\ No newline at end of file
diff --git a/indra/newview/app_settings/settings_per_account_alchemy.xml b/indra/newview/app_settings/settings_per_account_alchemy.xml
index 4bb92914d4090dc45d008d527591ee7f67862df4..3923fac6dbba541f096b344b30f5735e75fb4b6d 100644
--- a/indra/newview/app_settings/settings_per_account_alchemy.xml
+++ b/indra/newview/app_settings/settings_per_account_alchemy.xml
@@ -11,6 +11,50 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>ALDiscordIntegration</key>
+    <map>
+      <key>Comment</key>
+      <string>Enable discord integration</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>ALDiscordShareLocationRegion</key>
+    <map>
+      <key>Comment</key>
+      <string>Share avatar region to discord</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>ALDiscordShareRegionMaxMaturity</key>
+    <map>
+      <key>Comment</key>
+      <string>Maximum maturity of location shared to Discord</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>U32</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>ALDiscordShareName</key>
+    <map>
+      <key>Comment</key>
+      <string>Share avatar name to discord</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>AlchemyMouselookAlternativeFOV</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 902a119be5ba5bedad5e4b1472b42be4f9c3e503..ececbccbd43e16a04fb9330e36757e26a145f16e 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -256,6 +256,10 @@ using namespace LL;
 #include "llcoproceduremanager.h"
 #include "llviewereventrecorder.h"
 
+#if USE_DISCORD
+#include "aldiscordmanager.h"
+#endif
+
 // *FIX: These extern globals should be cleaned up.
 // The globals either represent state/config/resource-storage of either
 // this app, or another 'component' of the viewer. App globals should be
@@ -1296,6 +1300,11 @@ bool LLAppViewer::init()
     }
 #endif
 
+#if USE_DISCORD
+		ALDiscordManager::getInstance();
+		LL_INFOS("AppInit") << "Discord Integration Initialized." << LL_ENDL; 
+#endif
+
 	return true;
 }
 
diff --git a/indra/newview/llviewerbuildconfig.h.in b/indra/newview/llviewerbuildconfig.h.in
index 09e01a0fcf210e277d3a33ed654fcab576b8a2de..141304158fe23f5c6bb231df499b1261bfcd2f8d 100644
--- a/indra/newview/llviewerbuildconfig.h.in
+++ b/indra/newview/llviewerbuildconfig.h.in
@@ -46,6 +46,9 @@
 // Sentry
 #define SENTRY_DSN "@SENTRY_DSN@"
 
+// Discord
+#define DISCORD_CLIENTID @DISCORD_CLIENTID@
+
 // Graphics Utils
 #cmakedefine01 USE_NVAPI
 
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 377cb383b2fa475d3fc1fd172770a46b9a787f46..be59b03dca62acccba67f8e762c3e848a5ab7a10 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -529,6 +529,9 @@ def construct(self):
                 with self.prefix(src=os.path.join(pkgdir, 'bin', 'release')):
                     self.path("crashpad_handler.exe")
 
+            if self.args.get('discord'):
+                self.path("discord_game_sdk.dll")
+
         self.path(src="licenses-win32.txt", dst="licenses.txt")
         self.path("featuretable.txt")
         self.path("cube.dae")
@@ -1218,6 +1221,9 @@ def construct(self):
             if self.args['fmodstudio'] == 'ON' or self.args['fmodstudio'] == 'TRUE':
                 self.path("libfmod.so*")
 
+            if self.args.get('discord'):
+                self.path("discord_game_sdk.so")
+
         # Vivox runtimes
         with self.prefix(src=os.path.join(pkgdir, 'bin', 'release'), dst="bin"):
             self.path("SLVoice")
@@ -1256,6 +1262,9 @@ def construct(self):
             if self.args['fmodstudio'] == 'ON' or self.args['fmodstudio'] == 'TRUE':
                 self.path("libfmod.so*")
 
+            if self.args.get('discord'):
+                self.path("discord_game_sdk.so")
+
         # Vivox runtimes
         with self.prefix(src=os.path.join(pkgdir, 'bin', 'release'), dst="bin"):
             self.path("SLVoice")
@@ -1278,6 +1287,7 @@ def construct(self):
            ' '.join((("'%s'" % arg) if ' ' in arg else arg) for arg in sys.argv))))
     # fmodstudio and openal can be used simultaneously and controled by environment
     extra_arguments = [
+        dict(name='discord', description="""Enable Discord integration""", default=''),
         dict(name='sentry', description="""Enable Sentry crash report system""", default=''),
         dict(name='fmodstudio', description="""Indication if fmod studio libraries are needed""", default='OFF'),
         dict(name='openal', description="""Indication if openal libraries are needed""", default='OFF'),