diff --git a/classes/LoadModules.php b/classes/LoadModules.php
new file mode 100644
index 0000000000000000000000000000000000000000..b15ccbd0845b982fb4b64f1005870fde6898129d
--- /dev/null
+++ b/classes/LoadModules.php
@@ -0,0 +1,72 @@
+<?php declare(strict_types=1);
+
+namespace uib\ub\loadspeakr;
+
+use uib\ub\loadspeakr\modules\ModuleInterface;
+use uib\ub\loadspeakr\modules\UnknownModule;
+
+final class LoadModules
+{
+    private array $conf;
+
+    public function __construct($conf)
+    {
+        $this->conf = $conf;
+    }
+
+  public function loadModule(string $uri): ModuleInterface
+  {
+      $className =  $this->loadClass($uri);
+      $unknown = new UnknownModule();
+
+      switch ($uri) {
+          case 'admin':
+              return new $className();
+          case 'redirect':
+              return new $className();
+          case 'service':
+              return new $className();
+          case 'session':
+              return new $className();
+          case 'sparqlfilter':
+              return new $className();
+          case 'type':
+              return new $className();
+          case 'uri':
+              return new $className();
+          case 'export':
+              return new $className();
+          case 'static':
+              return new $className();
+          case 'default':
+              break;
+      }
+
+      return $unknown;
+  }
+
+    private function loadClass($module): string
+    {
+        if (!$this->moduleAvailable($module)) {
+            HTTPStatus::send500('Module: ' . $module . ' not found.');
+        }
+
+        $className = ucfirst($module) . 'Module';
+
+        if (file_exists(__DIR__ . '/modules/' . $className . '.php')) {
+            return __NAMESPACE__ . '\\modules\\' . $className;
+        }
+
+        return '';
+    }
+
+    private function moduleAvailable(string $module): bool
+    {
+        if (!in_array($module, $this->conf['modules']['available'], true)) {
+            return false;
+        }
+
+        return true;
+    }
+
+}
\ No newline at end of file
diff --git a/classes/modules/UnknownModule.php b/classes/modules/UnknownModule.php
new file mode 100644
index 0000000000000000000000000000000000000000..48f45017c58424ce72577bd06cfd7fce93f81504
--- /dev/null
+++ b/classes/modules/UnknownModule.php
@@ -0,0 +1,23 @@
+<?php declare(strict_types=1);
+
+namespace uib\ub\loadspeakr\modules;
+
+use uib\ub\loadspeakr\HTTPStatus;
+
+/**
+ * Null result Loadspkr module.
+ *
+ * Used when unknown module is requested.
+ */
+final class UnknownModule implements ModuleInterface
+{
+
+    public function match($uri): void
+    {
+        HTTPStatus::send404($uri);
+    }
+
+    public function execute($params): void
+    {
+    }
+}
diff --git a/index.php b/index.php
index bf2a12d18312718eef917855fd0e788b4f05ccd2..abc168558a8a16a695ffbdd925be7374dfe74c90 100644
--- a/index.php
+++ b/index.php
@@ -4,6 +4,7 @@ use uib\ub\loadspeakr\Endpoint;
 use uib\ub\loadspeakr\Exporter;
 use uib\ub\loadspeakr\HTTPStatus;
 use uib\ub\loadspeakr\Importer;
+use uib\ub\loadspeakr\LoadModules;
 use uib\ub\loadspeakr\Logging;
 use uib\ub\loadspeakr\Utils;
 
@@ -65,22 +66,24 @@ if ($uri === $conf['basedir']) {
 $localUri = $conf['basedir'] . $_GET['q'];
 $uri = Utils::getMirroredUri($localUri);
 
-// Load Loadspeakr modules.
-foreach ($conf['modules']['available'] as $i) {
-    $className = ucfirst($i) . 'Module';
-    $currentModule = $conf['modules']['directory'] . $className . '.php';
-    $namespacedClassName = 'uib\ub\loadspeakr\modules\\' . $className;
-    $module = new $namespacedClassName();
+/**
+ * Load Loadspeakr modules.
+ */
+foreach ($conf['modules']['available'] as $loadspkrModule) {
+    $loader = new LoadModules($conf);
+    $module = $loader->loadModule($loadspkrModule);
     $matching = $module->match($uri);
 
-    if ($matching !== false) {
+    if ($matching) {
         $module->execute($matching);
-
         if ($conf['logfile'] !== null) {
             fwrite($conf['logfile'], "]}");
             fclose($conf['logfile']);
         }
 
+        /**
+         * Only run first Loadspeakr modules that matches.
+         */
         exit(0);
     }
 }