diff --git a/.gitignore b/.gitignore
index e934bbe..f04d691 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@ riderModule.iml
.idea
/tools
.vscode
+*.DotSettings.user
\ No newline at end of file
diff --git a/Reactor.Benchmarks/AssetBundleBenchmarks.cs b/Reactor.Benchmarks/AssetBundleBenchmarks.cs
index 1c238dd..ec9d4bc 100644
--- a/Reactor.Benchmarks/AssetBundleBenchmarks.cs
+++ b/Reactor.Benchmarks/AssetBundleBenchmarks.cs
@@ -6,7 +6,8 @@ using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Jobs;
using BepInEx;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
-using Reactor.Extensions;
+using Reactor.Utilities;
+using Reactor.Utilities.Extensions;
using UnityEngine;
namespace Reactor.Benchmarks;
diff --git a/Reactor.Debugger/DebuggerPlugin.cs b/Reactor.Debugger/DebuggerPlugin.cs
index b601747..a0a401a 100644
--- a/Reactor.Debugger/DebuggerPlugin.cs
+++ b/Reactor.Debugger/DebuggerPlugin.cs
@@ -6,7 +6,8 @@ using HarmonyLib;
using Il2CppInterop.Runtime.Attributes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using InnerNet;
-using Reactor.Extensions;
+using Reactor.Utilities.Attributes;
+using Reactor.Utilities.ImGui;
using UnityEngine;
namespace Reactor.Debugger;
diff --git a/Reactor.Debugger/Patches.cs b/Reactor.Debugger/Patches.cs
index d8388a8..1dd62e9 100644
--- a/Reactor.Debugger/Patches.cs
+++ b/Reactor.Debugger/Patches.cs
@@ -1,6 +1,7 @@
using System.Linq;
using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
+using Reactor.Utilities;
using UnityEngine;
namespace Reactor.Debugger;
diff --git a/Reactor.Example/ExamplePlugin.cs b/Reactor.Example/ExamplePlugin.cs
index 3911819..24b8d9f 100644
--- a/Reactor.Example/ExamplePlugin.cs
+++ b/Reactor.Example/ExamplePlugin.cs
@@ -2,9 +2,12 @@
using BepInEx;
using BepInEx.Unity.IL2CPP;
using Il2CppInterop.Runtime.Attributes;
-using Reactor.Extensions;
using Reactor.Networking;
-using Reactor.Networking.MethodRpc;
+using Reactor.Networking.Attributes;
+using Reactor.Networking.Rpc;
+using Reactor.Utilities;
+using Reactor.Utilities.Attributes;
+using Reactor.Utilities.ImGui;
using UnityEngine;
using Random = UnityEngine.Random;
diff --git a/Reactor.Example/ExampleRpc.cs b/Reactor.Example/ExampleRpc.cs
index b068e6e..c60b8ec 100644
--- a/Reactor.Example/ExampleRpc.cs
+++ b/Reactor.Example/ExampleRpc.cs
@@ -1,5 +1,6 @@
using Hazel;
-using Reactor.Networking;
+using Reactor.Networking.Attributes;
+using Reactor.Networking.Rpc;
namespace Reactor.Example;
diff --git a/Reactor.sln b/Reactor.sln
index 1d1945a..11fdc70 100644
--- a/Reactor.sln
+++ b/Reactor.sln
@@ -7,6 +7,13 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reactor.Example", "Reactor.
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reactor.Benchmarks", "Reactor.Benchmarks\Reactor.Benchmarks.csproj", "{99B87307-3AEB-4A6A-BF45-871768308FDD}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Files", "Solution Files", "{4BBF0A80-F6E6-4FDD-ADD0-8CB4F28F88A4}"
+ ProjectSection(SolutionItems) = preProject
+ AmongUs.props = AmongUs.props
+ Directory.Build.props = Directory.Build.props
+ nuget.config = nuget.config
+ EndProjectSection
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reactor.Networking.Shared", "Reactor.Networking.Shared\Reactor.Networking.Shared.csproj", "{1E68CA20-22EB-4E57-B525-81970BE6363D}"
EndProject
Global
diff --git a/Reactor/Compiler/IsUnmanagedAttribute.cs b/Reactor/Compiler/IsUnmanagedAttribute.cs
new file mode 100644
index 0000000..4c137c3
--- /dev/null
+++ b/Reactor/Compiler/IsUnmanagedAttribute.cs
@@ -0,0 +1,12 @@
+// ReSharper disable CheckNamespace
+
+namespace System.Runtime.CompilerServices;
+
+///
+/// This attribute is required by the compiler for the "unmanaged" generic type constraint.
+/// It should be generated automatically, but for whatever reason its not.
+///
+[Obsolete("Do not use directly.", true)]
+internal class IsUnmanagedAttribute : Attribute
+{
+}
diff --git a/Reactor/Extensions/Extensions.cs b/Reactor/Extensions/Extensions.cs
deleted file mode 100644
index 5cfa593..0000000
--- a/Reactor/Extensions/Extensions.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Threading.Tasks;
-using HarmonyLib;
-using Il2CppInterop.Runtime.InteropTypes.Arrays;
-using UnityEngine;
-using UnityEngine.Events;
-using UnityEngine.Networking;
-using UnityEngine.SceneManagement;
-using Il2CppType = Il2CppInterop.Runtime.Il2CppType;
-
-namespace Reactor.Extensions;
-
-///
-/// General utilities
-///
-public static class Extensions
-{
- ///
- /// Adds a delegate to get one notification when a scene has loaded.
- ///
- public static void once_sceneLoaded(Action value)
- {
- UnityAction? unityAction = null;
-
- unityAction = (Action) ((scene, loadMode) =>
- {
- SceneManager.remove_sceneLoaded(unityAction);
- value.Invoke(scene, loadMode);
- });
-
- SceneManager.add_sceneLoaded(unityAction);
- }
-
- ///
- /// Returns random from
- ///
- public static T? Random(this IEnumerable input)
- {
- var list = input as IList ?? input.ToList();
- return list.Count == 0 ? default : list[UnityEngine.Random.Range(0, list.Count)];
- }
-
- ///
- /// Returns the color as a hexadecimal string in the format "RRGGBBAA".
- ///
- /// The color to be converted.
- /// Hexadecimal string representing the color.
- /// https://docs.unity3d.com/ScriptReference/ColorUtility.ToHtmlStringRGBA.html
- public static string ToHtmlStringRGBA(this Color32 color)
- {
- return $"{color.r:X2}{color.g:X2}{color.b:X2}{color.a:X2}";
- }
-
- ///
- public static string ToHtmlStringRGBA(this Color color)
- {
- return ((Color32) color).ToHtmlStringRGBA();
- }
-
- ///
- /// Fully read stream, can be used as workaround for il2cpp streams.
- ///
- public static byte[] ReadFully(this Stream input)
- {
- using (var ms = new MemoryStream())
- {
- input.CopyTo(ms);
- return ms.ToArray();
- }
- }
-
- ///
- /// Sends and return task that finishes on completion.
- ///
- public static Task SendAsync(this UnityWebRequest request)
- {
- var task = new TaskCompletionSource