diff --git a/Libraries/LibWeb/HTML/MessagePort.cpp b/Libraries/LibWeb/HTML/MessagePort.cpp
index b347fe554be..2c955155490 100644
--- a/Libraries/LibWeb/HTML/MessagePort.cpp
+++ b/Libraries/LibWeb/HTML/MessagePort.cpp
@@ -99,7 +99,11 @@ WebIDL::ExceptionOr MessagePort::transfer_steps(HTML::TransferDataEncoder&
// 3. If value is entangled with another port remotePort, then:
if (is_entangled()) {
// 1. Set remotePort's has been shipped flag to true.
- m_remote_port->m_has_been_shipped = true;
+
+ // NOTE: We have to null check here because we can be entangled with a port living in another agent.
+ // In that case, we'll have a transport, but no remote port object.
+ if (m_remote_port)
+ m_remote_port->m_has_been_shipped = true;
auto fd = MUST(m_transport->release_underlying_transport_for_transfer());
m_transport.clear();
diff --git a/Tests/LibWeb/Text/expected/HTML/MessagePort-transfer-twice.txt b/Tests/LibWeb/Text/expected/HTML/MessagePort-transfer-twice.txt
new file mode 100644
index 00000000000..33c112e2685
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/HTML/MessagePort-transfer-twice.txt
@@ -0,0 +1,2 @@
+first receipt: re-transferring same port
+we good
diff --git a/Tests/LibWeb/Text/input/HTML/MessagePort-transfer-twice.html b/Tests/LibWeb/Text/input/HTML/MessagePort-transfer-twice.html
new file mode 100644
index 00000000000..d0245d81383
--- /dev/null
+++ b/Tests/LibWeb/Text/input/HTML/MessagePort-transfer-twice.html
@@ -0,0 +1,27 @@
+
+
+