diff --git a/config/install/site_status_message.settings.yml b/config/install/site_status_message.settings.yml
new file mode 100644
index 0000000..57e6647
--- /dev/null
+++ b/config/install/site_status_message.settings.yml
@@ -0,0 +1,6 @@
+admin: 0
+link: ''
+message: ''
+readmore: 'Read more...'
+langcode: en
+default_langcode: en
diff --git a/config/schema/site_status_message.schema.yml b/config/schema/site_status_message.schema.yml
new file mode 100644
index 0000000..328aa33
--- /dev/null
+++ b/config/schema/site_status_message.schema.yml
@@ -0,0 +1,12 @@
+# # Schema file for the configuration files of the Site Status Message module.
+
+site_status_message.settings:
+  type: config_object
+  label: 'Site Status Message settings'
+  mapping:
+    message:
+      type: text
+      label: 'Status message'
+    readmore:
+      type: text
+      label: 'More information link text'
diff --git a/config/site_status_message.settings.yml b/config/site_status_message.settings.yml
deleted file mode 100644
index 72a4c63..0000000
--- a/config/site_status_message.settings.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-admin: 0
-link: ''
-message: ''
-readmore: 'Read more...'
diff --git a/site_status_message.config_translation.yml b/site_status_message.config_translation.yml
new file mode 100644
index 0000000..9b15bcc
--- /dev/null
+++ b/site_status_message.config_translation.yml
@@ -0,0 +1,5 @@
+site_status_message.settings:
+  title: 'Site Status Message settings'
+  base_route_name: system.site_information_settings
+  names:
+    - site_status_message.settings
diff --git a/site_status_message.info.yml b/site_status_message.info.yml
index c5f2353..81a9cbe 100644
--- a/site_status_message.info.yml
+++ b/site_status_message.info.yml
@@ -2,5 +2,4 @@ name: Site Status Message
 type: module
 description: 'Provides a configurable message to display on the top of your site'
 core: 8.x
-version: VERSION
 configure: system.admin_config_system
diff --git a/site_status_message.install b/site_status_message.install
index 4fb1141..a702ed5 100644
--- a/site_status_message.install
+++ b/site_status_message.install
@@ -9,19 +9,5 @@
  */
 function site_status_message_uninstall() {
   // Remove Site Status Message variables.
-  \Drupal::config('site_status_message.settings')->delete();
+  \Drupal::configFactory()->getEditable('site_status_message.settings')->delete();
 }
-
-/**
- * Converts variables to config.
- *
- * @ingroup config_upgrade
- */
-function site_status_message_update_8001() {
-  update_variables_to_config('site_status_message.settings', array(
-    'site_status_message_message' => 'message',
-    'site_status_message_link' => 'link',
-    'site_status_message_readmore' => 'readmore',
-    'site_status_message_admin' => 'admin',
-  ));
-}
\ No newline at end of file
diff --git a/site_status_message.libraries.yml b/site_status_message.libraries.yml
new file mode 100644
index 0000000..02a2856
--- /dev/null
+++ b/site_status_message.libraries.yml
@@ -0,0 +1,5 @@
+site_status_message:
+  version: 1.x
+  css:
+    theme:
+      css/site_status_message.css: {}
diff --git a/site_status_message.module b/site_status_message.module
index be4e025..2d63009 100644
--- a/site_status_message.module
+++ b/site_status_message.module
@@ -7,12 +7,18 @@
  * @author: Gideon Cresswell (SkidNCrashwell) <https://drupal.org/user/407780>
  */
 
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Component\Utility\Xss;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Url;
+use Drupal\Core\Link;
+
 /**
  * Implements hook_help().
  */
-function site_status_message_help($path, $arg) {
-  switch ($path) {
-    case 'admin/help#site_status_message':
+function site_status_message_help($route_name, RouteMatchInterface $route_match) {
+  switch ($route_name) {
+    case 'help.page.site_status_message':
       $output = '<h3>' . t('About') . '</h3>';
       $output .= '<p>' . t('The Site Status Message is a simple module to display a site wide message to your users at the top of each page. Use cases could be to inform of known downtime in the future, to advertise a special offer on the site or some important news that needs highlighting.') . '</p>';
       $output .= '<p>' . t('An optional link to a page with more information can be displayed after the message.') . '</p>';
@@ -22,40 +28,52 @@ function site_status_message_help($path, $arg) {
 }
 
 /**
- * Implements hook_page_build().
+ * Implements hook_page_top().
  */
-function site_status_message_page_build(&$page) {
+function site_status_message_page_top(array &$page) {
   $config = \Drupal::config('site_status_message.settings');
-  $site_status_message = filter_xss(trim($config->get('message')));
+  $site_status_message = Xss::filter(trim($config->get('message')));
 
   if ($site_status_message) {
-    if (!$config->get('admin') && path_is_admin(current_path())) {
+    // Check if we need to show status message on admin pages.
+    if (!$config->get('admin') && \Drupal::service('router.admin_context')->isAdminRoute()) {
       return;
     }
-
-    $service = \Drupal::service('path.alias_manager');
-    $path = $service->getSystemPath($config->get('link'));
-    if (drupal_valid_path($path) && !empty($path)) {
-      $readmore = filter_xss($config->get('readmore'));
-      $link = l($readmore, $path);
-    }
-    else {
-      $readmore = $link = NULL;
+    $path = $config->get('link');
+    if (!empty($path)) {
+      $readmore = Xss::filterAdmin($config->get('readmore'));
+      // Build link from user entered data.
+      if ($path == '<front>') {
+        $link = Link::createFromRoute($readmore, $path);
+      }
+      else {
+        $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
+        $path = \Drupal::service('path.alias_manager')->getPathByAlias($path, $language);
+        if (\Drupal::service('path.validator')->isValid($path)) {
+          if (parse_url($path, PHP_URL_SCHEME) !== NULL) {
+            $link = \Drupal::l($readmore, Url::fromUri($path));
+          }
+          else {
+            $link = \Drupal::l($readmore, Url::fromUserInput($path));
+          }
+        }
+      }
+      if (!empty($link)) {
+        $page['page_top']['site_status_message'] = array(
+          '#theme' => 'site_status_message',
+          '#message' => $site_status_message,
+          '#link' => $link,
+          '#readmore' => $readmore,
+          '#attached' => array(
+            'library' => 'site_status_message/site_status_message',
+          ),
+          '#access' => \Drupal::currentUser()->hasPermission('access content'),
+        );
+      }
     }
 
-    $page['page_top']['site_status_message'] = array(
-      '#theme' => 'site_status_message',
-      '#message' => $site_status_message,
-      '#link' => $link,
-      '#readmore' => $readmore,
-      '#attached' => array(
-        'css' => array(
-          drupal_get_path('module', 'site_status_message') . '/css/site_status_message.css',
-        ),
-      ),
-      '#access' => user_access('access content'),
-    );
   }
+
 }
 
 /**
@@ -63,7 +81,6 @@ function site_status_message_page_build(&$page) {
  */
 function site_status_message_form_system_site_information_settings_alter(&$form, &$form_state, $form_id) {
   $config = \Drupal::config('site_status_message.settings');
-  $service = \Drupal::service('path.alias_manager');
 
   $form['site_status'] = array(
     '#type'  => 'fieldset',
@@ -80,9 +97,8 @@ function site_status_message_form_system_site_information_settings_alter(&$form,
       '#size'          => 40,
       '#maxlength'     => 256,
       '#title'         => 'More information page',
-      '#default_value' => $service->getPathAlias($config->get('link')),
+      '#default_value' => $config->get('link'),
       '#description'   => t('An optional link to show more information about the status message.'),
-      '#field_prefix'  => url(NULL, array('absolute' => TRUE)),
     ),
     'site_status_message_readmore' => array(
       '#type'          => 'textfield',
@@ -105,26 +121,37 @@ function site_status_message_form_system_site_information_settings_alter(&$form,
 /**
  * Validates the submitted site-information form.
  */
-function site_status_message_form_validate($form, &$form_state) {
+function site_status_message_form_validate($form, FormStateInterface &$form_state) {
   // Validate that the More Information page exists.
-  $service = \Drupal::service('path.alias_manager');
-  $form_builder = \Drupal::formBuilder(); 
-  $link = $form_state['values']['site_status_message_link'];
+  $raw_link = $link = $form_state->getValue('site_status_message_link');
 
-  if (!empty($link) && !drupal_valid_path($service->getSystemPath($link))) {
-    $form_builder->setErrorByName('site_status_message_link', $form_state, t('You must enter a valid internal path.'));
+  if (!empty($link)) {
+    if (parse_url($link, PHP_URL_SCHEME) === NULL) {
+      if (strpos($link, '<front>') === 0) {
+        $link = '/' . substr($link, strlen('<front>'));
+      }
+      $link = 'internal:' . $link;
+    }
+    if (parse_url($link, PHP_URL_SCHEME) === 'internal' && !in_array($raw_link[0], ['/', '?', '#'], TRUE) && substr($raw_link, 0, 7) !== '<front>') {
+      $form_state->setErrorByName('site_status_message_link', t('Manually entered paths should start with %slash, %question or %hash.', ['%slash' => '/', '%question' => '?', '%hash' => '#']));
+    }
+    $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
+    if (substr($raw_link, 0, 7) !== '<front>' && !\Drupal::service('path.validator')->isValid(\Drupal::service('path.alias_manager')->getPathByAlias($raw_link, $language))) {
+      $form_state->setErrorByName('site_status_message_link', t('You must enter a valid path.'));
+    }
   }
 }
 
 /**
- * Save the Site Status Message settings
+ * Save the Site Status Message settings.
  */
-function site_status_message_form_submit($form, &$form_state) {
-  $config = \Drupal::config('site_status_message.settings');
-  $config->set('message', $form_state['values']['site_status_message_message'])->save();
-  $config->set('link', $form_state['values']['site_status_message_link'])->save();
-  $config->set('readmore', $form_state['values']['site_status_message_readmore'])->save();
-  $config->set('admin', $form_state['values']['site_status_message_admin'])->save();
+function site_status_message_form_submit($form, FormStateInterface &$form_state) {
+  \Drupal::configFactory()->getEditable('site_status_message.settings')
+    ->set('message', $form_state->getValue('site_status_message_message'))
+    ->set('link', $form_state->getValue('site_status_message_link'))
+    ->set('readmore', $form_state->getValue('site_status_message_readmore'))
+    ->set('admin', $form_state->getValue('site_status_message_admin'))
+    ->save();
 }
 
 /**
@@ -136,10 +163,17 @@ function site_status_message_theme($existing, $type, $theme, $path) {
       'variables' => array(
         'message' => NULL,
         'link' => NULL,
-        'readmore' => NULL, 
+        'readmore' => NULL,
       ),
       'render element' => 'element',
       'template'  => 'site-status-message',
     ),
   );
 }
+
+/**
+ * Implements hook_config_translation_info_alter().
+ */
+function site_status_message_config_translation_info_alter(&$info) {
+  $info['system.site_information_settings']['names'][] = 'site_status_message.settings';
+}
diff --git a/templates/site-status-message.html.twig b/templates/site-status-message.html.twig
index b15b97e..e95b82f 100644
--- a/templates/site-status-message.html.twig
+++ b/templates/site-status-message.html.twig
@@ -4,7 +4,7 @@
  * This template handles the output of the Site Status Message.
  *
  * Variables available:
- * - $message: The message to display (run through check_plain).
+ * - $message: The message to display.
  * - $link: An optional link to a page with more information.
  *
  * @ingroup themeable
