diff --git a/README.txt b/README.txt
index 36bfd19..d5b5e95 100644
--- a/README.txt
+++ b/README.txt
@@ -1,5 +1,7 @@
--- SUMMARY --
+JW Player module for Drupal.
 
+SUMMARY
+-----------------------------------------------
 The JW Player module adds a new field for displaying video files in a JW Player.
 
 For a full description visit the project page:
@@ -8,15 +10,15 @@ Bug reports, feature suggestions and latest developments:
   http://drupal.org/project/issues/jw_player
 
 
--- REQUIREMENTS --
-
+REQUIREMENTS
+-----------------------------------------------
 * This module depends on the File module, which is part of Drupal core, Chaos
   Tools (http://drupal.org/project/ctools) and the Libraries module
   (http://drupal.org/project/libraries).
 
 
--- INSTALLATION --
-
+INSTALLATION
+-----------------------------------------------
 * Download either the latest commercial or the latest non-commercial JW
   Player at http://www.longtailvideo.com/players/jw-flv-player/.
 
@@ -30,12 +32,12 @@ Bug reports, feature suggestions and latest developments:
   check your configuration.
 
 
--- BASIC USAGE --
-
+BASIC USAGE
+-----------------------------------------------
 In that majority of cases JW Player is used as a field formatter on a file
 field. Before enabling JW Player on a field visit /admin/config/media/jw_player
 to configure one or more presets. A preset is a group of JW Player settings,
-such as dimentions and skin, that can be re-used multiple times.
+such as dimensions and skin, that can be re-used multiple times.
 
 Once a preset has been defined visit /admin/structure/types and select "manage
 display" for the content type you'd like to configure and select "JW player" as
@@ -44,8 +46,8 @@ click on the cog beside the field to select the preset you'd like to apply to
 the file. That's it - videos uploaded to this field should now be displayed
 using JW Player!
 
--- URL BASED SEEKING --
-
+URL BASED SEEKING
+-----------------------------------------------
 You can create permanent links that make jWPlayer start playing at a given
 time frame. The url must look like this:
 
@@ -58,3 +60,12 @@ for sites with multiple instances of jWPlayer on it.
 Not that seeking only works if the server delivering the media file is
 capable of doing so. If the Server does not support this the player will
 always start at the beginning.
+
+LIMITATIONS
+-----------------------------------------------
+1) It is not possible to have multiple JW Player cloud-based presets on the
+   same page. In such a situation, each player will have its own Player Library
+   URL. When loaded on the same page, there will be a conflict. The way to
+   resolve this issue is use one Cloud Player Library URL (the default defined
+   on the General Settings page at /admin/config/media/jw_player/settings), and
+   set each preset used on the page to have Drupal-defined settings.
diff --git a/config/install/jw_player.settings.yml b/config/install/jw_player.settings.yml
index 1dee974..fe3fef8 100644
--- a/config/install/jw_player.settings.yml
+++ b/config/install/jw_player.settings.yml
@@ -1,2 +1,3 @@
 jw_player_key: null
 jw_player_version: 6
+jw_player_hosting: cloud
diff --git a/config/schema/jw_player.schema.yml b/config/schema/jw_player.schema.yml
index 1220a02..0e75672 100644
--- a/config/schema/jw_player.schema.yml
+++ b/config/schema/jw_player.schema.yml
@@ -18,6 +18,9 @@ jw_player.preset.*:
       type: mapping
       label: 'Settings'
       mapping:
+        preset_source:
+          type:  label
+          label: 'Select your preset source.'
         mode:
           type:  label
           label: 'Select your primary embed mode.'
@@ -45,6 +48,32 @@ jw_player.preset.*:
         autoplay:
           type: boolean
           label: 'Autoplay'
+        mute:
+          type: boolean
+          label: 'Mute'
+        sharing:
+          type: boolean
+          label: 'Sharing'
+        sharing_heading:
+          type: string
+          label: 'Sharing heading'
+        sharing_sites:
+          type: mapping
+          label: 'Sharing sites'
+          mapping:
+            sites:
+              type: sequence
+              label: 'Sites'
+              sequence:
+                type: mapping
+                label: 'Sharing sites configuration'
+                mapping:
+                  enabled:
+                    type: boolean
+                    label: 'Enabled'
+                  weight:
+                    type: integer
+                    label: 'Weight'
         advertising:
           type: mapping
           label: 'Advertising'
@@ -75,6 +104,9 @@ jw_player.settings:
     cloud_player_library_url:
       type: string
       label: 'Cloud-Hosted Account Token'
+    jw_player_hosting:
+      type: string
+      label: 'Hosting Type'
     jw_player_key:
       type: string
       label: 'Self-Hosted Player License Key'
diff --git a/jw_player.module b/jw_player.module
index 0ce7045..9c61003 100755
--- a/jw_player.module
+++ b/jw_player.module
@@ -3,6 +3,8 @@
  * @file
  * Adds a theme function which allows theme developers to use the JW Player.
  */
+use Drupal\Core\Render\Element;
+use Drupal\jw_player\Entity\Jw_player;
 
 /**
  * Implements hook_theme().
@@ -193,3 +195,32 @@ function jw_player_get_key() {
   $config = \Drupal::config('jw_player.settings');
   return $config->get('jw_player_key') ? $config->get('jw_player_key') : NULL;
 }
+
+/**
+ * Helper function to retrieve available JW Player sharing sites.
+ *
+ * @return array
+ *   Array of sharing site keys and formatted values.
+ */
+function jw_player_sharing_sites() {
+  return [
+    'facebook' => t('Facebook'),
+    'twitter' => t('Twitter'),
+    'pinterest' => t('Pinterest'),
+    'email' => t('Email'),
+    'tumblr' => t('Tumblr'),
+    'googleplus' => t('Google Plus'),
+    'reddit' => t('Reddit'),
+    'linkedin' => t('LinkedIn'),
+  ];
+}
+
+/**
+ * Return regex to check JW Player library URL format.
+ *
+ * @return string
+ *   The regex string as defined in the function.
+ */
+function jw_player_library_url_regex() {
+  return '/^(https?:|)?\/\/content\.jwplatform\.com\/libraries\/([a-zA-Z0-9]*)\.js$/i';
+}
diff --git a/src/Element/JwPlayer.php b/src/Element/JwPlayer.php
index deaad7d..fb9fd5d 100644
--- a/src/Element/JwPlayer.php
+++ b/src/Element/JwPlayer.php
@@ -110,6 +110,26 @@ class JwPlayer extends RenderElement {
       unset($settings['advertising']);
     }
 
+    // Unset sharing if it is not set.
+    if (isset($settings['sharing']) && $settings['sharing']) {
+      unset($settings['sharing']);
+      $settings['sharing']['sites'] = [];
+      foreach($settings['sharing_sites']['sites'] as $key => $value) {
+        if ($value['enabled'] == 1) {
+          $settings['sharing']['sites'][] = $key;
+        }
+      }
+      // If none selected, all selected.
+      if (!$settings['sharing']['sites']) {
+        foreach($settings['sharing_sites']['sites'] as $key => $value) {
+          $settings['sharing']['sites'][] = $key;
+        }
+      }
+      $settings['sharing']['heading'] = $settings['sharing_heading'];
+    }
+    unset($settings['sharing_sites']);
+    unset($settings['sharing_heading']);
+
     // Add the build settings to drupal settings.
     $element['#attached']['drupalSettings']['jw_player']['players'][$element['#html_id']] = $settings;
 
diff --git a/src/Entity/Jw_player.php b/src/Entity/Jw_player.php
index 87d69ea..6e87087 100644
--- a/src/Entity/Jw_player.php
+++ b/src/Entity/Jw_player.php
@@ -1,10 +1,7 @@
 <?php
-/**
- * @file
- * Contains \Drupal\jw_player\Entity\Jw_player.
- */
 
 namespace Drupal\jw_player\Entity;
+
 use Drupal\Core\Config\Entity\ConfigEntityBase;
 use Drupal\jw_player\Jw_playerInterface;
 /**
@@ -88,4 +85,105 @@ class Jw_player extends ConfigEntityBase implements Jw_playerInterface {
     return isset($this->settings[$setting_name]) ? $this->settings[$setting_name] : NULL;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsDisplay($format = 'string') {
+    $summary = [];
+    $preset_settings = $this->getSettings();
+    // Name and description.
+    $summary['name'] = t('Preset: @name', ['@name' => $this->label()]);
+    if (!empty($this->description)) {
+      $summary['description'] = t('Description: @desc', ['@desc' => $this->description]);
+    }
+    // Skin.
+    if (!isset($preset_settings['preset_source']) || $preset_settings['preset_source'] == 'drupal') {
+      $summary['source'] = t('Preset source: Drupal');
+      if (!empty($preset_settings['skin'])) {
+        $skin_label = $preset_settings['skin'];
+        $summary['skin'] = t('Skin: @skin', ['@skin' => $skin_label]);
+      }
+      // Dimensions and stretching.
+      switch ($preset_settings['stretching']) {
+        case 'exactfit':
+          $stretch = 'exact fit';
+          break;
+        case 'uniform':
+          $stretch = 'uniform';
+          break;
+        case 'fill':
+          $stretch = 'fill';
+          break;
+        default:
+          $stretch = '';
+          break;
+      }
+      if (!empty($stretch)) {
+        if (!empty($preset_settings['responsive'])) {
+          $summary['dimensions'] = t('Dimensions: @width width (@aspect_ratio), @stretch', [
+            '@width' => $preset_settings['width'],
+            '@aspect_ratio' => $preset_settings['aspectratio'],
+            '@stretch' => $stretch,
+          ]);
+        }
+        else {
+          $summary['dimensions'] = t('Dimensions: @widthx@height, @stretch', [
+            '@width' => $preset_settings['width'],
+            '@height' => $preset_settings['height'],
+            '@stretch' => $stretch,
+          ]);
+        }
+      }
+      else {
+        if (!empty($preset_settings['responsive'])) {
+          $summary['dimensions'] = t('Dimensions: @width width (@aspect_ratio)', [
+            '@width' => $preset_settings['width'],
+            '@aspect_ratio' => $preset_settings['aspectratio'],
+          ]);
+        }
+        else {
+          $summary['dimensions'] = t('Dimensions: @widthx@height', [
+            '@width' => $preset_settings['width'],
+            '@height' => $preset_settings['height'],
+          ]);
+        }
+      }
+      // Enabled options.
+      $enabled = [];
+      if ($preset_settings['autoplay']) {
+        $enabled[] = t('Autoplay');
+      }
+      if ($preset_settings['mute']) {
+        $enabled[] = t('Mute');
+      }
+      if (isset($preset_settings['sharing']) && $preset_settings['sharing']) {
+        $enabled[] = t('Sharing');
+      }
+      if (!empty($enabled)) {
+        $enabled_string = implode(', ', $enabled);
+        $summary['enabled'] = t('Enabled options: @enabled', ['@enabled' => $enabled_string]);
+      }
+      // Sharing sites.
+      $sharing_weights = NULL;
+      if (isset($preset_settings['sharing_sites']['sites'])) {
+        foreach ($preset_settings['sharing_sites']['sites'] as $key => $value) {
+          if ($value['enabled'] == TRUE) {
+            $sharing_weights[$key] = $value['weight'];
+          }
+        }
+        if ($sharing_weights) {
+          asort($sharing_weights);
+          $sharing_sites = jw_player_sharing_sites();
+          $sharing_sorted = array_intersect_key($sharing_sites, $sharing_weights);
+
+          $sharing_sorted_string = implode(', ', $sharing_sorted);
+          $summary['sharing'] = t('Sharing sites: @sharing', ['@sharing' => $sharing_sorted_string]);
+        }
+      }
+    }
+    else {
+      $summary['source'] = t('Preset source: JW Player');
+    }
+    return ($format == 'string') ? implode('<br />', $summary) : $summary;
+  }
 }
diff --git a/src/Form/JwplayerPresetAdd.php b/src/Form/JwplayerPresetAdd.php
index ef1691b..a71a4cb 100644
--- a/src/Form/JwplayerPresetAdd.php
+++ b/src/Form/JwplayerPresetAdd.php
@@ -1,8 +1,4 @@
 <?php
-/**
- * @file
- * Contains \Drupal\jw_player\Form\JwplayerSettingsForm.
- */
 
 namespace Drupal\jw_player\Form;
 
@@ -94,18 +90,115 @@ class JwplayerPresetAdd extends EntityForm {
       '#weight' => 5,
     );
 
+    if (jw_player_use_legacy()) {
+      $disabled = TRUE;
+      $desc = t('When creating JW Player presets, select if the source should be defined on Drupal, or by using definitions set within your JWPlayer.com account. <strong>This option is only available for sites using JW Player 7 or above.</strong>');
+    }
+    else {
+      $disabled = FALSE;
+      $desc = t('When creating JW Player presets, select if the source should be defined on Drupal, or by using definitions set within your JWPlayer.com account.');
+    }
+    $form['settings']['preset_source'] = [
+      '#type' => 'radios',
+      '#title' => t('Preset source'),
+      '#disabled' => $disabled,
+      '#options' => [
+        'drupal' => t('Use Drupal-defined presets'),
+        'jwplayer' => t('Use presets defined on JWPlayer.com'),
+      ],
+      '#default_value' => $preset->getSetting('preset_source') ? $preset->getSetting('preset_source') : 'drupal',
+      '#description' => $desc,
+      '#weight' => 0,
+    ];
+
+    // Some settings are suitable for legacy versions only.
+    if (jw_player_use_legacy()) {
+      $form['settings']['mode'] = [
+        '#type' => 'radios',
+        '#title' => t('Embed mode'),
+        '#description' => t('Select your primary embed mode. Choosing HTML5 primary means that modern browsers that also support flash will use the HTML5 player first where possible. While this is desirable, the Flash based player supports more features and is generally more reliable.'),
+        '#options' => array(
+          'flash' => t('Flash primary, HTML5 failover'),
+          'html5' => t('HTML5 primary, Flash failover'),
+        ),
+        '#default_value' => $preset->getSetting('mode') ? $preset->getSetting('mode') : 'html5',
+        '#weight' => 1,
+        '#states' => [
+          'visible' => [
+            ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+          ],
+        ],
+      ];
+
+      // Legacy Skins.
+      $skin_options = [
+        'bekle' => 'Bekle*',
+        'modieus' => 'Modieus*',
+        'glow' => 'Glow*',
+        'five' => 'Five*',
+        'beelden' => 'Beelden*',
+        'stormtrooper' => 'Stormtrooper*',
+        'vapor' => 'Vapor*',
+        'roundster' => 'Roundster*'
+      ];
+      $skin_desc = t('Select a player skin. Some skins (*) require a premium license.');
+    }
+    else {
+      // JW Player 7 Skins
+      $skin_options = [
+        'seven' => 'Seven',
+        'six' => 'Six',
+        'five' => 'Five',
+        'glow' => 'Glow',
+        'beelden' => 'Beelden',
+        'vapor' => 'Vapor',
+        'bekle' => 'Bekle',
+        'roundster' => 'Roundster',
+        'stormtrooper' => 'Stormtrooper',
+      ];
+      $skin_url = 'https://support.jwplayer.com/customer/portal/articles/1406968-using-jw-player-skins';
+      $skin_desc = t('Select a player skin. <a href="@url" target="_blank">Click here</a> to see skins provided by JW Player.', [
+        '@url' => $skin_url,
+      ]);
+    }
+
+    // Add any additional skins defined in JW Player library.
+    foreach (jw_player_skins() as $skin) {
+      $skin_options[$skin->name] = Unicode::ucfirst($skin->name);
+    }
+
+    $form['settings']['skin'] = [
+      '#title' => t('Skin'),
+      '#description' => $skin_desc,
+      '#type' => 'select',
+      '#default_value' => $preset->getSetting('skin') ? $preset->getSetting('skin') : FALSE,
+      '#empty_option' => t('None (default skin)'),
+      '#options' => $skin_options,
+      '#weight' => 2,
+      '#states' => [
+        'visible' => [
+          ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+        ],
+      ],
+    ];
+
     $form['settings']['stretching'] = array(
       '#title' => t('Stretching'),
       '#description' => t('How to resize the poster and video to fit the display.'),
       '#type' => 'select',
       '#default_value' => $preset->getSetting('stretching') ? $preset->getSetting('stretching') : 'uniform',
-      '#weight' => 5,
+      '#weight' => 3,
       '#options' => array(
         'none' => t('None (keep original dimensions)'),
         'exactfit' => t('Exact Fit (stretch disproportionally)'),
         'uniform' => t('Uniform (stretch proportionally; black borders)'),
         'fill' => t('Fill (stretch proportionally; parts cut off)'),
       ),
+      '#states' => [
+        'visible' => [
+          ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+        ],
+      ],
     );
 
     $form['settings']['responsive'] = array(
@@ -113,7 +206,12 @@ class JwplayerPresetAdd extends EntityForm {
       '#title' => 'Use a Responsive Design',
       '#description' => t('Enable Responsive Design using a percentage based width and an aspect ratio.'),
       '#default_value' => $preset->getSetting('responsive') ? $preset->getSetting('responsive') : FALSE,
-      '#weight' => 6,
+      '#weight' => 4,
+      '#states' => [
+        'visible' => [
+          ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+        ],
+      ],
     );
 
     $form['settings']['width'] = array(
@@ -125,7 +223,15 @@ class JwplayerPresetAdd extends EntityForm {
       '#field_suffix' => ' ' . t('pixels'),
       '#default_value' => $preset->getSetting('width') ? $preset->getSetting('width') : NULL,
       '#required' => TRUE,
-      '#weight' => 7,
+      '#weight' => 5,
+      '#states' => [
+        'required' => [
+          ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+        ],
+        'visible' => [
+          ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+        ],
+      ],
     );
 
     $form['settings']['height'] = array(
@@ -136,13 +242,17 @@ class JwplayerPresetAdd extends EntityForm {
       '#description' => t('Enter the height for this player.'),
       '#field_suffix' => ' ' . t('pixels'),
       '#default_value' => $preset->getSetting('height') ? $preset->getSetting('height') : NULL,
-      '#weight' => 8,
+      '#weight' => 6,
       '#states' => array(
         'required' => array(
-          ':input[name="settings[responsive]"]' => array('checked' => FALSE),
+          [
+            ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+            ':input[name="settings[responsive]"]' => ['checked' => FALSE],
+          ]
         ),
         'visible' => array(
           ':input[name="settings[responsive]"]' => array('checked' => FALSE),
+          ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
         ),
       ),
     );
@@ -153,17 +263,137 @@ class JwplayerPresetAdd extends EntityForm {
       '#title' => t('Aspect ratio'),
       '#description' => t('Enter the aspect ratio for this player.'),
       '#default_value' => $preset->getSetting('aspectratio') ? $preset->getSetting('aspectratio') : NULL,
-      '#weight' => 8,
+      '#weight' => 6,
       '#states' => array(
         'required' => array(
-          ':input[name="settings[responsive]"]' => array('checked' => TRUE),
+          [
+            ':input[name="settings[responsive]"]' => ['checked' => TRUE],
+            ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+          ]
         ),
         'visible' => array(
           ':input[name="settings[responsive]"]' => array('checked' => TRUE),
+          ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
         ),
       ),
     );
 
+    $form['settings']['autoplay'] = [
+      '#title' => t('Autoplay'),
+      '#type' => 'checkbox',
+      '#description' => t('Automatically start playing the video on page load. Can be true or false (default). Autostart does not work on mobile devices like iOS and Android.'),
+      '#default_value' => $preset->getSetting('autoplay') ? $preset->getSetting('autoplay') : 'false',
+      '#weight' => 7,
+      '#states' => [
+        'visible' => [
+          ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+        ],
+      ],
+    ];
+
+    $form['settings']['mute'] = [
+      '#type' => 'checkbox',
+      '#title' => t('Mute'),
+      '#description' => t('Mute the player by default during playback. This can be useful when combined with the autostart option. Cannot control settings of external sources such as YouTube.'),
+      '#default_value' => $preset->getSetting('mute') ? $preset->getSetting('mute') : FALSE,
+      '#weight' => 8,
+      '#states' => [
+        'visible' => [
+          ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+        ],
+      ],
+    ];
+
+    // Social media sharing.
+    if (!jw_player_use_legacy()) {
+      $form['settings']['sharing'] = [
+        '#type' => 'checkbox',
+        '#title' => t('Sharing'),
+        '#description' => t('Enable the social sharing overlay. If no sharing options are selected, the page URL link with default sharing sites will be shown.'),
+        '#default_value' => $preset->getSetting('sharing') ? $preset->getSetting('sharing') : FALSE,
+        '#weight' => 9,
+        '#states' => [
+          'visible' => [
+            ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+          ],
+        ],
+      ];
+      $form['settings']['sharing_heading'] = [
+        '#type' => 'textfield',
+        '#title' => t('Sharing heading text'),
+        '#description' => t('Short, instructive text to display at the top of the sharing screen.'),
+        '#default_value' => $preset->getSetting('sharing_heading') ? $preset->getSetting('sharing_heading') : t('Share Video'),
+        '#weight' => 10,
+        '#states' => [
+          'visible' => [
+            ':input[name="settings[sharing]"]' => ['checked' => TRUE],
+            ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+          ],
+        ],
+      ];
+
+      $sites = jw_player_sharing_sites();
+      $weight = count($sites) + 1;
+      $sharing_sites_order = [];
+      foreach ($sites as $site_id => $sharing_site) {
+        $sharing_sites_order[$site_id] = [
+          'label' => $sharing_site,
+          'enabled' => $preset->getSetting('sharing_sites')['sites'][$site_id]['enabled'] ?: FALSE,
+          'weight' => $preset->getSetting('sharing_sites')['sites'][$site_id]['weight'] ?: $weight,
+        ];
+        $weight++;
+      }
+
+      $form['settings']['sharing_sites'] = [
+        '#type' => 'item',
+        '#weight' => 11,
+      ];
+      $form['settings']['sharing_sites']['sites'] = [
+        '#type' => 'table',
+        '#header' => [t('Label'), t('Weight')],
+        '#empty' => t('There are no items yet. Add an item.'),
+        '#suffix' => '<div class="description">' . $this->t('The social networks sites that are enabled for sharing. Select none to allow all sharing sites.') .'</div>',
+        '#tabledrag' => [
+          [
+            'action' => 'order',
+            'relationship' => 'sibling',
+            'group' => 'jw-player-sharing-sites-order-weight',
+          ],
+        ],
+        '#states' => [
+          'visible' => [
+            ':input[name="settings[sharing]"]' => ['checked' => TRUE],
+            ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+          ],
+        ],
+      ];
+
+      uasort($sharing_sites_order, 'Drupal\Component\Utility\SortArray::sortByWeightElement');
+
+      foreach ($sharing_sites_order as $site_id => $sharing_site) {
+        $form['settings']['sharing_sites']['sites'][$site_id]['#attributes']['class'][] = 'draggable';
+        $form['settings']['sharing_sites']['sites'][$site_id]['enabled'] = [
+          '#type' => 'checkbox',
+          '#title' => $sharing_site['label'],
+          '#title_display' => 'after',
+          '#default_value' => $sharing_site['enabled'],
+        ];
+        $form['settings']['sharing_sites']['sites'][$site_id]['weight'] = [
+          '#type' => 'weight',
+          '#title' => t('Weight for @title', ['@title' => $sharing_site['label']]),
+          '#title_display' => 'invisible',
+          '#delta' => 50,
+          '#default_value' => (int) $sharing_site['weight'],
+          '#array_parents' => [
+            'settings',
+            'sites',
+            $site_id
+          ],
+          '#attributes' => ['class' => ['jw-player-sharing-sites-order-weight']],
+        ];
+      }
+    }
+
     $form['settings']['controlbar'] = array(
       '#title' => t('Controlbar Position'),
       '#type' => 'select',
@@ -175,71 +405,17 @@ class JwplayerPresetAdd extends EntityForm {
         'top' => t('Top'),
         'over' => t('Over'),
       ),
-      '#weight' => 9,
+      '#weight' => 12,
+      '#states' => [
+        'visible' => [
+          ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+        ],
+      ],
     );
 
-    // Some settings are suitable for legacy versions only.
-    if (jw_player_use_legacy()) {
-      $form['settings']['mode'] = array(
-        '#type' => 'radios',
-        '#title' => t('Embed mode'),
-        '#description' => t('Select your primary embed mode. Choosing HTML5 primary means that modern browsers that also support flash will use the HTML5 player first where possible. While this is desirable, the Flash based player supports more features and is generally more reliable.'),
-        '#options' => array(
-          'flash' => t('Flash primary, HTML5 failover'),
-          'html5' => t('HTML5 primary, Flash failover'),
-        ),
-        '#default_value' => $preset->getSetting('mode') ? $preset->getSetting('mode') : 'html5',
-      );
-
-      // Legacy Skins.
-      $skin_options = [
-        'bekle' => 'Bekle*',
-        'modieus' => 'Modieus*',
-        'glow' => 'Glow*',
-        'five' => 'Five*',
-        'beelden' => 'Beelden*',
-        'stormtrooper' => 'Stormtrooper*',
-        'vapor' => 'Vapor*',
-        'roundster' => 'Roundster*'
-      ];
-      $skin_desc = t('Select a player skin. Some skins (*) require a premium license.');
-    }
-    else {
-      // JW Player 7 Skins
-      $skin_options = [
-        'seven' => 'Seven',
-        'six' => 'Six',
-        'five' => 'Five',
-        'glow' => 'Glow',
-        'beelden' => 'Beelden',
-        'vapor' => 'Vapor',
-        'bekle' => 'Bekle',
-        'roundster' => 'Roundster',
-        'stormtrooper' => 'Stormtrooper',
-      ];
-      $skin_url = 'https://support.jwplayer.com/customer/portal/articles/1406968-using-jw-player-skins';
-      $skin_desc = t('Select a player skin. <a href="@url" target="_blank">Click here</a> to see skins provided by JW Player.', [
-        '@url' => $skin_url,
-      ]);
-    }
-
-    // Add any additional skins defined in JW Player library.
-    foreach (jw_player_skins() as $skin) {
-      $skin_options[$skin->name] = Unicode::ucfirst($skin->name);
-    }
-
-    $form['settings']['skin'] = [
-      '#title' => t('Skin'),
-      '#description' => $skin_desc,
-      '#type' => 'select',
-      '#default_value' => $preset->getSetting('skin') ? $preset->getSetting('skin') : FALSE,
-      '#empty_option' => t('None (default skin)'),
-      '#options' => $skin_options,
-    ];
-
     // Add preset plugin settings.
     foreach (jw_player_preset_plugins() as $plugin => $info) {
-      $form['settings']['plugins']['#weight'] = 10;
+      $form['settings']['plugins']['#weight'] = 13;
 
       // Fieldset per plugin.
       $form['settings']['plugins'][$plugin] = array(
@@ -250,6 +426,11 @@ class JwplayerPresetAdd extends EntityForm {
         '#weight' => 10,
         '#collapsible' => TRUE,
         '#collapsed' => FALSE,
+        '#states' => [
+          'visible' => [
+            ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+          ],
+        ],
       );
 
       // Enable/disable plugin setting.
@@ -284,19 +465,16 @@ class JwplayerPresetAdd extends EntityForm {
       }
     }
 
-    $form['settings']['autoplay'] = array(
-      '#title' => t('Autoplay'),
-      '#type' => 'checkbox',
-      '#description' => t('Set the video to autoplay on page load'),
-      '#default_value' => $preset->getSetting('autoplay') ? $preset->getSetting('autoplay') : 'false',
-      '#weight' => 4,
-    );
-
     $form['settings']['advertising'] = array(
       '#type' => 'details',
       '#title' => $this->t('Advertising'),
       '#description' => $this->t('This requires an enterprise license. See the <a href="@jwplayer_documentation_url">JW Player documentation</a> about preroll ads for more information'),
-      '#weight' => 11,
+      '#weight' => 14,
+      '#states' => [
+        'visible' => [
+          ':input[name="settings[preset_source]"]' => ['value' => 'drupal'],
+        ],
+      ],
     );
 
     $form['settings']['advertising']['client'] = array(
@@ -322,6 +500,22 @@ class JwplayerPresetAdd extends EntityForm {
         ),
       ),
     );
+
+    $form['settings']['player_library_url'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Cloud Player Library Url'),
+      '#description' => $this->t('Enter the URL to the player created on JWPlayer.com that contains the settings for this preset.'),
+      '#default_value' => $preset->getSetting('player_library_url') ?: FALSE,
+      '#states' => [
+        'required' => [
+          ':input[name="settings[preset_source]"]' => ['value' => 'jwplayer'],
+        ],
+        'visible' => [
+          ':input[name="settings[preset_source]"]' => ['value' => 'jwplayer'],
+        ],
+      ],
+    ];
+
     $form['#attached']['library'][] = 'jw_player/preset';
     return $form;
   }
@@ -341,25 +535,33 @@ class JwplayerPresetAdd extends EntityForm {
   public function validateForm(array &$form, FormStateInterface $form_state) {
     parent::validateForm($form, $form_state);
     $preset = $this->entity;
-    if (!$preset->getSetting('width')) {
-      $form_state->setErrorByName('settings][width', t('Width field is required.'));
-    }
-    if ($preset->getSetting('responsive')) {
-      if ($preset->getSetting('width') > 100) {
-        $form_state->setErrorByName('settings][width', t('Width field must be less than 100%.'));
+    if ($preset->getSetting('preset_source') == 'drupal') {
+      if (!$preset->getSetting('width')) {
+        $form_state->setErrorByName('settings][width', t('Width field is required.'));
       }
-      // Aspect Ratio Validation.
-      if (!$preset->getSetting('aspectratio')) {
-        $form_state->setErrorByName('settings][aspectratio', t('Aspect Ratio field is required if Responsive Design is enabled.'));
+      if ($preset->getSetting('responsive')) {
+        if ($preset->getSetting('width') > 100) {
+          $form_state->setErrorByName('settings][width', t('Width field must be less than 100%.'));
+        }
+        // Aspect Ratio Validation.
+        if (!$preset->getSetting('aspectratio')) {
+          $form_state->setErrorByName('settings][aspectratio', t('Aspect Ratio field is required if Responsive Design is enabled.'));
+        }
+        elseif (!preg_match('/^([0-9]*):([0-9]*)$/', $preset->getSetting('aspectratio'), $matches) ||
+          (!is_numeric($matches[1]) || !is_numeric($matches[2]))
+        ) {
+          $form_state->setErrorByName('settings][aspectratio', $this->t('Aspect Ratio field must be of the format of two numbers separated by a colon. For example, <em>16:9</em>.'));
+        }
       }
-      elseif (!preg_match('/^([0-9]*):([0-9]*)$/', $preset->getSetting('aspectratio'), $matches) ||
-        (!is_numeric($matches[1]) || !is_numeric($matches[2]))
-      ) {
-        $form_state->setErrorByName('settings][aspectratio', $this->t('Aspect Ratio field must be of the format of two numbers separated by a colon. For example, <em>16:9</em>.'));
+      elseif (!$preset->getSetting('height')) {
+        $form_state->setErrorByName('settings][height', t('Height field is required.'));
       }
     }
-    elseif (!$preset->getSetting('height')) {
-      $form_state->setErrorByName('settings][height', t('Height field is required.'));
+    else {
+      preg_match(jw_player_library_url_regex(), $preset->getSetting('player_library_url'), $matches);
+      if (!isset($matches[2])) {
+        $form_state->setErrorByName('settings][player_library_url', t('Player Library URL does not match format provided by JWPlayer.com.'));
+      }
     }
   }
 
@@ -374,9 +576,22 @@ class JwplayerPresetAdd extends EntityForm {
     else {
       unset($preset->settings['aspectratio']);
     }
+    if (!$preset->getSetting('sharing')) {
+      unset($preset->settings['sharing_heading']);
+      unset($preset->settings['sharing_sites']);
+    }
+    if ($preset->getSetting('preset_source') == 'jwplayer') {
+      foreach ($preset->getSettings() as $key => $value) {
+        if ($key != 'preset_source' && $key != 'player_library_url') {
+          unset($preset->settings[$key]);
+        }
+      }
+    }
+    else {
+      unset($preset->settings['player_library_url']);
+    }
     $preset->save();
     drupal_set_message($this->t('Saved the %label Preset.', array('%label' => $preset->label())));
     $form_state->setRedirect('entity.jw_player.collection');
   }
-
 }
diff --git a/src/Form/JwplayerSettingsForm.php b/src/Form/JwplayerSettingsForm.php
index fcd94a1..e926fab 100644
--- a/src/Form/JwplayerSettingsForm.php
+++ b/src/Form/JwplayerSettingsForm.php
@@ -1,8 +1,4 @@
 <?php
-/**
- * @file
- * Contains \Drupal\jw_player\Form\JwplayerSettingsForm.
- */
 
 namespace Drupal\jw_player\Form;
 
@@ -50,6 +46,28 @@ class JwplayerSettingsForm extends ConfigFormBase {
       '#description' => t('Select the version of JWPlayer you are using.'),
     );
 
+    $form['jw_player_hosting'] = [
+      '#type' => 'radios',
+      '#title' => t('Hosting type'),
+      '#options' => [
+        'self' => $this->t('Self-Hosted'),
+        'cloud' => $this->t('Cloud-Hosted'),
+      ],
+      '#default_value' => $config->get('jw_player_hosting') ?: 'self',
+      '#description' => t('Choose if JW Player will be downloaded and self-hosted, or the site will use JW Player\'s cloud-hosting service.'),
+      '#states' => [
+        'unchecked' => [
+          'select[name="jw_player_version"]' => ['value' => '5'],
+        ],
+        'visible' => [
+          [
+            ['select[name="jw_player_version"]' => ['value' => '6']],
+            ['select[name="jw_player_version"]' => ['value' => '7']],
+          ],
+        ],
+      ],
+    ];
+
     $form['jw_player_key'] = array(
       '#type' => 'textfield',
       '#title' => $this->t('Self-Hosted Player License Key'),
@@ -57,6 +75,23 @@ class JwplayerSettingsForm extends ConfigFormBase {
         '@url' => $url,
       )),
       '#default_value' => $config->get('jw_player_key'),
+      '#states' => [
+        'visible' => [
+          [
+            [
+              'select[name="jw_player_version"]' => ['value' => '6'],
+              ':input[name="jw_player_hosting"]' => ['value' => 'self']
+            ],
+            [
+              'select[name="jw_player_version"]' => ['value' => '7'],
+              ':input[name="jw_player_hosting"]' => ['value' => 'self']
+            ],
+            [
+              'select[name="jw_player_version"]' => ['value' => '5']
+            ]
+          ],
+        ],
+      ],
     );
 
     $form['cloud_player_library_url'] = array(
@@ -66,10 +101,52 @@ class JwplayerSettingsForm extends ConfigFormBase {
         '@url' => $url,
       )),
       '#default_value' => $config->get('cloud_player_library_url'),
+      '#states' => [
+        'visible' => [
+          [
+            [
+              'select[name="jw_player_version"]' => ['value' => '6'],
+              ':input[name="jw_player_hosting"]' => ['value' => 'cloud']
+            ],
+            [
+              'select[name="jw_player_version"]' => ['value' => '7'],
+              ':input[name="jw_player_hosting"]' => ['value' => 'cloud']
+            ],
+          ],
+        ],
+      ],
     );
 
     return parent::buildForm($form, $form_state);
   }
+
+  public function validateForm(array &$form, FormStateInterface $form_state) {
+    parent::validateForm($form, $form_state);
+    if ($form_state->getValue('jw_player_version') == 5) {
+      $form_state->setValue('jw_player_hosting', 'self');
+      if ($form_state->getValue('jw_player_key') == "") {
+        $form_state->setErrorByName('jw_player_key', t('Player license key is required.'));
+      }
+    }
+    else {
+      switch ($form_state->getValue('jw_player_hosting')) {
+        case '':
+          $form_state->setErrorByName('jw_player_hosting', t('Hosting type is required.'));
+          break;
+        case 'self':
+          if ($form_state->getValue('jw_player_key') == "") {
+            $form_state->setErrorByName('jw_player_key', t('Self-Hosted Player License Key is required when Hosting type is "Self-Hosted".'));
+          }
+          break;
+        case 'cloud':
+          if ($form_state->getValue('cloud_player_library_url') == "") {
+            $form_state->setErrorByName('cloud_player_library_url', t('Default Cloud Player Url is required when Hosting type is "Cloud-Hosted".'));
+          }
+          break;
+      }
+    }
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -77,6 +154,10 @@ class JwplayerSettingsForm extends ConfigFormBase {
     parent::submitForm($form, $form_state);
     $config = $this->config('jw_player.settings');
     $config->set('jw_player_version', $form_state->getValue('jw_player_version'));
+    if ($form_state->getValue('jw_player_version') == 5) {
+      $form_state->setValue('jw_player_hosting', 'self');
+    }
+    $config->set('jw_player_hosting', $form_state->getValue('jw_player_hosting'));
     $config->set('cloud_player_library_url', $form_state->getValue('cloud_player_library_url'));
     $config->set('jw_player_key', $form_state->getValue('jw_player_key'));
     $config->save();
diff --git a/src/Jw_playerInterface.php b/src/Jw_playerInterface.php
index 4061d62..3780676 100644
--- a/src/Jw_playerInterface.php
+++ b/src/Jw_playerInterface.php
@@ -1,10 +1,7 @@
 <?php
-/**
- * @file
- * Contains \Drupal\jw_player\Jw_playerInterface.
- */
 
 namespace Drupal\jw_player;
+
 use Drupal\Core\Config\Entity\ConfigEntityInterface;
 
 /**
@@ -30,4 +27,15 @@ interface Jw_playerInterface extends ConfigEntityInterface {
    *   The setting value.
    */
   public function getSetting($setting_name);
+
+  /**
+   * Helper function to display JW Player preset settings.
+   *
+   * @param string $format (optional)
+   *   Whether the preset settings are returned as an 'array' or formatted 'string'.
+   *
+   * @return array|string
+   *   The preset settings stored in an array or as an imploded string for rendering.
+   */
+  public function settingsDisplay($format = 'string');
 }
diff --git a/src/Plugin/Field/FieldFormatter/JwplayerFormatter.php b/src/Plugin/Field/FieldFormatter/JwplayerFormatter.php
index ef5404d..0c71f4c 100644
--- a/src/Plugin/Field/FieldFormatter/JwplayerFormatter.php
+++ b/src/Plugin/Field/FieldFormatter/JwplayerFormatter.php
@@ -1,10 +1,5 @@
 <?php
 
-/**
- * @file
- * Contains \Drupal\link\Plugin\field\formatter\LinkFormatter.
- */
-
 namespace Drupal\jw_player\Plugin\Field\FieldFormatter;
 
 use Drupal\Core\Cache\Cache;
@@ -79,7 +74,7 @@ class JwplayerFormatter extends FormatterBase {
       }
 
       // Add support for configurable preview images.
-      if (\Drupal::moduleHandler()->moduleExists('image') && $this->fieldDefinition->getTargetEntityTypeId() && $this->fieldDefinition->getTargetBundle()) {
+      if (\Drupal::moduleHandler()->moduleExists('image')) {
         $options = [];
         $field_definitions = \Drupal::service('entity_field.manager')
           ->getFieldDefinitions($this->fieldDefinition->getTargetEntityTypeId(), $this->fieldDefinition->getTargetBundle());
@@ -133,39 +128,57 @@ class JwplayerFormatter extends FormatterBase {
    */
   public function settingsSummary() {
     $settings = $this->getSettings();
+    $summary = [];
+    if (isset($settings['jwplayer_preset'])) {
+      $preset = $this->loadPreset();
+      if (!$preset) {
+        return $summary;
+      }
+      $preset_settings = $preset->settingsDisplay('array');
+      // Formatted preset name and player type.
+      $summary[] = $preset_settings['name'];
+      if (stripos($preset_settings['source'], 'drupal') !== FALSE) {
+        // Skin, dimensions, enabled options, and sharing sites.
+        if (isset($preset_settings['skin'])) {
+          $summary[] = $preset_settings['skin'];
+        }
+        $summary[] = $preset_settings['dimensions'];
+        if (isset($preset_settings['enabled'])) {
+          $summary[] = $preset_settings['enabled'];
+        }
+        if (isset($preset_settings['sharing'])) {
+          $summary[] = $preset_settings['sharing'];
+        }
+      }
+      else {
+        $summary[] = $preset_settings['source'];
+      }
 
-    $summary = array();
-    $presets = Jw_player::loadMultiple();
-
-    if (isset($presets[$settings['jwplayer_preset']])) {
-      $summary[] = t('Preset: @name', array('@name' => $this->getSetting('jwplayer_preset')));
-      $summary[] = t('Description: @description', array('@description' => $presets[$settings['jwplayer_preset']]->description));
-
-      $settings = $presets[$settings['jwplayer_preset']]->settings;
-      foreach ($settings as $key => $val) {
-        // Filter out complex settings in the form of arrays (such as plugins).
-        // @todo Tackle the display of enabled plugins separately.
-        if (!is_array($val)) {
-          $summary[] = t('@key: @val', array('@key' => $key, '@val' => !empty($val) ? $val : t('default')));
+      // Preview image settings.
+      if (isset($settings['preview_image_field']) && !empty($settings['preview_image_field'])) {
+        // Get image field label.
+        $split = explode('|', $settings['preview_image_field']);
+        $field_definitions = \Drupal::service('entity_field.manager')
+          ->getFieldDefinitions($this->fieldDefinition->getTargetEntityTypeId(), $this->fieldDefinition->getTargetBundle());
+        $info = $field_definitions[$split[1]];
+        // Get image style label.
+        if (!empty($settings['preview_image_style'])) {
+          $style = ImageStyle::load($settings['preview_image_style']);
+          $preview_image_style = $style->label();
+        }
+        else {
+          $preview_image_style = 'Original';
         }
+        $summary[] = t('Preview: @field (@style)', array(
+          '@field' => $info->label(),
+          '@style' => $preview_image_style,
+        ));
       }
     }
     else {
       $summary[] = t('No preset selected');
     }
 
-    // Add preview image settings.
-    if ($this->getSetting('preview_image_field')) {
-      $summary[] = t(
-        'Preview image field: @field',
-        ['@field' => $this->getSetting('preview_image_field')]
-      );
-      $summary[] = t(
-        'Preview image style: @style',
-        ['@style' => $this->getSetting('preview_image_style')]
-      );
-    }
-
     return $summary;
   }
 
diff --git a/src/Tests/JwPlayer7ConfigurationTest.php b/src/Tests/JwPlayer7ConfigurationTest.php
index 7632857..3983272 100644
--- a/src/Tests/JwPlayer7ConfigurationTest.php
+++ b/src/Tests/JwPlayer7ConfigurationTest.php
@@ -1,8 +1,4 @@
 <?php
-/**
- * @file
- * Contains \Drupal\jw_player\JwPlayer7ConfigurationTest.
- */
 
 namespace Drupal\jw_player\Tests;
 
@@ -88,6 +84,9 @@ class JwPlayer7ConfigurationTest extends WebTestBase {
     $this->assertFieldByName('label', 'Test preset');
     $this->assertFieldByName('description', 'Test preset description');
     $this->assertNoField('settings[mode]');
+    $this->assertFieldByName('settings[preset_source]', 'drupal');
+    $this->assertFieldByName('settings[mute]', '1');
+    $this->assertFieldByName('settings[sharing]', '1');
     $this->assertFieldByName('settings[skin]', 'seven');
     $this->assertFieldByName('settings[advertising][client]', 'vast');
     $this->assertFieldByName('settings[advertising][tag]', 'www.example.com/vast');
@@ -108,9 +107,10 @@ class JwPlayer7ConfigurationTest extends WebTestBase {
     $this->drupalPostForm(NULL, $edit, t('Update'));
     $this->drupalPostForm(NULL, NULL, t('Save'));
     // Make sure JW preset is correct.
-    $this->assertText('Preset: test_preset');
-    $this->assertText('width: 100');
-    $this->assertText('height: 100');
+    $this->assertText('Preset: Test preset');
+    $this->assertText('Dimensions: 100x100, uniform');
+    $this->assertText('Preview: image_preview (Medium');
+    $this->assertText('Skin: seven');
     // Make sure the formatter reports correct dependencies.
     /** @var \Drupal\Core\Entity\Entity\EntityViewDisplay $view_display */
     $view_display = EntityViewDisplay::load('node.jw_player.default');
diff --git a/src/Tests/JwPlayerConfigurationTest.php b/src/Tests/JwPlayerConfigurationTest.php
index 98cc165..53e4d27 100644
--- a/src/Tests/JwPlayerConfigurationTest.php
+++ b/src/Tests/JwPlayerConfigurationTest.php
@@ -1,8 +1,4 @@
 <?php
-/**
- * @file
- * Contains \Drupal\jw_player\JwPlayerConfigurationTest.
- */
 
 namespace Drupal\jw_player\Tests;
 
@@ -102,9 +98,9 @@ class JwPlayerConfigurationTest extends WebTestBase {
     $this->drupalPostForm(NULL, $edit, t('Update'));
     $this->drupalPostForm(NULL, NULL, t('Save'));
     // Make sure JW preset is correct.
-    $this->assertText('Preset: test_preset');
-    $this->assertText('width: 100');
-    $this->assertText('height: 100');
+    $this->assertText('Preset: Test preset');
+    $this->assertText('Dimensions: 100x100, uniform');
+    $this->assertText('Skin: bekle');
     // Make sure the formatter reports correct dependencies.
     /** @var \Drupal\Core\Entity\Entity\EntityViewDisplay $view_display */
     $view_display = EntityViewDisplay::load('node.jw_player.default');
