diff --git a/composer.json b/composer.json
index cf50bfe2b58b2abc4caac32aa4f73b47d19ec3ce..972b328887c501b36801e14cabad3587ad300760 100644
--- a/composer.json
+++ b/composer.json
@@ -24,10 +24,9 @@
         "source": "https://gitlab.lakedrops.com/composer/plugin/dorgflow/tree/master"
     },
     "require": {
+        "php": ">=7.0",
         "composer-plugin-api": "^1.0.0",
-        "cypresslab/gitelephant": "~1.0",
-        "lakedrops/composer-json-utils": "^1.1.0",
-        "php": ">=5.6"
+        "lakedrops/composer-json-utils": "^1.3.1"
     },
     "require-dev": {
         "composer/composer": "^1.5.0",
@@ -41,14 +40,6 @@
         }
     },
     "extra": {
-        "class": "LakeDrops\\DorgFlow\\Plugin",
-        "lakedrops": {
-            "scripts": {
-                "dorgflow": {
-                    "callback": "LakeDrops\\DorgFlow\\Plugin::prepare",
-                    "description": "Prepare drupal.org projects for dorgflow utility."
-                }
-            }
-        }
+        "class": "LakeDrops\\DorgFlow\\Plugin"
     }
 }
diff --git a/src/CommandProvider.php b/src/CommandProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..f34e7b034a41c334a7f3dc150433a3a6fc3dce96
--- /dev/null
+++ b/src/CommandProvider.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace LakeDrops\DorgFlow;
+
+use Composer\Plugin\Capability\CommandProvider as CommandProviderCapability;
+use Composer\Command\BaseCommand;
+
+class CommandProvider implements CommandProviderCapability {
+
+  /**
+   * Retrieves an array of commands
+   *
+   * @return BaseCommand[]
+   */
+  public function getCommands(): array {
+    return [
+      new PrepareCommand(),
+    ];
+  }
+}
diff --git a/src/Handler.php b/src/Handler.php
index 0df234091a57d12ba333712554f13243fad67ea7..8b1ed8f53c4eb8089217b7df6c348ed98dd63a5a 100644
--- a/src/Handler.php
+++ b/src/Handler.php
@@ -2,7 +2,6 @@
 
 namespace LakeDrops\DorgFlow;
 
-use Composer\Script\Event;
 use GitElephant\Repository;
 use LakeDrops\Component\Composer\BaseHandler;
 use Symfony\Component\Filesystem\Filesystem;
@@ -16,14 +15,11 @@ class Handler extends BaseHandler {
 
   /**
    * Post install/update event to prepare projects for development.
-   *
-   * @param \Composer\Script\Event $event
-   *   The event that triggered the call of this function.
    */
-  public function prepareDevProjects(Event $event) {
+  public function prepareDevProjects() {
 
     // We only do the fancy stuff for developers.
-    if (!$event->isDevMode()) {
+    if (!$this->isDevMode()) {
       return;
     }
 
@@ -36,7 +32,7 @@ class Handler extends BaseHandler {
     $installationManager = $this->composer->getInstallationManager();
     foreach ($options['projects'] as $project => $version) {
       $package = $this->getPackage($project);
-      if (empty($package)) {
+      if ($package === NULL) {
         continue;
       }
 
@@ -52,7 +48,7 @@ class Handler extends BaseHandler {
    * @return array
    *   The options.
    */
-  protected function getOptions() {
+  protected function getOptions(): array {
     $extra = $this->composer->getPackage()->getExtra() + ['dorgflow' => []];
     return $extra['dorgflow'] + [
       'projects' => [],
@@ -79,7 +75,7 @@ class Handler extends BaseHandler {
 
     try {
       $origin = $repository->getRemote('origin', FALSE);
-      if ($origin && $origin->getFetchURL() == $uri) {
+      if ($origin && $origin->getFetchURL() === $uri) {
         // Already setup correctly.
         return;
       }
@@ -97,7 +93,7 @@ class Handler extends BaseHandler {
     $repository->fetch();
     $repository->checkout($version);
     $repository->getCaller()->execute('branch --set-upstream-to origin/' . $version . ' ' . $version);
-    $this->io->write("  - completed", TRUE);
+    $this->io->write('  - completed', TRUE);
   }
 
 }
diff --git a/src/Plugin.php b/src/Plugin.php
index b99f1261790cde9a8f1ff5b35b742a0f166f9c03..ebd0dae67ad712291a1dad1be094fa3f208f44cf 100644
--- a/src/Plugin.php
+++ b/src/Plugin.php
@@ -21,7 +21,16 @@ class Plugin extends BasePlugin {
   /**
    * {@inheritdoc}
    */
-  public static function getSubscribedEvents() {
+  public function getCapabilities(): array {
+    return [
+      \Composer\Plugin\Capability\CommandProvider::class => CommandProvider::class,
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents(): array {
     return array(
       ScriptEvents::POST_INSTALL_CMD => 'prepareDevProjects',
       ScriptEvents::POST_UPDATE_CMD => 'prepareDevProjects',
@@ -35,18 +44,11 @@ class Plugin extends BasePlugin {
    *   The event that triggered the call of this function.
    */
   public function prepareDevProjects(Event $event) {
-    $this->handler->prepareDevProjects($event);
-  }
-
-  /**
-   * Script callback for putting in composer scripts to prepare the project.
-   *
-   * @param \Composer\Script\Event $event
-   *   The event that triggered the call of this function.
-   */
-  public static function prepare(Event $event) {
-    $handler = new Handler($event->getComposer(), $event->getIO());
-    $handler->prepareDevProjects($event);
+    /** @var Handler $handler */
+    $handler = $this->handler;
+    $handler
+      ->setEvent($event)
+      ->prepareDevProjects();
   }
 
 }
diff --git a/src/PrepareCommand.php b/src/PrepareCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..3a0c2d40c3f40f55a3a310aed8b2048884e37fd5
--- /dev/null
+++ b/src/PrepareCommand.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace LakeDrops\DorgFlow;
+
+use LakeDrops\Component\Composer\BaseCommand;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class PrepareCommand extends BaseCommand {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function configure() {
+    $this->setName('lakedrops:dorgflow');
+    $this->setDescription('Prepare drupal.org projects for dorgflow utility.');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getHandlerClass() {
+    return Handler::class;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function execute(InputInterface $input, OutputInterface $output) {
+    parent::execute($input, $output);
+    /** @var Handler $handler */
+    $handler = $this->handler;
+    $handler->prepareDevProjects();
+  }
+
+}