diff --git a/imagemagick.api.php b/imagemagick.api.php
index 01f2799..51478cb 100644
--- a/imagemagick.api.php
+++ b/imagemagick.api.php
@@ -19,7 +19,7 @@
  * file system to allow processing.
  *
  * @param \Drupal\imagemagick\ImagemagickExecArguments $arguments
- *   The ImageMagick execution arguments object.
+ *   The ImageMagick/GraphicsMagick execution arguments object.
  *
  * @see \Drupal\imagemagick\Plugin\ImageToolkit\ImagemagickToolkit::parseFile()
  * @see \Drupal\imagemagick\ImagemagickExecArguments::getSource()
@@ -37,11 +37,11 @@ function hook_imagemagick_pre_parse_file_alter(\Drupal\imagemagick\ImagemagickEx
  * systems.
  *
  * @param \Drupal\imagemagick\ImagemagickExecArguments $arguments
- *   The ImageMagick execution arguments object.
+ *   The ImageMagick/GraphicsMagick execution arguments object.
  *
+ * @see \Drupal\imagemagick\Plugin\ImageToolkit\ImagemagickToolkit::save()
  * @see \Drupal\imagemagick\ImagemagickExecArguments::getDestination()
  * @see \Drupal\imagemagick\ImagemagickExecArguments::getDestinationLocalPath()
- * @see \Drupal\imagemagick\Plugin\ImageToolkit\ImagemagickToolkit::save()
  */
 function hook_imagemagick_post_save_alter(\Drupal\imagemagick\ImagemagickExecArguments $arguments) {
 }
@@ -63,30 +63,23 @@ function hook_imagemagick_post_save_alter(\Drupal\imagemagick\ImagemagickExecArg
  * ImageMagick automatically converts the target image to the format denoted by
  * the file extension. However, since changing the file extension is not always
  * an option, you can specify an alternative image format via
- * $toolkit->setDestinationFormat('format'), where 'format' is a string
- * denoting an Imagemagick supported format.
+ * $arguments->setDestinationFormat('format'), where 'format' is a string
+ * denoting an Imagemagick supported format, or via
+ * $arguments->setDestinationFormatFromExtension('extension'), where
+ * 'extension' is a string denoting an image file extension.
+ *
  * When the destination format is set, it is passed to ImageMagick's convert
  * binary with the syntax "[format]:[destination]".
  *
  * @param \Drupal\imagemagick\ImagemagickExecArguments $arguments
- *   The ImageMagick execution arguments object.
+ *   The ImageMagick/GraphicsMagick execution arguments object.
  * @param string $command
- *   The ImageMagick binary being called.
+ *   The ImageMagick/GraphicsMagick command being called.
  *
  * @see http://www.imagemagick.org/script/command-line-processing.php#output
  * @see http://www.imagemagick.org/Usage/files/#save
  *
- * @see \Drupal\imagemagick\ImagemagickExecArguments::add()
- * @see \Drupal\imagemagick\ImagemagickExecArguments::find()
- * @see \Drupal\imagemagick\ImagemagickExecArguments::remove()
- * @see \Drupal\imagemagick\ImagemagickExecArguments::reset()
- * @see \Drupal\imagemagick\ImagemagickExecArguments::getSource()
- * @see \Drupal\imagemagick\ImagemagickExecArguments::setSourceLocalPath()
- * @see \Drupal\imagemagick\ImagemagickExecArguments::getSourceLocalPath()
- * @see \Drupal\imagemagick\ImagemagickExecArguments::getDestination()
- * @see \Drupal\imagemagick\ImagemagickExecArguments::setDestinationLocalPath()
- * @see \Drupal\imagemagick\ImagemagickExecArguments::getDestinationLocalPath()
- * @see \Drupal\imagemagick\Plugin\ImageToolkit\ImagemagickToolkit::arguments()
+ * @see \Drupal\imagemagick\ImagemagickExecArguments
  * @see \Drupal\imagemagick\Plugin\ImageToolkit\ImagemagickToolkit::convert()
  * @see \Drupal\imagemagick\Plugin\FileMetadata\ImagemagickIdentify::identify()
  */
diff --git a/imagemagick.services.yml b/imagemagick.services.yml
index 5a42754..87e2e3f 100644
--- a/imagemagick.services.yml
+++ b/imagemagick.services.yml
@@ -4,7 +4,7 @@ services:
     arguments: ['@cache.default', '@imagemagick.mime_type_mapper', '@config.factory', '@config.typed']
   imagemagick.exec_manager:
     class: Drupal\imagemagick\ImagemagickExecManager
-    arguments: ['@logger.channel.image', '@config.factory', '@app.root', '@current_user']
+    arguments: ['@logger.channel.image', '@config.factory', '@app.root', '@current_user', '@imagemagick.format_mapper', '@module_handler']
   imagemagick.mime_type_mapper:
     class: Drupal\imagemagick\ImagemagickMimeTypeMapper
     arguments: ['@file.mime_type.guesser.extension']
diff --git a/src/ImagemagickExecArguments.php b/src/ImagemagickExecArguments.php
index 21542c2..ade3074 100644
--- a/src/ImagemagickExecArguments.php
+++ b/src/ImagemagickExecArguments.php
@@ -463,7 +463,20 @@ class ImagemagickExecArguments {
    * @return $this
    */
   public function setSourceFormat($format) {
-    $this->sourceFormat = $format;
+    $this->sourceFormat = $this->execManager->getFormatMapper()->isFormatEnabled($format) ? $format : '';
+    return $this;
+  }
+
+  /**
+   * Sets the source image format from an image file extension.
+   *
+   * @param string $extension
+   *   The image file extension.
+   *
+   * @return $this
+   */
+  public function setSourceFormatFromExtension($extension) {
+    $this->sourceFormat = $this->execManager->getFormatMapper()->getFormatFromExtension($extension) ?: '';
     return $this;
   }
 
@@ -591,6 +604,23 @@ class ImagemagickExecArguments {
   }
 
   /**
+   * Sets the image destination format from an image file extension.
+   *
+   * When set, it is passed to the convert binary in the syntax
+   * "[format]:[destination]", where [format] is a string denoting an
+   * ImageMagick's image format.
+   *
+   * @param string $extension
+   *   The destination image file extension.
+   *
+   * @return $this
+   */
+  public function setDestinationFormatFromExtension($extension) {
+    $this->destinationFormat = $this->execManager->getFormatMapper()->getFormatFromExtension($extension) ?: '';
+    return $this;
+  }
+
+  /**
    * Gets the image destination format.
    *
    * When set, it is passed to the convert binary in the syntax
diff --git a/src/ImagemagickExecManager.php b/src/ImagemagickExecManager.php
index 4d93975..7439506 100644
--- a/src/ImagemagickExecManager.php
+++ b/src/ImagemagickExecManager.php
@@ -4,6 +4,7 @@ namespace Drupal\imagemagick;
 
 use Drupal\Component\Utility\Timer;
 use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Session\AccountProxyInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Psr\Log\LoggerInterface;
@@ -59,6 +60,20 @@ class ImagemagickExecManager implements ImagemagickExecManagerInterface {
   protected $configFactory;
 
   /**
+   * The module handler service.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * The format mapper service.
+   *
+   * @var \Drupal\imagemagick\ImagemagickFormatMapperInterface
+   */
+  protected $formatMapper;
+
+  /**
    * Constructs an ImagemagickExecManager object.
    *
    * @param \Psr\Log\LoggerInterface $logger
@@ -69,16 +84,46 @@ class ImagemagickExecManager implements ImagemagickExecManagerInterface {
    *   The app root.
    * @param \Drupal\Core\Session\AccountProxyInterface $current_user
    *   The current user.
+   * @param \Drupal\imagemagick\ImagemagickFormatMapperInterface $format_mapper
+   *   The format mapper service.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler service.
    */
-  public function __construct(LoggerInterface $logger, ConfigFactoryInterface $config_factory, $app_root, AccountProxyInterface $current_user) {
+  public function __construct(LoggerInterface $logger, ConfigFactoryInterface $config_factory, $app_root, AccountProxyInterface $current_user, ImagemagickFormatMapperInterface $format_mapper, ModuleHandlerInterface $module_handler) {
     $this->logger = $logger;
     $this->configFactory = $config_factory;
     $this->appRoot = $app_root;
     $this->currentUser = $current_user;
+    $this->formatMapper = $format_mapper;
+    $this->moduleHandler = $module_handler;
     $this->isWindows = substr(PHP_OS, 0, 3) === 'WIN';
   }
 
   /**
+   * Returns the format mapper.
+   *
+   * @return \Drupal\imagemagick\ImagemagickFormatMapperInterface
+   *   The format mapper service.
+   *
+   * @todo in 8.x-3.0, add this method to the interface.
+   */
+  public function getFormatMapper() {
+    return $this->formatMapper;
+  }
+
+  /**
+   * Returns the module handler.
+   *
+   * @return \Drupal\Core\Extension\ModuleHandlerInterface
+   *   The module handler service.
+   *
+   * @todo in 8.x-3.0, add this method to the interface.
+   */
+  public function getModuleHandler() {
+    return $this->moduleHandler;
+  }
+
+  /**
    * Sets the execution timeout (max. runtime).
    *
    * To disable the timeout, set this value to null.
diff --git a/src/Plugin/ImageToolkit/ImagemagickToolkit.php b/src/Plugin/ImageToolkit/ImagemagickToolkit.php
index 0d31e39..53de471 100644
--- a/src/Plugin/ImageToolkit/ImagemagickToolkit.php
+++ b/src/Plugin/ImageToolkit/ImagemagickToolkit.php
@@ -187,13 +187,13 @@ class ImagemagickToolkit extends ImageToolkitBase {
       '#group' => 'imagemagick_settings',
     ];
     $options = [
-      'imagemagick' => $this->getPackageLabel('imagemagick'),
-      'graphicsmagick' => $this->getPackageLabel('graphicsmagick'),
+      'imagemagick' => $this->getExecManager()->getPackageLabel('imagemagick'),
+      'graphicsmagick' => $this->getExecManager()->getPackageLabel('graphicsmagick'),
     ];
     $form['suite']['binaries'] = [
       '#type' => 'radios',
       '#title' => $this->t('Suite'),
-      '#default_value' => $this->getPackage(),
+      '#default_value' => $this->getExecManager()->getPackage(),
       '#options' => $options,
       '#required' => TRUE,
       '#description' => $this->t("Select the graphics package to use."),
@@ -207,7 +207,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
       '#description' => $this->t('If needed, the path to the package executables (<kbd>convert</kbd>, <kbd>identify</kbd>, <kbd>gm</kbd>, etc.), <b>including</b> the trailing slash/backslash. For example: <kbd>/usr/bin/</kbd> or <kbd>C:\Program Files\ImageMagick-6.3.4-Q16\</kbd>.'),
     ];
     // Version information.
-    $status = $this->execManager->checkPath($config->get('path_to_binaries'));
+    $status = $this->getExecManager()->checkPath($config->get('path_to_binaries'));
     if (empty($status['errors'])) {
       $version_info = explode("\n", preg_replace('/\r/', '', Html::escape($status['output'])));
     }
@@ -235,7 +235,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
       '#description' => $this->t("@suite formats: %formats<br />Image file extensions: %extensions", [
         '%formats' => implode(', ', $this->formatMapper->getEnabledFormats()),
         '%extensions' => Unicode::strtolower(implode(', ', static::getSupportedExtensions())),
-        '@suite' => $this->getPackageLabel(),
+        '@suite' => $this->getExecManager()->getPackageLabel(),
       ]),
     ];
     // Image formats map.
@@ -255,7 +255,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
     if (empty($status['errors'])) {
       $this->arguments()->add('-list format', ImagemagickExecArguments::PRE_SOURCE);
       $output = NULL;
-      $this->execManager->execute('convert', $this->arguments(), $output);
+      $this->getExecManager()->execute('convert', $this->arguments(), $output);
       $this->arguments()->reset();
       $formats_info = implode('<br />', explode("\n", preg_replace('/\r/', '', Html::escape($output))));
       $form['formats']['list'] = [
@@ -263,7 +263,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
         '#collapsible' => TRUE,
         '#open' => FALSE,
         '#title' => $this->t('Format list'),
-        '#description' => $this->t("Supported image formats returned by executing <kbd>'convert -list format'</kbd>. <b>Note:</b> these are the formats supported by the installed @suite executable, <b>not</b> by the toolkit.<br /><br />", ['@suite' => $this->getPackageLabel()]),
+        '#description' => $this->t("Supported image formats returned by executing <kbd>'convert -list format'</kbd>. <b>Note:</b> these are the formats supported by the installed @suite executable, <b>not</b> by the toolkit.<br /><br />", ['@suite' => $this->getExecManager()->getPackageLabel()]),
       ];
       $form['formats']['list']['list'] = [
         '#markup' => "<pre>" . $formats_info . "</pre>",
@@ -334,7 +334,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
       '#description' => $this->t("The locale to be used to prepare the command passed to executables. The default, <kbd>'en_US.UTF-8'</kbd>, should work in most cases. If that is not available on the server, enter another locale. 'Installed Locales' below provides a list of locales installed on the server."),
     ];
     // Installed locales.
-    $locales = $this->execManager->getInstalledLocales();
+    $locales = $this->getExecManager()->getInstalledLocales();
     $locales_info = implode('<br />', explode("\n", preg_replace('/\r/', '', Html::escape($locales))));
     $form['exec']['installed_locales'] = [
       '#type' => 'details',
@@ -412,6 +412,16 @@ class ImagemagickToolkit extends ImageToolkitBase {
   }
 
   /**
+   * Returns the ImageMagick execution manager service.
+   *
+   * @return \Drupal\imagemagick\ImagemagickExecManagerInterface
+   *   The ImageMagick execution manager service.
+   */
+  public function getExecManager() {
+    return $this->execManager;
+  }
+
+  /**
    * Gets the binaries package in use.
    *
    * @param string $package
@@ -420,9 +430,15 @@ class ImagemagickToolkit extends ImageToolkitBase {
    * @return string
    *   The default package ('imagemagick'|'graphicsmagick'), or the $package
    *   argument.
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ImagemagickExecManagerInterface::getPackage() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function getPackage($package = NULL) {
-    return $this->execManager->getPackage($package);
+    @trigger_error('getPackage() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecManagerInterface::getPackage() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    return $this->getExecManager()->getPackage($package);
   }
 
   /**
@@ -434,9 +450,15 @@ class ImagemagickToolkit extends ImageToolkitBase {
    * @return string
    *   A translated label of the binaries package in use, or the $package
    *   argument.
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ImagemagickExecManagerInterface::getPackageLabel() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function getPackageLabel($package = NULL) {
-    return $this->execManager->getPackageLabel($package);
+    @trigger_error('getPackageLabel() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecManagerInterface::getPackageLabel() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    return $this->getExecManager()->getPackageLabel($package);
   }
 
   /**
@@ -452,9 +474,15 @@ class ImagemagickToolkit extends ImageToolkitBase {
    *   - output: The shell output of 'convert -version', if any.
    *   - errors: A list of error messages indicating if the executable could
    *     not be found or executed.
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ImagemagickExecManagerInterface::checkPath() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function checkPath($path, $package = NULL) {
-    return $this->execManager->checkPath($path, $package);
+    @trigger_error('checkPath() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecManagerInterface::checkPath() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    return $this->getExecManager()->checkPath($path, $package);
   }
 
   /**
@@ -480,7 +508,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
     // it will prevent the entire image toolkit selection form from being
     // submitted.
     if ($form_state->getValue(['image_toolkit']) === 'imagemagick') {
-      $status = $this->execManager->checkPath($form_state->getValue([
+      $status = $this->getExecManager()->checkPath($form_state->getValue([
         'imagemagick', 'suite', 'path_to_binaries',
       ]), $form_state->getValue(['imagemagick', 'suite', 'binaries']));
       if ($status['errors']) {
@@ -549,7 +577,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
    */
   public function setSource($source) {
     parent::setSource($source);
-    $this->arguments->setSource($source);
+    $this->arguments()->setSource($source);
     return $this;
   }
 
@@ -557,7 +585,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
    * {@inheritdoc}
    */
   public function getSource() {
-    return $this->arguments->getSource();
+    return $this->arguments()->getSource();
   }
 
   /**
@@ -565,16 +593,32 @@ class ImagemagickToolkit extends ImageToolkitBase {
    *
    * @return string
    *   A filesystem path.
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ::ensureSourceLocalPath() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function getSourceLocalPath() {
+    @trigger_error('getSourceLocalPath() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ::ensureSourceLocalPath() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    return $this->ensureSourceLocalPath();
+  }
+
+  /**
+   * Ensures that the local filesystem path to the image file exists.
+   *
+   * @return string
+   *   A filesystem path.
+   */
+  public function ensureSourceLocalPath() {
     // If sourceLocalPath is NULL, then ensure it is prepared. This can
     // happen if image was identified via cached metadata: the cached data are
     // available, but the temp file path is not resolved, or even the temp file
     // could be missing if it was copied locally from a remote file system.
-    if (!$this->arguments->getSourceLocalPath() && $this->getSource()) {
+    if (!$this->arguments()->getSourceLocalPath() && $this->getSource()) {
       $this->moduleHandler->alter('imagemagick_pre_parse_file', $this->arguments);
     }
-    return $this->arguments->getSourceLocalPath();
+    return $this->arguments()->getSourceLocalPath();
   }
 
   /**
@@ -584,9 +628,15 @@ class ImagemagickToolkit extends ImageToolkitBase {
    *   A filesystem path.
    *
    * @return $this
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ImagemagickExecArguments::setSourceLocalPath() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function setSourceLocalPath($path) {
-    $this->arguments->setSourceLocalPath($path);
+    @trigger_error('setSourceLocalPath() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::setSourceLocalPath() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    $this->arguments()->setSourceLocalPath($path);
     return $this;
   }
 
@@ -595,9 +645,15 @@ class ImagemagickToolkit extends ImageToolkitBase {
    *
    * @return string
    *   The source image format.
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ImagemagickExecArguments::getSourceFormat() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function getSourceFormat() {
-    return $this->arguments->getSourceFormat();
+    @trigger_error('getSourceFormat() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::getSourceFormat() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    return $this->arguments()->getSourceFormat();
   }
 
   /**
@@ -607,9 +663,15 @@ class ImagemagickToolkit extends ImageToolkitBase {
    *   The image format.
    *
    * @return $this
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ImagemagickExecArguments::setSourceFormat() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function setSourceFormat($format) {
-    $this->arguments->setSourceFormat($this->formatMapper->isFormatEnabled($format) ? $format : '');
+    @trigger_error('setSourceFormat() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::setSourceFormat() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    $this->arguments()->setSourceFormat($format);
     return $this;
   }
 
@@ -620,10 +682,15 @@ class ImagemagickToolkit extends ImageToolkitBase {
    *   The image file extension.
    *
    * @return $this
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ImagemagickExecArguments::setSourceFormatFromExtension() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function setSourceFormatFromExtension($extension) {
-    $format = $this->formatMapper->getFormatFromExtension($extension);
-    $this->arguments->setSourceFormat($format ?: '');
+    @trigger_error('setSourceFormatFromExtension() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::setSourceFormatFromExtension() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    $this->arguments()->setSourceFormatFromExtension($extension);
     return $this;
   }
 
@@ -638,7 +705,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
       if ($this->getSource() !== NULL) {
         $file_md = $this->fileMetadataManager->uri($this->getSource());
         if ($file_md->getLocalTempPath() === NULL) {
-          $file_md->setLocalTempPath($this->getSourceLocalPath());
+          $file_md->setLocalTempPath($this->ensureSourceLocalPath());
         }
         $orientation = $file_md->getMetadata('exif', 'Orientation');
         $this->setExifOrientation(isset($orientation['value']) ? $orientation['value'] : NULL);
@@ -691,9 +758,15 @@ class ImagemagickToolkit extends ImageToolkitBase {
    *
    * @return string
    *   The image destination URI/path.
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ImagemagickExecArguments::getDestination() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function getDestination() {
-    return $this->arguments->getDestination();
+    @trigger_error('getDestination() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::getDestination() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    return $this->arguments()->getDestination();
   }
 
   /**
@@ -703,9 +776,15 @@ class ImagemagickToolkit extends ImageToolkitBase {
    *   The image destination URI/path.
    *
    * @return $this
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ImagemagickExecArguments::setDestination() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function setDestination($destination) {
-    $this->arguments->setDestination($destination);
+    @trigger_error('setDestination() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::setDestination() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    $this->arguments()->setDestination($destination);
     return $this;
   }
 
@@ -714,9 +793,15 @@ class ImagemagickToolkit extends ImageToolkitBase {
    *
    * @return string
    *   A filesystem path.
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ImagemagickExecArguments::getDestinationLocalPath() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function getDestinationLocalPath() {
-    return $this->arguments->getDestinationLocalPath();
+    @trigger_error('getDestinationLocalPath() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::getDestinationLocalPath() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    return $this->arguments()->getDestinationLocalPath();
   }
 
   /**
@@ -726,9 +811,15 @@ class ImagemagickToolkit extends ImageToolkitBase {
    *   A filesystem path.
    *
    * @return $this
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ImagemagickExecArguments::setDestinationLocalPath() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function setDestinationLocalPath($path) {
-    $this->arguments->setDestinationLocalPath($path);
+    @trigger_error('setDestinationLocalPath() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::setDestinationLocalPath() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    $this->arguments()->setDestinationLocalPath($path);
     return $this;
   }
 
@@ -741,9 +832,15 @@ class ImagemagickToolkit extends ImageToolkitBase {
    *
    * @return string
    *   The image destination format.
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ImagemagickExecArguments::getDestinationFormat() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function getDestinationFormat() {
-    return $this->arguments->getDestinationFormat();
+    @trigger_error('getDestinationFormat() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::getDestinationFormat() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    return $this->arguments()->getDestinationFormat();
   }
 
   /**
@@ -757,9 +854,15 @@ class ImagemagickToolkit extends ImageToolkitBase {
    *   The image destination format.
    *
    * @return $this
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ImagemagickExecArguments::setDestinationFormat() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function setDestinationFormat($format) {
-    $this->arguments->setDestinationFormat($this->formatMapper->isFormatEnabled($format) ? $format : '');
+    @trigger_error('setDestinationFormat() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::setDestinationFormat() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    $this->arguments()->setDestinationFormat($this->formatMapper->isFormatEnabled($format) ? $format : '');
     return $this;
   }
 
@@ -774,10 +877,15 @@ class ImagemagickToolkit extends ImageToolkitBase {
    *   The destination image file extension.
    *
    * @return $this
+   *
+   * @deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use
+   *   ImagemagickExecArguments::setDestinationFormatFromExtension() instead.
+   *
+   * @see https://www.drupal.org/project/imagemagick/issues/2938375
    */
   public function setDestinationFormatFromExtension($extension) {
-    $format = $this->formatMapper->getFormatFromExtension($extension);
-    $this->arguments->setDestinationFormat($format ?: '');
+    @trigger_error('setDestinationFormatFromExtension() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::setDestinationFormatFromExtension() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
+    $this->arguments()->setDestinationFormatFromExtension($extension);
     return $this;
   }
 
@@ -825,7 +933,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
    * {@inheritdoc}
    */
   public function getMimeType() {
-    return $this->formatMapper->getMimeTypeFromFormat($this->getSourceFormat());
+    return $this->formatMapper->getMimeTypeFromFormat($this->arguments()->getSourceFormat());
   }
 
   /**
@@ -851,7 +959,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
    */
   public function getArguments() {
     @trigger_error('getArguments() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ::arguments() instead, using ImagemagickExecArguments methods to manipulate arguments. See https://www.drupal.org/project/imagemagick/issues/2925780.', E_USER_DEPRECATED);
-    return $this->arguments->getArguments();
+    return $this->arguments()->getArguments();
   }
 
   /**
@@ -869,7 +977,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
    */
   public function getStringForBinary() {
     @trigger_error('getStringForBinary() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::toString() instead. See https://www.drupal.org/project/imagemagick/issues/2925780.', E_USER_DEPRECATED);
-    return $this->arguments->getStringForBinary();
+    return $this->arguments()->getStringForBinary();
   }
 
   /**
@@ -887,7 +995,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
    */
   public function addArgument($arg) {
     @trigger_error('addArgument() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::add() instead. See https://www.drupal.org/project/imagemagick/issues/2925780.', E_USER_DEPRECATED);
-    $this->arguments->addArgument($arg);
+    $this->arguments()->addArgument($arg);
     return $this;
   }
 
@@ -906,7 +1014,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
    */
   public function prependArgument($arg) {
     @trigger_error('prependArgument() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::add() instead. See https://www.drupal.org/project/imagemagick/issues/2925780.', E_USER_DEPRECATED);
-    $this->arguments->prependArgument($arg);
+    $this->arguments()->prependArgument($arg);
     return $this;
   }
 
@@ -927,7 +1035,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
    */
   public function findArgument($arg) {
     @trigger_error('findArgument() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::find() instead. See https://www.drupal.org/project/imagemagick/issues/2925780.', E_USER_DEPRECATED);
-    return $this->arguments->findArgument($arg);
+    return $this->arguments()->findArgument($arg);
   }
 
   /**
@@ -945,7 +1053,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
    */
   public function removeArgument($index) {
     @trigger_error('removeArgument() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::remove() instead. See https://www.drupal.org/project/imagemagick/issues/2936615.', E_USER_DEPRECATED);
-    $this->arguments->removeArgument($index);
+    $this->arguments()->removeArgument($index);
     return $this;
   }
 
@@ -961,7 +1069,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
    */
   public function resetArguments() {
     @trigger_error('resetArguments() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::reset() instead. See https://www.drupal.org/project/imagemagick/issues/2936615.', E_USER_DEPRECATED);
-    $this->arguments->resetArguments();
+    $this->arguments()->resetArguments();
     return $this;
   }
 
@@ -977,7 +1085,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
    */
   public function countArguments() {
     @trigger_error('countArguments() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::find() instead, then count the result. See https://www.drupal.org/project/imagemagick/issues/2936615.', E_USER_DEPRECATED);
-    return $this->arguments->countArguments();
+    return $this->arguments()->countArguments();
   }
 
   /**
@@ -997,19 +1105,19 @@ class ImagemagickToolkit extends ImageToolkitBase {
    */
   public function escapeShellArg($arg) {
     @trigger_error('escapeShellArg() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::escape() instead. See https://www.drupal.org/project/imagemagick/issues/2936680.', E_USER_DEPRECATED);
-    return $this->execManager->escapeShellArg($arg);
+    return $this->getExecManager()->escapeShellArg($arg);
   }
 
   /**
    * {@inheritdoc}
    */
   public function save($destination) {
-    $this->setDestination($destination);
+    $this->arguments()->setDestination($destination);
     if ($ret = $this->convert()) {
       // Allow modules to alter the destination file.
       $this->moduleHandler->alter('imagemagick_post_save', $this->arguments);
       // Reset local path to allow saving to other file.
-      $this->setDestinationLocalPath('');
+      $this->arguments()->setDestinationLocalPath('');
     }
     return $ret;
   }
@@ -1046,20 +1154,21 @@ class ImagemagickToolkit extends ImageToolkitBase {
 
     // Sets the local file path to the one retrieved by identify if available.
     if ($source_local_path = $file_md->getMetadata('imagemagick_identify', 'source_local_path')) {
-      $this->setSourceLocalPath($source_local_path);
+      $this->arguments()->setSourceLocalPath($source_local_path);
     }
 
     // Process parsed data from the first frame.
     $format = $file_md->getMetadata('imagemagick_identify', 'format');
     if ($this->formatMapper->isFormatEnabled($format)) {
       $this
-        ->setSourceFormat($format)
         ->setWidth((int) $file_md->getMetadata('imagemagick_identify', 'width'))
         ->setHeight((int) $file_md->getMetadata('imagemagick_identify', 'height'))
         ->setExifOrientation($file_md->getMetadata('imagemagick_identify', 'exif_orientation'))
         ->setFrames($file_md->getMetadata('imagemagick_identify', 'frames_count'));
+      $this->arguments()
+        ->setSourceFormat($format);
       // Only Imagemagick allows to get colorspace information via 'identify'.
-      if ($this->getPackage() === 'imagemagick') {
+      if ($this->getExecManager()->getPackage() === 'imagemagick') {
         $this->arguments()
           ->setSourceColorspace($file_md->getMetadata('imagemagick_identify', 'colorspace'))
           ->setDestinationColorspace($file_md->getMetadata('imagemagick_identify', 'colorspace'));
@@ -1093,13 +1202,14 @@ class ImagemagickToolkit extends ImageToolkitBase {
     $format = $this->formatMapper->getFormatFromExtension(image_type_to_extension($data[2], FALSE));
     if ($format) {
       $this
-        ->setSourceFormat($format)
         ->setWidth($data[0])
         ->setHeight($data[1])
         // 'getimagesize' cannot provide information on number of frames in an
         // image and EXIF orientation, so set to defaults.
         ->setExifOrientation(static::EXIF_ORIENTATION_NOT_FETCHED)
         ->setFrames(NULL);
+      $this->arguments()
+        ->setSourceFormat($format);
       return TRUE;
     }
 
@@ -1116,7 +1226,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
     $config = $this->configFactory->get('imagemagick.settings');
 
     // Ensure sourceLocalPath is prepared.
-    $this->getSourceLocalPath();
+    $this->ensureSourceLocalPath();
 
     // Allow modules to alter the command line parameters.
     $command = 'convert';
@@ -1125,41 +1235,41 @@ class ImagemagickToolkit extends ImageToolkitBase {
     // Delete any cached file metadata for the destination image file, before
     // creating a new one, and release the URI from the manager so that
     // metadata will not stick in the same request.
-    $this->fileMetadataManager->deleteCachedMetadata($this->getDestination());
-    $this->fileMetadataManager->release($this->getDestination());
+    $this->fileMetadataManager->deleteCachedMetadata($this->arguments()->getDestination());
+    $this->fileMetadataManager->release($this->arguments()->getDestination());
 
     // When destination format differs from source format, and source image
     // is multi-frame, convert only the first frame.
-    $destination_format = $this->getDestinationFormat() ?: $this->getSourceFormat();
-    if ($this->getSourceFormat() !== $destination_format && ($this->getFrames() === NULL || $this->getFrames() > 1)) {
-      $this->arguments->setSourceFrames('[0]');
+    $destination_format = $this->arguments()->getDestinationFormat() ?: $this->arguments()->getSourceFormat();
+    if ($this->arguments()->getSourceFormat() !== $destination_format && ($this->getFrames() === NULL || $this->getFrames() > 1)) {
+      $this->arguments()->setSourceFrames('[0]');
     }
 
     // Execute the command.
-    $success = $this->execManager->execute($command, $this->arguments) && file_exists($this->getDestinationLocalPath());
+    $success = $this->getExecManager()->execute($command, $this->arguments) && file_exists($this->arguments()->getDestinationLocalPath());
 
     // Under some circumstances (actually the most common), we can safely build
     // a new FileMetadata entry and assign data to it. This will save I/O in
     // future requests.
     if ($success &&
       $config->get('use_identify') &&
-      $this->getPackage() === 'imagemagick' &&
+      $this->getExecManager()->getPackage() === 'imagemagick' &&
       $this->getFrames() === 1 &&
       $this->getWidth() !== NULL &&
       $this->getHeight() !== NULL
     ) {
-      $destination_image_md = $this->fileMetadataManager->uri($this->getDestination());
+      $destination_image_md = $this->fileMetadataManager->uri($this->arguments()->getDestination());
       $metadata = [
         'frames' => [
           0 => [
-            'format' => $this->getDestinationFormat() ?: $this->getSourceFormat(),
+            'format' => $this->arguments()->getDestinationFormat() ?: $this->arguments()->getSourceFormat(),
             'width' => $this->getWidth(),
             'height' => $this->getHeight(),
             'colorspace' => $this->arguments()->getDestinationColorspace(),
             'exif_orientation' => $this->getExifOrientation(),
           ],
         ],
-        'source_local_path' => $this->getDestinationLocalPath(),
+        'source_local_path' => $this->arguments()->getDestinationLocalPath(),
       ];
       $destination_image_md->loadMetadata('imagemagick_identify', $metadata);
     }
@@ -1181,7 +1291,7 @@ class ImagemagickToolkit extends ImageToolkitBase {
       ]);
     }
     else {
-      $status = $this->execManager->checkPath($this->configFactory->get('imagemagick.settings')->get('path_to_binaries'));
+      $status = $this->getExecManager()->checkPath($this->configFactory->get('imagemagick.settings')->get('path_to_binaries'));
       if (!empty($status['errors'])) {
         // Can not execute 'convert'.
         $severity = REQUIREMENT_ERROR;
diff --git a/src/Plugin/ImageToolkit/Operation/imagemagick/Convert.php b/src/Plugin/ImageToolkit/Operation/imagemagick/Convert.php
index f66b687..b5865ec 100644
--- a/src/Plugin/ImageToolkit/Operation/imagemagick/Convert.php
+++ b/src/Plugin/ImageToolkit/Operation/imagemagick/Convert.php
@@ -40,7 +40,7 @@ class Convert extends ImagemagickImageToolkitOperationBase {
    * {@inheritdoc}
    */
   protected function execute(array $arguments) {
-    $this->getToolkit()->setDestinationFormatFromExtension($arguments['extension']);
+    $this->getToolkit()->arguments()->setDestinationFormatFromExtension($arguments['extension']);
     return TRUE;
   }
 
diff --git a/src/Plugin/ImageToolkit/Operation/imagemagick/CreateNew.php b/src/Plugin/ImageToolkit/Operation/imagemagick/CreateNew.php
index 3bf39e1..3a92843 100644
--- a/src/Plugin/ImageToolkit/Operation/imagemagick/CreateNew.php
+++ b/src/Plugin/ImageToolkit/Operation/imagemagick/CreateNew.php
@@ -75,21 +75,21 @@ class CreateNew extends ImagemagickImageToolkitOperationBase {
    */
   protected function execute(array $arguments) {
     $this->getToolkit()
-      ->setSourceLocalPath('')
-      ->setSourceFormatFromExtension($arguments['extension'])
       ->setWidth($arguments['width'])
       ->setHeight($arguments['height'])
       ->setExifOrientation(NULL)
       ->setFrames(1);
     $this->getToolkit()->arguments()
-      ->setSourceColorspace($this->getToolkit()->getPackage() === 'imagemagick' ? 'sRGB' : NULL)
-      ->setDestinationColorspace($this->getToolkit()->getPackage() === 'imagemagick' ? 'sRGB' : NULL)
+      ->setSourceFormatFromExtension($arguments['extension'])
+      ->setSourceLocalPath('')
+      ->setSourceColorspace($this->getToolkit()->getExecManager()->getPackage() === 'imagemagick' ? 'sRGB' : NULL)
+      ->setDestinationColorspace($this->getToolkit()->getExecManager()->getPackage() === 'imagemagick' ? 'sRGB' : NULL)
       ->reset();
     $arg = '-size ' . $arguments['width'] . 'x' . $arguments['height'];
 
     // Transparent color syntax for GIF files differs by package.
     if ($arguments['extension'] === 'gif') {
-      switch ($this->getToolkit()->getPackage()) {
+      switch ($this->getToolkit()->getExecManager()->getPackage()) {
         case 'imagemagick':
           $arg .= ' xc:transparent -transparent-color ' . $this->escapeArgument($arguments['transparent_color']);
           break;
diff --git a/src/Plugin/ImageToolkit/Operation/imagemagick/Desaturate.php b/src/Plugin/ImageToolkit/Operation/imagemagick/Desaturate.php
index 30e13f3..07c864a 100644
--- a/src/Plugin/ImageToolkit/Operation/imagemagick/Desaturate.php
+++ b/src/Plugin/ImageToolkit/Operation/imagemagick/Desaturate.php
@@ -28,7 +28,7 @@ class Desaturate extends ImagemagickImageToolkitOperationBase {
    */
   protected function execute(array $arguments) {
     $this->addArgument('-colorspace GRAY');
-    $this->getToolkit()->arguments()->setDestinationColorspace($this->getToolkit()->getPackage() === 'imagemagick' ? 'GRAY' : NULL);
+    $this->getToolkit()->arguments()->setDestinationColorspace($this->getToolkit()->getExecManager()->getPackage() === 'imagemagick' ? 'GRAY' : NULL);
     return TRUE;
   }
 
diff --git a/tests/src/Functional/ToolkitImagemagickFileMetadataTest.php b/tests/src/Functional/ToolkitImagemagickFileMetadataTest.php
index c639a15..e2249df 100644
--- a/tests/src/Functional/ToolkitImagemagickFileMetadataTest.php
+++ b/tests/src/Functional/ToolkitImagemagickFileMetadataTest.php
@@ -113,7 +113,7 @@ class ToolkitImagemagickFileMetadataTest extends BrowserTestBase {
       ->set('binaries', $binaries)
       ->set('use_identify', $parsing_method === 'imagemagick_identify')
       ->save();
-    $status = \Drupal::service('image.toolkit.manager')->createInstance('imagemagick')->checkPath('');
+    $status = \Drupal::service('image.toolkit.manager')->createInstance('imagemagick')->getExecManager()->checkPath('');
     if (!empty($status['errors'])) {
       // Bots running automated test on d.o. do not have binaries installed,
       // so the test will be skipped; it can be run locally where binaries are
@@ -625,6 +625,14 @@ class ToolkitImagemagickFileMetadataTest extends BrowserTestBase {
    * Tests getSourceLocalPath() for re-creating local path.
    */
   public function testSourceLocalPath() {
+    $status = \Drupal::service('image.toolkit.manager')->createInstance('imagemagick')->getExecManager()->checkPath('');
+    if (!empty($status['errors'])) {
+      // Bots running automated test on d.o. do not have binaries installed,
+      // so the test will be skipped; it can be run locally where binaries are
+      // installed.
+      $this->markTestSkipped("Tests for 'imagemagick' cannot run because the binaries are not available on the shell path.");
+    }
+
     $config = \Drupal::configFactory()->getEditable('imagemagick.settings');
     $config_mdm = \Drupal::configFactory()->getEditable('file_mdm.settings');
 
@@ -646,17 +654,16 @@ class ToolkitImagemagickFileMetadataTest extends BrowserTestBase {
     // Load up the image.
     $image = $this->imageFactory->get($source_uri);
     $this->assertEqual($source_uri, $image->getToolkit()->getSource());
-    $this->assertEqual(drupal_realpath($source_uri), $image->getToolkit()->getSourceLocalPath());
+    $this->assertEqual(drupal_realpath($source_uri), $image->getToolkit()->arguments()->getSourceLocalPath());
 
     // Free up the URI from the file metadata manager to force reload from
     // cache. Simulates that next imageFactory->get is from another request.
     $fmdm->release($source_uri);
 
-    // Re-load the image, getLocalSourcePath should still return the local
-    // path.
+    // Re-load the image, ensureLocalSourcePath should return the local path.
     $image1 = $this->imageFactory->get($source_uri);
     $this->assertEqual($source_uri, $image1->getToolkit()->getSource());
-    $this->assertEqual(drupal_realpath($source_uri), $image1->getToolkit()->getSourceLocalPath());
+    $this->assertEqual(drupal_realpath($source_uri), $image1->getToolkit()->ensureSourceLocalPath());
   }
 
 }
diff --git a/tests/src/Functional/ToolkitImagemagickTest.php b/tests/src/Functional/ToolkitImagemagickTest.php
index 9dbeb26..ce40f62 100644
--- a/tests/src/Functional/ToolkitImagemagickTest.php
+++ b/tests/src/Functional/ToolkitImagemagickTest.php
@@ -106,7 +106,7 @@ class ToolkitImagemagickTest extends BrowserTestBase {
     if ($check_path) {
       // The test can only be executed if binaries are available on the shell
       // path.
-      $status = \Drupal::service('image.toolkit.manager')->createInstance('imagemagick')->checkPath('');
+      $status = \Drupal::service('image.toolkit.manager')->createInstance('imagemagick')->getExecManager()->checkPath('');
       if (!empty($status['errors'])) {
         // Bots running automated test on d.o. do not have binaries installed,
         // so the test will be skipped; it can be run locally where binaries
@@ -350,7 +350,7 @@ class ToolkitImagemagickTest extends BrowserTestBase {
         $this->assertTrue($image->isValid());
 
         // @todo Suite specifics, temporarily adjust tests.
-        $package = $image->getToolkit()->getPackage();
+        $package = $image->getToolkit()->getExecManager()->getPackage();
         if ($package === 'graphicsmagick') {
           // @todo Issues with crop and convert on GIF files, investigate.
           if (in_array($file, [
@@ -509,14 +509,14 @@ class ToolkitImagemagickTest extends BrowserTestBase {
     // Test handling a file stored through a remote stream wrapper.
     $image = $this->imageFactory->get('dummy-remote://image-test.png');
     // Source file should be equal to the copied local temp source file.
-    $this->assertEqual(filesize('dummy-remote://image-test.png'), filesize($image->getToolkit()->getSourceLocalPath()));
+    $this->assertEqual(filesize('dummy-remote://image-test.png'), filesize($image->getToolkit()->arguments()->getSourceLocalPath()));
     $image->desaturate();
     $this->assertTrue($image->save('dummy-remote://remote-image-test.png'));
     // Destination file should exists, and destination local temp file should
     // have been reset.
-    $this->assertTrue(file_exists($image->getToolkit()->getDestination()));
-    $this->assertEqual('dummy-remote://remote-image-test.png', $image->getToolkit()->getDestination());
-    $this->assertIdentical('', $image->getToolkit()->getDestinationLocalPath());
+    $this->assertTrue(file_exists($image->getToolkit()->arguments()->getDestination()));
+    $this->assertEqual('dummy-remote://remote-image-test.png', $image->getToolkit()->arguments()->getDestination());
+    $this->assertIdentical('', $image->getToolkit()->arguments()->getDestinationLocalPath());
 
     // Test retrieval of EXIF information.
     file_unmanaged_copy(drupal_get_path('module', 'imagemagick') . '/misc/test-exif.jpeg', 'public://', FILE_EXISTS_REPLACE);
@@ -621,6 +621,252 @@ class ToolkitImagemagickTest extends BrowserTestBase {
   }
 
   /**
+   * Legacy methods tests.
+   *
+   * @param string $binaries
+   *   The graphics package binaries to use for testing.
+   *
+   * @dataProvider providerManipulationTest
+   *
+   * @todo remove in 8.x-3.0.
+   *
+   * @group legacy
+   */
+  public function testManipulationsLegacy($binaries) {
+    $this->setUpToolkit($binaries);
+
+    // Check package.
+    $toolkit = \Drupal::service('image.toolkit.manager')->createInstance('imagemagick');
+    $this->assertSame($binaries, $toolkit->getPackage());
+    $this->assertNotNull($toolkit->getPackageLabel());
+    $this->assertSame([], $toolkit->checkPath('')['errors']);
+
+    // Typically the corner colors will be unchanged. These colors are in the
+    // order of top-left, top-right, bottom-right, bottom-left.
+    $default_corners = [
+      $this->red,
+      $this->green,
+      $this->blue,
+      $this->transparent,
+    ];
+
+    // A list of files that will be tested.
+    $files = [
+      'image-test.png',
+      'image-test.gif',
+      'image-test-no-transparency.gif',
+      'image-test.jpg',
+    ];
+
+    // Setup a list of tests to perform on each type.
+    $operations = [
+      'resize' => [
+        'function' => 'resize',
+        'arguments' => ['width' => 20, 'height' => 10],
+        'width' => 20,
+        'height' => 10,
+        'corners' => $default_corners,
+        'tolerance' => 0,
+      ],
+      'scale_x' => [
+        'function' => 'scale',
+        'arguments' => ['width' => 20],
+        'width' => 20,
+        'height' => 10,
+        'corners' => $default_corners,
+        'tolerance' => 0,
+      ],
+      'scale_y' => [
+        'function' => 'scale',
+        'arguments' => ['height' => 10],
+        'width' => 20,
+        'height' => 10,
+        'corners' => $default_corners,
+        'tolerance' => 0,
+      ],
+      'upscale_x' => [
+        'function' => 'scale',
+        'arguments' => ['width' => 80, 'upscale' => TRUE],
+        'width' => 80,
+        'height' => 40,
+        'corners' => $default_corners,
+        'tolerance' => 0,
+      ],
+      'upscale_y' => [
+        'function' => 'scale',
+        'arguments' => ['height' => 40, 'upscale' => TRUE],
+        'width' => 80,
+        'height' => 40,
+        'corners' => $default_corners,
+        'tolerance' => 0,
+      ],
+      'crop' => [
+        'function' => 'crop',
+        'arguments' => ['x' => 12, 'y' => 4, 'width' => 16, 'height' => 12],
+        'width' => 16,
+        'height' => 12,
+        'corners' => array_fill(0, 4, $this->white),
+        'tolerance' => 0,
+      ],
+      'scale_and_crop' => [
+        'function' => 'scale_and_crop',
+        'arguments' => ['width' => 10, 'height' => 8],
+        'width' => 10,
+        'height' => 8,
+        'corners' => array_fill(0, 4, $this->black),
+        'tolerance' => 100,
+      ],
+      'convert_jpg' => [
+        'function' => 'convert',
+        'width' => 40,
+        'height' => 20,
+        'arguments' => ['extension' => 'jpeg'],
+        'mimetype' => 'image/jpeg',
+        'corners' => $default_corners,
+        'tolerance' => 0,
+      ],
+      'convert_gif' => [
+        'function' => 'convert',
+        'width' => 40,
+        'height' => 20,
+        'arguments' => ['extension' => 'gif'],
+        'mimetype' => 'image/gif',
+        'corners' => $default_corners,
+        'tolerance' => 15,
+      ],
+      'convert_png' => [
+        'function' => 'convert',
+        'width' => 40,
+        'height' => 20,
+        'arguments' => ['extension' => 'png'],
+        'mimetype' => 'image/png',
+        'corners' => $default_corners,
+        'tolerance' => 5,
+      ],
+      'rotate_5' => [
+        'function' => 'rotate',
+        'arguments' => [
+          'degrees' => 5,
+          'background' => '#FF00FF',
+          'resize_filter' => 'Box',
+        ],
+        'width' => 41,
+        'height' => 23,
+        'corners' => array_fill(0, 4, $this->fuchsia),
+        'tolerance' => 5,
+      ],
+      'rotate_minus_10' => [
+        'function' => 'rotate',
+        'arguments' => [
+          'degrees' => -10,
+          'background' => '#FF00FF',
+          'resize_filter' => 'Box',
+        ],
+        'width' => 41,
+        'height' => 26,
+        'corners' => array_fill(0, 4, $this->fuchsia),
+        'tolerance' => 15,
+      ],
+      'rotate_90' => [
+        'function' => 'rotate',
+        'arguments' => ['degrees' => 90, 'background' => '#FF00FF'],
+        'width' => 20,
+        'height' => 40,
+        'corners' => [$this->transparent, $this->red, $this->green, $this->blue],
+        'tolerance' => 0,
+      ],
+      'rotate_transparent_5' => [
+        'function' => 'rotate',
+        'arguments' => ['degrees' => 5, 'resize_filter' => 'Box'],
+        'width' => 41,
+        'height' => 23,
+        'corners' => array_fill(0, 4, $this->transparent),
+        'tolerance' => 0,
+      ],
+      'rotate_transparent_90' => [
+        'function' => 'rotate',
+        'arguments' => ['degrees' => 90],
+        'width' => 20,
+        'height' => 40,
+        'corners' => [$this->transparent, $this->red, $this->green, $this->blue],
+        'tolerance' => 0,
+      ],
+      'desaturate' => [
+        'function' => 'desaturate',
+        'arguments' => [],
+        'height' => 20,
+        'width' => 40,
+        // Grayscale corners are a bit funky. Each of the corners are a shade of
+        // gray. The values of these were determined simply by looking at the
+        // final image to see what desaturated colors end up being.
+        'corners' => [
+          array_fill(0, 3, 76) + [3 => 0],
+          array_fill(0, 3, 149) + [3 => 0],
+          array_fill(0, 3, 29) + [3 => 0],
+          array_fill(0, 3, 225) + [3 => 127],
+        ],
+        // @todo tolerance here is too high. Check reasons.
+        'tolerance' => 17000,
+      ],
+    ];
+
+    // Prepare a copy of test files.
+    $this->getTestFiles('image');
+
+    foreach ($files as $file) {
+      $image_uri = 'public://' . $file;
+      foreach ($operations as $op => $values) {
+        // Load up a fresh image.
+        $image = $this->imageFactory->get($image_uri);
+        if (!$image->isValid()) {
+          $this->fail("Could not load image $file.");
+          continue 2;
+        }
+
+        // Check that no multi-frame information is set.
+        $this->assertIdentical(1, $image->getToolkit()->getFrames());
+
+        // Legacy source tests.
+        $this->assertSame($image_uri, $image->getToolkit()->getSource());
+        $this->assertSame($image->getToolkit()->arguments()->getSourceLocalPath(), $image->getToolkit()->getSourceLocalPath());
+        $this->assertSame($image->getToolkit()->arguments()->getSourceFormat(), $image->getToolkit()->getSourceFormat());
+
+        // Perform our operation.
+        $image->apply($values['function'], $values['arguments']);
+
+        // Save image.
+        $file_path = $this->testDirectory . '/' . $op . substr($file, -4);
+        $this->assertTrue($image->save($file_path));
+
+        // Legacy destination tests.
+        $this->assertSame($file_path, $image->getToolkit()->getDestination());
+        $this->assertSame('', $image->getToolkit()->getDestinationLocalPath());
+        $this->assertNotNull($image->getToolkit()->arguments()->getSourceFormat(), $image->getToolkit()->getDestinationFormat());
+
+        // Reload image.
+        $image = $this->imageFactory->get($file_path);
+        $this->assertTrue($image->isValid());
+
+        // Legacy set methods.
+        $image->getToolkit()->setSourceLocalPath('bar');
+        $image->getToolkit()->setSourceFormat('PNG');
+        $image->getToolkit()->setDestination('foo');
+        $image->getToolkit()->setDestinationLocalPath('baz');
+        $image->getToolkit()->setDestinationFormat('GIF');
+        $this->assertSame('bar', $image->getToolkit()->arguments()->getSourceLocalPath());
+        $this->assertSame('PNG', $image->getToolkit()->arguments()->getSourceFormat());
+        $this->assertSame('foo', $image->getToolkit()->arguments()->getDestination());
+        $this->assertSame('baz', $image->getToolkit()->arguments()->getDestinationLocalPath());
+        $this->assertSame('GIF', $image->getToolkit()->arguments()->getDestinationFormat());
+        $image->getToolkit()->setSourceFormatFromExtension('jpg');
+        $image->getToolkit()->setDestinationFormatFromExtension('jpg');
+        $this->assertSame('JPEG', $image->getToolkit()->arguments()->getSourceFormat());
+        $this->assertSame('JPEG', $image->getToolkit()->arguments()->getDestinationFormat());
+      }
+    }
+  }
+
+  /**
    * Test ImageMagick subform and settings.
    */
   public function testFormAndSettings() {
