diff --git a/src/Controller/TinyMCEController.php b/src/Controller/TinyMCEController.php
index e5e8234..51251a8 100644
--- a/src/Controller/TinyMCEController.php
+++ b/src/Controller/TinyMCEController.php
@@ -38,11 +38,11 @@ class TinyMCEController extends ControllerBase {
 
     // Attempt to save the file and the folder if it does not exist.
     if (\Drupal::service('file_system')->prepareDirectory($destinationFolder, FileSystemInterface::CREATE_DIRECTORY)) {
-      $file = file_save_data($data, $destinationFile, FILE_EXISTS_REPLACE);
+      $file = \Drupal::service('file.repository')->writeData($data, $destinationFile, FileSystemInterface::EXISTS_REPLACE);
     }
 
     // Prepare the json output for the editor.
-    $path = file_create_url($destinationFile);
+    $path = \Drupal::service('file_url_generator')->generateAbsoluteString($destinationFile);
     $response['location'] = $path;
 
     return new JsonResponse($response);
diff --git a/tests/src/Functional/TinyMCELoadingTest.php b/tests/src/Functional/TinyMCELoadingTest.php
index c3c3283..00bd055 100644
--- a/tests/src/Functional/TinyMCELoadingTest.php
+++ b/tests/src/Functional/TinyMCELoadingTest.php
@@ -101,11 +101,11 @@ class TinyMCELoadingTest extends BrowserTestBase {
     $hidden_input = $this->xpath('//input[@type="hidden" and contains(@class, "editor")]');
     $this->assertCount(0, $hidden_input, 'A single text format hidden input does not exist on the page.');
     // Verify that TinyMCE glue JS is absent.
-    $this->assertSession()->responseNotContains(drupal_get_path('module', 'tinymce') . '/js/tinymce.js');
+    $this->assertSession()->responseNotContains(\Drupal::service('extension.list.module')->getPath('tinymce') . '/js/tinymce.js');
 
     // On pages where there would never be a text editor, TinyMCE JS is absent.
     $this->drupalGet('user');
-    $this->assertSession()->responseNotContains(drupal_get_path('module', 'tinymce') . '/js/tinymce.js');
+    $this->assertSession()->responseNotContains(\Drupal::service('extension.list.module')->getPath('tinymce') . '/js/tinymce.js');
     $this->drupalLogout();
 
     // The normal user:
diff --git a/tinymce.info.yml b/tinymce.info.yml
index 68acac3..2f424c7 100644
--- a/tinymce.info.yml
+++ b/tinymce.info.yml
@@ -1,6 +1,6 @@
 name: TinyMCE
 description: "The most popular WYSIWYG editor for advanced content editing."
-core_version_requirement: ^8.8 || ^9
+core_version_requirement: ^9.3 || ^10
 type: module
 dependencies:
   - drupal:editor
diff --git a/tinymce.module b/tinymce.module
index 29b0d25..05a2c55 100644
--- a/tinymce.module
+++ b/tinymce.module
@@ -4,7 +4,7 @@
  * @file
  * Integrate the TinyMCE editor (https://www.tiny.cloud/) into Drupal.
  */
-
+use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Url;
 
 /**
@@ -34,7 +34,7 @@ function tinymce_library_info_build() {
 /**
  * Implementation of hook_help().
  */
-function tinymce_help($route_name, \Drupal\Core\Routing\RouteMatchInterface $route_match) {
+function tinymce_help($route_name, RouteMatchInterface $route_match) {
   switch ($route_name) {
     case 'help.page.tinymce' :
       $output = '';
