diff --git a/src/Event/QueryStringCreated.php b/src/Event/QueryStringCreated.php
new file mode 100644
index 0000000..471d735
--- /dev/null
+++ b/src/Event/QueryStringCreated.php
@@ -0,0 +1,143 @@
+<?php
+
+namespace Drupal\facets\Event;
+
+use Drupal\facets\FacetInterface;
+use Drupal\facets\Result\ResultInterface;
+use Symfony\Component\EventDispatcher\Event;
+use Symfony\Component\HttpFoundation\ParameterBag;
+
+/**
+ * Implements the query string created event.
+ *
+ * This event allows modules to change the facet's query string if needed.
+ */
+final class QueryStringCreated extends Event {
+
+  const NAME = 'facets.query_string_created';
+
+  /**
+   * The get parameters.
+   *
+   * @var \Symfony\Component\HttpFoundation\ParameterBag
+   */
+  private $queryParameters;
+
+  /**
+   * The filter parameters.
+   *
+   * @var array
+   */
+  private $filterParameters;
+
+  /**
+   * The facet result.
+   *
+   * @var \Drupal\facets\Result\ResultInterface
+   */
+  private $facetResult;
+
+  /**
+   * The active filters.
+   *
+   * @var array
+   */
+  private $activeFilters;
+
+  /**
+   * The facet.
+   *
+   * @var \Drupal\facets\FacetInterface
+   */
+  private $facet;
+
+  /**
+   * QueryStringCreated constructor.
+   *
+   * @param \Symfony\Component\HttpFoundation\ParameterBag $queryParameters
+   *   The get parameters to use.
+   * @param array $filterParameters
+   *   The filter parameters to use.
+   * @param \Drupal\facets\Result\ResultInterface $facetResult
+   *   The facet result.
+   * @param array $activeFilters
+   *   The active filters.
+   * @param \Drupal\facets\FacetInterface $facet
+   *   The facet.
+   */
+  public function __construct(ParameterBag $queryParameters, array $filterParameters, ResultInterface $facetResult, array $activeFilters, FacetInterface $facet) {
+    $this->queryParameters = $queryParameters;
+    $this->filterParameters = $filterParameters;
+    $this->facetResult = $facetResult;
+    $this->activeFilters = $activeFilters;
+    $this->facet = $facet;
+  }
+
+  /**
+   * Get the get parameters.
+   *
+   * @return \Symfony\Component\HttpFoundation\ParameterBag
+   *   The get parameters.
+   */
+  public function getQueryParameters() {
+    return $this->queryParameters;
+  }
+
+  /**
+   * Get the filter parameters.
+   *
+   * @return array
+   *   The filter parameters.
+   */
+  public function getFilterParameters() {
+    return $this->filterParameters;
+  }
+
+  /**
+   * Set the filter parameters.
+   *
+   * @param array $filterParameters
+   *   The filter parameters to set.
+   */
+  public function setFilterParameters($filterParameters) {
+    $this->filterParameters = $filterParameters;
+  }
+
+  /**
+   * Get the facet result.
+   *
+   * Only to be used as context, because changing this will not result in any
+   * changes to the final url.
+   *
+   * @return \Drupal\facets\Result\ResultInterface
+   *   The facet result.
+   */
+  public function getFacetResult() {
+    return $this->facetResult;
+  }
+
+  /**
+   * Get the active filters.
+   *
+   * Only to be used as context, because changing this will not result in any
+   * changes to the final url.
+   *
+   * @return array
+   */
+  public function getActiveFilters() {
+    return $this->activeFilters;
+  }
+
+  /**
+   * Get the facet.
+   *
+   * Only to be used as context, because changing this will not result in any
+   * changes to the final url.
+   *
+   * @return \Drupal\facets\FacetInterface
+   */
+  public function getFacet() {
+    return $this->facet;
+  }
+
+}
diff --git a/src/Plugin/facets/url_processor/QueryString.php b/src/Plugin/facets/url_processor/QueryString.php
index b2afb96..8d02a91 100644
--- a/src/Plugin/facets/url_processor/QueryString.php
+++ b/src/Plugin/facets/url_processor/QueryString.php
@@ -5,8 +5,11 @@ namespace Drupal\facets\Plugin\facets\url_processor;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
 use Drupal\Core\Url;
+use Drupal\facets\Event\QueryStringCreated;
 use Drupal\facets\FacetInterface;
 use Drupal\facets\UrlProcessor\UrlProcessorPluginBase;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\Routing\Exception\ResourceNotFoundException;
 
@@ -29,16 +32,38 @@ class QueryString extends UrlProcessorPluginBase {
   protected $urlAlias;
 
   /**
+   * The event dispatcher.
+   *
+   * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
+   */
+  protected $eventDispatcher;
+
+  /**
    * {@inheritdoc}
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, Request $request, EntityTypeManagerInterface $entity_type_manager) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, Request $request, EntityTypeManagerInterface $entity_type_manager, EventDispatcherInterface $eventDispatcher) {
     parent::__construct($configuration, $plugin_id, $plugin_definition, $request, $entity_type_manager);
+    $this->eventDispatcher = $eventDispatcher;
     $this->initializeActiveFilters();
   }
 
   /**
    * {@inheritdoc}
    */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('request_stack')->getMasterRequest(),
+      $container->get('entity_type.manager'),
+      $container->get('event_dispatcher')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function buildUrls(FacetInterface $facet, array $results) {
     // No results are found for this facet, so don't try to create urls.
     if (empty($results)) {
@@ -155,6 +180,10 @@ class QueryString extends UrlProcessorPluginBase {
           }
         }
       }
+
+      // Allow other modules to alter the result url built.
+      $this->eventDispatcher->dispatch(QueryStringCreated::NAME, new QueryStringCreated($result_get_params, $filter_params, $result, $this->activeFilters, $facet));
+
       asort($filter_params, \SORT_NATURAL);
       $result_get_params->set($this->filterKey, array_values($filter_params));
       if (!empty($routeParameters)) {
diff --git a/tests/facets_events_test/facets_events_test.info.yml b/tests/facets_events_test/facets_events_test.info.yml
new file mode 100644
index 0000000..0dcef4d
--- /dev/null
+++ b/tests/facets_events_test/facets_events_test.info.yml
@@ -0,0 +1,6 @@
+name: 'Facets events test'
+type: module
+description: 'Facets events test'
+package: 'Search'
+core: 8.x
+hidden: true
diff --git a/tests/facets_events_test/facets_events_test.services.yml b/tests/facets_events_test/facets_events_test.services.yml
new file mode 100644
index 0000000..84acb61
--- /dev/null
+++ b/tests/facets_events_test/facets_events_test.services.yml
@@ -0,0 +1,6 @@
+services:
+
+  facets_events_test.event_listener:
+    class: Drupal\facets_events_test\EventListener
+    tags:
+      - { name: event_subscriber }
diff --git a/tests/facets_events_test/src/EventListener.php b/tests/facets_events_test/src/EventListener.php
new file mode 100644
index 0000000..183f141
--- /dev/null
+++ b/tests/facets_events_test/src/EventListener.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Drupal\facets_events_test;
+
+use Drupal\facets\Event\QueryStringCreated;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Class EventListener.
+ */
+class EventListener implements EventSubscriberInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    return [
+      QueryStringCreated::NAME => 'queryStringCreated'
+    ];
+  }
+
+  /**
+   * Event handler for the query string created event.
+   *
+   * @param \Drupal\facets\Event\QueryStringCreated $event
+   *   The query string created event.
+   */
+  public function queryStringCreated(QueryStringCreated $event) {
+    $event->getQueryParameters()->add(['test' => 'fun']);
+  }
+
+}
diff --git a/tests/src/Functional/UrlIntegrationTest.php b/tests/src/Functional/UrlIntegrationTest.php
index e2714a4..95357f0 100644
--- a/tests/src/Functional/UrlIntegrationTest.php
+++ b/tests/src/Functional/UrlIntegrationTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\facets\Functional;
 
+use Drupal\Component\Render\FormattableMarkup;
 use Drupal\Core\Url;
 use Drupal\facets\FacetInterface;
 use Drupal\facets\Entity\Facet;
@@ -215,4 +216,21 @@ class UrlIntegrationTest extends FacetsTestBase {
     $this->assertSession()->pageTextContains('This alias is already in use for another facet defined on the same source.');
   }
 
+  /**
+   * Tests that modules can change the facet url.
+   */
+  public function testFacetUrlCanBeChanged() {
+    $modules = ['facets_events_test'];
+    $success = $this->container->get('module_installer')->install($modules, TRUE);
+    $this->assertTrue($success, new FormattableMarkup('Enabled modules: %modules', ['%modules' => implode(', ', $modules)]));
+    $this->rebuildAll();
+
+    $id = 'facet';
+    $name = 'Facet';
+    $this->createFacet($name, $id);
+
+    $url = Url::fromUserInput('/search-api-test-fulltext', ['query' => ['f[0]' => 'facet:item', 'test' => 'fun']]);
+    $this->checkClickedFacetUrl($url);
+  }
+
 }
diff --git a/tests/src/Unit/Plugin/url_processor/QueryStringTest.php b/tests/src/Unit/Plugin/url_processor/QueryStringTest.php
index 48253ab..321857f 100644
--- a/tests/src/Unit/Plugin/url_processor/QueryStringTest.php
+++ b/tests/src/Unit/Plugin/url_processor/QueryStringTest.php
@@ -16,6 +16,7 @@ use Drupal\facets\Result\ResultInterface;
 use Drupal\Tests\Core\Routing\TestRouterInterface;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 use Symfony\Component\HttpFoundation\ParameterBag;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\Routing\Exception\ResourceNotFoundException;
@@ -49,11 +50,20 @@ class QueryStringTest extends UnitTestCase {
   protected $entityManager;
 
   /**
+   * A mock of the event dispatcher.
+   *
+   * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
+   */
+  protected $eventDispatcher;
+
+  /**
    * Creates a new processor object for use in the tests.
    */
   protected function setUp() {
     parent::setUp();
 
+    $this->eventDispatcher = $this->createMock(EventDispatcherInterface::class);
+
     $facet = new Facet([], 'facets_facet');
     $this->originalResults = [
       new Result($facet, 'llama', 'Llama', 15),
@@ -71,7 +81,7 @@ class QueryStringTest extends UnitTestCase {
    */
   public function testEmptyProcessorConfiguration() {
     $this->setExpectedException(InvalidProcessorException::class, "The url processor doesn't have the required 'facet' in the configuration array.");
-    new QueryString([], 'test', [], new Request(), $this->entityManager);
+    new QueryString([], 'test', [], new Request(), $this->entityManager, $this->eventDispatcher);
   }
 
   /**
@@ -105,7 +115,7 @@ class QueryStringTest extends UnitTestCase {
     $request = new Request();
     $request->query->set('f', ['test:badger']);
 
-    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request, $entityTypeManager);
+    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request, $entityTypeManager, $this->eventDispatcher);
     $this->processor->setActiveItems($facet);
 
     $this->assertEquals(['badger'], $facet->getActiveItems());
@@ -142,7 +152,7 @@ class QueryStringTest extends UnitTestCase {
     $request = new Request();
     $request->query->set('f', ['test:badger', 'test:mushroom', 'donkey:kong']);
 
-    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request, $entityTypeManager);
+    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request, $entityTypeManager, $this->eventDispatcher);
     $this->processor->setActiveItems($facet);
 
     $this->assertEquals(['badger', 'mushroom'], $facet->getActiveItems());
@@ -159,7 +169,7 @@ class QueryStringTest extends UnitTestCase {
     $request = new Request();
     $request->query->set('f', []);
 
-    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request, $this->entityManager);
+    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request, $this->entityManager, $this->eventDispatcher);
     $results = $this->processor->buildUrls($facet, []);
     $this->assertEmpty($results);
   }
@@ -176,7 +186,7 @@ class QueryStringTest extends UnitTestCase {
     $request = new Request();
     $request->query->set('f', []);
 
-    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request, $this->entityManager);
+    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request, $this->entityManager, $this->eventDispatcher);
     $results = $this->processor->buildUrls($facet, $this->originalResults);
 
     $this->assertEquals('f', $this->processor->getFilterKey());
@@ -226,7 +236,7 @@ class QueryStringTest extends UnitTestCase {
     $request = new Request();
     $request->query->set('f', ['king:kong']);
 
-    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request, $entityTypeManager);
+    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request, $entityTypeManager, $this->eventDispatcher);
     $results = $this->processor->buildUrls($facet, $original_results);
 
     /** @var \Drupal\facets\Result\ResultInterface $r */
@@ -254,7 +264,7 @@ class QueryStringTest extends UnitTestCase {
     $this->originalResults[1]->setActiveState(TRUE);
     $this->originalResults[2]->setActiveState(TRUE);
 
-    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], new Request(), $this->entityManager);
+    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], new Request(), $this->entityManager, $this->eventDispatcher);
     $results = $this->processor->buildUrls($facet, $this->originalResults);
 
     $this->assertEquals('route:test?f%5B0%5D=test%3A' . $results[0]->getRawValue(), $results[0]->getUrl()->toUriString());
@@ -294,7 +304,7 @@ class QueryStringTest extends UnitTestCase {
     $request = new Request();
     $request->query->set('ab', []);
 
-    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request, $this->entityManager);
+    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request, $this->entityManager, $this->eventDispatcher);
     $results = $this->processor->buildUrls($facet, $this->originalResults);
 
     /** @var \Drupal\facets\Result\ResultInterface $r */
@@ -313,7 +323,7 @@ class QueryStringTest extends UnitTestCase {
     $facet->setUrlAlias('test');
     $facet->setFacetSourceId('facet_source__dummy');
 
-    $this->processor = new QueryString(['facet' => $facet, 'separator' => '__'], 'query_string', [], new Request(), $this->entityManager);
+    $this->processor = new QueryString(['facet' => $facet, 'separator' => '__'], 'query_string', [], new Request(), $this->entityManager, $this->eventDispatcher);
     $results = $this->processor->buildUrls($facet, $this->originalResults);
 
     foreach ($results as $result) {
@@ -348,7 +358,7 @@ class QueryStringTest extends UnitTestCase {
     $facet->setUrlAlias('test');
     $facet->setFacetSourceId('facet_source__dummy');
 
-    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], new Request(), $this->entityManager);
+    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], new Request(), $this->entityManager, $this->eventDispatcher);
     $results = $this->processor->buildUrls($facet, $this->originalResults);
 
     foreach ($results as $result) {
@@ -380,7 +390,7 @@ class QueryStringTest extends UnitTestCase {
     $facet->setUrlAlias('test');
     $facet->setFacetSourceId('facet_source__dummy');
 
-    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], new Request(), $this->entityManager);
+    $this->processor = new QueryString(['facet' => $facet], 'query_string', [], new Request(), $this->entityManager, $this->eventDispatcher);
 
     $results = $this->processor->buildUrls($facet, $this->originalResults);
 
