diff --git a/com.unity.netcode.gameobjects/Editor/AssemblyInfo.cs b/com.unity.netcode.gameobjects/Editor/AssemblyInfo.cs
index 41e6599661..0f4e7e2b1d 100644
--- a/com.unity.netcode.gameobjects/Editor/AssemblyInfo.cs
+++ b/com.unity.netcode.gameobjects/Editor/AssemblyInfo.cs
@@ -2,7 +2,7 @@
 
 #if UNITY_INCLUDE_TESTS
 #if UNITY_EDITOR
-[assembly: InternalsVisibleTo("Unity.Netcode.EditorTests")]
-[assembly: InternalsVisibleTo("TestProject.RuntimeTests")]
+[assembly: InternalsVisibleTo("Unity.Netcode.Editor.Tests")]
+[assembly: InternalsVisibleTo("TestProject.Runtime.Tests")]
 #endif // UNITY_EDITOR
 #endif // UNITY_INCLUDE_TESTS
diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/com.unity.netcode.editor.codegen.asmdef b/com.unity.netcode.gameobjects/Editor/CodeGen/Unity.Netcode.Editor.CodeGen.asmdef
similarity index 100%
rename from com.unity.netcode.gameobjects/Editor/CodeGen/com.unity.netcode.editor.codegen.asmdef
rename to com.unity.netcode.gameobjects/Editor/CodeGen/Unity.Netcode.Editor.CodeGen.asmdef
diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/com.unity.netcode.editor.codegen.asmdef.meta b/com.unity.netcode.gameobjects/Editor/CodeGen/Unity.Netcode.Editor.CodeGen.asmdef.meta
similarity index 100%
rename from com.unity.netcode.gameobjects/Editor/CodeGen/com.unity.netcode.editor.codegen.asmdef.meta
rename to com.unity.netcode.gameobjects/Editor/CodeGen/Unity.Netcode.Editor.CodeGen.asmdef.meta
diff --git a/com.unity.netcode.gameobjects/Editor/PackageChecker/com.unity.netcode.editor.packagechecker.asmdef b/com.unity.netcode.gameobjects/Editor/PackageChecker/Unity.Netcode.Editor.PackageChecker.asmdef
similarity index 100%
rename from com.unity.netcode.gameobjects/Editor/PackageChecker/com.unity.netcode.editor.packagechecker.asmdef
rename to com.unity.netcode.gameobjects/Editor/PackageChecker/Unity.Netcode.Editor.PackageChecker.asmdef
diff --git a/com.unity.netcode.gameobjects/Editor/PackageChecker/com.unity.netcode.editor.packagechecker.asmdef.meta b/com.unity.netcode.gameobjects/Editor/PackageChecker/Unity.Netcode.Editor.PackageChecker.asmdef.meta
similarity index 100%
rename from com.unity.netcode.gameobjects/Editor/PackageChecker/com.unity.netcode.editor.packagechecker.asmdef.meta
rename to com.unity.netcode.gameobjects/Editor/PackageChecker/Unity.Netcode.Editor.PackageChecker.asmdef.meta
diff --git a/com.unity.netcode.gameobjects/Editor/com.unity.netcode.editor.asmdef b/com.unity.netcode.gameobjects/Editor/Unity.Netcode.Editor.asmdef
similarity index 100%
rename from com.unity.netcode.gameobjects/Editor/com.unity.netcode.editor.asmdef
rename to com.unity.netcode.gameobjects/Editor/Unity.Netcode.Editor.asmdef
diff --git a/com.unity.netcode.gameobjects/Editor/com.unity.netcode.editor.asmdef.meta b/com.unity.netcode.gameobjects/Editor/Unity.Netcode.Editor.asmdef.meta
similarity index 100%
rename from com.unity.netcode.gameobjects/Editor/com.unity.netcode.editor.asmdef.meta
rename to com.unity.netcode.gameobjects/Editor/Unity.Netcode.Editor.asmdef.meta
diff --git a/com.unity.netcode.gameobjects/Runtime/AssemblyInfo.cs b/com.unity.netcode.gameobjects/Runtime/AssemblyInfo.cs
index 82e95f556e..e2697f2947 100644
--- a/com.unity.netcode.gameobjects/Runtime/AssemblyInfo.cs
+++ b/com.unity.netcode.gameobjects/Runtime/AssemblyInfo.cs
@@ -4,22 +4,23 @@
 [assembly: InternalsVisibleTo("Unity.Netcode.Editor")]
 [assembly: InternalsVisibleTo("Unity.Netcode.Editor.CodeGen")]
 #endif // UNITY_EDITOR
-#if MULTIPLAYER_TOOLS
-[assembly: InternalsVisibleTo("Unity.Multiplayer.Tools.Adapters.Ngo1WithUtp2")]
-#endif // MULTIPLAYER_TOOLS
+
 #if COM_UNITY_NETCODE_ADAPTER_UTP
 [assembly: InternalsVisibleTo("Unity.Netcode.Adapter.UTP")]
 #endif // COM_UNITY_NETCODE_ADAPTER_UTP
 
 #if UNITY_INCLUDE_TESTS
-[assembly: InternalsVisibleTo("Unity.Netcode.RuntimeTests")]
+[assembly: InternalsVisibleTo("Unity.Netcode.Runtime.Tests")]
 [assembly: InternalsVisibleTo("Unity.Netcode.TestHelpers.Runtime")]
-[assembly: InternalsVisibleTo("TestProject.RuntimeTests")]
+[assembly: InternalsVisibleTo("TestProject.Runtime.Tests")]
 #if UNITY_EDITOR
-[assembly: InternalsVisibleTo("Unity.Netcode.EditorTests")]
-[assembly: InternalsVisibleTo("TestProject.EditorTests")]
+[assembly: InternalsVisibleTo("Unity.Netcode.Editor.Tests")]
+[assembly: InternalsVisibleTo("TestProject.Editor.Tests")]
 #endif // UNITY_EDITOR
+
 #if MULTIPLAYER_TOOLS
+[assembly: InternalsVisibleTo("Unity.Multiplayer.Tools.GameObjects.Tests")]
+[assembly: InternalsVisibleTo("Unity.Multiplayer.Tools.Adapters.Ngo1WithUtp2")]
 [assembly: InternalsVisibleTo("TestProject.ToolsIntegration.RuntimeTests")]
 #endif // MULTIPLAYER_TOOLS
 #endif // UNITY_INCLUDE_TESTS
diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs
index 05eeb22cfe..45391c018c 100644
--- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs
@@ -852,7 +852,7 @@ public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReade
                 if (HasScaleChange)
                 {
                     // If we are teleporting (which includes synchronizing) and the associated NetworkObject has a parent
-                    // then we want to serialize the LossyScale since NetworkObject spawn order is not  guaranteed
+                    // then we want to serialize the LossyScale since NetworkObject spawn order is not guaranteed
                     if (IsTeleportingNextFrame && IsParented)
                     {
                         serializer.SerializeValue(ref LossyScale);
@@ -1014,7 +1014,7 @@ public enum InterpolationTypes
             /// Uses a 1 to 2 phase smooth dampening approach where:<br />
             /// <list type="bullet">
             /// <item><description>The first phase smooth dampens towards the current tick state update being processed by the accumulated delta time relative to the time to target.</description></item>
-            /// <item><description>The second phase (optional) performs lerp smoothing where the current respective transform value is lerped towards the result of the third phase at a rate of delta time divided by the respective max interpolation time.</description></item>
+            /// <item><description>The second phase (optional) performs lerp smoothing where the current respective transform value is lerped towards the result of the first phase at a rate of delta time divided by the respective max interpolation time.</description></item>
             /// </list>
             /// </summary>
             /// <remarks>
@@ -3726,13 +3726,13 @@ internal void ChildRegistration(NetworkObject child, bool isAdding)
 
         /// <inheritdoc/>
         /// <remarks>
-        /// When not using a NetworkRigidbody and using an owner authoritative motion model, you can <br />
+        /// When not using a NetworkRigidbody and using an owner authoritative motion model, you can<br />
         /// improve parenting transitions into and out of world and local space by:<br />
         /// - Disabling <see cref="NetworkObject.SyncOwnerTransformWhenParented"/><br />
         /// - Enabling <see cref="NetworkObject.AllowOwnerToParent"/><br />
         /// - Enabling <see cref="SwitchTransformSpaceWhenParented"/><br />
         /// -- Note: This handles changing from world space to local space for you.<br />
-        /// When these settings are applied, transitioning from: <br />
+        /// When these settings are applied, transitioning from:<br />
         /// - World space to local space (root-null parent/null to <see cref="NetworkObject"/> parent)
         /// - Local space back to world space (<see cref="NetworkObject"/> parent to root-null parent)
         /// - Local space to local space (<see cref="NetworkObject"/> parent to <see cref="NetworkObject"/> parent)
@@ -4101,12 +4101,12 @@ private void UpdateInterpolation()
             }
 
             // Note: This is for the legacy lerp type in order to maintain the same end result for any games under development that have tuned their
-            // project's to match the legacy lerp's end result. This will not allow changes
+            // project's to match the legacy lerp's end result.
             var cachedRenderTime = 0.0;
             if (PositionInterpolationType == InterpolationTypes.LegacyLerp || RotationInterpolationType == InterpolationTypes.LegacyLerp || ScaleInterpolationType == InterpolationTypes.LegacyLerp)
             {
                 // Since InterpolationBufferTickOffset defaults to zero, this should not impact exist projects but still provides users with the ability to tweak
-                // their ticks ago time. 
+                // their ticks ago time.
                 var ticksAgo = (!IsServerAuthoritative() && !IsServer ? 2 : 1) + InterpolationBufferTickOffset;
                 cachedRenderTime = timeSystem.TimeTicksAgo(ticksAgo).Time;
             }
@@ -4533,7 +4533,7 @@ internal static void UpdateNetworkTick(NetworkManager networkManager)
         /// </summary>
         /// <remarks>
         /// Note: You can adjust this value during runtime. Increasing this value will set non-authority instances that much further
-        /// behind the authority instance but will increase the number of state updates to be processed. Increasing this can be useful 
+        /// behind the authority instance but will increase the number of state updates to be processed. Increasing this can be useful
         /// under higher latency conditions.<br />
         /// The default value is 1 tick (plus the tick latency). When running on a local network, reducing this to 0 is recommended.<br />
         /// <see cref="NetworkTimeSystem.TickLatency"/>
diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ChangeOwnershipMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ChangeOwnershipMessage.cs
index 9b980d2430..9d1564ed21 100644
--- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ChangeOwnershipMessage.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ChangeOwnershipMessage.cs
@@ -381,7 +381,7 @@ private void HandleOwnershipChange(ref NetworkContext context)
 
             if (originalOwner == networkManager.LocalClientId && !networkManager.DistributedAuthorityMode)
             {
-                // Fully synchronize NetworkVariables with either read or write ownership permissions. 
+                // Fully synchronize NetworkVariables with either read or write ownership permissions.
                 networkObject.SynchronizeOwnerNetworkVariables(originalOwner, networkObject.PreviousOwnerId);
             }
 
diff --git a/com.unity.netcode.gameobjects/Runtime/com.unity.netcode.runtime.asmdef b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef
similarity index 100%
rename from com.unity.netcode.gameobjects/Runtime/com.unity.netcode.runtime.asmdef
rename to com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef
diff --git a/com.unity.netcode.gameobjects/Runtime/com.unity.netcode.runtime.asmdef.meta b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef.meta
similarity index 100%
rename from com.unity.netcode.gameobjects/Runtime/com.unity.netcode.runtime.asmdef.meta
rename to com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef.meta
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/AssemblyInfo.cs b/com.unity.netcode.gameobjects/TestHelpers/Runtime/AssemblyInfo.cs
index e880ab216e..2910ea0f5b 100644
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/AssemblyInfo.cs
+++ b/com.unity.netcode.gameobjects/TestHelpers/Runtime/AssemblyInfo.cs
@@ -1,13 +1,15 @@
 using System.Runtime.CompilerServices;
 
 #if UNITY_INCLUDE_TESTS
-[assembly: InternalsVisibleTo("Unity.Netcode.RuntimeTests")]
-[assembly: InternalsVisibleTo("TestProject.RuntimeTests")]
+[assembly: InternalsVisibleTo("Unity.Netcode.Runtime.Tests")]
+[assembly: InternalsVisibleTo("TestProject.Runtime.Tests")]
 #if UNITY_EDITOR
 [assembly: InternalsVisibleTo("Unity.Netcode.Editor")]
-[assembly: InternalsVisibleTo("TestProject.EditorTests")]
+[assembly: InternalsVisibleTo("Unity.Netcode.Editor.Tests")]
+[assembly: InternalsVisibleTo("TestProject.Editor.Tests")]
 #endif // UNITY_EDITOR
 #if MULTIPLAYER_TOOLS
+[assembly: InternalsVisibleTo("Unity.Multiplayer.Tools.GameObjects.Tests")]
 [assembly: InternalsVisibleTo("TestProject.ToolsIntegration.RuntimeTests")]
 #endif // MULTIPLAYER_TOOLS
 #endif // UNITY_INCLUDE_TESTS
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/MetricTestBase.cs b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/MetricTestBase.cs
deleted file mode 100644
index 773a79b470..0000000000
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/MetricTestBase.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using System.Collections;
-
-namespace Unity.Netcode.TestHelpers.Runtime.Metrics
-{
-    internal abstract class SingleClientMetricTestBase : NetcodeIntegrationTest
-    {
-        protected override int NumberOfClients => 1;
-
-        internal NetworkManager Server { get; private set; }
-
-        internal NetworkMetrics ServerMetrics { get; private set; }
-
-        internal NetworkManager Client { get; private set; }
-
-        internal NetworkMetrics ClientMetrics { get; private set; }
-
-        protected override void OnServerAndClientsCreated()
-        {
-            Server = m_ServerNetworkManager;
-            Client = m_ClientNetworkManagers[0];
-            base.OnServerAndClientsCreated();
-        }
-
-        protected override IEnumerator OnStartedServerAndClients()
-        {
-            ServerMetrics = Server.NetworkMetrics as NetworkMetrics;
-            ClientMetrics = Client.NetworkMetrics as NetworkMetrics;
-            yield return base.OnStartedServerAndClients();
-        }
-    }
-
-    public abstract class DualClientMetricTestBase : NetcodeIntegrationTest
-    {
-        protected override int NumberOfClients => 2;
-
-        internal NetworkManager Server { get; private set; }
-
-        internal NetworkMetrics ServerMetrics { get; private set; }
-
-        internal NetworkManager FirstClient { get; private set; }
-
-        internal NetworkMetrics FirstClientMetrics { get; private set; }
-
-        internal NetworkManager SecondClient { get; private set; }
-
-        internal NetworkMetrics SecondClientMetrics { get; private set; }
-
-        protected override void OnServerAndClientsCreated()
-        {
-            Server = m_ServerNetworkManager;
-            FirstClient = m_ClientNetworkManagers[0];
-            SecondClient = m_ClientNetworkManagers[1];
-            base.OnServerAndClientsCreated();
-        }
-
-        protected override IEnumerator OnStartedServerAndClients()
-        {
-            ServerMetrics = Server.NetworkMetrics as NetworkMetrics;
-            FirstClientMetrics = FirstClient.NetworkMetrics as NetworkMetrics;
-            SecondClientMetrics = SecondClient.NetworkMetrics as NetworkMetrics;
-            yield return base.OnStartedServerAndClients();
-        }
-    }
-}
-#endif
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/MetricTestBase.cs.meta b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/MetricTestBase.cs.meta
deleted file mode 100644
index fc32437f8c..0000000000
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/MetricTestBase.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: c726f5bc421c3874d9c1a26bcac3f091
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/NetworkVariableComponent.cs b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/NetworkVariableComponent.cs
deleted file mode 100644
index d21b8b1a25..0000000000
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/NetworkVariableComponent.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using UnityEngine;
-
-namespace Unity.Netcode.TestHelpers.Runtime.Metrics
-{
-    public class NetworkVariableComponent : NetworkBehaviour
-    {
-        public NetworkVariable<int> MyNetworkVariable { get; } = new NetworkVariable<int>();
-
-        private void Update()
-        {
-            if (IsServer)
-            {
-                MyNetworkVariable.Value = Random.Range(100, 999);
-            }
-        }
-    }
-}
-#endif
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/NetworkVariableComponent.cs.meta b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/NetworkVariableComponent.cs.meta
deleted file mode 100644
index 6694f4a450..0000000000
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/NetworkVariableComponent.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 124489f89ef59d449ab4bed1f5ef2f59
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/RpcTestComponent.cs b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/RpcTestComponent.cs
deleted file mode 100644
index 158f5d3c42..0000000000
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/RpcTestComponent.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-
-namespace Unity.Netcode.TestHelpers.Runtime.Metrics
-{
-    public class RpcTestComponent : NetworkBehaviour
-    {
-        public event Action OnServerRpcAction;
-        public event Action OnClientRpcAction;
-
-        [ServerRpc]
-        public void MyServerRpc()
-        {
-            OnServerRpcAction?.Invoke();
-        }
-
-        [ClientRpc]
-        public void MyClientRpc(ClientRpcParams rpcParams = default)
-        {
-            OnClientRpcAction?.Invoke();
-        }
-    }
-}
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/RpcTestComponent.cs.meta b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/RpcTestComponent.cs.meta
deleted file mode 100644
index 5df815356d..0000000000
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/RpcTestComponent.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: fdfa28da9866545428083671c445a9ef
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForCounterMetricValue.cs b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForCounterMetricValue.cs
deleted file mode 100644
index 6912e73799..0000000000
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForCounterMetricValue.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Multiplayer.Tools.NetStats;
-
-namespace Unity.Netcode.TestHelpers.Runtime.Metrics
-{
-    internal class WaitForCounterMetricValue : WaitForMetricValues<Counter>
-    {
-        private long m_Value;
-
-        public delegate bool CounterFilter(long metric);
-        private CounterFilter m_CounterFilterDelegate;
-
-        public WaitForCounterMetricValue(IMetricDispatcher dispatcher, DirectionalMetricInfo directionalMetricName)
-            : base(dispatcher, directionalMetricName)
-        {
-        }
-
-        public WaitForCounterMetricValue(IMetricDispatcher dispatcher, DirectionalMetricInfo directionalMetricName, CounterFilter counterFilter)
-            : this(dispatcher, directionalMetricName)
-        {
-            m_CounterFilterDelegate = counterFilter;
-        }
-
-        public long AssertMetricValueHaveBeenFound()
-        {
-            AssertHasError();
-            AssertIsFound();
-
-            return m_Value;
-        }
-
-        public override void Observe(MetricCollection collection)
-        {
-            if (FindMetric(collection, out var metric))
-            {
-                var typedMetric = metric as Counter;
-                if (typedMetric == default)
-                {
-                    SetError(metric);
-                    return;
-                }
-
-                m_Value = typedMetric.Value;
-                m_Found = m_CounterFilterDelegate != null ? m_CounterFilterDelegate(m_Value) : true;
-            }
-        }
-    }
-}
-#endif
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForCounterMetricValue.cs.meta b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForCounterMetricValue.cs.meta
deleted file mode 100644
index 73b1537579..0000000000
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForCounterMetricValue.cs.meta
+++ /dev/null
@@ -1,3 +0,0 @@
-fileFormatVersion: 2
-guid: aa1d3026d48b43bfa4c76e253b08b3ae
-timeCreated: 1644269156
\ No newline at end of file
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForEventMetricValues.cs b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForEventMetricValues.cs
deleted file mode 100644
index a9af59427a..0000000000
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForEventMetricValues.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using System.Collections.Generic;
-using System.Linq;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Multiplayer.Tools.NetStats;
-
-namespace Unity.Netcode.TestHelpers.Runtime.Metrics
-{
-    internal class WaitForEventMetricValues<TMetric> : WaitForMetricValues<TMetric>
-    {
-        private IReadOnlyCollection<TMetric> m_EventValues;
-
-        public delegate bool EventFilter(TMetric metric);
-
-        private EventFilter m_EventFilterDelegate;
-
-        public WaitForEventMetricValues(IMetricDispatcher dispatcher, DirectionalMetricInfo directionalMetricName)
-            : base(dispatcher, directionalMetricName)
-        {
-        }
-
-        public WaitForEventMetricValues(IMetricDispatcher dispatcher, DirectionalMetricInfo directionalMetricName, EventFilter eventFilter)
-            : this(dispatcher, directionalMetricName)
-        {
-            m_EventFilterDelegate = eventFilter;
-        }
-
-        public IReadOnlyCollection<TMetric> AssertMetricValuesHaveBeenFound()
-        {
-            AssertHasError();
-            AssertIsFound();
-
-            return m_EventValues;
-        }
-
-        public override void Observe(MetricCollection collection)
-        {
-            if (FindMetric(collection, out var metric))
-            {
-                var typedMetric = metric as IEventMetric<TMetric>;
-                if (typedMetric == default)
-                {
-                    SetError(metric);
-                    return;
-                }
-
-                if (typedMetric.Values.Any())
-                {
-                    // Apply filter if one was provided
-                    m_EventValues = m_EventFilterDelegate != null ? typedMetric.Values.Where(x => m_EventFilterDelegate(x)).ToList() : typedMetric.Values.ToList();
-                    m_Found = m_EventValues.Count > 0;
-                }
-            }
-        }
-    }
-}
-#endif
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForEventMetricValues.cs.meta b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForEventMetricValues.cs.meta
deleted file mode 100644
index 93efe71f7d..0000000000
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForEventMetricValues.cs.meta
+++ /dev/null
@@ -1,3 +0,0 @@
-fileFormatVersion: 2
-guid: 319c55f92728431283c9e888d8f9d70e
-timeCreated: 1644269156
\ No newline at end of file
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForGaugeMetricValues.cs b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForGaugeMetricValues.cs
deleted file mode 100644
index 240639f663..0000000000
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForGaugeMetricValues.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Multiplayer.Tools.NetStats;
-
-namespace Unity.Netcode.TestHelpers.Runtime.Metrics
-{
-    internal class WaitForGaugeMetricValues : WaitForMetricValues<Gauge>
-    {
-        private double m_Value;
-
-        public delegate bool GaugeFilter(double metric);
-        private GaugeFilter m_GaugeFilterDelegate;
-
-        public WaitForGaugeMetricValues(IMetricDispatcher dispatcher, DirectionalMetricInfo directionalMetricName)
-            : base(dispatcher, directionalMetricName)
-        {
-        }
-
-        public WaitForGaugeMetricValues(IMetricDispatcher dispatcher, DirectionalMetricInfo directionalMetricName, GaugeFilter counterFilter)
-            : this(dispatcher, directionalMetricName)
-        {
-            m_GaugeFilterDelegate = counterFilter;
-        }
-
-        public bool MetricFound()
-        {
-            return m_Found;
-        }
-
-        public double AssertMetricValueHaveBeenFound()
-        {
-            AssertHasError();
-            AssertIsFound();
-
-            return m_Value;
-        }
-
-        public override void Observe(MetricCollection collection)
-        {
-            if (FindMetric(collection, out var metric))
-            {
-                var typedMetric = metric as Gauge;
-                if (typedMetric == default)
-                {
-                    SetError(metric);
-                    return;
-                }
-
-                m_Value = typedMetric.Value;
-                m_Found = m_GaugeFilterDelegate != null ? m_GaugeFilterDelegate(m_Value) : true;
-            }
-        }
-    }
-}
-#endif
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForGaugeMetricValues.cs.meta b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForGaugeMetricValues.cs.meta
deleted file mode 100644
index 7ad4b45ec2..0000000000
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForGaugeMetricValues.cs.meta
+++ /dev/null
@@ -1,3 +0,0 @@
-fileFormatVersion: 2
-guid: 1d76c4e546c546a3b9d63b2c74fcbbca
-timeCreated: 1644269156
\ No newline at end of file
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForMetricValues.cs b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForMetricValues.cs
deleted file mode 100644
index 10e8c6b8c5..0000000000
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForMetricValues.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using System.Collections;
-using System.Linq;
-using NUnit.Framework;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Multiplayer.Tools.NetStats;
-
-namespace Unity.Netcode.TestHelpers.Runtime.Metrics
-{
-    internal abstract class WaitForMetricValues<TMetric> : IMetricObserver
-    {
-        protected readonly string m_MetricName;
-        protected bool m_Found;
-        protected bool m_HasError;
-        protected string m_Error;
-        protected uint m_NbFrames = 0;
-
-        public WaitForMetricValues(IMetricDispatcher dispatcher, DirectionalMetricInfo directionalMetricName)
-        {
-            m_MetricName = directionalMetricName.Id;
-            dispatcher.RegisterObserver(this);
-        }
-
-        public abstract void Observe(MetricCollection collection);
-
-        public void AssertMetricValuesHaveNotBeenFound()
-        {
-            if (m_HasError)
-            {
-                Assert.Fail(m_Error);
-            }
-
-            if (!m_Found)
-            {
-                Assert.Pass();
-            }
-            else
-            {
-                Assert.Fail();
-            }
-        }
-
-        public IEnumerator WaitForMetricsReceived()
-        {
-            yield return WaitForFrames(60);
-        }
-
-        protected void AssertHasError()
-        {
-            if (m_HasError)
-            {
-                Assert.Fail(m_Error);
-            }
-        }
-
-        protected void AssertIsFound()
-        {
-            if (!m_Found)
-            {
-                Assert.Fail($"Found no matching values for metric of type '{typeof(TMetric).Name}', with name '{m_MetricName}' during '{m_NbFrames}' frames.");
-            }
-        }
-
-        protected bool FindMetric(MetricCollection collection, out IMetric metric)
-        {
-            if (m_Found || m_HasError)
-            {
-                metric = null;
-                return false;
-            }
-
-            metric = collection.Metrics.SingleOrDefault(x => x.Name == m_MetricName);
-            if (metric == default)
-            {
-                m_HasError = true;
-                m_Error = $"Metric collection does not contain metric named '{m_MetricName}'.";
-
-                return false;
-            }
-
-            return true;
-        }
-
-        protected void SetError(IMetric metric)
-        {
-            m_HasError = true;
-            m_Error = $"Metric collection contains a metric of type '{metric.GetType().Name}' for name '{m_MetricName}', but was expecting '{typeof(TMetric).Name}'.";
-        }
-
-        private IEnumerator WaitForFrames(uint maxNbFrames)
-        {
-            while (!m_Found && m_NbFrames < maxNbFrames)
-            {
-                m_NbFrames++;
-                yield return null;
-            }
-        }
-    }
-}
-#endif
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForMetricValues.cs.meta b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForMetricValues.cs.meta
deleted file mode 100644
index 64a440fee5..0000000000
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics/WaitForMetricValues.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 176888f06e2c5e14db33783fd0299668
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/com.unity.netcode.testhelpers.runtime.asmdef b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Unity.Netcode.TestHelpers.Runtime.asmdef
similarity index 66%
rename from com.unity.netcode.gameobjects/TestHelpers/Runtime/com.unity.netcode.testhelpers.runtime.asmdef
rename to com.unity.netcode.gameobjects/TestHelpers/Runtime/Unity.Netcode.TestHelpers.Runtime.asmdef
index 2fb107c79f..f39b4d1e2f 100644
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/com.unity.netcode.testhelpers.runtime.asmdef
+++ b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Unity.Netcode.TestHelpers.Runtime.asmdef
@@ -6,11 +6,18 @@
         "Unity.Multiplayer.MetricTypes",
         "Unity.Multiplayer.NetStats",
         "Unity.Multiplayer.Tools.MetricTypes",
-        "Unity.Multiplayer.Tools.NetStats"
+        "Unity.Multiplayer.Tools.NetStats",
+        "UnityEngine.TestRunner",
+        "UnityEditor.TestRunner"
     ],
-    "optionalUnityReferences": [
-        "TestAssemblies"
+    "includePlatforms": [],
+    "excludePlatforms": [],
+    "allowUnsafeCode": false,
+    "overrideReferences": true,
+    "precompiledReferences": [
+        "nunit.framework.dll"
     ],
+    "autoReferenced": false,
     "defineConstraints": [
         "UNITY_INCLUDE_TESTS"
     ],
@@ -25,5 +32,6 @@
             "expression": "1.0.0-pre.7",
             "define": "MULTIPLAYER_TOOLS_1_0_0_PRE_7"
         }
-    ]
+    ],
+    "noEngineReferences": false
 }
\ No newline at end of file
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/com.unity.netcode.testhelpers.runtime.asmdef.meta b/com.unity.netcode.gameobjects/TestHelpers/Runtime/Unity.Netcode.TestHelpers.Runtime.asmdef.meta
similarity index 100%
rename from com.unity.netcode.gameobjects/TestHelpers/Runtime/com.unity.netcode.testhelpers.runtime.asmdef.meta
rename to com.unity.netcode.gameobjects/TestHelpers/Runtime/Unity.Netcode.TestHelpers.Runtime.asmdef.meta
diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Metrics.meta b/com.unity.netcode.gameobjects/Tests/Editor/Metrics.meta
deleted file mode 100644
index bc962b1c81..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Editor/Metrics.meta
+++ /dev/null
@@ -1,3 +0,0 @@
-fileFormatVersion: 2
-guid: 87ddfad8823c4fe192fff56b7acc241b
-timeCreated: 1629386688
\ No newline at end of file
diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Metrics/NetworkMetricsRegistrationTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Metrics/NetworkMetricsRegistrationTests.cs
deleted file mode 100644
index 54114e2bd7..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Editor/Metrics/NetworkMetricsRegistrationTests.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using System;
-using System.Linq;
-using System.Reflection;
-using NUnit.Framework;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Multiplayer.Tools.NetStats;
-
-namespace Unity.Netcode.EditorTests.Metrics
-{
-    internal class NetworkMetricsRegistrationTests
-    {
-        private static Type[] s_MetricTypes = AppDomain.CurrentDomain.GetAssemblies()
-            .SelectMany(x => x.GetTypes())
-            .Where(x => x.GetInterfaces().Contains(typeof(INetworkMetricEvent)))
-            .ToArray();
-
-        [TestCaseSource(nameof(s_MetricTypes))]
-        [Ignore("Disable test while we reevaluate the assumption that INetworkMetricEvent interfaces must be reported from MLAPI. This ignored test is tracked in MTT-11339")]
-        public void ValidateThatAllMetricTypesAreRegistered(Type metricType)
-        {
-            var dispatcher = new NetworkMetrics().Dispatcher as MetricDispatcher;
-            Assert.NotNull(dispatcher);
-
-            var collection = typeof(MetricDispatcher)
-                .GetField("m_Collection", BindingFlags.NonPublic | BindingFlags.Instance)?
-                .GetValue(dispatcher) as MetricCollection;
-            Assert.NotNull(collection);
-
-            Assert.That(
-                collection.Metrics.OfType<IEventMetric>(),
-                Has.Exactly(2).Matches<IEventMetric>(
-                    eventMetric =>
-                    {
-                        var eventType = eventMetric.GetType().GetGenericArguments()?.FirstOrDefault();
-                        return eventType == metricType;
-                    }));
-        }
-    }
-}
-
-#endif
diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Metrics/NetworkMetricsRegistrationTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Editor/Metrics/NetworkMetricsRegistrationTests.cs.meta
deleted file mode 100644
index 89ebdab722..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Editor/Metrics/NetworkMetricsRegistrationTests.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: af741f5e3d4f5544eaa68bb9bcaf54c6
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef b/com.unity.netcode.gameobjects/Tests/Editor/Unity.Netcode.Editor.Tests.asmdef
similarity index 71%
rename from com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef
rename to com.unity.netcode.gameobjects/Tests/Editor/Unity.Netcode.Editor.Tests.asmdef
index b2c942a948..05e9c6ac53 100644
--- a/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef
+++ b/com.unity.netcode.gameobjects/Tests/Editor/Unity.Netcode.Editor.Tests.asmdef
@@ -1,28 +1,32 @@
 {
-    "name": "Unity.Netcode.EditorTests",
+    "name": "Unity.Netcode.Editor.Tests",
     "rootNamespace": "Unity.Netcode.EditorTests",
     "references": [
         "Unity.Collections",
         "Unity.Netcode.Runtime",
         "Unity.Netcode.Editor",
-        "Unity.Netcode.Components",
         "Unity.Multiplayer.MetricTypes",
         "Unity.Multiplayer.NetStats",
         "Unity.Multiplayer.Tools.MetricTypes",
         "Unity.Multiplayer.Tools.NetStats",
         "Unity.Networking.Transport",
-        "Unity.Mathematics"
-    ],
-    "optionalUnityReferences": [
-        "TestAssemblies"
-    ],
-    "defineConstraints": [
-        "UNITY_INCLUDE_TESTS"
+        "Unity.Mathematics",
+        "UnityEngine.TestRunner",
+        "UnityEditor.TestRunner"
     ],
     "includePlatforms": [
         "Editor"
     ],
+    "excludePlatforms": [],
     "allowUnsafeCode": true,
+    "overrideReferences": true,
+    "precompiledReferences": [
+        "nunit.framework.dll"
+    ],
+    "autoReferenced": false,
+    "defineConstraints": [
+        "UNITY_INCLUDE_TESTS"
+    ],
     "versionDefines": [
         {
             "name": "com.unity.multiplayer.tools",
@@ -34,5 +38,6 @@
             "expression": "(0,2022.2.0a5)",
             "define": "UNITY_UNET_PRESENT"
         }
-    ]
-}
+    ],
+    "noEngineReferences": false
+}
\ No newline at end of file
diff --git a/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef.meta b/com.unity.netcode.gameobjects/Tests/Editor/Unity.Netcode.Editor.Tests.asmdef.meta
similarity index 100%
rename from com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef.meta
rename to com.unity.netcode.gameobjects/Tests/Editor/Unity.Netcode.Editor.Tests.asmdef.meta
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/AssemblyInfo.cs b/com.unity.netcode.gameobjects/Tests/Runtime/AssemblyInfo.cs
index fb444ea293..0c0d63f26e 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/AssemblyInfo.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/AssemblyInfo.cs
@@ -1,9 +1,9 @@
 using System.Runtime.CompilerServices;
 
 #if UNITY_INCLUDE_TESTS
-[assembly: InternalsVisibleTo("TestProject.RuntimeTests")]
+[assembly: InternalsVisibleTo("TestProject.Runtime.Tests")]
 #if UNITY_EDITOR
-[assembly: InternalsVisibleTo("TestProject.EditorTests")]
+[assembly: InternalsVisibleTo("TestProject.Editor.Tests")]
 #endif // UNITY_EDITOR
 #if MULTIPLAYER_TOOLS
 [assembly: InternalsVisibleTo("TestProject.ToolsIntegration.RuntimeTests")]
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/DistributedAuthority/ParentChildDistibutionTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/DistributedAuthority/ParentChildDistibutionTests.cs
index bd74d710a2..21da72d5fb 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/DistributedAuthority/ParentChildDistibutionTests.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/DistributedAuthority/ParentChildDistibutionTests.cs
@@ -169,7 +169,7 @@ public IEnumerator DistributeOwnerHierarchy([Values] DistributionTypes distribut
                 m_NetworkManagers.Remove(m_ClientNetworkManagers[3]);
             }
 
-            // When testing connect redistribution, 
+            // When testing connect redistribution
             var instances = distributionType == DistributionTypes.UponDisconnect ? 1 : 2;
             var rootObject = (GameObject)null;
             var childOne = (GameObject)null;
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Helpers.meta
similarity index 100%
rename from com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers.meta
rename to com.unity.netcode.gameobjects/Tests/Runtime/Helpers.meta
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/MessageCatcher.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/MessageCatcher.cs
similarity index 100%
rename from com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/MessageCatcher.cs
rename to com.unity.netcode.gameobjects/Tests/Runtime/Helpers/MessageCatcher.cs
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/MessageCatcher.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/MessageCatcher.cs.meta
similarity index 100%
rename from com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/MessageCatcher.cs.meta
rename to com.unity.netcode.gameobjects/Tests/Runtime/Helpers/MessageCatcher.cs.meta
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/MessageLogger.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/MessageLogger.cs
similarity index 100%
rename from com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/MessageLogger.cs
rename to com.unity.netcode.gameobjects/Tests/Runtime/Helpers/MessageLogger.cs
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/MessageLogger.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/MessageLogger.cs.meta
similarity index 100%
rename from com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/MessageLogger.cs.meta
rename to com.unity.netcode.gameobjects/Tests/Runtime/Helpers/MessageLogger.cs.meta
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/ConnectionMetricsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/ConnectionMetricsTests.cs
deleted file mode 100644
index b94cc47725..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/ConnectionMetricsTests.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-#if MULTIPLAYER_TOOLS
-#if MULTIPLAYER_TOOLS_1_0_0_PRE_7
-
-using System.Collections;
-using NUnit.Framework;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Netcode.TestHelpers.Runtime;
-using Unity.Netcode.TestHelpers.Runtime.Metrics;
-using UnityEngine.TestTools;
-
-namespace Unity.Netcode.RuntimeTests.Metrics
-{
-    [TestFixture(ClientCount.OneClient, HostOrServer.Host)]
-    [TestFixture(ClientCount.TwoClients, HostOrServer.Host)]
-    [TestFixture(ClientCount.OneClient, HostOrServer.Server)]
-    [TestFixture(ClientCount.TwoClients, HostOrServer.Server)]
-    internal class ConnectionMetricsTests : NetcodeIntegrationTest
-    {
-        protected override int NumberOfClients => m_ClientCount;
-
-        private int m_ClientCount;
-
-        public enum ClientCount
-        {
-            OneClient = 1,
-            TwoClients,
-        }
-
-        public ConnectionMetricsTests(ClientCount clientCount, HostOrServer hostOrServer)
-            : base(hostOrServer)
-        {
-            m_ClientCount = (int)clientCount;
-        }
-
-        private int GetClientCountForFixture()
-        {
-            return m_ClientCount + ((m_UseHost) ? 1 : 0);
-        }
-
-        [UnityTest]
-        public IEnumerator UpdateConnectionCountOnServer()
-        {
-            var waitForGaugeValues = new WaitForGaugeMetricValues((m_ServerNetworkManager.NetworkMetrics as NetworkMetrics).Dispatcher, NetworkMetricTypes.ConnectedClients);
-
-            yield return waitForGaugeValues.WaitForMetricsReceived();
-
-            var value = waitForGaugeValues.AssertMetricValueHaveBeenFound();
-            Assert.AreEqual(GetClientCountForFixture(), value);
-        }
-
-        [UnityTest]
-        public IEnumerator UpdateConnectionCountOnClient()
-        {
-            foreach (var clientNetworkManager in m_ClientNetworkManagers)
-            {
-                var waitForGaugeValues = new WaitForGaugeMetricValues((clientNetworkManager.NetworkMetrics as NetworkMetrics).Dispatcher, NetworkMetricTypes.ConnectedClients);
-
-                yield return waitForGaugeValues.WaitForMetricsReceived();
-
-                var value = waitForGaugeValues.AssertMetricValueHaveBeenFound();
-                Assert.AreEqual(1, value);
-            }
-        }
-    }
-}
-
-#endif
-#endif
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/ConnectionMetricsTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/ConnectionMetricsTests.cs.meta
deleted file mode 100644
index bc0d812e3f..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/ConnectionMetricsTests.cs.meta
+++ /dev/null
@@ -1,3 +0,0 @@
-fileFormatVersion: 2
-guid: 1845aef61dbb4f2b9d2be9145262ab90
-timeCreated: 1647023529
\ No newline at end of file
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/MessagingMetricsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/MessagingMetricsTests.cs
deleted file mode 100644
index 6cd827f691..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/MessagingMetricsTests.cs
+++ /dev/null
@@ -1,275 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Linq;
-using NUnit.Framework;
-using Unity.Collections;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Netcode.TestHelpers.Runtime.Metrics;
-using UnityEngine;
-using UnityEngine.TestTools;
-
-namespace Unity.Netcode.RuntimeTests.Metrics
-{
-    internal class MessagingMetricsTests : DualClientMetricTestBase
-    {
-        private const uint k_MessageNameHashSize = 8;
-        // Header is dynamically sized due to packing, will be 2 bytes for all test messages.
-        private const int k_MessageHeaderSize = 2;
-        private static readonly int k_NamedMessageOverhead = (int)k_MessageNameHashSize + k_MessageHeaderSize;
-        private static readonly int k_UnnamedMessageOverhead = k_MessageHeaderSize;
-
-        protected override int NumberOfClients => 2;
-
-        [UnityTest]
-        public IEnumerator TrackNetworkMessageSentMetric()
-        {
-            var waitForMetricValues = new WaitForEventMetricValues<NetworkMessageEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.NetworkMessageSent);
-
-            var messageName = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
-            using (var writer = new FastBufferWriter(1300, Allocator.Temp))
-            {
-                writer.WriteValueSafe(messageName);
-
-                Server.CustomMessagingManager.SendNamedMessage(messageName.Value.ToString(), FirstClient.LocalClientId, writer);
-            }
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var networkMessageSentMetricValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-
-            // We should have 1 NamedMessage
-            Assert.That(networkMessageSentMetricValues, Has.Exactly(1).Matches<NetworkMessageEvent>(x => x.Name == nameof(NamedMessage)));
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNetworkMessageSentMetricToMultipleClients()
-        {
-            var waitForMetricValues = new WaitForEventMetricValues<NetworkMessageEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.NetworkMessageSent);
-            var messageName = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
-            using (var writer = new FastBufferWriter(1300, Allocator.Temp))
-            {
-                writer.WriteValueSafe(messageName);
-
-                Server.CustomMessagingManager.SendNamedMessage(messageName.Value.ToString(), new List<ulong> { FirstClient.LocalClientId, SecondClient.LocalClientId }, writer);
-            }
-
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var networkMessageSentMetricValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(2, networkMessageSentMetricValues.Count(x => x.Name.Equals(nameof(NamedMessage))));
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNetworkMessageReceivedMetric()
-        {
-            var messageName = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
-
-            LogAssert.Expect(LogType.Log, $"Received from {Server.LocalClientId}");
-            FirstClient.CustomMessagingManager.RegisterNamedMessageHandler(messageName.Value.ToString(), (ulong sender, FastBufferReader payload) =>
-            {
-                Debug.Log($"Received from {sender}");
-            });
-            var waitForMetricValues = new WaitForEventMetricValues<NetworkMessageEvent>(FirstClientMetrics.Dispatcher, NetworkMetricTypes.NetworkMessageReceived,
-                metric => metric.Name == nameof(NamedMessage));
-
-            using (var writer = new FastBufferWriter(1300, Allocator.Temp))
-            {
-                writer.WriteValueSafe(messageName);
-
-                Server.CustomMessagingManager.SendNamedMessage(messageName.Value.ToString(), FirstClient.LocalClientId, writer);
-            }
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var networkMessageReceivedValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-            // We should have 1 NamedMessage
-            Assert.That(networkMessageReceivedValues, Has.Exactly(1).Matches<NetworkMessageEvent>(x => x.Name == nameof(NamedMessage)));
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNamedMessageSentMetric()
-        {
-            var waitForMetricValues = new WaitForEventMetricValues<NamedMessageEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.NamedMessageSent);
-
-            var messageName = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
-            using (var writer = new FastBufferWriter(1300, Allocator.Temp))
-            {
-                writer.WriteValueSafe(messageName);
-
-                Server.CustomMessagingManager.SendNamedMessage(messageName.Value.ToString(), FirstClient.LocalClientId, writer);
-            }
-
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var namedMessageSentMetricValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, namedMessageSentMetricValues.Count);
-
-            var namedMessageSent = namedMessageSentMetricValues.First();
-            Assert.AreEqual(messageName.Value.ToString(), namedMessageSent.Name);
-            Assert.AreEqual(FirstClient.LocalClientId, namedMessageSent.Connection.Id);
-            Assert.AreEqual(FastBufferWriter.GetWriteSize(messageName) + k_NamedMessageOverhead, namedMessageSent.BytesCount);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNamedMessageSentMetricToMultipleClients()
-        {
-            var waitForMetricValues = new WaitForEventMetricValues<NamedMessageEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.NamedMessageSent);
-            var messageName = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
-            using (var writer = new FastBufferWriter(1300, Allocator.Temp))
-            {
-                writer.WriteValueSafe(messageName);
-
-                Server.CustomMessagingManager.SendNamedMessage(messageName.Value.ToString(), new List<ulong> { FirstClient.LocalClientId, SecondClient.LocalClientId }, writer);
-            }
-
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var namedMessageSentMetricValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(2, namedMessageSentMetricValues.Count);
-            Assert.That(namedMessageSentMetricValues.Select(x => x.Name), Has.All.EqualTo(messageName.Value.ToString()));
-            Assert.That(namedMessageSentMetricValues.Select(x => x.BytesCount), Has.All.EqualTo(FastBufferWriter.GetWriteSize(messageName) + k_NamedMessageOverhead));
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNamedMessageSentMetricToSelf()
-        {
-            var waitForMetricValues = new WaitForEventMetricValues<NamedMessageEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.NamedMessageSent);
-            var messageName = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
-            using (var writer = new FastBufferWriter(1300, Allocator.Temp))
-            {
-                writer.WriteValueSafe(messageName);
-
-                Server.CustomMessagingManager.SendNamedMessage(messageName.Value.ToString(), Server.LocalClientId, writer);
-            }
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            waitForMetricValues.AssertMetricValuesHaveNotBeenFound();
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNamedMessageReceivedMetric()
-        {
-            var waitForMetricValues = new WaitForEventMetricValues<NamedMessageEvent>(FirstClientMetrics.Dispatcher, NetworkMetricTypes.NamedMessageReceived);
-
-            var messageName = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
-
-            LogAssert.Expect(LogType.Log, $"Received from {Server.LocalClientId}");
-            FirstClient.CustomMessagingManager.RegisterNamedMessageHandler(messageName.Value.ToString(), (ulong sender, FastBufferReader payload) =>
-            {
-                Debug.Log($"Received from {sender}");
-            });
-
-            using (var writer = new FastBufferWriter(1300, Allocator.Temp))
-            {
-                writer.WriteValueSafe(messageName);
-
-                Server.CustomMessagingManager.SendNamedMessage(messageName.Value.ToString(), FirstClient.LocalClientId, writer);
-            }
-
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var namedMessageReceivedValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, namedMessageReceivedValues.Count);
-
-            var namedMessageReceived = namedMessageReceivedValues.First();
-            Assert.AreEqual(messageName.Value.ToString(), namedMessageReceived.Name);
-            Assert.AreEqual(Server.LocalClientId, namedMessageReceived.Connection.Id);
-            Assert.AreEqual(FastBufferWriter.GetWriteSize(messageName) + k_NamedMessageOverhead, namedMessageReceived.BytesCount);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackUnnamedMessageSentMetric()
-        {
-            var message = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
-            using (var writer = new FastBufferWriter(1300, Allocator.Temp))
-            {
-                writer.WriteValueSafe(message);
-
-                Server.CustomMessagingManager.SendUnnamedMessage(FirstClient.LocalClientId, writer);
-            }
-
-
-            var waitForMetricValues = new WaitForEventMetricValues<UnnamedMessageEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.UnnamedMessageSent);
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var unnamedMessageSentMetricValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, unnamedMessageSentMetricValues.Count);
-
-            var unnamedMessageSent = unnamedMessageSentMetricValues.First();
-            Assert.AreEqual(FirstClient.LocalClientId, unnamedMessageSent.Connection.Id);
-            Assert.AreEqual(FastBufferWriter.GetWriteSize(message) + k_UnnamedMessageOverhead, unnamedMessageSent.BytesCount);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackUnnamedMessageSentMetricToMultipleClients()
-        {
-            var message = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
-            var waitForMetricValues = new WaitForEventMetricValues<UnnamedMessageEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.UnnamedMessageSent);
-            using (var writer = new FastBufferWriter(1300, Allocator.Temp))
-            {
-                writer.WriteValueSafe(message);
-
-                Server.CustomMessagingManager.SendUnnamedMessage(new List<ulong> { FirstClient.LocalClientId, SecondClient.LocalClientId }, writer);
-            }
-
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var unnamedMessageSentMetricValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(2, unnamedMessageSentMetricValues.Count);
-            Assert.That(unnamedMessageSentMetricValues.Select(x => x.BytesCount), Has.All.EqualTo(FastBufferWriter.GetWriteSize(message) + k_UnnamedMessageOverhead));
-
-            var clientIds = unnamedMessageSentMetricValues.Select(x => x.Connection.Id).ToList();
-            Assert.Contains(FirstClient.LocalClientId, clientIds);
-            Assert.Contains(SecondClient.LocalClientId, clientIds);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackUnnamedMessageSentMetricToSelf()
-        {
-            var waitForMetricValues = new WaitForEventMetricValues<UnnamedMessageEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.UnnamedMessageSent);
-            var messageName = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
-            using (var writer = new FastBufferWriter(1300, Allocator.Temp))
-            {
-                writer.WriteValueSafe(messageName);
-
-                Server.CustomMessagingManager.SendUnnamedMessage(Server.LocalClientId, writer);
-            }
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            waitForMetricValues.AssertMetricValuesHaveNotBeenFound();
-        }
-
-        [UnityTest]
-        public IEnumerator TrackUnnamedMessageReceivedMetric()
-        {
-            var message = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
-            var waitForMetricValues = new WaitForEventMetricValues<UnnamedMessageEvent>(FirstClientMetrics.Dispatcher, NetworkMetricTypes.UnnamedMessageReceived);
-            using (var writer = new FastBufferWriter(1300, Allocator.Temp))
-            {
-                writer.WriteValueSafe(message);
-
-                Server.CustomMessagingManager.SendUnnamedMessage(FirstClient.LocalClientId, writer);
-            }
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var unnamedMessageReceivedValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, unnamedMessageReceivedValues.Count);
-
-            var unnamedMessageReceived = unnamedMessageReceivedValues.First();
-            Assert.AreEqual(Server.LocalClientId, unnamedMessageReceived.Connection.Id);
-            Assert.AreEqual(FastBufferWriter.GetWriteSize(message) + k_UnnamedMessageOverhead, unnamedMessageReceived.BytesCount);
-        }
-    }
-}
-#endif
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/MessagingMetricsTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/MessagingMetricsTests.cs.meta
deleted file mode 100644
index 7910ff22ff..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/MessagingMetricsTests.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 2490ed51138306e4d92f8e9dcfc34462
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/MetricsDispatchTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/MetricsDispatchTests.cs
deleted file mode 100644
index 6d1eb91789..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/MetricsDispatchTests.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using System;
-using System.Collections;
-using NUnit.Framework;
-using Unity.Multiplayer.Tools.NetStats;
-using Unity.Netcode.TestHelpers.Runtime;
-using UnityEngine.TestTools;
-
-namespace Unity.Netcode.RuntimeTests.Metrics
-{
-    internal class MetricsDispatchTests
-    {
-        private int m_NbDispatches;
-
-        private NetworkManager m_NetworkManager;
-
-        [SetUp]
-        public void SetUp()
-        {
-            var networkManagerStarted = NetworkManagerHelper.StartNetworkManager(
-                out m_NetworkManager,
-                NetworkManagerHelper.NetworkManagerOperatingMode.Host,
-                new NetworkConfig
-                {
-                    TickRate = 1,
-                });
-            Assert.IsTrue(networkManagerStarted);
-
-            var networkMetrics = m_NetworkManager.NetworkMetrics as NetworkMetrics;
-            networkMetrics.Dispatcher.RegisterObserver(new MockMetricsObserver(() => m_NbDispatches++));
-        }
-
-        [TearDown]
-        public void TearDown()
-        {
-            NetworkManagerHelper.ShutdownNetworkManager();
-        }
-
-        [UnityTest]
-        public IEnumerator VerifyNetworkMetricsDispatchesOncePerFrame()
-        {
-            var nbDispatchesBeforeFrame = m_NbDispatches;
-
-            yield return null; // Wait one frame so dispatch occurs
-
-            var nbDispatchesAfterFrame = m_NbDispatches;
-
-            Assert.AreEqual(1, nbDispatchesAfterFrame - nbDispatchesBeforeFrame);
-        }
-
-        private class MockMetricsObserver : IMetricObserver
-        {
-            private readonly Action m_OnObserve;
-
-            public MockMetricsObserver(Action onObserve)
-            {
-                m_OnObserve = onObserve;
-            }
-
-            public void Observe(MetricCollection collection)
-            {
-                m_OnObserve?.Invoke();
-            }
-        }
-    }
-}
-#endif
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/MetricsDispatchTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/MetricsDispatchTests.cs.meta
deleted file mode 100644
index 9a1994022a..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/MetricsDispatchTests.cs.meta
+++ /dev/null
@@ -1,3 +0,0 @@
-fileFormatVersion: 2
-guid: 4833f15c8a59407abbb8532ea64b5683
-timeCreated: 1633451646
\ No newline at end of file
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/NetworkObjectMetricsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/NetworkObjectMetricsTests.cs
deleted file mode 100644
index 31abcadd50..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/NetworkObjectMetricsTests.cs
+++ /dev/null
@@ -1,288 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using System.Collections;
-using System.Collections.Generic;
-using System.Linq;
-using NUnit.Framework;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Netcode.TestHelpers.Runtime.Metrics;
-using UnityEngine;
-using UnityEngine.TestTools;
-
-namespace Unity.Netcode.RuntimeTests.Metrics
-{
-    internal class NetworkObjectMetricsTests : SingleClientMetricTestBase
-    {
-        // Keep less than 23 chars to avoid issues if compared against a 32-byte fixed string
-        //     since it will have "(Clone)" appended
-        private const string k_NewNetworkObjectName = "MetricObject";
-        private GameObject m_NewNetworkPrefab;
-
-        /// <summary>
-        /// Use OnServerAndClientsCreated to create any additional prefabs that you might need
-        /// </summary>
-        protected override void OnServerAndClientsCreated()
-        {
-            base.OnServerAndClientsCreated();
-            m_NewNetworkPrefab = CreateNetworkObjectPrefab(k_NewNetworkObjectName);
-        }
-
-        private NetworkObject SpawnNetworkObject()
-        {
-            return SpawnObject(m_NewNetworkPrefab, m_ServerNetworkManager).GetComponent<NetworkObject>();
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNetworkObjectSpawnSentMetric()
-        {
-            var waitForMetricEvent = new WaitForEventMetricValues<ObjectSpawnedEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.ObjectSpawnedSent);
-
-            var spawnedObject = SpawnNetworkObject();
-
-            yield return waitForMetricEvent.WaitForMetricsReceived();
-
-            var objectSpawnedSentMetricValues = waitForMetricEvent.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, objectSpawnedSentMetricValues.Count);
-
-            var objectSpawned = objectSpawnedSentMetricValues.Last();
-            Assert.AreEqual(Client.LocalClientId, objectSpawned.Connection.Id);
-            Assert.AreEqual(spawnedObject.name, objectSpawned.NetworkId.Name);
-            Assert.AreNotEqual(0, objectSpawned.BytesCount);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNetworkObjectSpawnReceivedMetric()
-        {
-            var waitForMetricEvent = new WaitForEventMetricValues<ObjectSpawnedEvent>(ClientMetrics.Dispatcher, NetworkMetricTypes.ObjectSpawnedReceived);
-
-            var networkObject = SpawnNetworkObject();
-            yield return s_DefaultWaitForTick;
-
-            yield return waitForMetricEvent.WaitForMetricsReceived();
-
-            var objectSpawnedReceivedMetricValues = waitForMetricEvent.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, objectSpawnedReceivedMetricValues.Count);
-            var clientSideObject = s_GlobalNetworkObjects[1][networkObject.NetworkObjectId];
-            var objectSpawned = objectSpawnedReceivedMetricValues.First();
-            Assert.AreEqual(Server.LocalClientId, objectSpawned.Connection.Id);
-            Assert.AreEqual(networkObject.NetworkObjectId, objectSpawned.NetworkId.NetworkId);
-            Assert.AreEqual(clientSideObject.name, objectSpawned.NetworkId.Name);
-            Assert.AreNotEqual(0, objectSpawned.BytesCount);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNetworkObjectDestroySentMetric()
-        {
-            var waitForMetricEvent = new WaitForEventMetricValues<ObjectDestroyedEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.ObjectDestroyedSent);
-            var networkObject = SpawnNetworkObject();
-            var objectName = networkObject.name;
-
-            Server.SpawnManager.OnDespawnObject(networkObject, true);
-
-            // Wait for the metric to be received
-            yield return waitForMetricEvent.WaitForMetricsReceived();
-            var objectDestroyedSentMetricValues = waitForMetricEvent.AssertMetricValuesHaveBeenFound();
-
-            // The server should have sent 1 destroy message to the 1 client connected
-            Assert.AreEqual(1, objectDestroyedSentMetricValues.Count);
-
-            var objectDestroyed = objectDestroyedSentMetricValues.Last();
-            Assert.AreEqual(Client.LocalClientId, objectDestroyed.Connection.Id);
-            Assert.AreEqual(objectName, objectDestroyed.NetworkId.Name);
-            Assert.AreNotEqual(0, objectDestroyed.BytesCount);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNetworkObjectDestroyReceivedMetric()
-        {
-            var networkObject = SpawnNetworkObject();
-
-            yield return s_DefaultWaitForTick;
-
-            var waitForMetricEvent = new WaitForEventMetricValues<ObjectDestroyedEvent>(ClientMetrics.Dispatcher, NetworkMetricTypes.ObjectDestroyedReceived);
-            var objectId = networkObject.NetworkObjectId;
-            var objectName = s_GlobalNetworkObjects[1][objectId].name;
-
-            Server.SpawnManager.OnDespawnObject(networkObject, true);
-            yield return s_DefaultWaitForTick;
-
-            yield return waitForMetricEvent.WaitForMetricsReceived();
-
-            var objectDestroyedReceivedMetricValues = waitForMetricEvent.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, objectDestroyedReceivedMetricValues.Count);
-
-            var objectDestroyed = objectDestroyedReceivedMetricValues.First();
-            Assert.AreEqual(Server.LocalClientId, objectDestroyed.Connection.Id);
-            Assert.AreEqual(objectId, objectDestroyed.NetworkId.NetworkId);
-            Assert.AreEqual(objectName, objectDestroyed.NetworkId.Name);
-            Assert.AreNotEqual(0, objectDestroyed.BytesCount);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackMultipleNetworkObjectSpawnSentMetric()
-        {
-            var networkObject1 = SpawnNetworkObject();
-            var networkObject2 = SpawnNetworkObject();
-            yield return s_DefaultWaitForTick;
-
-            NetworkObject.NetworkHide(new List<NetworkObject> { networkObject1, networkObject2 }, Client.LocalClientId);
-
-            yield return s_DefaultWaitForTick;
-
-            var waitForMetricEvent = new WaitForEventMetricValues<ObjectSpawnedEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.ObjectSpawnedSent);
-
-            NetworkObject.NetworkShow(new List<NetworkObject> { networkObject1, networkObject2 }, Client.LocalClientId);
-            yield return s_DefaultWaitForTick;
-
-            yield return waitForMetricEvent.WaitForMetricsReceived();
-
-            var objectSpawnedSentMetricValues = waitForMetricEvent.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(2, objectSpawnedSentMetricValues.Count); // As there's a client and server, this event is emitted twice.
-            Assert.That(
-                objectSpawnedSentMetricValues,
-                Has.Exactly(1).Matches<ObjectSpawnedEvent>(
-                    x => Client.LocalClientId == x.Connection.Id
-                         && x.NetworkId.NetworkId == networkObject1.NetworkObjectId
-                         && x.NetworkId.Name == networkObject1.name));
-            Assert.That(
-                objectSpawnedSentMetricValues,
-                Has.Exactly(1).Matches<ObjectSpawnedEvent>(
-                    x => Client.LocalClientId == x.Connection.Id
-                         && x.NetworkId.NetworkId == networkObject2.NetworkObjectId
-                         && x.NetworkId.Name == networkObject2.name));
-
-            Assert.AreEqual(1, objectSpawnedSentMetricValues.Select(x => x.BytesCount).Distinct().Count());
-            Assert.That(objectSpawnedSentMetricValues.Select(x => x.BytesCount), Has.All.Not.EqualTo(0));
-        }
-
-        [UnityTest]
-        public IEnumerator TrackMultipleNetworkObjectDestroySentMetric()
-        {
-            var networkObject1 = SpawnNetworkObject();
-            var networkObject2 = SpawnNetworkObject();
-
-            yield return s_DefaultWaitForTick;
-
-            var waitForMetricEvent = new WaitForEventMetricValues<ObjectDestroyedEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.ObjectDestroyedSent);
-
-            NetworkObject.NetworkHide(new List<NetworkObject> { networkObject1, networkObject2 }, Client.LocalClientId);
-            yield return s_DefaultWaitForTick;
-            yield return waitForMetricEvent.WaitForMetricsReceived();
-
-            var objectDestroyedSentMetricValues = waitForMetricEvent.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(2, objectDestroyedSentMetricValues.Count); // As there's a client and server, this event is emitted twice.
-            Assert.That(
-                objectDestroyedSentMetricValues,
-                Has.Exactly(1).Matches<ObjectDestroyedEvent>(
-                    x => Client.LocalClientId == x.Connection.Id
-                         && x.NetworkId.NetworkId == networkObject1.NetworkObjectId
-                         && x.NetworkId.Name == networkObject1.name));
-            Assert.That(
-                objectDestroyedSentMetricValues,
-                Has.Exactly(1).Matches<ObjectDestroyedEvent>(
-                    x => Client.LocalClientId == x.Connection.Id
-                         && x.NetworkId.NetworkId == networkObject2.NetworkObjectId
-                         && x.NetworkId.Name == networkObject2.name));
-
-            Assert.AreEqual(1, objectDestroyedSentMetricValues.Select(x => x.BytesCount).Distinct().Count());
-            Assert.That(objectDestroyedSentMetricValues.Select(x => x.BytesCount), Has.All.Not.EqualTo(0));
-        }
-
-#if MULTIPLAYER_TOOLS_1_0_0_PRE_7
-        [UnityTest]
-        public IEnumerator TrackNetworkObjectCountAfterSpawnOnServer()
-        {
-            SpawnNetworkObject();
-
-            var waitForGaugeValues = new WaitForGaugeMetricValues(ServerMetrics.Dispatcher, NetworkMetricTypes.NetworkObjects);
-
-            yield return s_DefaultWaitForTick;
-            yield return waitForGaugeValues.WaitForMetricsReceived();
-
-            var value = waitForGaugeValues.AssertMetricValueHaveBeenFound();
-            Assert.AreEqual(3, value);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNetworkObjectCountAfterSpawnOnClient()
-        {
-            SpawnNetworkObject();
-
-            //By default, we have 2 network objects
-            //There's a slight delay between the spawn on the server and the spawn on the client
-            //We want to have metrics when the value is different than the 2 default one to confirm the client has the new value
-            var waitForGaugeValues = new WaitForGaugeMetricValues(ClientMetrics.Dispatcher, NetworkMetricTypes.NetworkObjects, metric => (int)metric != 2);
-
-            yield return waitForGaugeValues.WaitForMetricsReceived();
-
-            var value = waitForGaugeValues.AssertMetricValueHaveBeenFound();
-            Assert.AreEqual(3, value);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNetworkObjectCountAfterDespawnOnServer()
-        {
-            var objectList = Server.SpawnManager.SpawnedObjectsList;
-            for (int i = objectList.Count - 1; i >= 0; --i)
-            {
-                objectList.ElementAt(i).Despawn();
-            }
-
-            var waitForGaugeValues = new WaitForGaugeMetricValues(ServerMetrics.Dispatcher, NetworkMetricTypes.NetworkObjects);
-
-            yield return s_DefaultWaitForTick;
-            yield return waitForGaugeValues.WaitForMetricsReceived();
-
-            var value = waitForGaugeValues.AssertMetricValueHaveBeenFound();
-            Assert.AreEqual(0, value);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNetworkObjectCountAfterDespawnOnClient()
-        {
-            var initialSpawnCount = Server.SpawnManager.SpawnedObjectsList.Count;
-            var spawnedObjects = new List<GameObject>();
-            //By default, we have 2 network objects and will have spawned 4 so we want to wait for metrics to tell us we have 6 spawned objects
-            var waitForGaugeValues = new WaitForGaugeMetricValues(ClientMetrics.Dispatcher, NetworkMetricTypes.NetworkObjects, metric => (int)metric == 6);
-
-            for (int i = 0; i < 4; i++)
-            {
-                spawnedObjects.Add(SpawnObject(m_NewNetworkPrefab, Server));
-            }
-
-            yield return waitForGaugeValues.WaitForMetricsReceived();
-            var value = waitForGaugeValues.AssertMetricValueHaveBeenFound();
-            Assert.AreEqual(6, value);
-
-            // Create a new gauge that waits for the initial spawned client count
-            waitForGaugeValues = new WaitForGaugeMetricValues(ClientMetrics.Dispatcher, NetworkMetricTypes.NetworkObjects, metric => (int)metric != 6);
-
-            // Now despawn the 4 spawned objects
-            foreach (var spawnedObject in spawnedObjects)
-            {
-                spawnedObject.GetComponent<NetworkObject>().Despawn();
-            }
-            spawnedObjects.Clear();
-            yield return waitForGaugeValues.WaitForMetricsReceived();
-            value = waitForGaugeValues.AssertMetricValueHaveBeenFound();
-
-            // Validate the value is equals to the spawned objects prior to spawning the network prefab instances
-            Assert.AreEqual(initialSpawnCount, value);
-
-            // Create a new gauge that waits for the initial spawned client count
-            waitForGaugeValues = new WaitForGaugeMetricValues(ClientMetrics.Dispatcher, NetworkMetricTypes.NetworkObjects, metric => (int)metric == 0);
-
-            // Now assure despawning players are being tracked too
-            var spawnedPlayers = Server.SpawnManager.SpawnedObjectsList.ToList();
-            foreach (var spawnedObject in spawnedPlayers)
-            {
-                spawnedObject.Despawn();
-            }
-            yield return waitForGaugeValues.WaitForMetricsReceived();
-            value = waitForGaugeValues.AssertMetricValueHaveBeenFound();
-            // Nothing should be spawned on the client at this point
-            Assert.AreEqual(0, value);
-        }
-#endif
-    }
-}
-#endif
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/NetworkObjectMetricsTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/NetworkObjectMetricsTests.cs.meta
deleted file mode 100644
index d09dcacf56..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/NetworkObjectMetricsTests.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: c4cb56c442bed164da4908e54590dfeb
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/NetworkVariableMetricsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/NetworkVariableMetricsTests.cs
deleted file mode 100644
index 11f38cea1b..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/NetworkVariableMetricsTests.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using System.Collections;
-using System.Linq;
-using NUnit.Framework;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Netcode.TestHelpers.Runtime.Metrics;
-using UnityEngine.TestTools;
-
-namespace Unity.Netcode.RuntimeTests.Metrics
-{
-    internal class NetworkVariableMetricsTests : SingleClientMetricTestBase
-    {
-        protected override void OnCreatePlayerPrefab()
-        {
-            m_PlayerPrefab.AddComponent<NetworkVariableComponent>();
-            base.OnCreatePlayerPrefab();
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNetworkVariableDeltaSentMetric()
-        {
-            var waitForMetricValues = new WaitForEventMetricValues<NetworkVariableEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.NetworkVariableDeltaSent);
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var metricValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-
-            bool found = false;
-            foreach (var networkVariableDeltaSent in metricValues)
-            {
-                if (nameof(NetworkVariableComponent.MyNetworkVariable) == networkVariableDeltaSent.Name &&
-                    Client.LocalClientId == networkVariableDeltaSent.Connection.Id &&
-                    0 != networkVariableDeltaSent.BytesCount)
-                {
-                    found = true;
-                }
-            }
-            Assert.IsTrue(found);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackNetworkVariableDeltaReceivedMetric()
-        {
-            var waitForMetricValues = new WaitForEventMetricValues<NetworkVariableEvent>(ClientMetrics.Dispatcher, NetworkMetricTypes.NetworkVariableDeltaReceived);
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var metricValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(2, metricValues.Count); // We have an instance each of the player prefabs
-
-            var first = metricValues.First();
-            Assert.AreEqual(nameof(NetworkVariableComponent.MyNetworkVariable), first.Name);
-            Assert.AreNotEqual(0, first.BytesCount);
-
-            var last = metricValues.Last();
-            Assert.AreEqual(nameof(NetworkVariableComponent.MyNetworkVariable), last.Name);
-            Assert.AreNotEqual(0, last.BytesCount);
-        }
-    }
-}
-#endif
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/NetworkVariableMetricsTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/NetworkVariableMetricsTests.cs.meta
deleted file mode 100644
index 690106bf91..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/NetworkVariableMetricsTests.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: abbea688505c90d4f82bfa5ea3ee1cd9
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/OwnershipChangeMetricsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/OwnershipChangeMetricsTests.cs
deleted file mode 100644
index cc08dcd5b7..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/OwnershipChangeMetricsTests.cs
+++ /dev/null
@@ -1,113 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using System.Collections;
-using System.Linq;
-using NUnit.Framework;
-using Unity.Collections;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Netcode.TestHelpers.Runtime;
-using Unity.Netcode.TestHelpers.Runtime.Metrics;
-using UnityEngine;
-using UnityEngine.TestTools;
-
-namespace Unity.Netcode.RuntimeTests.Metrics
-{
-    internal class OwnershipChangeMetricsTests : SingleClientMetricTestBase
-    {
-        private const string k_NewNetworkObjectName = "TestNetworkObjectToSpawn";
-        private NetworkObject m_NewNetworkPrefab;
-        // Header is dynamically sized due to packing, will be 2 bytes for all test messages.
-        private const int k_MessageHeaderSize = 2;
-
-        protected override void OnServerAndClientsCreated()
-        {
-            var gameObject = new GameObject(k_NewNetworkObjectName);
-            m_NewNetworkPrefab = gameObject.AddComponent<NetworkObject>();
-            NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(m_NewNetworkPrefab);
-
-            var networkPrefab = new NetworkPrefab { Prefab = gameObject };
-            m_ServerNetworkManager.NetworkConfig.Prefabs.Add(networkPrefab);
-            foreach (var client in m_ClientNetworkManagers)
-            {
-                client.NetworkConfig.Prefabs.Add(networkPrefab);
-            }
-            base.OnServerAndClientsCreated();
-        }
-
-        private NetworkObject SpawnNetworkObject()
-        {
-            // Spawn another network object so we can hide multiple.
-            var gameObject = Object.Instantiate(m_NewNetworkPrefab); // new GameObject(NewNetworkObjectName);
-            var networkObject = gameObject.GetComponent<NetworkObject>();
-            networkObject.NetworkManagerOwner = Server;
-            networkObject.Spawn();
-
-            return networkObject;
-        }
-
-        private int GetWriteSizeForOwnerChange(NetworkObject networkObject, ulong newOwner)
-        {
-            var message = new ChangeOwnershipMessage
-            {
-                NetworkObjectId = networkObject.NetworkObjectId,
-                OwnerClientId = newOwner
-            };
-            using var writer = new FastBufferWriter(1024, Allocator.Temp);
-            message.Serialize(writer, message.Version);
-            return writer.Length;
-        }
-
-        [UnityTest]
-        public IEnumerator TrackOwnershipChangeSentMetric()
-        {
-            var networkObject = SpawnNetworkObject();
-
-            yield return new WaitForSeconds(0.2f);
-
-            var waitForMetricValues = new WaitForEventMetricValues<OwnershipChangeEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.OwnershipChangeSent);
-
-            networkObject.ChangeOwnership(1);
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var metricValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-
-            var ownershipChangeSent = metricValues.First();
-            Assert.AreEqual(networkObject.NetworkObjectId, ownershipChangeSent.NetworkId.NetworkId);
-            Assert.AreEqual(Server.LocalClientId, ownershipChangeSent.Connection.Id);
-            Assert.AreEqual(0, ownershipChangeSent.BytesCount);
-
-            // The first metric is to the server(self), so its size is now correctly reported as 0.
-            // Let's check the last one instead, to have a valid value
-            ownershipChangeSent = metricValues.Last();
-            Assert.AreEqual(networkObject.NetworkObjectId, ownershipChangeSent.NetworkId.NetworkId);
-            Assert.AreEqual(Client.LocalClientId, ownershipChangeSent.Connection.Id);
-
-            var serializedLength = GetWriteSizeForOwnerChange(networkObject, 1);
-            Assert.AreEqual(serializedLength + k_MessageHeaderSize, ownershipChangeSent.BytesCount);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackOwnershipChangeReceivedMetric()
-        {
-            var networkObject = SpawnNetworkObject();
-
-            yield return new WaitForSeconds(0.2f);
-
-            var waitForMetricValues = new WaitForEventMetricValues<OwnershipChangeEvent>(ClientMetrics.Dispatcher, NetworkMetricTypes.OwnershipChangeReceived);
-
-            networkObject.ChangeOwnership(1);
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var metricValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, metricValues.Count);
-
-            var ownershipChangeReceived = metricValues.First();
-            Assert.AreEqual(networkObject.NetworkObjectId, ownershipChangeReceived.NetworkId.NetworkId);
-
-            var serializedLength = GetWriteSizeForOwnerChange(networkObject, 1);
-            Assert.AreEqual(serializedLength, ownershipChangeReceived.BytesCount);
-        }
-    }
-}
-#endif
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/OwnershipChangeMetricsTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/OwnershipChangeMetricsTests.cs.meta
deleted file mode 100644
index a227871bc5..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/OwnershipChangeMetricsTests.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 86daf1dbe91c9ad40818743a805d0052
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/PacketLossMetricsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/PacketLossMetricsTests.cs
deleted file mode 100644
index 1f9a35390f..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/PacketLossMetricsTests.cs
+++ /dev/null
@@ -1,91 +0,0 @@
-#if MULTIPLAYER_TOOLS
-#if MULTIPLAYER_TOOLS_1_0_0_PRE_7
-using System.Collections;
-using NUnit.Framework;
-using Unity.Collections;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Netcode.TestHelpers.Runtime;
-using Unity.Netcode.TestHelpers.Runtime.Metrics;
-using Unity.Netcode.Transports.UTP;
-using Unity.Networking.Transport.Utilities;
-using UnityEngine.TestTools;
-
-namespace Unity.Netcode.RuntimeTests.Metrics
-{
-    internal class PacketLossMetricsTests : NetcodeIntegrationTest
-    {
-        protected override int NumberOfClients => 1;
-        private readonly int m_PacketLossRate = 25;
-        private readonly int m_PacketLossRangeDelta = 3;
-        private readonly int m_MessageSize = 200;
-
-        public PacketLossMetricsTests()
-            : base(HostOrServer.Server)
-        { }
-
-        protected override void OnServerAndClientsCreated()
-        {
-            var clientTransport = (UnityTransport)m_ClientNetworkManagers[0].NetworkConfig.NetworkTransport;
-
-            // Determined through trial and error. With both UTP 1.2 and 2.0, this random seed
-            // results in an effective packet loss percentage between 22% and 28%. Future UTP
-            // updates may change the RNG call patterns and cause this test to fail, in which
-            // case the value should be modified again.
-            clientTransport.DebugSimulatorRandomSeed = 4;
-
-            base.OnServerAndClientsCreated();
-        }
-
-        [UnityTest]
-        public IEnumerator TrackPacketLossAsServer()
-        {
-            var waitForPacketLossMetric = new WaitForGaugeMetricValues((m_ServerNetworkManager.NetworkMetrics as NetworkMetrics).Dispatcher,
-                NetworkMetricTypes.PacketLoss,
-                metric => metric == 0.0d);
-
-            for (int i = 0; i < 1000; ++i)
-            {
-                using var writer = new FastBufferWriter(m_MessageSize, Allocator.Persistent);
-                writer.WriteBytesSafe(new byte[m_MessageSize]);
-                m_ServerNetworkManager.CustomMessagingManager.SendNamedMessage("Test", m_ServerNetworkManager.ConnectedClientsIds, writer);
-            }
-
-            yield return waitForPacketLossMetric.WaitForMetricsReceived();
-
-            var packetLossValue = waitForPacketLossMetric.AssertMetricValueHaveBeenFound();
-            Assert.AreEqual(0d, packetLossValue);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackPacketLossAsClient()
-        {
-            double packetLossRateMinRange = (m_PacketLossRate - m_PacketLossRangeDelta) / 100d;
-            double packetLossRateMaxrange = (m_PacketLossRate + m_PacketLossRangeDelta) / 100d;
-            var clientNetworkManager = m_ClientNetworkManagers[0];
-
-            var clientTransport = (UnityTransport)clientNetworkManager.NetworkConfig.NetworkTransport;
-            clientTransport.GetNetworkDriver().CurrentSettings.TryGet<SimulatorUtility.Parameters>(out var parameters);
-            parameters.PacketDropPercentage = m_PacketLossRate;
-            clientTransport.GetNetworkDriver().ModifySimulatorStageParameters(parameters);
-
-            var waitForPacketLossMetric = new WaitForGaugeMetricValues((clientNetworkManager.NetworkMetrics as NetworkMetrics).Dispatcher,
-                NetworkMetricTypes.PacketLoss,
-                metric => packetLossRateMinRange <= metric && metric <= packetLossRateMaxrange);
-
-            for (int i = 0; i < 1000; ++i)
-            {
-                using var writer = new FastBufferWriter(m_MessageSize, Allocator.Persistent);
-                writer.WriteBytesSafe(new byte[m_MessageSize]);
-                m_ServerNetworkManager.CustomMessagingManager.SendNamedMessage("Test", m_ServerNetworkManager.ConnectedClientsIds, writer);
-            }
-
-            yield return waitForPacketLossMetric.WaitForMetricsReceived();
-
-            var packetLossValue = waitForPacketLossMetric.AssertMetricValueHaveBeenFound();
-            Assert.That(packetLossValue, Is.InRange(packetLossRateMinRange, packetLossRateMaxrange));
-        }
-    }
-}
-
-#endif
-#endif
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/PacketLossMetricsTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/PacketLossMetricsTests.cs.meta
deleted file mode 100644
index d48f305665..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/PacketLossMetricsTests.cs.meta
+++ /dev/null
@@ -1,3 +0,0 @@
-fileFormatVersion: 2
-guid: 12e64da4670d49a4a89da38d18e64396
-timeCreated: 1648133968
\ No newline at end of file
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/PacketMetricsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/PacketMetricsTests.cs
deleted file mode 100644
index b6bfd71bf9..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/PacketMetricsTests.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-#if MULTIPLAYER_TOOLS
-#if MULTIPLAYER_TOOLS_1_0_0_PRE_7
-using System.Collections;
-using NUnit.Framework;
-using Unity.Collections;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Netcode.TestHelpers.Runtime.Metrics;
-using UnityEngine.TestTools;
-
-namespace Unity.Netcode.RuntimeTests.Metrics
-{
-    internal class PacketMetricsTests : SingleClientMetricTestBase
-    {
-        [UnityTest]
-        public IEnumerator TrackPacketSentMetric()
-        {
-            var waitForMetricValues = new WaitForCounterMetricValue(ServerMetrics.Dispatcher, NetworkMetricTypes.PacketsSent, metric => metric > 0);
-
-            using (var writer = new FastBufferWriter(sizeof(uint), Allocator.Temp))
-            {
-                writer.WriteValueSafe(1337);
-                Server.CustomMessagingManager.SendUnnamedMessageToAll(writer);
-            }
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var totalPacketCount = waitForMetricValues.AssertMetricValueHaveBeenFound();
-            Assert.That(totalPacketCount, Is.InRange(1, 4));
-        }
-
-        [UnityTest]
-        public IEnumerator TrackPacketReceivedMetric()
-        {
-            var waitForMetricValues = new WaitForCounterMetricValue(ClientMetrics.Dispatcher, NetworkMetricTypes.PacketsReceived, metric => metric > 0);
-
-            using (var writer = new FastBufferWriter(sizeof(uint), Allocator.Temp))
-            {
-                writer.WriteValueSafe(1337);
-                Server.CustomMessagingManager.SendUnnamedMessageToAll(writer);
-            }
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var totalPacketCount = waitForMetricValues.AssertMetricValueHaveBeenFound();
-            Assert.That(totalPacketCount, Is.InRange(1, 4));
-        }
-    }
-}
-#endif
-#endif
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/PacketMetricsTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/PacketMetricsTests.cs.meta
deleted file mode 100644
index d55ef2fa73..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/PacketMetricsTests.cs.meta
+++ /dev/null
@@ -1,3 +0,0 @@
-fileFormatVersion: 2
-guid: 84a4884f4ea744a9944284d56b29531b
-timeCreated: 1644269306
\ No newline at end of file
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/RpcMetricsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/RpcMetricsTests.cs
deleted file mode 100644
index f68d502597..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/RpcMetricsTests.cs
+++ /dev/null
@@ -1,145 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using System.Collections;
-using System.Linq;
-using NUnit.Framework;
-using Unity.Collections;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Netcode.TestHelpers.Runtime.Metrics;
-using UnityEngine.TestTools;
-
-namespace Unity.Netcode.RuntimeTests.Metrics
-{
-    internal class RpcMetricsTests : DualClientMetricTestBase
-    {
-        protected override void OnCreatePlayerPrefab()
-        {
-            m_PlayerPrefab.AddComponent<RpcTestComponent>();
-            base.OnCreatePlayerPrefab();
-        }
-
-        [UnityTest]
-        public IEnumerator TrackRpcSentMetricOnServerToOnlyOneClientWithArray()
-        {
-            var waitForMetricValues = new WaitForEventMetricValues<RpcEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.RpcSent);
-
-            m_PlayerNetworkObjects[m_ServerNetworkManager.LocalClientId][FirstClient.LocalClientId].GetComponent<RpcTestComponent>().MyClientRpc(new ClientRpcParams
-            {
-                Send = new ClientRpcSendParams
-                {
-                    TargetClientIds = new[] { FirstClient.LocalClientId }
-                }
-            });
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var serverRpcSentValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, serverRpcSentValues.Count);
-
-            Assert.That(serverRpcSentValues, Has.All.Matches<RpcEvent>(x => x.Name == nameof(RpcTestComponent.MyClientRpc)));
-            Assert.That(serverRpcSentValues, Has.All.Matches<RpcEvent>(x => x.NetworkBehaviourName == nameof(RpcTestComponent)));
-            Assert.That(serverRpcSentValues, Has.All.Matches<RpcEvent>(x => x.BytesCount != 0));
-            Assert.AreEqual(FirstClient.LocalClientId, serverRpcSentValues.First().Connection.Id);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackRpcSentMetricOnServerToOnlyOneClientWithNativeArray()
-        {
-            var waitForMetricValues = new WaitForEventMetricValues<RpcEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.RpcSent);
-
-            m_PlayerNetworkObjects[m_ServerNetworkManager.LocalClientId][FirstClient.LocalClientId].GetComponent<RpcTestComponent>().MyClientRpc(new ClientRpcParams
-            {
-                Send = new ClientRpcSendParams
-                {
-                    TargetClientIdsNativeArray = new NativeArray<ulong>(new[] { FirstClient.LocalClientId }, Allocator.Temp)
-                }
-            });
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var serverRpcSentValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, serverRpcSentValues.Count);
-
-            Assert.That(serverRpcSentValues, Has.All.Matches<RpcEvent>(x => x.Name == nameof(RpcTestComponent.MyClientRpc)));
-            Assert.That(serverRpcSentValues, Has.All.Matches<RpcEvent>(x => x.NetworkBehaviourName == nameof(RpcTestComponent)));
-            Assert.That(serverRpcSentValues, Has.All.Matches<RpcEvent>(x => x.BytesCount != 0));
-            Assert.AreEqual(FirstClient.LocalClientId, serverRpcSentValues.First().Connection.Id);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackRpcSentMetricOnServerToAllClients()
-        {
-            var waitForMetricValues = new WaitForEventMetricValues<RpcEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.RpcSent);
-
-            m_PlayerNetworkObjects[m_ServerNetworkManager.LocalClientId][FirstClient.LocalClientId].GetComponent<RpcTestComponent>().MyClientRpc();
-
-            yield return waitForMetricValues.WaitForMetricsReceived();
-
-            var serverRpcSentValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(3, serverRpcSentValues.Count); // Server will receive this, since it's host
-
-            Assert.That(serverRpcSentValues, Has.All.Matches<RpcEvent>(x => x.Name == nameof(RpcTestComponent.MyClientRpc)));
-            Assert.That(serverRpcSentValues, Has.All.Matches<RpcEvent>(x => x.NetworkBehaviourName == nameof(RpcTestComponent)));
-            Assert.That(serverRpcSentValues, Has.All.Matches<RpcEvent>(x => x.BytesCount != 0));
-            Assert.Contains(Server.LocalClientId, serverRpcSentValues.Select(x => x.Connection.Id).ToArray());
-            Assert.Contains(FirstClient.LocalClientId, serverRpcSentValues.Select(x => x.Connection.Id).ToArray());
-            Assert.Contains(SecondClient.LocalClientId, serverRpcSentValues.Select(x => x.Connection.Id).ToArray());
-        }
-
-        [UnityTest]
-        public IEnumerator TrackRpcSentMetricOnClient()
-        {
-            var waitForClientMetricsValues = new WaitForEventMetricValues<RpcEvent>(FirstClientMetrics.Dispatcher, NetworkMetricTypes.RpcSent);
-
-            m_PlayerNetworkObjects[FirstClient.LocalClientId][FirstClient.LocalClientId].GetComponent<RpcTestComponent>().MyServerRpc();
-
-            yield return waitForClientMetricsValues.WaitForMetricsReceived();
-
-            var clientRpcSentValues = waitForClientMetricsValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, clientRpcSentValues.Count);
-
-            var rpcSent = clientRpcSentValues.First();
-            Assert.AreEqual(Server.LocalClientId, rpcSent.Connection.Id);
-            Assert.AreEqual(nameof(RpcTestComponent.MyServerRpc), rpcSent.Name);
-            Assert.AreEqual(nameof(RpcTestComponent), rpcSent.NetworkBehaviourName);
-            Assert.AreNotEqual(0, rpcSent.BytesCount);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackRpcReceivedMetricOnServer()
-        {
-            var waitForServerMetricsValues = new WaitForEventMetricValues<RpcEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.RpcReceived);
-            m_PlayerNetworkObjects[FirstClient.LocalClientId][FirstClient.LocalClientId].GetComponent<RpcTestComponent>().MyServerRpc();
-
-            yield return waitForServerMetricsValues.WaitForMetricsReceived();
-
-            var serverRpcReceivedValues = waitForServerMetricsValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, serverRpcReceivedValues.Count);
-
-            var rpcReceived = serverRpcReceivedValues.First();
-            Assert.AreEqual(FirstClient.LocalClientId, rpcReceived.Connection.Id);
-            Assert.AreEqual(nameof(RpcTestComponent.MyServerRpc), rpcReceived.Name);
-            Assert.AreEqual(nameof(RpcTestComponent), rpcReceived.NetworkBehaviourName);
-            Assert.AreNotEqual(0, rpcReceived.BytesCount);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackRpcReceivedMetricOnClient()
-        {
-            var waitForClientMetricsValues = new WaitForEventMetricValues<RpcEvent>(FirstClientMetrics.Dispatcher, NetworkMetricTypes.RpcReceived);
-
-            m_PlayerNetworkObjects[m_ServerNetworkManager.LocalClientId][FirstClient.LocalClientId].GetComponent<RpcTestComponent>().MyClientRpc();
-
-            yield return waitForClientMetricsValues.WaitForMetricsReceived();
-
-            var clientRpcReceivedValues = waitForClientMetricsValues.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, clientRpcReceivedValues.Count);
-
-            var rpcReceived = clientRpcReceivedValues.First();
-            Assert.AreEqual(Server.LocalClientId, rpcReceived.Connection.Id);
-            Assert.AreEqual(nameof(RpcTestComponent.MyClientRpc), rpcReceived.Name);
-            Assert.AreEqual(nameof(RpcTestComponent), rpcReceived.NetworkBehaviourName);
-            Assert.AreNotEqual(0, rpcReceived.BytesCount);
-        }
-    }
-}
-#endif
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/RpcMetricsTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/RpcMetricsTests.cs.meta
deleted file mode 100644
index 38427d5e46..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/RpcMetricsTests.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 02a31cf8be00f8b46b65477d648b297d
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/RttMetricsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/RttMetricsTests.cs
deleted file mode 100644
index 3a1a2ca2d4..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/RttMetricsTests.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-#if MULTIPLAYER_TOOLS
-#if MULTIPLAYER_TOOLS_1_0_0_PRE_7
-
-using System.Collections;
-using System.Collections.Generic;
-using System.Linq;
-using NUnit.Framework;
-using Unity.Collections;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Netcode.TestHelpers.Runtime;
-using Unity.Netcode.TestHelpers.Runtime.Metrics;
-using UnityEngine.TestTools;
-
-namespace Unity.Netcode.RuntimeTests.Metrics
-{
-    /// <summary>
-    /// Note: This is one way to easily identify each specific test.
-    /// Since the test only tested 1 and then 2 clients, I made this
-    /// and enum, but you can always remove the enum in the constructor,
-    /// replace it with an int, and then test from 1 to 9 clients.
-    /// Just an example of how you can accomplish the same task using
-    /// the NetcodeIntegrationTest
-    /// </summary>
-    [TestFixture(ClientCount.OneClient)]
-    [TestFixture(ClientCount.TwoClients)]
-    internal class RttMetricsTests : NetcodeIntegrationTest
-    {
-        protected override int NumberOfClients => m_ClientCount;
-
-        public enum ClientCount
-        {
-            OneClient,
-            TwoClients
-        }
-
-        private int m_ClientCount;
-
-        public RttMetricsTests(ClientCount numberOfClients)
-        {
-            m_ClientCount = numberOfClients == ClientCount.OneClient ? 1 : 2;
-        }
-
-        [UnityTest]
-        public IEnumerator TrackRttMetricServerToClient()
-        {
-            var waitForMetricValues = new WaitForGaugeMetricValues((m_ServerNetworkManager.NetworkMetrics as NetworkMetrics).Dispatcher, NetworkMetricTypes.RttToServer);
-
-            using (var writer = new FastBufferWriter(sizeof(uint), Allocator.Temp))
-            {
-                writer.WriteValueSafe(1337);
-                m_ServerNetworkManager.CustomMessagingManager.SendUnnamedMessageToAll(writer);
-            }
-
-            yield return WaitForConditionOrTimeOut(() => waitForMetricValues.MetricFound());
-            Assert.False(s_GlobalTimeoutHelper.TimedOut, $"{nameof(TrackRttMetricServerToClient)} timed out waiting for metric to be found for {m_ClientCount} clients!");
-
-            var rttValue = waitForMetricValues.AssertMetricValueHaveBeenFound();
-            Assert.AreEqual(0f, rttValue);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackRttMetricClientToServer()
-        {
-            var clientGaugeMetricValues = new List<WaitForGaugeMetricValues>();
-            foreach (var client in m_ClientNetworkManagers)
-            {
-                clientGaugeMetricValues.Add(new WaitForGaugeMetricValues((client.NetworkMetrics as NetworkMetrics).Dispatcher, NetworkMetricTypes.RttToServer, metric => metric > 0f));
-            }
-
-            using (var writer = new FastBufferWriter(sizeof(uint), Allocator.Temp))
-            {
-                writer.WriteValueSafe(1337);
-                m_ServerNetworkManager.CustomMessagingManager.SendUnnamedMessageToAll(writer);
-            }
-
-            yield return WaitForConditionOrTimeOut(() => clientGaugeMetricValues.Where((c) => c.MetricFound()).Count() == NumberOfClients);
-            Assert.False(s_GlobalTimeoutHelper.TimedOut, $"{nameof(TrackRttMetricClientToServer)} timed out waiting for metric to be found for {m_ClientCount} clients!");
-
-            foreach (var clientGaugeMetricValue in clientGaugeMetricValues)
-            {
-                var rttValue = clientGaugeMetricValue.AssertMetricValueHaveBeenFound();
-                Assert.That(rttValue, Is.GreaterThanOrEqualTo(1e-3f));
-            }
-        }
-    }
-}
-#endif
-#endif
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/RttMetricsTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/RttMetricsTests.cs.meta
deleted file mode 100644
index 704d1b4b6d..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/RttMetricsTests.cs.meta
+++ /dev/null
@@ -1,3 +0,0 @@
-fileFormatVersion: 2
-guid: 452fbcb436d24291ba7db3a68e3e50ac
-timeCreated: 1644269321
\ No newline at end of file
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/ServerLogsMetricTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/ServerLogsMetricTests.cs
deleted file mode 100644
index 758d7aa114..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/ServerLogsMetricTests.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using System;
-using System.Collections;
-using System.Linq;
-using NUnit.Framework;
-using Unity.Collections;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Netcode.TestHelpers.Runtime.Metrics;
-using UnityEngine.TestTools;
-
-namespace Unity.Netcode.RuntimeTests.Metrics
-{
-    internal class ServerLogsMetricTests : SingleClientMetricTestBase
-    {
-        // Header is dynamically sized due to packing, will be 3 bytes for all test messages.
-        private const int k_MessageHeaderSize = 3;
-
-        protected override IEnumerator OnSetup()
-        {
-            m_CreateServerFirst = false;
-            return base.OnSetup();
-        }
-
-
-        private int GetWriteSizeForLog(NetworkLog.LogType logType, string logMessage)
-        {
-            var message = new ServerLogMessage
-            {
-                LogType = logType,
-                Message = logMessage
-            };
-            using var writer = new FastBufferWriter(1024, Allocator.Temp);
-            message.Serialize(writer, message.Version);
-            return writer.Length;
-        }
-
-        [UnityTest]
-        public IEnumerator TrackServerLogSentMetric()
-        {
-            // Set the client NetworkManager to assure the log is sent
-            NetworkLog.NetworkManagerOverride = Client;
-            var waitForSentMetric = new WaitForEventMetricValues<ServerLogEvent>(ClientMetrics.Dispatcher, NetworkMetricTypes.ServerLogSent);
-
-            var message = Guid.NewGuid().ToString();
-            Client.LogLevel = LogLevel.Developer;
-            Server.LogLevel = LogLevel.Developer;
-            NetworkLog.LogWarningServer(message);
-            yield return s_DefaultWaitForTick;
-
-            yield return waitForSentMetric.WaitForMetricsReceived();
-
-            var sentMetrics = waitForSentMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, sentMetrics.Count);
-
-            var sentMetric = sentMetrics.First();
-            Assert.AreEqual(Server.LocalClientId, sentMetric.Connection.Id);
-            Assert.AreEqual((uint)NetworkLog.LogType.Warning, (uint)sentMetric.LogLevel);
-
-            var serializedLength = GetWriteSizeForLog(NetworkLog.LogType.Warning, message);
-            Assert.AreEqual(serializedLength + k_MessageHeaderSize, sentMetric.BytesCount);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackServerLogReceivedMetric()
-        {
-            var waitForReceivedMetric = new WaitForEventMetricValues<ServerLogEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.ServerLogReceived);
-
-            var message = Guid.NewGuid().ToString();
-            Client.LogLevel = LogLevel.Developer;
-            Server.LogLevel = LogLevel.Developer;
-            NetworkLog.LogWarningServer(message);
-
-            yield return s_DefaultWaitForTick;
-
-            yield return waitForReceivedMetric.WaitForMetricsReceived();
-
-            var receivedMetrics = waitForReceivedMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, receivedMetrics.Count);
-
-            var receivedMetric = receivedMetrics.First();
-            Assert.AreEqual(Client.LocalClientId, receivedMetric.Connection.Id);
-            Assert.AreEqual((uint)NetworkLog.LogType.Warning, (uint)receivedMetric.LogLevel);
-
-            var serializedLength = GetWriteSizeForLog(NetworkLog.LogType.Warning, message);
-            Assert.AreEqual(serializedLength, receivedMetric.BytesCount);
-        }
-
-        protected override IEnumerator OnTearDown()
-        {
-            NetworkLog.NetworkManagerOverride = null;
-            return base.OnTearDown();
-        }
-    }
-}
-#endif
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/ServerLogsMetricTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/ServerLogsMetricTests.cs.meta
deleted file mode 100644
index 8eccb56ef7..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/ServerLogsMetricTests.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 5ba082aac78de5d488f621a0cbaf16a6
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/TransportBytesMetricsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/TransportBytesMetricsTests.cs
deleted file mode 100644
index 94e67e5630..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/TransportBytesMetricsTests.cs
+++ /dev/null
@@ -1,111 +0,0 @@
-#if MULTIPLAYER_TOOLS
-using System;
-using System.Collections;
-using NUnit.Framework;
-using Unity.Collections;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Multiplayer.Tools.NetStats;
-using Unity.Netcode.TestHelpers.Runtime.Metrics;
-using UnityEngine.TestTools;
-
-namespace Unity.Netcode.RuntimeTests.Metrics
-{
-    internal class TransportBytesMetricsTests : SingleClientMetricTestBase
-    {
-        // Header is dynamically sized due to packing, will be 2 bytes for all test messages.
-        private const int k_MessageHeaderSize = 2;
-        private static readonly long k_MessageOverhead = 8 + FastBufferWriter.GetWriteSize<NetworkBatchHeader>() + k_MessageHeaderSize;
-
-        [UnityTest]
-        public IEnumerator TrackTotalNumberOfBytesSent()
-        {
-            var messageName = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
-            var writer = new FastBufferWriter(1300, Allocator.Temp);
-            var observer = new TotalBytesObserver(ClientMetrics.Dispatcher, NetworkMetricTypes.TotalBytesReceived);
-            try
-            {
-                writer.WriteValueSafe(messageName);
-
-                Server.CustomMessagingManager.SendNamedMessage(messageName.Value.ToString(), Client.LocalClientId, writer);
-            }
-            finally
-            {
-                writer.Dispose();
-            }
-
-            var nbFrames = 0;
-            while (!observer.Found || nbFrames < 10)
-            {
-                yield return null;
-                nbFrames++;
-            }
-
-            Assert.True(observer.Found);
-            Assert.AreEqual(((FastBufferWriter.GetWriteSize(messageName) + k_MessageOverhead) + 7) & ~7, observer.Value);
-        }
-
-        [UnityTest]
-        public IEnumerator TrackTotalNumberOfBytesReceived()
-        {
-            var messageName = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
-            var writer = new FastBufferWriter(1300, Allocator.Temp);
-            var observer = new TotalBytesObserver(ClientMetrics.Dispatcher, NetworkMetricTypes.TotalBytesReceived);
-            try
-            {
-                writer.WriteValueSafe(messageName);
-
-                Server.CustomMessagingManager.SendNamedMessage(messageName.Value.ToString(), Client.LocalClientId, writer);
-            }
-            finally
-            {
-                writer.Dispose();
-            }
-
-            var nbFrames = 0;
-            while (!observer.Found || nbFrames < 10)
-            {
-                yield return null;
-                nbFrames++;
-            }
-
-            Assert.True(observer.Found);
-            Assert.AreEqual(((FastBufferWriter.GetWriteSize(messageName) + k_MessageOverhead) + 7) & ~7, observer.Value);
-        }
-
-        private class TotalBytesObserver : IMetricObserver
-        {
-            private readonly DirectionalMetricInfo m_MetricInfo;
-
-            public TotalBytesObserver(IMetricDispatcher dispatcher, DirectionalMetricInfo metricInfo)
-            {
-                m_MetricInfo = metricInfo;
-
-                dispatcher.RegisterObserver(this);
-            }
-
-            public bool Found { get; private set; }
-
-            public long Value { get; private set; }
-
-            private int m_BytesFoundCounter;
-            private long m_TotalBytes;
-
-            public void Observe(MetricCollection collection)
-            {
-                if (collection.TryGetCounter(m_MetricInfo.Id, out var counter) && counter.Value > 0)
-                {
-                    // Don't assign another observed value once one is already observed
-                    if (!Found)
-                    {
-                        Found = true;
-                        Value = counter.Value;
-                        m_TotalBytes += ((counter.Value + 7) & ~7);
-                        m_BytesFoundCounter++;
-                        UnityEngine.Debug.Log($"[{m_BytesFoundCounter}] Bytes Observed {counter.Value} | Total Bytes Observed: {m_TotalBytes}");
-                    }
-                }
-            }
-        }
-    }
-}
-#endif
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/TransportBytesMetricsTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/TransportBytesMetricsTests.cs.meta
deleted file mode 100644
index 2cfb1f3a0b..0000000000
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/TransportBytesMetricsTests.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: a8be98b50d230114f853054c479341ee
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef b/com.unity.netcode.gameobjects/Tests/Runtime/Unity.Netcode.Runtime.Tests.asmdef
similarity index 95%
rename from com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef
rename to com.unity.netcode.gameobjects/Tests/Runtime/Unity.Netcode.Runtime.Tests.asmdef
index ce8ab1c7eb..96441cf8af 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/Unity.Netcode.Runtime.Tests.asmdef
@@ -1,9 +1,8 @@
 {
-    "name": "Unity.Netcode.RuntimeTests",
+    "name": "Unity.Netcode.Runtime.Tests",
     "rootNamespace": "Unity.Netcode.RuntimeTests",
     "references": [
         "Unity.Netcode.Runtime",
-        "Unity.Netcode.Components",
         "Unity.Collections",
         "Unity.Multiplayer.MetricTypes",
         "Unity.Multiplayer.NetStats",
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Unity.Netcode.Runtime.Tests.asmdef.meta
similarity index 100%
rename from com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef.meta
rename to com.unity.netcode.gameobjects/Tests/Runtime/Unity.Netcode.Runtime.Tests.asmdef.meta
diff --git a/testproject-tools-integration/Assets/Tests/Runtime/SceneEventTests.cs b/testproject-tools-integration/Assets/Tests/Runtime/SceneEventTests.cs
deleted file mode 100644
index eccaf57490..0000000000
--- a/testproject-tools-integration/Assets/Tests/Runtime/SceneEventTests.cs
+++ /dev/null
@@ -1,751 +0,0 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Linq;
-using NUnit.Framework;
-using Unity.Multiplayer.Tools.MetricTypes;
-using Unity.Netcode;
-using Unity.Netcode.TestHelpers.Runtime;
-using Unity.Netcode.TestHelpers.Runtime.Metrics;
-using UnityEngine.SceneManagement;
-using UnityEngine.TestTools;
-using SceneEventType = Unity.Netcode.SceneEventType;
-
-namespace TestProject.ToolsIntegration.RuntimeTests
-{
-    internal class SceneEventTests : SingleClientMetricTestBase
-    {
-        // scenes referenced in this test must also be in the build settings of the project.
-        private const string k_SimpleSceneName = "SimpleScene";
-
-        private NetworkSceneManager m_ClientNetworkSceneManager;
-        private NetworkSceneManager m_ServerNetworkSceneManager;
-        private Scene m_LoadedScene;
-
-        protected override IEnumerator OnSetup()
-        {
-            SceneManager.sceneLoaded += SceneManager_sceneLoaded;
-            m_CreateServerFirst = false;
-            return base.OnSetup();
-        }
-
-        private List<Scene> m_AllScenesLoaded = new List<Scene>();
-
-        private void SceneManager_sceneLoaded(Scene arg0, LoadSceneMode arg1)
-        {
-            m_AllScenesLoaded.Add(arg0);
-        }
-
-        protected override void OnServerAndClientsCreated()
-        {
-            // invoke the base first so the Server and client are set
-            base.OnServerAndClientsCreated();
-
-            Server.NetworkConfig.EnableSceneManagement = true;
-            Client.NetworkConfig.EnableSceneManagement = true;
-        }
-
-        protected override IEnumerator OnServerAndClientsConnected()
-        {
-            m_ClientNetworkSceneManager = Client.SceneManager;
-            m_ServerNetworkSceneManager = Server.SceneManager;
-            m_ServerNetworkSceneManager.OnSceneEvent += RegisterLoadedSceneCallback;
-
-            yield return base.OnServerAndClientsConnected();
-        }
-
-        protected override IEnumerator OnTearDown()
-        {
-            if (!m_AllScenesLoaded.Contains(m_LoadedScene))
-            {
-                m_AllScenesLoaded.Add(m_LoadedScene);
-            }
-
-            foreach (var sceneLoaded in m_AllScenesLoaded)
-            {
-                if (sceneLoaded.IsValid())
-                {
-                    yield return UnloadTestScene(sceneLoaded);
-                }
-            }
-
-            yield return base.OnTearDown();
-        }
-
-        [UnityTest]
-        public IEnumerator TestS2CLoadSent()
-        {
-            var serverSceneLoaded = false;
-            var clientSceneLoaded = false;
-            // Register a callback so we know when the scene has loaded server side, as this is when
-            // the message is sent to the client. AsyncOperation is the ScceneManager.LoadSceneAsync operation.
-            m_ClientNetworkSceneManager.OnSceneEvent += sceneEvent =>
-            {
-                if (sceneEvent.SceneEventType.Equals(SceneEventType.Load) && sceneEvent.ClientId == Client.LocalClientId)
-                {
-                    serverSceneLoaded = true;
-                }
-            };
-
-            m_ServerNetworkSceneManager.OnSceneEvent += sceneEvent =>
-            {
-                if (sceneEvent.SceneEventType.Equals(SceneEventType.LoadComplete) && sceneEvent.ClientId == Client.LocalClientId)
-                {
-                    clientSceneLoaded = true;
-                }
-            };
-
-            var waitForSentMetric = new WaitForEventMetricValues<SceneEventMetric>(ServerMetrics.Dispatcher, NetworkMetricTypes.SceneEventSent);
-
-            // Load a scene to trigger the messages
-            StartServerLoadScene();
-
-            // Wait for the server to load the scene locally first.
-            yield return WaitForCondition(() => serverSceneLoaded);
-            Assert.IsTrue(serverSceneLoaded);
-
-            yield return WaitForCondition(() => clientSceneLoaded);
-            Assert.IsTrue(clientSceneLoaded);
-
-            // Now start the wait for the metric to be emitted when the message is sent.
-            yield return waitForSentMetric.WaitForMetricsReceived();
-
-            var sentMetrics = waitForSentMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, sentMetrics.Count);
-
-            var sentMetric = sentMetrics.First();
-            Assert.AreEqual(SceneEventType.Load.ToString(), sentMetric.SceneEventType);
-            Assert.AreEqual(Client.LocalClientId, sentMetric.Connection.Id);
-            Assert.AreEqual(k_SimpleSceneName, sentMetric.SceneName);
-        }
-
-        [UnityTest]
-        public IEnumerator TestS2CLoadReceived()
-        {
-            var serverSceneLoaded = false;
-            var clientSceneLoaded = false;
-            // Register a callback so we know when the scene has loaded server side, as this is when
-            // the message is sent to the client. AsyncOperation is the ScceneManager.LoadSceneAsync operation.
-            m_ClientNetworkSceneManager.OnSceneEvent += sceneEvent =>
-            {
-                if (sceneEvent.SceneEventType.Equals(SceneEventType.Load) && sceneEvent.ClientId == Client.LocalClientId)
-                {
-                    serverSceneLoaded = true;
-                }
-            };
-
-            m_ServerNetworkSceneManager.OnSceneEvent += sceneEvent =>
-            {
-                if (sceneEvent.SceneEventType.Equals(SceneEventType.LoadComplete) && sceneEvent.ClientId == Client.LocalClientId)
-                {
-                    clientSceneLoaded = true;
-                }
-            };
-
-            var waitForReceivedMetric = new WaitForEventMetricValues<SceneEventMetric>(ClientMetrics.Dispatcher, NetworkMetricTypes.SceneEventReceived);
-
-            // Load a scene to trigger the messages
-            StartServerLoadScene();
-
-            // Wait for the server to load the scene locally first.
-            yield return WaitForCondition(() => serverSceneLoaded);
-            Assert.IsTrue(serverSceneLoaded);
-
-            yield return WaitForCondition(() => clientSceneLoaded);
-            Assert.IsTrue(clientSceneLoaded);
-
-            // Now start the wait for the metric to be emitted when the message is received.
-            yield return waitForReceivedMetric.WaitForMetricsReceived();
-
-            var receivedMetrics = waitForReceivedMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, receivedMetrics.Count);
-
-            var receivedMetric = receivedMetrics.First();
-            Assert.AreEqual(SceneEventType.Load.ToString(), receivedMetric.SceneEventType);
-            Assert.AreEqual(Server.LocalClientId, receivedMetric.Connection.Id);
-            Assert.AreEqual(k_SimpleSceneName, receivedMetric.SceneName);
-        }
-
-        [UnityTest]
-        public IEnumerator TestClientLoadCompleteSent()
-        {
-            // Register a callback so we can notify the test when the client has finished loading the scene locally
-            // as this is when the message is sent
-            var waitForClientLoadComplete = new WaitForSceneEvent(
-                m_ClientNetworkSceneManager,
-                SceneEventType.LoadComplete);
-
-            var waitForSentMetric = new WaitForEventMetricValues<SceneEventMetric>(ClientMetrics.Dispatcher, NetworkMetricTypes.SceneEventSent);
-
-            // Load a scene to trigger the messages
-            StartServerLoadScene();
-
-
-            // Wait for the client to complete loading the scene locally
-            yield return waitForClientLoadComplete.Wait();
-            Assert.IsTrue(waitForClientLoadComplete.Done);
-
-            // Now start the wait for the metric to be emitted when the message is sent.
-            yield return waitForSentMetric.WaitForMetricsReceived();
-
-            var sentMetrics = waitForSentMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, sentMetrics.Count);
-
-            var sentMetric = sentMetrics.First();
-            Assert.AreEqual(SceneEventType.LoadComplete.ToString(), sentMetric.SceneEventType);
-            Assert.AreEqual(Server.LocalClientId, sentMetric.Connection.Id);
-            Assert.AreEqual(k_SimpleSceneName, sentMetric.SceneName);
-        }
-
-        [UnityTest]
-        public IEnumerator TestC2SLoadCompleteReceived()
-        {
-            // Register a callback so we can notify the test when the client has finished loading the scene locally
-            // as this is when the message is sent
-            var waitForClientLoadComplete = new WaitForSceneEvent(
-                m_ClientNetworkSceneManager,
-                SceneEventType.LoadComplete);
-
-            var waitForReceivedMetric = new WaitForEventMetricValues<SceneEventMetric>(ServerMetrics.Dispatcher, NetworkMetricTypes.SceneEventReceived);
-
-            // Load a scene to trigger the messages
-            StartServerLoadScene();
-
-
-            // Wait for the client to complete loading the scene locally
-            yield return waitForClientLoadComplete.Wait();
-            Assert.IsTrue(waitForClientLoadComplete.Done);
-
-            // Now start the wait for the metric to be emitted when the message is received
-            yield return waitForReceivedMetric.WaitForMetricsReceived();
-
-            var receivedMetrics = waitForReceivedMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, receivedMetrics.Count);
-
-            var receivedMetric = receivedMetrics.First();
-            Assert.AreEqual(SceneEventType.LoadComplete.ToString(), receivedMetric.SceneEventType);
-            Assert.AreEqual(Client.LocalClientId, receivedMetric.Connection.Id);
-            Assert.AreEqual(k_SimpleSceneName, receivedMetric.SceneName);
-        }
-
-        [UnityTest]
-        public IEnumerator TestS2CLoadCompleteSent()
-        {
-            // Register a callback so we can notify the test when the server has finished loading the scene locally
-            // as this is when the message is sent
-            var waitForServerLoadComplete = new WaitForSceneEvent(
-                m_ServerNetworkSceneManager,
-                SceneEventType.LoadEventCompleted);
-
-            var waitForSentMetric = new WaitForEventMetricValues<SceneEventMetric>(
-                ServerMetrics.Dispatcher,
-                NetworkMetricTypes.SceneEventSent,
-                metric => metric.SceneEventType.Equals(SceneEventType.LoadEventCompleted.ToString()));
-
-            // Load a scene to trigger the messages
-            StartServerLoadScene();
-
-            // Wait for the server to complete loading the scene locally
-            yield return waitForServerLoadComplete.Wait();
-            Assert.IsTrue(waitForServerLoadComplete.Done);
-
-            // Now start the wait for the metric to be emitted when the message is sent
-            yield return waitForSentMetric.WaitForMetricsReceived();
-
-            var sentMetrics = waitForSentMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(Server.ConnectedClients.Count, sentMetrics.Count);
-
-            var filteredSentMetrics = sentMetrics
-                .Where(metric => metric.SceneEventType == SceneEventType.LoadEventCompleted.ToString())
-                .Where(metric => metric.SceneName == k_SimpleSceneName);
-            CollectionAssert.AreEquivalent(filteredSentMetrics.Select(x => x.Connection.Id), Server.ConnectedClients.Select(x => x.Key));
-        }
-
-        [UnityTest]
-        public IEnumerator TestS2CLoadCompleteReceived()
-        {
-            // Register a callback so we can notify the test when the server has finished loading the scene locally
-            // as this is when the message is sent
-            var waitForServerLoadComplete = new WaitForSceneEvent(
-                m_ServerNetworkSceneManager,
-                SceneEventType.LoadEventCompleted);
-
-            var waitForReceivedMetric = new WaitForEventMetricValues<SceneEventMetric>(
-                ClientMetrics.Dispatcher,
-                NetworkMetricTypes.SceneEventReceived,
-                metric => metric.SceneEventType.Equals(SceneEventType.LoadEventCompleted.ToString()));
-
-            // Load a scene to trigger the messages
-            StartServerLoadScene();
-
-            // Wait for the server to complete loading the scene locally
-            yield return waitForServerLoadComplete.Wait();
-            Assert.IsTrue(waitForServerLoadComplete.Done);
-
-            // Now start the wait for the metric to be emitted when the message is received
-            yield return waitForReceivedMetric.WaitForMetricsReceived();
-
-            var receivedMetrics = waitForReceivedMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, receivedMetrics.Count);
-            var receivedMetric = receivedMetrics.First();
-
-            Assert.AreEqual(SceneEventType.LoadEventCompleted.ToString(), receivedMetric.SceneEventType);
-            Assert.AreEqual(Server.LocalClientId, receivedMetric.Connection.Id);
-            Assert.AreEqual(k_SimpleSceneName, receivedMetric.SceneName);
-        }
-
-        [UnityTest]
-        public IEnumerator TestS2CUnloadSent()
-        {
-            // Load a scene so that we can unload it
-            yield return LoadTestScene(k_SimpleSceneName, true);
-
-            var serverSceneUnloaded = false;
-            // Register a callback so we can notify the test when the scene has finished unloading server side
-            // as this is when the message is sent
-            m_ServerNetworkSceneManager.OnSceneEvent += sceneEvent =>
-            {
-                if (sceneEvent.SceneEventType.Equals(SceneEventType.UnloadComplete) && sceneEvent.ClientId == Server.LocalClientId)
-                {
-                    serverSceneUnloaded = true;
-                }
-            };
-
-            var waitForSentMetric = new WaitForEventMetricValues<SceneEventMetric>(
-                ServerMetrics.Dispatcher,
-                NetworkMetricTypes.SceneEventSent,
-                metric => metric.SceneEventType.Equals(SceneEventType.Unload.ToString()));
-
-            yield return s_DefaultWaitForTick;
-            // Unload the scene to trigger the messages
-            StartServerUnloadScene();
-
-            // Wait for the scene to unload locally
-            yield return WaitForCondition(() => serverSceneUnloaded);
-            Assert.IsTrue(serverSceneUnloaded);
-
-            // Now wait for the metric to be emitted when the message is sent
-            yield return waitForSentMetric.WaitForMetricsReceived();
-
-            var sentMetrics = waitForSentMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, sentMetrics.Count);
-
-            var sentMetric = sentMetrics.First();
-            Assert.AreEqual(SceneEventType.Unload.ToString(), sentMetric.SceneEventType);
-            Assert.AreEqual(Client.LocalClientId, sentMetric.Connection.Id);
-            Assert.AreEqual(k_SimpleSceneName, sentMetric.SceneName);
-        }
-
-        [UnityTest]
-        public IEnumerator TestS2CUnloadReceived()
-        {
-            // Load a scene so that we can unload it.
-            yield return LoadTestScene(k_SimpleSceneName);
-
-            var serverSceneUnloaded = false;
-
-            // Register a callback so we can notify the test when the scene has started to unload server side
-            // as this is when the message is sent
-            m_ServerNetworkSceneManager.OnSceneEvent += sceneEvent =>
-            {
-                if (sceneEvent.SceneEventType.Equals(SceneEventType.Unload) && sceneEvent.ClientId == Server.LocalClientId)
-                {
-                    serverSceneUnloaded = true;
-                }
-            };
-
-            var waitForReceivedMetric = new WaitForEventMetricValues<SceneEventMetric>(
-                ClientMetrics.Dispatcher,
-                NetworkMetricTypes.SceneEventReceived,
-                metric => metric.SceneEventType.Equals(SceneEventType.Unload.ToString()));
-
-            // Unload the scene to trigger the messages
-            StartServerUnloadScene();
-
-            // Wait for the scene to unload locally
-            yield return WaitForCondition(() => serverSceneUnloaded);
-            Assert.IsTrue(serverSceneUnloaded);
-
-            // Now wait for the metric to be emitted when the message is received
-            yield return waitForReceivedMetric.WaitForMetricsReceived();
-
-            var receivedMetrics = waitForReceivedMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, receivedMetrics.Count);
-
-            var receivedMetric = receivedMetrics.First();
-            Assert.AreEqual(SceneEventType.Unload.ToString(), receivedMetric.SceneEventType);
-            Assert.AreEqual(Server.LocalClientId, receivedMetric.Connection.Id);
-            Assert.AreEqual(k_SimpleSceneName, receivedMetric.SceneName);
-        }
-
-
-
-        [UnityTest]
-        public IEnumerator TestC2SUnloadCompleteSent()
-        {
-            // Load a scene so that we can unload it
-            yield return LoadTestScene(k_SimpleSceneName, true);
-
-            // Register a callback so we can notify the test when the scene has finished unloading client side
-            // as this is when the message is sent.
-            var waitForClientUnloadComplete = new WaitForSceneEvent(
-                m_ClientNetworkSceneManager,
-                SceneEventType.UnloadComplete);
-
-            var waitForSentMetric = new WaitForEventMetricValues<SceneEventMetric>(
-                ClientMetrics.Dispatcher,
-                NetworkMetricTypes.SceneEventSent,
-                metric => metric.SceneEventType.Equals(SceneEventType.UnloadComplete.ToString()));
-
-            // Unload a scene to trigger the messages
-            StartServerUnloadScene();
-
-            // Wait for the scene to complete unloading locally
-            yield return waitForClientUnloadComplete.Wait();
-            Assert.IsTrue(waitForClientUnloadComplete.Done);
-
-            // Now wait for the metric to be emitted when the message is sent
-            yield return waitForSentMetric.WaitForMetricsReceived();
-
-            var sentMetrics = waitForSentMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, sentMetrics.Count);
-
-            var sentMetric = sentMetrics.First();
-            Assert.AreEqual(SceneEventType.UnloadComplete.ToString(), sentMetric.SceneEventType);
-            Assert.AreEqual(Server.LocalClientId, sentMetric.Connection.Id);
-            Assert.AreEqual(k_SimpleSceneName, sentMetric.SceneName);
-        }
-
-        [UnityTest]
-        public IEnumerator TestC2SUnloadCompleteReceived()
-        {
-            // Load a scene so that we can unload it
-            yield return LoadTestScene(k_SimpleSceneName, true);
-
-            // Register a callback we can notify the test when the scene has finished unloading client side
-            // as this is when the message is sent
-            var waitForClientUnloadComplete = new WaitForSceneEvent(
-                m_ClientNetworkSceneManager,
-                SceneEventType.UnloadComplete);
-
-            var waitForReceivedMetric = new WaitForEventMetricValues<SceneEventMetric>(
-                ServerMetrics.Dispatcher,
-                NetworkMetricTypes.SceneEventReceived,
-                metric => metric.SceneEventType.Equals(SceneEventType.UnloadComplete.ToString()));
-
-            // Unload a scene to trigger the messages
-            StartServerUnloadScene();
-
-            //Wait for the scene to complete unloading locally
-            yield return waitForClientUnloadComplete.Wait();
-            Assert.IsTrue(waitForClientUnloadComplete.Done);
-
-            // Now wait for the metric to be emitted when the message is received
-            yield return waitForReceivedMetric.WaitForMetricsReceived();
-
-            var receivedMetrics = waitForReceivedMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, receivedMetrics.Count);
-
-            var receivedMetric = receivedMetrics.First();
-            Assert.AreEqual(SceneEventType.UnloadComplete.ToString(), receivedMetric.SceneEventType);
-            Assert.AreEqual(Client.LocalClientId, receivedMetric.Connection.Id);
-            Assert.AreEqual(k_SimpleSceneName, receivedMetric.SceneName);
-        }
-
-        [UnityTest]
-        public IEnumerator TestS2CUnloadCompleteSent()
-        {
-            // Load a scene so that we can unload it
-            yield return LoadTestScene(k_SimpleSceneName);
-
-            // Register a callback so we can notify the test when the scene has finished unloading server side
-            // as this is when the message is sent
-            var waitForServerUnloadComplete = new WaitForSceneEvent(
-                m_ServerNetworkSceneManager,
-                SceneEventType.UnloadEventCompleted);
-
-            var waitForSentMetric = new WaitForEventMetricValues<SceneEventMetric>(
-                ServerMetrics.Dispatcher,
-                NetworkMetricTypes.SceneEventSent,
-                metric => metric.SceneEventType.Equals(SceneEventType.UnloadEventCompleted.ToString()));
-
-            // Unload a scene to trigger the messages
-            StartServerUnloadScene();
-
-            // Wait for the scene to complete unloading locally
-            yield return waitForServerUnloadComplete.Wait();
-            Assert.IsTrue(waitForServerUnloadComplete.Done);
-
-            // Now wait for the metric to be emitted when the message is sent
-            yield return waitForSentMetric.WaitForMetricsReceived();
-
-            var sentMetrics = waitForSentMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(Server.ConnectedClients.Count, sentMetrics.Count);
-
-            // This message is sent from the server to all connected clients including itself if it is a host,
-            // so iterate over the connected client list on the server to ensure that we have a 1-1 match of connected
-            // clients to sent metrics.
-            var filteredSentMetrics = sentMetrics
-                .Where(metric => metric.SceneEventType == SceneEventType.UnloadEventCompleted.ToString())
-                .Where(metric => metric.SceneName == k_SimpleSceneName);
-            CollectionAssert.AreEquivalent(filteredSentMetrics.Select(x => x.Connection.Id), Server.ConnectedClients.Select(x => x.Key));
-        }
-
-        [UnityTest]
-        public IEnumerator TestS2CUnloadCompleteReceived()
-        {
-            // Load a scene so that we can unload it
-            yield return LoadTestScene(k_SimpleSceneName);
-
-            // Register a callback so we can notify the test when the scene has finished unloading server side
-            // as this is when the message is sent
-            var waitForServerUnloadComplete = new WaitForSceneEvent(
-                m_ServerNetworkSceneManager,
-                SceneEventType.UnloadEventCompleted);
-
-            var waitForReceivedMetric = new WaitForEventMetricValues<SceneEventMetric>(
-                ClientMetrics.Dispatcher,
-                NetworkMetricTypes.SceneEventReceived,
-                metric => metric.SceneEventType.Equals(SceneEventType.UnloadEventCompleted.ToString()));
-
-            // Unload the scene to trigger the messages
-            StartServerUnloadScene();
-
-            // Wait for the scene to unload locally
-            yield return waitForServerUnloadComplete.Wait();
-            Assert.IsTrue(waitForServerUnloadComplete.Done);
-
-            // Now wait for the metric to be emitted when the message is received
-            yield return waitForReceivedMetric.WaitForMetricsReceived();
-
-            var receivedMetrics = waitForReceivedMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, receivedMetrics.Count);
-            var receivedMetric = receivedMetrics.First();
-
-            Assert.AreEqual(SceneEventType.UnloadEventCompleted.ToString(), receivedMetric.SceneEventType);
-            Assert.AreEqual(Server.LocalClientId, receivedMetric.Connection.Id);
-            Assert.AreEqual(k_SimpleSceneName, receivedMetric.SceneName);
-        }
-
-        [UnityTest]
-        public IEnumerator TestS2CSyncSent()
-        {
-            // Register a callback so we can notify the test when the client and server have completed their sync
-            var waitForServerSyncComplete = new WaitForSceneEvent(
-                m_ServerNetworkSceneManager,
-                SceneEventType.SynchronizeComplete);
-
-            var waitForSentMetric = new WaitForEventMetricValues<SceneEventMetric>(
-                ServerMetrics.Dispatcher,
-                NetworkMetricTypes.SceneEventSent,
-                metric => metric.SceneEventType.Equals(SceneEventType.Synchronize.ToString()));
-
-            // To trigger a sync, we need to connect a new client to an already started server, so create a client
-            var newClient = CreateAndStartClient();
-
-            // Wait for the metric to be emitted when the server sends the sync message back to the client
-            yield return waitForSentMetric.WaitForMetricsReceived();
-
-            var sentMetrics = waitForSentMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, sentMetrics.Count);
-
-            // Although the metric should have been emitted, wait for the sync to complete
-            // as the client/server IDs have not been fully initialized until this is done.
-            yield return waitForServerSyncComplete.Wait();
-            Assert.IsTrue(waitForServerSyncComplete.Done);
-
-            var sentMetric = sentMetrics.First();
-
-            Assert.AreEqual(SceneEventType.Synchronize.ToString(), sentMetric.SceneEventType);
-            Assert.AreEqual(newClient.LocalClientId, sentMetric.Connection.Id);
-
-            NetcodeIntegrationTestHelpers.StopOneClient(newClient);
-        }
-
-        [UnityTest]
-        public IEnumerator TestS2CSyncReceived()
-        {
-            // To trigger a sync, we need to connect a new client to an already started server, so create a client
-            var newClient = CreateAndStartClient();
-
-            // Now the client is started we can grab the NetworkMetrics field from it
-            var newClientMetrics = newClient.NetworkMetrics as NetworkMetrics;
-
-            var waitForReceivedMetric = new WaitForEventMetricValues<SceneEventMetric>(
-                newClientMetrics.Dispatcher,
-                NetworkMetricTypes.SceneEventReceived,
-                metric => metric.SceneEventType.Equals(SceneEventType.Synchronize.ToString()));
-
-            // Wait for the metric to be emitted when the message is received on the client from the server
-            yield return waitForReceivedMetric.WaitForMetricsReceived();
-
-            var receivedMetrics = waitForReceivedMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, receivedMetrics.Count);
-            var receivedMetric = receivedMetrics.First();
-
-            Assert.AreEqual(SceneEventType.Synchronize.ToString(), receivedMetric.SceneEventType);
-            Assert.AreEqual(Server.LocalClientId, receivedMetric.Connection.Id);
-
-            NetcodeIntegrationTestHelpers.StopOneClient(newClient);
-        }
-
-        [UnityTest]
-        public IEnumerator TestC2SSyncCompleteSent()
-        {
-            // To trigger a sync, we need to connect a new client to an already started server, so create a client
-            var newClient = CreateAndStartClient();
-
-            // Now the client is started we can grab the NetworkMetrics field from it
-            var newClientMetrics = newClient.NetworkMetrics as NetworkMetrics;
-
-            var waitForSentMetric = new WaitForEventMetricValues<SceneEventMetric>(
-                newClientMetrics.Dispatcher,
-                NetworkMetricTypes.SceneEventSent,
-                metric => metric.SceneEventType.Equals(SceneEventType.SynchronizeComplete.ToString()));
-
-            // Wait for the metric to be emitted when the client has completed the sync locally and sends the message
-            // to the server
-            yield return waitForSentMetric.WaitForMetricsReceived();
-
-            var sentMetrics = waitForSentMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, sentMetrics.Count);
-            var sentMetric = sentMetrics.First();
-
-            Assert.AreEqual(SceneEventType.SynchronizeComplete.ToString(), sentMetric.SceneEventType);
-            Assert.AreEqual(Server.LocalClientId, sentMetric.Connection.Id);
-
-            NetcodeIntegrationTestHelpers.StopOneClient(newClient);
-        }
-
-        [UnityTest]
-        public IEnumerator TestC2SSyncCompleteReceived()
-        {
-            var waitForReceivedMetric = new WaitForEventMetricValues<SceneEventMetric>(
-                ServerMetrics.Dispatcher,
-                NetworkMetricTypes.SceneEventReceived,
-                metric => metric.SceneEventType.Equals(SceneEventType.SynchronizeComplete.ToString()));
-
-            // To trigger a sync, we need to connect a new client to an already started server, so create a client
-            var newClient = CreateAndStartClient();
-
-            // Wait for the metric to be emitted when the client has completed the sync locally and the message is
-            // received on the server
-            yield return waitForReceivedMetric.WaitForMetricsReceived();
-
-            var receivedMetrics = waitForReceivedMetric.AssertMetricValuesHaveBeenFound();
-            Assert.AreEqual(1, receivedMetrics.Count);
-
-            var receivedMetric = receivedMetrics.First();
-
-            Assert.AreEqual(SceneEventType.SynchronizeComplete.ToString(), receivedMetric.SceneEventType);
-            Assert.AreEqual(newClient.LocalClientId, receivedMetric.Connection.Id);
-
-            NetcodeIntegrationTestHelpers.StopOneClient(newClient);
-        }
-
-        // Create a new client to connect to an already started server to trigger a server sync.
-        private NetworkManager CreateAndStartClient()
-        {
-            NetcodeIntegrationTestHelpers.CreateNewClients(1, out var newClients);
-            var newClient = newClients[0];
-
-            // Set up the client so it has the same NetworkConfig as the server
-            newClient.NetworkConfig.EnableSceneManagement = true;
-            newClient.NetworkConfig.PlayerPrefab = m_PlayerPrefab;
-
-            // Start the client to trigger the sync
-            newClient.StartClient();
-
-            return newClient;
-        }
-
-        private void StartServerLoadScene()
-        {
-            var loadSceneResult = m_ServerNetworkSceneManager.LoadScene(k_SimpleSceneName, LoadSceneMode.Additive);
-            Assert.AreEqual(SceneEventProgressStatus.Started, loadSceneResult);
-        }
-
-        private void StartServerUnloadScene()
-        {
-            if (m_LoadedScene.IsValid() && m_LoadedScene.isLoaded)
-            {
-                var unloadSceneResult = m_ServerNetworkSceneManager.UnloadScene(m_LoadedScene);
-                Assert.AreEqual(SceneEventProgressStatus.Started, unloadSceneResult);
-            }
-        }
-
-        // Loads a scene, then waits for the client to notify the server
-        // that it has finished loading the scene, as this is the last thing that happens.
-        private IEnumerator LoadTestScene(string sceneName, bool waitForClient = false)
-        {
-            var sceneLoadComplete = false;
-            m_ClientNetworkSceneManager.OnSceneEvent += sceneEvent =>
-            {
-                var clientIdToWaitFor = waitForClient == true ? m_ClientNetworkManagers[0].LocalClientId : m_ServerNetworkManager.LocalClientId;
-                if (sceneEvent.SceneEventType == SceneEventType.LoadComplete)
-                {
-                    sceneLoadComplete = true;
-                }
-            };
-
-            var loadSceneResult = m_ServerNetworkSceneManager.LoadScene(sceneName, LoadSceneMode.Additive);
-            Assert.AreEqual(SceneEventProgressStatus.Started, loadSceneResult);
-
-            yield return WaitForCondition(() => sceneLoadComplete);
-
-            Assert.IsTrue(sceneLoadComplete);
-        }
-
-        // Unloads a loaded scene. If the scene is not loaded, this is a no-op
-        private IEnumerator UnloadTestScene(Scene scene)
-        {
-            if (scene.isLoaded)
-            {
-                // This is called after everything is done and destroyed.
-                // Just use the normal scene manager to unload the scene.
-                var asyncResults = SceneManager.UnloadSceneAsync(scene);
-                yield return WaitForCondition(() => asyncResults.isDone);
-
-            }
-        }
-
-        private static IEnumerator WaitForCondition(Func<bool> condition)
-        {
-            yield return WaitForConditionOrTimeOut(condition);
-        }
-
-        // Registers a callback for the client's NetworkSceneManager which will synchronize the scene handles from
-        // the server to the client. This only needs to be done in multi-instance unit tests as the client and the
-        // server share a (Unity) SceneManager.
-        private void RegisterLoadedSceneCallback(SceneEvent sceneEvent)
-        {
-            if (!sceneEvent.SceneEventType.Equals(SceneEventType.Load) || sceneEvent.ClientId != m_ServerNetworkManager.LocalClientId)
-            {
-                return;
-            }
-
-            m_LoadedScene = SceneManager.GetSceneByName(sceneEvent.SceneName);
-        }
-
-        private class WaitForSceneEvent
-        {
-            public WaitForSceneEvent(NetworkSceneManager sceneManager, SceneEventType sceneEventType)
-            {
-                sceneManager.OnSceneEvent += sceneEvent =>
-                {
-                    if (sceneEvent.SceneEventType == sceneEventType)
-                    {
-                        Done = true;
-                    }
-                };
-            }
-
-            public bool Done { get; private set; }
-
-            public IEnumerator Wait()
-            {
-                yield return WaitForCondition(() => Done);
-            }
-        }
-    }
-}
diff --git a/testproject-tools-integration/Assets/Tests/Runtime/SceneEventTests.cs.meta b/testproject-tools-integration/Assets/Tests/Runtime/SceneEventTests.cs.meta
deleted file mode 100644
index fc0aaa1169..0000000000
--- a/testproject-tools-integration/Assets/Tests/Runtime/SceneEventTests.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 9ec83c68fbe2bf54896596ac2ca71f26
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/testproject-tools-integration/Assets/Tests/Runtime/testproject.toolsintegration.runtimetests.asmdef b/testproject-tools-integration/Assets/Tests/Runtime/testproject.toolsintegration.runtimetests.asmdef
deleted file mode 100644
index c076a6d6a3..0000000000
--- a/testproject-tools-integration/Assets/Tests/Runtime/testproject.toolsintegration.runtimetests.asmdef
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-    "name": "TestProject.ToolsIntegration.RuntimeTests",
-    "rootNamespace": "TestProject.ToolsIntegration.RuntimeTests",
-    "references": [
-        "Unity.Netcode.Runtime",
-        "Unity.Multiplayer.MetricTypes",
-        "Unity.Multiplayer.NetStats",
-        "Unity.Multiplayer.Tools.MetricTypes",
-        "Unity.Multiplayer.Tools.NetStats",
-        "Unity.Collections",
-        "Unity.Netcode.TestHelpers.Runtime"
-    ],
-    "optionalUnityReferences": [
-        "TestAssemblies"
-    ],
-    "versionDefines": [
-        {
-            "name": "com.unity.multiplayer.tools",
-            "expression": "",
-            "define": "MULTIPLAYER_TOOLS"
-        },
-        {
-            "name": "Unity",
-            "expression": "(0,2022.2.0a5)",
-            "define": "UNITY_UNET_PRESENT"
-        },
-        {
-            "name": "com.unity.multiplayer.tools",
-            "expression": "1.0.0-pre.4",
-            "define": "MULTIPLAYER_TOOLS_1_0_0_PRE_4"
-        }
-    ]
-}
\ No newline at end of file
diff --git a/testproject-tools-integration/Packages/manifest.json b/testproject-tools-integration/Packages/manifest.json
index a3f60bc15a..41bfa5ac67 100644
--- a/testproject-tools-integration/Packages/manifest.json
+++ b/testproject-tools-integration/Packages/manifest.json
@@ -1,13 +1,13 @@
 {
   "dependencies": {
-    "com.unity.ai.navigation": "2.0.5",
-    "com.unity.ide.rider": "3.0.34",
-    "com.unity.ide.visualstudio": "2.0.22",
-    "com.unity.multiplayer.center": "1.0.0",
-    "com.unity.multiplayer.tools": "2.2.3",
+    "com.unity.ai.navigation": "2.0.7",
+    "com.unity.ide.rider": "3.0.36",
+    "com.unity.ide.visualstudio": "2.0.23",
+    "com.unity.multiplayer.center": "1.0.0",    
+    "com.unity.multiplayer.tools": "https://github.com/Unity-Technologies/com.unity.multiplayer.tools.git?path=com.unity.multiplayer.tools#chore/migrate-metrics-tests-to-tools-repository",
     "com.unity.netcode.gameobjects": "file:../../com.unity.netcode.gameobjects",
-    "com.unity.test-framework": "1.4.6",
-    "com.unity.test-framework.performance": "3.0.3",
+    "com.unity.test-framework": "1.5.1",
+    "com.unity.test-framework.performance": "3.1.0",
     "com.unity.modules.accessibility": "1.0.0",
     "com.unity.modules.ai": "1.0.0",
     "com.unity.modules.androidjni": "1.0.0",
diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics.meta b/testproject/Assets/Samples/Physics/PhysicsSample.meta
similarity index 77%
rename from com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics.meta
rename to testproject/Assets/Samples/Physics/PhysicsSample.meta
index 1e3c81867c..f8fbca94fa 100644
--- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/Metrics.meta
+++ b/testproject/Assets/Samples/Physics/PhysicsSample.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: ebacdb7d8cb876a43b4a908dd6d83aa9
+guid: 9e48167ebb6bd5540a1b9eb1cf359775
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/testproject/Assets/Samples/Physics/PhysicsSample/LightingData.asset b/testproject/Assets/Samples/Physics/PhysicsSample/LightingData.asset
new file mode 100644
index 0000000000..6866c0e915
Binary files /dev/null and b/testproject/Assets/Samples/Physics/PhysicsSample/LightingData.asset differ
diff --git a/testproject-tools-integration/Assets/Tests/Runtime/testproject.toolsintegration.runtimetests.asmdef.meta b/testproject/Assets/Samples/Physics/PhysicsSample/LightingData.asset.meta
similarity index 52%
rename from testproject-tools-integration/Assets/Tests/Runtime/testproject.toolsintegration.runtimetests.asmdef.meta
rename to testproject/Assets/Samples/Physics/PhysicsSample/LightingData.asset.meta
index daef7e0b6a..7d022180a5 100644
--- a/testproject-tools-integration/Assets/Tests/Runtime/testproject.toolsintegration.runtimetests.asmdef.meta
+++ b/testproject/Assets/Samples/Physics/PhysicsSample/LightingData.asset.meta
@@ -1,7 +1,8 @@
 fileFormatVersion: 2
-guid: e99721187226b3c4da365db28d179f8b
-AssemblyDefinitionImporter:
+guid: 29d2c44a6e01063478e1b9a607c770c6
+NativeFormatImporter:
   externalObjects: {}
+  mainObjectFileID: 112000000
   userData: 
   assetBundleName: 
   assetBundleVariant: 
diff --git a/testproject/Assets/Samples/Physics/PhysicsSample/ReflectionProbe-0.exr b/testproject/Assets/Samples/Physics/PhysicsSample/ReflectionProbe-0.exr
new file mode 100644
index 0000000000..73bac30ef3
Binary files /dev/null and b/testproject/Assets/Samples/Physics/PhysicsSample/ReflectionProbe-0.exr differ
diff --git a/testproject/Assets/Samples/Physics/PhysicsSample/ReflectionProbe-0.exr.meta b/testproject/Assets/Samples/Physics/PhysicsSample/ReflectionProbe-0.exr.meta
new file mode 100644
index 0000000000..7803ed084d
--- /dev/null
+++ b/testproject/Assets/Samples/Physics/PhysicsSample/ReflectionProbe-0.exr.meta
@@ -0,0 +1,143 @@
+fileFormatVersion: 2
+guid: f2b15ba7b672e4846bd653be20c7d489
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 13
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+    flipGreenChannel: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMipmapLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 1
+  seamlessCubemap: 1
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 2
+    aniso: 0
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 2
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  swizzle: 50462976
+  cookieLightType: 0
+  platformSettings:
+  - serializedVersion: 4
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 100
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 4
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 4
+    buildTarget: WebGL
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 4
+    buildTarget: WindowsStoreApps
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    customData: 
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    spriteCustomMetadata:
+      entries: []
+    nameFileIdTable: {}
+  mipmapLimitGroupName: 
+  pSDRemoveMatte: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics.meta b/testproject/Assets/Scenes/SampleScene.meta
similarity index 77%
rename from com.unity.netcode.gameobjects/Tests/Runtime/Metrics.meta
rename to testproject/Assets/Scenes/SampleScene.meta
index 11b63dac9f..3c1200b671 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics.meta
+++ b/testproject/Assets/Scenes/SampleScene.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 4cd7fa97c73f3674b9cce18b1e0a6874
+guid: c07594ceda5cd9d4887aa653a6dc5a05
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/testproject/Assets/Scenes/SampleScene/LightingData.asset b/testproject/Assets/Scenes/SampleScene/LightingData.asset
new file mode 100644
index 0000000000..fd4cd58d9a
Binary files /dev/null and b/testproject/Assets/Scenes/SampleScene/LightingData.asset differ
diff --git a/testproject/Assets/Scenes/SampleScene/LightingData.asset.meta b/testproject/Assets/Scenes/SampleScene/LightingData.asset.meta
new file mode 100644
index 0000000000..53d1892097
--- /dev/null
+++ b/testproject/Assets/Scenes/SampleScene/LightingData.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6c6756b3d6aa50248b97daa6cef80753
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 112000000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/testproject/Assets/Scenes/SampleScene/ReflectionProbe-0.exr b/testproject/Assets/Scenes/SampleScene/ReflectionProbe-0.exr
new file mode 100644
index 0000000000..73bac30ef3
Binary files /dev/null and b/testproject/Assets/Scenes/SampleScene/ReflectionProbe-0.exr differ
diff --git a/testproject/Assets/Scenes/SampleScene/ReflectionProbe-0.exr.meta b/testproject/Assets/Scenes/SampleScene/ReflectionProbe-0.exr.meta
new file mode 100644
index 0000000000..d558288481
--- /dev/null
+++ b/testproject/Assets/Scenes/SampleScene/ReflectionProbe-0.exr.meta
@@ -0,0 +1,143 @@
+fileFormatVersion: 2
+guid: 0472d52de3d600846983f39d2f8663f9
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 13
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+    flipGreenChannel: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMipmapLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 1
+  seamlessCubemap: 1
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 2
+    aniso: 0
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 2
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  swizzle: 50462976
+  cookieLightType: 0
+  platformSettings:
+  - serializedVersion: 4
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 100
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 4
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 4
+    buildTarget: WebGL
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 4
+    buildTarget: WindowsStoreApps
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    customData: 
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    spriteCustomMetadata:
+      entries: []
+    nameFileIdTable: {}
+  mipmapLimitGroupName: 
+  pSDRemoveMatte: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/testproject-tools-integration/Assets/Tests/Runtime.meta b/testproject/Assets/Scenes/ZooSam.meta
similarity index 77%
rename from testproject-tools-integration/Assets/Tests/Runtime.meta
rename to testproject/Assets/Scenes/ZooSam.meta
index 09d3d9f693..63a2788243 100644
--- a/testproject-tools-integration/Assets/Tests/Runtime.meta
+++ b/testproject/Assets/Scenes/ZooSam.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: c6826f5447d670a4591fb855ae4a94e6
+guid: 32fb0648e881ae843a439b0ca686d3a6
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/testproject/Assets/Scenes/ZooSam/LightingData.asset b/testproject/Assets/Scenes/ZooSam/LightingData.asset
new file mode 100644
index 0000000000..635239ea06
Binary files /dev/null and b/testproject/Assets/Scenes/ZooSam/LightingData.asset differ
diff --git a/testproject/Assets/Scenes/ZooSam/LightingData.asset.meta b/testproject/Assets/Scenes/ZooSam/LightingData.asset.meta
new file mode 100644
index 0000000000..7b0b92350d
--- /dev/null
+++ b/testproject/Assets/Scenes/ZooSam/LightingData.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4ac3c6a6e77b0234ab114d3c79575b8c
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 112000000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/testproject/Assets/Scenes/ZooSam/ReflectionProbe-0.exr b/testproject/Assets/Scenes/ZooSam/ReflectionProbe-0.exr
new file mode 100644
index 0000000000..0d310ee3eb
Binary files /dev/null and b/testproject/Assets/Scenes/ZooSam/ReflectionProbe-0.exr differ
diff --git a/testproject/Assets/Scenes/ZooSam/ReflectionProbe-0.exr.meta b/testproject/Assets/Scenes/ZooSam/ReflectionProbe-0.exr.meta
new file mode 100644
index 0000000000..34adcde9d6
--- /dev/null
+++ b/testproject/Assets/Scenes/ZooSam/ReflectionProbe-0.exr.meta
@@ -0,0 +1,143 @@
+fileFormatVersion: 2
+guid: 138192721c6fad2409fc5c03d42e5a6d
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 13
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+    flipGreenChannel: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMipmapLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 1
+  seamlessCubemap: 1
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 2
+    aniso: 0
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 2
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  swizzle: 50462976
+  cookieLightType: 0
+  platformSettings:
+  - serializedVersion: 4
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 100
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 4
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 4
+    buildTarget: WebGL
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 4
+    buildTarget: WindowsStoreApps
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    customData: 
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    spriteCustomMetadata:
+      entries: []
+    nameFileIdTable: {}
+  mipmapLimitGroupName: 
+  pSDRemoveMatte: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/testproject/Assets/Tests/Editor/TestProject.Editor.Tests.asmdef b/testproject/Assets/Tests/Editor/TestProject.Editor.Tests.asmdef
new file mode 100644
index 0000000000..51aa4685de
--- /dev/null
+++ b/testproject/Assets/Tests/Editor/TestProject.Editor.Tests.asmdef
@@ -0,0 +1,25 @@
+{
+    "name": "TestProject.Editor.Tests",
+    "rootNamespace": "TestProject.EditorTests",
+    "references": [
+        "Unity.Netcode.Runtime",
+        "Unity.Netcode.Editor",
+        "UnityEngine.TestRunner",
+        "UnityEditor.TestRunner"
+    ],
+    "includePlatforms": [
+        "Editor"
+    ],
+    "excludePlatforms": [],
+    "allowUnsafeCode": false,
+    "overrideReferences": true,
+    "precompiledReferences": [
+        "nunit.framework.dll"
+    ],
+    "autoReferenced": false,
+    "defineConstraints": [
+        "UNITY_INCLUDE_TESTS"
+    ],
+    "versionDefines": [],
+    "noEngineReferences": false
+}
\ No newline at end of file
diff --git a/testproject/Assets/Tests/Editor/testproject.editortests.asmdef.meta b/testproject/Assets/Tests/Editor/TestProject.Editor.Tests.asmdef.meta
similarity index 100%
rename from testproject/Assets/Tests/Editor/testproject.editortests.asmdef.meta
rename to testproject/Assets/Tests/Editor/TestProject.Editor.Tests.asmdef.meta
diff --git a/testproject/Assets/Tests/Editor/testproject.editortests.asmdef b/testproject/Assets/Tests/Editor/testproject.editortests.asmdef
deleted file mode 100644
index 9495d3cc11..0000000000
--- a/testproject/Assets/Tests/Editor/testproject.editortests.asmdef
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "name": "TestProject.EditorTests",
-    "rootNamespace": "TestProject.EditorTests",
-    "references": [
-        "Unity.Netcode.Runtime",
-        "Unity.Netcode.Editor"
-    ],
-    "optionalUnityReferences": [
-        "TestAssemblies"
-    ],
-    "includePlatforms": [
-        "Editor"
-    ]
-}
\ No newline at end of file
diff --git a/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef b/testproject/Assets/Tests/Runtime/TestProject.Runtime.Tests.asmdef
similarity index 96%
rename from testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef
rename to testproject/Assets/Tests/Runtime/TestProject.Runtime.Tests.asmdef
index 17af49a925..7abd1fb496 100644
--- a/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef
+++ b/testproject/Assets/Tests/Runtime/TestProject.Runtime.Tests.asmdef
@@ -1,5 +1,5 @@
 {
-    "name": "TestProject.RuntimeTests",
+    "name": "TestProject.Runtime.Tests",
     "rootNamespace": "TestProject.RuntimeTests",
     "references": [
         "Unity.Netcode.Runtime",
diff --git a/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef.meta b/testproject/Assets/Tests/Runtime/TestProject.Runtime.Tests.asmdef.meta
similarity index 100%
rename from testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef.meta
rename to testproject/Assets/Tests/Runtime/TestProject.Runtime.Tests.asmdef.meta