diff --git a/Editor/Scripts/WorldStorageServerEditor.cs b/Editor/Scripts/WorldStorageServerEditor.cs
new file mode 100644
index 0000000000000000000000000000000000000000..7cbc40498029648bfba9e9db6c6f36cf5f02b6f8
--- /dev/null
+++ b/Editor/Scripts/WorldStorageServerEditor.cs
@@ -0,0 +1,173 @@
+//
+// ARF - Augmented Reality Framework (ETSI ISG ARF)
+//
+// Copyright 2024 ETSI
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Last change: July 2024
+//
+
+using System.Collections;
+using UnityEngine;
+using UnityEditor;
+
+using ETSI.ARF.OpenAPI;
+using ETSI.ARF.WorldStorage;
+using ETSI.ARF.WorldStorage.REST;
+
+[CustomEditor(typeof(WorldStorageServer))]
+public class WorldStorageServerEditor : Editor
+{
+    WorldStorageServer server;
+
+    private string state = "";
+    private string version = "";
+
+    private string test = "";
+
+    private Queue handleResponseQueue = new Queue();
+
+    private ResponseObject<string> pendingTest = null;
+    private ResponseObject<string> pendingState = null;
+    private ResponseObject<string> pendingVersion = null;
+
+    public void OnEnable()
+    {
+        server = (WorldStorageServer)target;
+    }
+
+    public override void OnInspectorGUI()
+    {
+        serializedObject.Update();
+
+        DrawDefaultInspector();
+        EditorGUILayout.Space();
+
+        if (GUILayout.Button("Test server"))
+        {
+            TestPing();
+        }
+        EditorGUILayout.LabelField("Test Response", test);
+
+        EditorGUILayout.Space();
+
+        if (GUILayout.Button("Query server"))
+        {
+            QueryServer();
+        }
+
+        EditorGUILayout.LabelField("Server State", state);
+        EditorGUILayout.LabelField("OpenAPI Version", version);
+
+        if (handleResponseQueue.Count > 0)
+        {
+            object o = handleResponseQueue.Dequeue();
+            if (o.Equals(pendingTest))
+            {
+                ResponseObject<string> response = o as ResponseObject<string>;
+                Debug.Log($"Get '{response.result}' from server");
+
+                test = response.result;
+                pendingTest = null;
+                EditorUtility.SetDirty(target);
+            }
+            else if (o.Equals(pendingState))
+            {
+                ResponseObject<string> response = o as ResponseObject<string>;
+                Debug.Log($"Get '{response.result}' from server");
+
+                state = response.result;
+                pendingState = null;
+                EditorUtility.SetDirty(target);
+            }
+            else if (o.Equals(pendingVersion))
+            {
+                ResponseObject<string> response = o as ResponseObject<string>;
+                Debug.Log($"Get '{response.result}' from server");
+
+                version = response.result;
+                pendingVersion = null;
+                EditorUtility.SetDirty(target);
+            }
+            else
+            {
+                Debug.Log("Unsupported response!");
+            }
+        }
+    }
+
+    public override bool RequiresConstantRepaint()
+    {
+        return handleResponseQueue.Count > 0;
+    }
+
+    void OnSceneGUI()
+    {
+        Debug.Log("OnSceneGUI");
+    }
+
+    private void TestPing()
+    {
+        test = "";
+        EditorUtility.SetDirty(target);
+
+        if (server == null)
+        {
+            Debug.LogError("No server defined!");
+            return;
+        }
+
+        //string response = AdminRequest.PingSync(server);
+        //EditorUtility.DisplayDialog("Test Server", $"Get '{response}' from server", "OK");
+
+        if (pendingTest != null)
+        {
+            pendingTest.Cancel();
+        }
+
+        pendingTest = AdminRequest.PingAsync(server, (response) =>
+        {
+            handleResponseQueue.Enqueue(response);
+            Debug.Log($"Request Time: { response.requestTime.ToLongTimeString() } / Total Time: { response.DeltaTime.TotalMilliseconds }ms\n\n<b>Content:</b>\n{ response.result }");
+        });
+        
+        Debug.Log("Starting request @ time: " + pendingTest.requestTime.ToLongTimeString() + "...");
+    }
+
+    private void QueryServer()
+    {
+        version = "";
+        state = "";
+
+        if (pendingState != null)
+        {
+            pendingState.Cancel();
+        }
+        
+        pendingState = AdminRequest.AdminAsync(server, (response) =>
+        {
+            handleResponseQueue.Enqueue(response);
+        });
+
+        if (pendingVersion != null)
+        {
+            pendingVersion.Cancel();
+        }
+
+        pendingVersion = AdminRequest.VersionAsync(server, (response) =>
+        {
+            handleResponseQueue.Enqueue(response);
+        });
+    }
+}
\ No newline at end of file
diff --git a/Editor/Scripts/WorldStorageServerEditor.cs.meta b/Editor/Scripts/WorldStorageServerEditor.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..058d2a857bd2183bcdf78f1c54a2dc0f51a3b79e
--- /dev/null
+++ b/Editor/Scripts/WorldStorageServerEditor.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e5c9b5bdbeaab49729133f4ac17ded99
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Editor/Scripts/WorldStorageUserEditor.cs b/Editor/Scripts/WorldStorageUserEditor.cs
new file mode 100644
index 0000000000000000000000000000000000000000..7de785fe59606f9192225d86e636ffebbfd16214
--- /dev/null
+++ b/Editor/Scripts/WorldStorageUserEditor.cs
@@ -0,0 +1,51 @@
+//
+// ARF - Augmented Reality Framework (ETSI ISG ARF)
+//
+// Copyright 2022 ETSI
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Last change: June 2022
+//
+
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEditor;
+
+using ETSI.ARF.WorldStorage;
+
+[CustomEditor(typeof(WorldStorageUser))]
+public class WorldStorageUserEditor : Editor
+{
+    WorldStorageUser user;
+
+    public void OnEnable()
+    {
+        user = (WorldStorageUser)target;
+    }
+
+    public override void OnInspectorGUI()
+    {
+        serializedObject.Update();
+
+        DrawDefaultInspector();
+        EditorGUILayout.Space();
+
+        if (GUILayout.Button("Generate New Creator UUID"))
+        {
+            user.UUID = System.Guid.NewGuid().ToString();
+            EditorUtility.SetDirty(target);
+        }
+    }
+}
diff --git a/Editor/Scripts/WorldStorageUserEditor.cs.meta b/Editor/Scripts/WorldStorageUserEditor.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..0efd092c80fd191d3efb66675d2ce091be16a21b
--- /dev/null
+++ b/Editor/Scripts/WorldStorageUserEditor.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 27356e11ca7a946a6a6cf289f784ee18
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: