diff --git a/Source/Core/Core/NetPlayClient.cpp b/Source/Core/Core/NetPlayClient.cpp
index c40b122a70..6c00b7ff53 100644
--- a/Source/Core/Core/NetPlayClient.cpp
+++ b/Source/Core/Core/NetPlayClient.cpp
@@ -1891,7 +1891,7 @@ void NetPlayClient::UpdateDevices()
     {
       si.ChangeDevice(SerialInterface::SIDEVICE_GC_GBA_EMULATED, pad);
     }
-    else if (player_id == m_local_player->pid)
+    else if (player_id == m_local_player->pid || player_id == NETPLAY_SHARE_CONTROLLER_MAGIC)
     {
       // Use local controller types for local controllers if they are compatible
       const SerialInterface::SIDevices si_device =
@@ -2409,7 +2409,7 @@ static int CountLocalPads(const PadMappingArray& pad_map, const PlayerId& local_
 {
   return static_cast<int>(
       std::count_if(pad_map.begin(), pad_map.end(), [&local_player_pid](const auto& mapping) {
-        return mapping == local_player_pid;
+        return mapping == local_player_pid || mapping == NETPLAY_SHARE_CONTROLLER_MAGIC;
       }));
 }
 
@@ -2426,7 +2426,7 @@ int NetPlayClient::NumLocalWiimotes() const
 static int InGameToLocal(int ingame_pad, const PadMappingArray& pad_map, PlayerId local_player_pid)
 {
   // not our pad
-  if (pad_map[ingame_pad] != local_player_pid)
+  if (pad_map[ingame_pad] != local_player_pid && pad_map[ingame_pad] != NETPLAY_SHARE_CONTROLLER_MAGIC)
     return 4;
 
   int local_pad = 0;
@@ -2434,7 +2434,7 @@ static int InGameToLocal(int ingame_pad, const PadMappingArray& pad_map, PlayerI
 
   for (; pad < ingame_pad; ++pad)
   {
-    if (pad_map[pad] == local_player_pid)
+    if (pad_map[pad] == local_player_pid || pad_map[ingame_pad] == NETPLAY_SHARE_CONTROLLER_MAGIC)
       local_pad++;
   }
 
@@ -2450,7 +2450,7 @@ static int LocalToInGame(int local_pad, const PadMappingArray& pad_map, PlayerId
   int ingame_pad = 0;
   for (; ingame_pad < 4; ingame_pad++)
   {
-    if (pad_map[ingame_pad] == local_player_pid)
+    if (pad_map[ingame_pad] == local_player_pid || pad_map[ingame_pad] == NETPLAY_SHARE_CONTROLLER_MAGIC)
       local_pad_count++;
 
     if (local_pad_count == local_pad)
@@ -2482,7 +2482,7 @@ int NetPlayClient::LocalWiimoteToInGameWiimote(int local_wiimote) const
 
 bool NetPlayClient::PlayerHasControllerMapped(const PlayerId pid) const
 {
-  const auto mapping_matches_player_id = [pid](const PlayerId& mapping) { return mapping == pid; };
+  const auto mapping_matches_player_id = [pid](const PlayerId& mapping) { return mapping == pid || mapping == NETPLAY_SHARE_CONTROLLER_MAGIC; };
 
   return std::any_of(m_pad_map.begin(), m_pad_map.end(), mapping_matches_player_id) ||
          std::any_of(m_wiimote_map.begin(), m_wiimote_map.end(), mapping_matches_player_id);
@@ -2665,6 +2665,7 @@ std::string GetPlayerMappingString(PlayerId pid, const PadMappingArray& pad_map,
     if (wiimote_map[i] == pid)
       wiimote_slots.push_back(i + 1);
   }
+  if (pad_map[0] == NETPLAY_SHARE_CONTROLLER_MAGIC) gc_slots.push_back(NETPLAY_SHARE_CONTROLLER_MAGIC);
   std::vector<std::string> groups;
   for (const auto& [group_name, slots] :
        {std::make_pair("GC", &gc_slots), std::make_pair("GBA", &gba_slots),
diff --git a/Source/Core/Core/NetPlayProto.h b/Source/Core/Core/NetPlayProto.h
index a20aee39ce..05cbaa370f 100644
--- a/Source/Core/Core/NetPlayProto.h
+++ b/Source/Core/Core/NetPlayProto.h
@@ -15,6 +15,8 @@
 #include "Core/HW/Sram.h"
 #include "VideoCommon/VideoConfig.h"
 
+#define NETPLAY_SHARE_CONTROLLER_MAGIC 69
+
 namespace DiscIO
 {
 enum class Region;
diff --git a/Source/Core/Core/NetPlayServer.cpp b/Source/Core/Core/NetPlayServer.cpp
index 0705e4d2a7..d2d7d17624 100644
--- a/Source/Core/Core/NetPlayServer.cpp
+++ b/Source/Core/Core/NetPlayServer.cpp
@@ -811,7 +811,7 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, Client& player)
 
       // If the data is not from the correct player,
       // then disconnect them.
-      if (m_pad_map.at(map) != player.pid)
+      if (m_pad_map.at(map) != player.pid && m_pad_map.at(map) != NETPLAY_SHARE_CONTROLLER_MAGIC)
       {
         return 1;
       }
@@ -2220,7 +2220,7 @@ void NetPlayServer::KickPlayer(PlayerId player)
 
 bool NetPlayServer::PlayerHasControllerMapped(const PlayerId pid) const
 {
-  const auto mapping_matches_player_id = [pid](const PlayerId& mapping) { return mapping == pid; };
+  const auto mapping_matches_player_id = [pid](const PlayerId& mapping) { return mapping == pid || mapping == NETPLAY_SHARE_CONTROLLER_MAGIC; };
 
   return std::any_of(m_pad_map.begin(), m_pad_map.end(), mapping_matches_player_id) ||
          std::any_of(m_wiimote_map.begin(), m_wiimote_map.end(), mapping_matches_player_id);
diff --git a/Source/Core/DolphinQt/NetPlay/PadMappingDialog.cpp b/Source/Core/DolphinQt/NetPlay/PadMappingDialog.cpp
index 35946d8f6d..fb488473f6 100644
--- a/Source/Core/DolphinQt/NetPlay/PadMappingDialog.cpp
+++ b/Source/Core/DolphinQt/NetPlay/PadMappingDialog.cpp
@@ -43,8 +43,10 @@ void PadMappingDialog::CreateWidgets()
     m_main_layout->addWidget(new QLabel(tr("Wii Remote %1").arg(i + 1)), 3, i);
     m_main_layout->addWidget(m_wii_boxes[i], 4, i);
   }
+  m_controller_share_box = new QCheckBox(tr("Share Controller"));
+  m_main_layout->addWidget(m_controller_share_box, 5, 0);
 
-  m_main_layout->addWidget(m_button_box, 5, 0, 1, -1);
+  m_main_layout->addWidget(m_button_box, 5, 1, 1, -1);
 
   setLayout(m_main_layout);
 }
@@ -63,6 +65,7 @@ void PadMappingDialog::ConnectWidgets()
   {
     connect(checkbox, &QCheckBox::stateChanged, this, &PadMappingDialog::OnMappingChanged);
   }
+  connect(m_controller_share_box, &QCheckBox::stateChanged, this, &PadMappingDialog::OnMappingChanged);
 }
 
 int PadMappingDialog::exec()
@@ -108,6 +111,11 @@ int PadMappingDialog::exec()
 
     m_gba_boxes[i]->setChecked(m_gba_config[i].enabled);
   }
+  
+  if (m_pad_mapping[0] == NETPLAY_SHARE_CONTROLLER_MAGIC) {
+	const QSignalBlocker blocker(m_controller_share_box);
+	m_controller_share_box->setChecked(true);
+  }
 
   return QDialog::exec();
 }
@@ -129,6 +137,15 @@ NetPlay::PadMappingArray PadMappingDialog::GetWiimoteArray()
 
 void PadMappingDialog::OnMappingChanged()
 {
+  if (m_controller_share_box->isChecked()) {
+	for (unsigned int i = 0; i < m_wii_boxes.size(); i++) {
+	  m_pad_mapping[i] = 0;
+	  m_gba_config[i].enabled = false;
+	  m_wii_mapping[i] = 0;
+	}
+	m_pad_mapping[0] = NETPLAY_SHARE_CONTROLLER_MAGIC;
+	return;
+  }
   for (unsigned int i = 0; i < m_wii_boxes.size(); i++)
   {
     int gc_id = m_gc_boxes[i]->currentIndex();
diff --git a/Source/Core/DolphinQt/NetPlay/PadMappingDialog.h b/Source/Core/DolphinQt/NetPlay/PadMappingDialog.h
index cd7a61c2bf..dfc7c044db 100644
--- a/Source/Core/DolphinQt/NetPlay/PadMappingDialog.h
+++ b/Source/Core/DolphinQt/NetPlay/PadMappingDialog.h
@@ -45,4 +45,5 @@ private:
   std::array<QComboBox*, 4> m_wii_boxes;
   std::vector<const NetPlay::Player*> m_players;
   QDialogButtonBox* m_button_box;
+  QCheckBox* m_controller_share_box;
 };
