diff --git a/app/Facades/DockerHub.php b/app/Facades/DockerHub.php
new file mode 100644
--- /dev/null
+++ b/app/Facades/DockerHub.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Nasqueron\Notifications\Facades;
+
+use Illuminate\Support\Facades\Facade;
+
+/**
+ * @see \Keruald\DockerHub\Build\TriggerBuildFactory
+ */
+class DockerHub extends Facade {
+
+    /**
+     * Gets the registered name of the component.
+     *
+     * @return string
+     */
+    protected static function getFacadeAccessor() {
+        return 'dockerhub';
+    }
+
+}
diff --git a/app/Providers/DockerHubServiceProvider.php b/app/Providers/DockerHubServiceProvider.php
new file mode 100644
--- /dev/null
+++ b/app/Providers/DockerHubServiceProvider.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace Nasqueron\Notifications\Providers;
+
+use Illuminate\Config\Repository;
+use Illuminate\Contracts\Foundation\Application;
+use Illuminate\Support\ServiceProvider;
+
+use GuzzleHttp\Client;
+use Keruald\DockerHub\Build\TriggerBuildFactory;
+
+class DockerHubServiceProvider extends ServiceProvider {
+    /**
+     * Bootstraps the application services.
+     *
+     * @return void
+     */
+    public function boot() {
+    }
+
+    /**
+     * Gets the tokens to trigger build for the Docker Hub images.
+     *
+     * @param \Illuminate\Contracts\Foundation\Application $app
+     * @return array
+     */
+    public static function getTokens (Application $app) {
+        $file = $app->make('config')->get('services.dockerhub.tokens');
+        $fs = $app->make('filesystem')->disk('local');
+
+        if ($fs->exists($file)) {
+            $content = $fs->get($file);
+            return json_decode($content, true);
+        }
+
+        return [];
+    }
+
+    /**
+     * Registers the application services.
+     *
+     * @return void
+     */
+    public function register() {
+        $this->app->singleton('dockerhub', function (Application $app) {
+            $tokens = DockerHubServiceProvider::getTokens($app);
+            return new TriggerBuildFactory(new Client, $tokens);
+        });
+    }
+}
diff --git a/composer.json b/composer.json
--- a/composer.json
+++ b/composer.json
@@ -16,6 +16,7 @@
     "keruald/github": "^0.2.0",
     "keruald/broker": "^0.4.1",
     "keruald/mailgun": "^0.0.1",
+    "keruald/dockerhub": "^0.0.2",
     "netresearch/jsonmapper": "~0.1.0",
     "sentry/sentry": "^0.13.0"
   },
diff --git a/config/app.php b/config/app.php
--- a/config/app.php
+++ b/config/app.php
@@ -171,6 +171,7 @@
          */
         Nasqueron\Notifications\Providers\AppServiceProvider::class,
         Nasqueron\Notifications\Providers\BrokerServiceProvider::class,
+        Nasqueron\Notifications\Providers\DockerHubServiceProvider::class,
         Nasqueron\Notifications\Providers\EventServiceProvider::class,
         Nasqueron\Notifications\Providers\MailgunServiceProvider::class,
         Nasqueron\Notifications\Providers\PhabricatorAPIServiceProvider::class,
@@ -252,6 +253,7 @@
          * App aliases...
          */
         'Broker'    => Nasqueron\Notifications\Facades\Broker::class,
+        'DockerHub' => Nasqueron\Notifications\Facades\DockerHub::class,
         'Mailgun'   => Nasqueron\Notifications\Facades\Mailgun::class,
         'PhabricatorAPI' => Nasqueron\Notifications\Facades\PhabricatorAPI::class,
         'ProjectsMap' => Nasqueron\Notifications\Facades\ProjectsMap::class,
diff --git a/config/services.php b/config/services.php
--- a/config/services.php
+++ b/config/services.php
@@ -39,6 +39,10 @@
         'dsn' => env('SENTRY_DSN'),
     ],
 
+    'dockerhub' => [
+        'tokens' => env('DOCKERHUB_TOKENS', 'DockerHubTokens.json')
+    ],
+
     'github' => [
         'analyzer' => [
             'configDir' => env('GITHUB_ANALYZER_CONFIG_DIR', 'GitHubPayloadAnalyzer')
diff --git a/storage/app/.gitignore b/storage/app/.gitignore
--- a/storage/app/.gitignore
+++ b/storage/app/.gitignore
@@ -1 +1,2 @@
 credentials.json
+DockerHubTokens.json
\ No newline at end of file
diff --git a/tests/Facades/DockerHubTest.php b/tests/Facades/DockerHubTest.php
new file mode 100644
--- /dev/null
+++ b/tests/Facades/DockerHubTest.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Nasqueron\Notifications\Tests\Facades;
+
+use Nasqueron\Notifications\Tests\TestCase;
+
+use Config;
+use DockerHub;
+
+use Keruald\DockerHub\Build\TriggerBuildFactory;
+
+class DockerHubTest extends TestCase {
+
+    public function testIfFacadeAccessorCouldBeResolvedInAppContainer () {
+        $this->assertInstanceOf(
+            TriggerBuildFactory::class,
+            DockerHub::getFacadeRoot()
+        );
+    }
+
+}
diff --git a/tests/Providers/DockerHubServiceProviderTest.php b/tests/Providers/DockerHubServiceProviderTest.php
new file mode 100644
--- /dev/null
+++ b/tests/Providers/DockerHubServiceProviderTest.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Nasqueron\Notifications\Tests\Providers;
+
+use Nasqueron\Notifications\Providers\DockerHubServiceProvider;
+
+use Config;
+
+class DockerHubServiceProviderTest extends TestCase {
+
+    public function testType () {
+        $this->assertServiceInstanceOf(
+            'Keruald\DockerHub\Build\TriggerBuildFactory',
+            'dockerhub'
+        );
+    }
+
+    public function testGetTokens () {
+        $this->assertSame(
+            ['acme/foo' => '0000'],
+            DockerHubServiceProvider::getTokens($this->app),
+            "The service provider should deserialize DockerHubTokens.json."
+        );
+    }
+
+    public function testGetTokensWhenFileDoesNotExist () {
+        Config::set('services.dockerhub.tokens', 'notexisting.json');
+
+        $this->assertSame(
+            [],
+            DockerHubServiceProvider::getTokens($this->app),
+            "When no tokens file exists, an empty array is used instead."
+        );
+    }
+
+}
diff --git a/tests/data/DockerHubTokens.json b/tests/data/DockerHubTokens.json
new file mode 100644
--- /dev/null
+++ b/tests/data/DockerHubTokens.json
@@ -0,0 +1,3 @@
+{
+    "acme/foo": "0000"
+}
\ No newline at end of file