diff --git a/README.txt b/README.txt
old mode 100644
new mode 100755
diff --git a/beautytips.admin.inc b/beautytips.admin.inc
deleted file mode 100644
index 83d7f0d..0000000
--- a/beautytips.admin.inc
+++ /dev/null
@@ -1,242 +0,0 @@
-<?php
-
-/**
- * @file
- * Beautytips settings form and submit action
- */
-
-/**
- * Menu callback - beautytips admin settings form
- */
-function beautytips_admin() {
-  
-  $form['beautytips_always_add'] = array(
-    '#title' => t('Add beautytips js to every page'),
-    '#description' => t('This allows you to give the class \'beautytips\' to any element on a page and the title attribute will popup as a beautytip.<br /> i.e. <i> &lt;p class="beautytips" title="type the text you want beautytips to display here"&gt .....&lt/p&gt</i>'),
-    '#type' => 'checkbox',
-    '#default_value' => variable_get('beautytips_always_add', 0),
-    '#weight' => -1,
-  );
-  $selectors = variable_get('beautytips_added_selectors_array', '');
-  $form['beautytips_added_selectors_string'] = array(
-    '#title' => t('Add beautytips to the following selectors'),
-    '#description' => t("Separate selectors with a comma.  Beautytips will be added to each of these on every page.  The element's title attribute will be the text used. (OPTIONAL)"),
-    '#type' => 'textfield',
-    '#default_value' => is_array($selectors) ? implode(", ", $selectors) : '',
-    '#weight' => -1,
-  );
-  $form['beautytips_ltr'] = array(
-    '#title' => t('Support Left to Right display'),
-    '#description' => t('Only check this if this is an ltr site.  This adds css to support it.'),
-    '#type' => 'checkbox',
-    '#default_value' => variable_get('beautytips_ltr', 0),
-  );
-  $form['beautytips_default_styles'] = array(
-    '#type' => 'fieldset',
-    '#title' => 'Styling Options',
-    '#collapsible' => TRUE,
-    '#collapsed' => FALSE,
-  );
-  $styles = beautytips_get_styles(TRUE);
-  if (count($styles)) {
-    unset($styles['default']);
-    foreach ($styles as $name => $style) {
-      $bt_style_options[$name]['cssSelect'] = '#edit-beautytips-default-style-' . str_replace('_', '-', $name);
-      $bt_style_options[$name]['text'] = 'Aenean risus purus, pharetra in, blandit quis, gravida a, turpis.  Aenean risus purus, pharetra in, blandit quis, gravida a, turpis.  Aenean risus purus, pharetra in, blandit quis, gravida a, turpis.';
-      $bt_style_options[$name]['width'] = isset($style['width']) ? $style['width'] : '300px';
-      $bt_style_options[$name]['style'] = $name;
-      $style_options[$name] = $name;
-    }
-  }
-  $bt_style_options['default_hover'] = array(
-    'cssSelect' => '#beautytips-site-wide-popup',
-    'text' => 'Sed justo nibh, ultrices ut gravida et, laoreet et elit. Nullam consequat lacus et dui dignissim venenatis. Curabitur quis urna eget mi interdum viverra quis eu enim. Ut sit amet nunc augue. Morbi fermentum ultricies velit sed aliquam. Etiam dui tortor, auctor sed tempus ac, auctor sed sapien.',
-    'positions' => array('right'),
-  );
-  // TODO: Determine what to do if default style has been removed.
-  $form['beautytips_default_styles']['beautytips_default_style'] = array(
-    '#type' => 'radios',
-    '#title' => t('Choose a default style'),
-    '#description' => t('Mouse over the radio buttons to see a preview.'),
-    '#prefix' => '<div id="beauty-default-styles">',
-    '#suffix' => '</div>',
-    '#options' => $style_options,
-    '#default_value' => variable_get('beautytips_default_style', 'plain'),
-  );
-  $style_options = array(
-    'fill' => t('background color (string - html color)'), 
-    'strokeWidth' => t('width of border (integer)'),
-    'strokeStyle' => t('color of border (string - html color)'),
-    'width' => t('width of popup (number in px)'), 
-    'padding' => t('space between content and border (number in px)'), 
-    'cornerRadius' => t('Controls roundness of corners (integer)'),
-    'spikeGirth' => t('thickness of spike (integer)'),
-    'spikeLength' => t('length of spike (integer)'),
-    'shadowBlur' => t('Size of popup shadow (integer)'),
-    'shadowColor' => t('Color of popup shadow (string - html color)'),
-  );
-  $form['beautytips_default_styles']['custom_styles'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Custom Style Options'),
-    '#description' => t('<b>Set a custom style.</b><br /> Note: These will use the default style that is selected as a base <br /> but will overide elements such as background color, border color etc.   <br /><i>Leave these empty unless you know what you are doing.</i><div id="beautytips-popup-changes"><div id="beauty-click-text"><p>Double Click here to view popup with custom changes</p></div></div>'),
-    '#collapsible' => TRUE,
-    '#collapsed' => TRUE,
-    '#attributes' => array('class' => array('bt-custom-styles')),
-    '#prefix' => '<div id="beautytips-site-wide-popup"><div id="beauty-text"><p>Hover here to see the current site-wide beautytips</p></div></div>',
-  );
-  $custom_style = variable_get('beautytips_custom_style', NULL);
-  foreach ($style_options as $option => $description) {
-    $form['beautytips_default_styles']['custom_styles']['bt-options-box-' . $option] = array(
-      '#title' => $option,
-      '#description' => $description,
-      '#type' => 'textfield',
-      '#default_value' => isset($custom_style[$option]) ? $custom_style[$option] : '',
-    );
-  }
-  $form['beautytips_default_styles']['custom_styles']['bt-options-box-shadow'] = array(
-    '#title' => 'shadow',
-    '#description' => t('Whether or not the popup has a shadow'),
-    '#type' => 'radios',
-    '#options' => array('default' => t('Default'), 'shadow' => t('Shadow On'), 'no_shadow' => t('Shadow Off')),
-    '#attributes' => array('class' => array('beautytips-options-shadow')),
-    '#default_value' => isset($custom_style['shadow']) ? $custom_style['shadow'] : 'default',
-  );
-  $form['beautytips_default_styles']['custom_styles']['bt-options-cssClass'] = array(
-    '#title' => 'cssClass',
-    '#description' => t('The class that will be applied to the box wrapper div (of the TIP)'),
-    '#type' => 'textfield',
-    '#default_value' => isset($custom_style['cssClass']) ? $custom_style['cssClass'] : '',
-  );
-  $css_style_options = array('color', 'fontFamily', 'fontWeight', 'fontSize');
-  $form['beautytips_default_styles']['custom_styles']['css-styles'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Font Styling'),
-    '#description' => t('Enter css options for changing the font style'),
-    '#attributes' => array('class' => array('beautytips-css-styling')),
-    '#collapsible' => FALSE,
-  );
-  foreach ($css_style_options as $option) {
-    $form['beautytips_default_styles']['custom_styles']['css-styles']['bt-options-css-' . $option] = array(
-      '#title' => $option,
-      '#type' => 'textfield',
-      '#default_value' => isset($custom_style['cssStyles'][$option]) ? $custom_style['cssStyles'][$option] : '',
-    );
-  }
-
-  $form['#submit'][] = 'beautytips_admin_submit';
-  
-  $path = drupal_get_path('module', 'beautytips');
-  drupal_add_js($path . '/other_libs/colorpicker/js/colorpicker.js');
-  drupal_add_css($path . '/other_libs/colorpicker/css/colorpicker.css');
-  drupal_add_css($path .'/css/beautytips.css');
-  beautytips_add_beautytips($bt_style_options);
-  drupal_add_js($path . '/js/bt_admin_page.js');
-
-  if (module_exists('beautytips_ui')) {
-    beautytips_ui_admin_settings($form); 
-  }
-
-  return system_settings_form($form);
-}
-
-/**
- * Validation for beautytips settings form
- */
-function beautytips_admin_validate($form, &$form_state) {
-  $values = $form_state['values'];
-  $integer_fields = array('bt-options-box-strokeWidth', 'bt-options-box-cornerRadius', 'bt-options-box-spikeGirth', 'bt-options-box-spikeLength', 'bt-options-box-shadowBlur'); 
-  $pixel_fields = array('bt-options-box-width', 'bt-options-box-padding', 'bt-options-css-fontSize');
-  $color_fields = array('bt-options-box-fill', 'bt-options-css-color', 'bt-options-box-shadowColor'); 
-  $sanitize_strings = array('bt-options-cssClass', 'bt-options-css-fontFamily', 'bt-options-css-fontWeight');
-
-  foreach ($integer_fields as $name) {
-    if ($values[$name]) {
-      if (!is_numeric($values[$name])) {
-        form_set_error($name, t('You need to enter a numeric value for <em>@name</em>', array('@name' => str_replace(array('bt-options-box-', 'bt-options-css-'), '', $name))));
-      }
-      else {
-        $form_state['values'][$name] = round($values[$name]);  
-      }
-    }
-  }
-
-  foreach ($pixel_fields as $name) {
-    if ($values[$name]) {
-      $unit = substr($values[$name], -2, 2);
-      $value = str_replace(array('px', ' ', 'em'), '', $values[$name]);
-      if (!is_numeric($value) || (!$value && $value != 0) || !in_array($unit, array('px', 'em'))) {
-        form_set_error($name, t('You need to enter a numeric value for <em>@name</em>, followed by <em>px</em>', array('@name' => str_replace(array('bt-options-box-', 'bt-options-css-'), '', $name))));
-      }
-    }
-  }
-}
-
-/**
- * Submit function for beautytips settings form
- */
-function beautytips_admin_submit($form, &$form_state) {
-  $values = $form_state['values'];
-  if (count($values)) {
-    $custom_style = array();
-    $css_style = array();
-    foreach ($values as $option => $value) {
-      if (strpos($option, 'bt-options-box-') === 0) {
-        $option = str_replace('bt-options-box-', '', $option);
-        $custom_style[$option] = $value;
-      }
-      else if ($option == 'bt-options-cssClass') {
-        $option = str_replace('bt-options-', '', $option);
-        $custom_style[$option] = $value;
-      }
-      else if (strpos($option, 'bt-options-css-') === 0) {
-        $option = str_replace('bt-options-css-', '', $option);
-        if ($value) {
-          $css_style[$option] = $value;
-        }
-      }
-    }
-
-    // Store the defaults - they will be passed to javascript
-    $style = beautytips_get_style($values['beautytips_default_style']);
-    if (count($custom_style)) {
-      foreach ($custom_style as $option => $value) {
-        if ($option == 'shadow') {
-          if ($value != 'default') {
-            $style['shadow'] = $value == 'shadow' ? TRUE : FALSE;
-          }
-        }
-        else if (!empty($value) || $value == '0') {
-          $style[$option] = is_numeric($value) ? (int) $value : (string) $value;
-        }
-      }
-    }
-    if (count($css_style)) {
-      foreach ($css_style as $option => $value) {
-        if (!empty($value)) {
-          $style['cssStyles'][$option] = (string) $value;
-        }
-      }
-      if (!empty($css_style)) {
-        $custom_style['cssStyles'] = $css_style;
-      }
-    }
-    variable_set('beautytips_defaults', $style);
-    variable_set('beautytips_custom_style', $custom_style);
-    variable_set('beautytips_default_style', $values['beautytips_default_style']);
-    cache_clear_all('beautytips:beautytips-styles', 'cache');
-
-    // Store array of selectors that bt will be added to on every page
-    $selectors = explode(",", $values['beautytips_added_selectors_string']);
-    $test = serialize($selectors);
-    if (count($selectors)) {
-      foreach ($selectors as $key => $selector) {
-        $selectors[$key] = trim($selector);
-      }
-    }
-    variable_set('beautytips_added_selectors_array', $selectors);
-  }
-  if (module_exists('beautytips_ui')) {
-    beautytips_ui_admin_submit($form, $form_state);
-  }
-}
-
diff --git a/beautytips.info b/beautytips.info
deleted file mode 100644
index 428d777..0000000
--- a/beautytips.info
+++ /dev/null
@@ -1,10 +0,0 @@
-
-name = BeautyTips API
-description = API for implementing jQuery beautyTips tooltip plugin
-core = 7.x
-package = User interface 
-files[] = beautytips.module
-files[] = beautytips.admin.inc
-files[] = beautytips.install
-configure = admin/config/user-interface/beautytips
-
diff --git a/beautytips.info.yml b/beautytips.info.yml
new file mode 100755
index 0000000..836ca15
--- /dev/null
+++ b/beautytips.info.yml
@@ -0,0 +1,8 @@
+
+name: BeautyTips API
+type: module
+description: API for implementing jQuery beautyTips tooltip plugin
+core: 8.x
+package: User interface
+configure: beautytips.config
+
diff --git a/beautytips.install b/beautytips.install
old mode 100644
new mode 100755
index 52c30d8..b5cca3c
--- a/beautytips.install
+++ b/beautytips.install
@@ -1,4 +1,4 @@
-<?php 
+<?php
 
 /**
  * @file
@@ -15,25 +15,12 @@ function beautytips_install() {
   if (!file_exists($path . '/other_libs/excanvas_r3/excanvas.compiled.js')) {
     drupal_set_message(t('WARNING! In order for BeautyTips to function correctly in Internet Explorer, the Excanvas library needs to be added. (See the !readme_file for more information.)', array('!readme_file' => $link_readme)), $type = 'warning');
   }
-
-  // Set basic defaults
-  variable_set('beautytips_defaults', array('cssStyles' => array()));
 }
 
 /**
  * Implementation of hook_uninstall().
  */
 function beautytips_uninstall() {
-  $variables = array(
-    'beautytips_always_add',
-    'beautytips_added_selectors_array',
-    'beautytips_default_style',
-    'beautytips_custom_style',
-    'beautytips_defaults',
-  );
-  foreach ($variables as $variable) {
-    variable_del($variable);
-  }
-
-  cache_clear_all('beautytips:beautytips-styles', 'cache');
+  \Drupal::config('beautytips.basic')->delete();
+  cache()->deleteTags(array('beautytips' => TRUE));
 }
diff --git a/beautytips.module b/beautytips.module
old mode 100644
new mode 100755
index 682e331..3e383d3
--- a/beautytips.module
+++ b/beautytips.module
@@ -5,14 +5,17 @@
  * Provides API for adding beautytips to pages.
  */
 
+use Drupal\Core\Cache\CacheBackendInterface;
+
 /**
- * Implements hook_init().
+ * Implements hook_page_build().
  */
-function beautytips_init() {
-  if (variable_get('beautytips_always_add', 0)) {
+function beautytips_page_build(&$page) {
+  $config = \Drupal::config('beautytips.basic');
+  if ($config->get('beautytips_always_add')) {
     $selectors = array();
     $options = array();
-    $selectors = variable_get('beautytips_added_selectors_array', array());
+    $selectors = $config->get('beautytips_added_selectors_array');
     if (count($selectors)) {
       foreach ($selectors as $selector) {
         if (!empty($selector)) {
@@ -32,18 +35,15 @@ function beautytips_menu() {
   $items['admin/config/user-interface/beautytips'] = array(
     'title' => 'BeautyTips',
     'description' => 'Configure settings related to the Beautytips module.',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('beautytips_admin'),
-    'access arguments' => array('administer site configuration'),
-    'file' => 'beautytips.admin.inc',
+    'route_name' => 'beautytips.config',
   );
   return $items;
 }
 
  /**
- * Implements hook_library().
+ * Implements hook_library_info().
  */
-function beautytips_library() {
+function beautytips_library_info() {
   $libraries = array();
   $path = drupal_get_path('module', 'beautytips');
   $expath = $path .'/other_libs/excanvas_r3';
@@ -52,13 +52,13 @@ function beautytips_library() {
     'title' => 'BeautyTips Jquery Plugin',
     'website' => 'http://plugins.jquery.com/project/bt',
     'version' => '0.9.5-rc1',
-    'js' => array($path .'/js/jquery.bt.min.js' => array()),
+    'js' => array($path .'/js/jquery.bt.js' => array()),
   );
   $libraries['beautytips-module'] = array(
     'title' => 'BeautyTips Module',
     'website' => 'http://drupal.org/project/beautytips',
     'version' => '7.x-2.x',
-    'js' => array($path .'/js/beautytips.min.js' => array()),
+    'js' => array($path .'/js/beautytips.js' => array()),
     'dependencies' => array(
       array('beautytips', 'beautytips-jquery'),
     ),
@@ -81,11 +81,10 @@ function beautytips_library() {
       array('beautytips', 'beautytips-jquery'),
     ),
   );
-  
+
   return $libraries;
 }
 
-
 /**
  * This is the API.  Call this function to add beautytips.
  *
@@ -141,7 +140,7 @@ function beautytips_add_js() {
     drupal_add_library('beautytips', 'beautytips-module');
     // Add this for ie compatibility
     drupal_add_library('beautytips', 'excanvas_r3');
-    if (variable_get('beautytips_ltr', FALSE)) {
+    if (\Drupal::config('beautytips.basic')->get('beautytips_ltr')) {
       drupal_add_library('beautytips', 'beautytips-ltr');
     }
 
@@ -158,12 +157,12 @@ function beautytips_add_js() {
  * Get all the defined beautytips styles
  */
 function beautytips_get_styles($reload = FALSE) {
-  $cache = cache_get('beautytips:beautytips-styles');
+  $cache = cache()->get('beautytips:beautytips-styles');
   if (!$cache || $reload) {
     $styles = module_invoke_all('define_beautytips_styles');
     drupal_alter('define_beautytips_styles', $styles);
     // Save the beautytips style registry in the cache.
-    cache_set('beautytips:beautytips-styles', $styles);
+    cache()->set('beautytips:beautytips-styles', $styles, CacheBackendInterface::CACHE_PERMANENT, array('beautytips' => TRUE));
   }
   else {
     $styles = $cache->data;
@@ -183,7 +182,7 @@ function beautytips_get_style($style = 'default') {
  * Implements hook_define_beautytips_styles().
  */
 function beautytips_define_beautytips_styles() {
-  $styles['default'] = variable_get('beautytips_defaults', array());
+  $styles['default'] = \Drupal::config('beautytips.basic')->get('beautytips_defaults');
   // Cleanup any problems with defaults.
   if (count($styles['default'])) {
     foreach ($styles['default'] as &$value) {
@@ -222,7 +221,7 @@ function beautytips_define_beautytips_styles() {
     'strokeStyle' => '#B7B7B7',
     'cornerRadius' => 0,
     'cssStyles' => array(
-      'fontFamily' => '"lucida grande",tahoma,verdana,arial,sans-serif', 
+      'fontFamily' => '"lucida grande",tahoma,verdana,arial,sans-serif',
       'fontSize' => '11px',
     ),
   );
@@ -238,7 +237,7 @@ function beautytips_define_beautytips_styles() {
       'color' => '#FFF',
       'fontWeight' => 'bold',
     ),
-  );      
+  );
   $styles['big-green'] = array(
     'fill' => '#00FF4E',
     'padding' => 20,
@@ -247,10 +246,10 @@ function beautytips_define_beautytips_styles() {
     'spikeGirth' => 40,
     'cornerRadius' => 15,
     'cssStyles' => array(
-      'fontFamily' => '"lucida grande",tahoma,verdana,arial,sans-serif', 
+      'fontFamily' => '"lucida grande",tahoma,verdana,arial,sans-serif',
       'fontSize' => '14px',
     ),
-  );       
+  );
   $styles['google-maps'] = array(
     'positions' => array('top', 'bottom'),
     'fill' => '#FFF',
@@ -265,15 +264,15 @@ function beautytips_define_beautytips_styles() {
   );
   $styles['hulu'] = array(
     'fill' => '#F4F4F4',
-    'strokeStyle' => '#666666', 
+    'strokeStyle' => '#666666',
     'spikeLength' => 20,
     'spikeGirth' => 10,
     'width' => 350,
     'overlap' => 0,
     'centerPointY' => 1,
-    'cornerRadius' => 0, 
+    'cornerRadius' => 0,
     'cssStyles' => array(
-      'fontFamily' => '"Lucida Grande",Helvetica,Arial,Verdana,sans-serif', 
+      'fontFamily' => '"Lucida Grande",Helvetica,Arial,Verdana,sans-serif',
       'fontSize' => '12px',
       'padding' => '10px 14px'
     ),
diff --git a/beautytips.routing.yml b/beautytips.routing.yml
new file mode 100755
index 0000000..799c659
--- /dev/null
+++ b/beautytips.routing.yml
@@ -0,0 +1,6 @@
+beautytips.config:
+  path: '/admin/config/user-interface/beautytips'
+  defaults:
+    _form: '\Drupal\beautytips\Form\BeautytipsConfigForm'
+  requirements:
+    _permission: 'administer site configuration'
diff --git a/beautytips_manager.admin.inc b/beautytips_manager.admin.inc
deleted file mode 100644
index 3eb9fab..0000000
--- a/beautytips_manager.admin.inc
+++ /dev/null
@@ -1,497 +0,0 @@
-<?php
-
-/**
- * @file
- * Administration pages and forms for beautytips manager.
- */
-
-/**
- * Listing of all beautytips available.
- */
-function beautytips_manager_tips_manager_page() {
-  $rows = array();
-  $empty = '';
-  $header = array(t('Element'), t('Style'), t('Status'), t('Visibility'), t('Pages'), t('operations') ,'');
-  $tips = beautytips_manager_get_custom_tips();
-  if (count($tips)) {
-    $visibility = array(t('Show on every page except the listed pages.'), t('Show on only the listed pages.'));
-    foreach ($tips as $tip) {
-      $tip->pages = check_plain($tip->pages);
-      $pages = ($tip->pages != substr($tip->pages, 0, 40)) ? substr($tip->pages, 0, 40) . '...' : substr($tip->pages, 0, 40);
-      $rows[$tip->id]['element'] = check_plain($tip->element);
-      $rows[$tip->id]['style'] = $tip->style;
-      $rows[$tip->id]['enabled'] = $tip->enabled ? t('Enabled') : t('Disabled');
-      $rows[$tip->id]['visibility'] = $visibility[$tip->visibility];
-      $rows[$tip->id]['pages'] = $pages;
-      $rows[$tip->id]['edit'] = l(t('edit'), "admin/config/user-interface/beautytips/custom-tips/$tip->id/edit");
-      $rows[$tip->id]['delete'] = l(t('delete'), "admin/config/user-interface/beautytips/custom-tips/$tip->id/delete");
-    }
-  }
-  else {
-    $empty = t('There are no custom beautytips yet.');
-  }
-  return theme('table', array('header' => $header, 'rows' => $rows)) . $empty;
-}
-
-/**
- * Page callback for custom styles administration.
- */
-function beautytips_manager_styles_manager_page() {
-  $rows = array();
-  $empty = '';
-  $header = array(t('Name'), t('operations'), '');
-  $styles = beautytips_manager_get_custom_styles();
-  if (count($styles)) {
-    $visibility = array(t('Show on every page except the listed pages.'), t('Show on only the listed pages.'));
-    foreach ($styles as $style) {
-      $name = check_plain($style->name);
-      unset($style->name);
-      $rows[$style->id]['name'] = '<span class="bt-style-' . $name . '">' . $name . '</span>';
-      $rows[$style->id]['edit'] = l(t('edit'), "admin/config/user-interface/beautytips/custom-styles/$style->id/edit");
-      if ($name != variable_get('beautytips_default_style', 'plain')) {
-        $rows[$style->id]['delete'] = l(t('delete'), "admin/config/user-interface/beautytips/custom-styles/$style->id/delete");
-      }
-      else {
-        $rows[$style->id]['delete'] = t('Default style');
-      }
-
-      $options = array(
-        'cssSelect' => 'td .bt-style-' . $name,
-        'text' => t('<h2>Default Text</h2><p>Nam magna enim, accumsan eu, blandit sed, blandit a, eros.  Nam ante nulla, interdum vel, tristique ac, condimentum non, tellus.</p><p>Nulla facilisi. Nam magna enim, accumsan eu, blandit sed, blandit a, eros.</p>'),
-        'trigger' => 'hover',
-        'style' => $name,
-        //'shrinkToFit' => TRUE,
-      );
-      beautytips_add_beautytips(array($name => $options));
-    }
-  }
-  else {
-    $empty = t('There are no custom beautytip styles yet.');
-  }
-  return theme('table', array('header' => $header, 'rows' => $rows)) . $empty;
-}
-
-/**
- * Form for configuring custom beautytips.
- */
-function beautytips_manager_custom_tips_form($form, &$form_state, $id = NULL) {
-  drupal_add_css(drupal_get_path('module', 'beautytips') . '/css/beautytips.css');
-  $tip = beautytips_manager_get_custom_tip($id);
-  if (!isset($tip->id)) {
-    $tip = NULL;
-  }
-
-  $form = array();
-  $form['tip'] = array(
-    '#type' => 'markup',
-    '#value' => '',
-    '#tree' => TRUE,
-  );
-  $form['tip']['id'] = array(
-    '#type' => 'value',
-    '#value' => is_object($tip) ? $tip->id : 0,
-  );
-  $form['tip']['element'] = array(
-    '#type' => 'textfield',
-    '#title' => t('Element'),
-    '#required' => TRUE,
-    '#maxlength' => 255,
-    '#default_value' => is_object($tip) ? $tip->element : '',
-  );
-  $form['tip']['enabled'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Enabled'),
-    '#default_value' => is_object($tip) ? $tip->enabled : TRUE,
-  );
-  $content_options = array('attribute' => 'attribute', 'text' => 'text', 'ajax' => 'ajax');
-  $description = t('Content to display in the beautytip.  The data entered here depends on the Content Type.');
-  $types = array();
-  $types[0] = t('attribute - Enter the attribute of the element that should be displayed. (If empty, the title will be selected.)');
-  $types[0] .= '<br />' . t('ex. "alt"');
-  $types[1] = t('text - Enter the text that should be displayed with in the beautytip.');
-  $types[1] .= '<br />' . t('ex. "This is my beautytip!"');
-  $types[2] = t('ajax - This will grab the page from the "href" attribute and display that page.  Enter css selectors to narrow the down the content from that page.');
-  $types[2] .= '<br />' . t('ex. "#my-id .my-class"');
-  if (user_access('use Javascript for custom beautytip display')) {
-    $content_options['js'] = 'js';
-    $types[3] = 'js - Directly enter javascript to select the content.';
-    $types[3] .= '<br />' . t('ex. "$(this).next(\'.description\').html()"');
-  }
-  $form['tip']['content_type'] = array(
-    '#type' => 'radios',
-    '#title' => t('Type of Content'),
-    '#description' => t('This helps determine from where to pull the content to be displayed.'),
-    '#options' => $content_options,
-    '#default_value' => is_object($tip) ? $tip->content_type : 0,
-  );  
-  $form['tip']['content'] = array(
-    '#type' => 'textarea',
-    '#title' => t('Content to Display'),
-    '#description' => theme('item_list', array('items' => $types)),
-    '#default_value' => is_object($tip) ? $tip->content : '',
-  );
-  $triggers = beautytips_manager_get_triggers();
-  $form['tip']['trigger_on'] = array(
-    '#type' => 'select',
-    '#title' => t('Trigger On'),
-    '#description' => t('Not all events are available for all elements. See jQuery <a href="@events">events documentation</a> for details.', array('@events' => 'http://docs.jquery.com/Events')),
-    '#options' => $triggers,
-    '#default_value' => is_object($tip) ? $tip->trigger_on : 0,
-    '#prefix' => '<div class="beautytips-triggers">',
-  );
-  $form['tip']['trigger_off'] = array(
-    '#type' => 'select',
-    '#title' => t('Trigger Off'),
-    '#options' => $triggers,
-    '#suffix' => '</div>',
-    '#default_value' => is_object($tip) ? $tip->trigger_off : 0,
-  );
-
-  $form['tip']['disable_link'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Disable Link Click'),
-    '#description' => t('If you have chosen ajax as the type of content, and you would like to prevent the link from working, then check this box.'),
-    '#default_value' => is_object($tip) ? $tip->disable_link : 0,
-  );
-
-  $styles = beautytips_get_styles();
-  foreach ($styles as $key => $style) {
-    $style_options[$key] = $key;
-  }
-  $form['tip']['style'] = array(
-    '#type' => 'select',
-    '#title' => t('Style'),
-    '#options' => $style_options,
-    '#default_value' => is_object($tip) ? $tip->style : 'default',
-  );
-  $form['tip']['shrink'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Shrink to Fit'),
-    '#description' => t('Shrink the beautytip to the size of the content. This can sometimes help with sizing problems and is good for tips with just one line.'),
-    '#default_value' => is_object($tip) ? $tip->shrink : FALSE,
-  );
-
-  $positions = is_object($tip) ? explode(',', $tip->positions) : array();
-  $form['tip']['positions'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Positions'),
-    '#description' => t("Optionally enter the order of positions in which you want the tip to appear.  It will use first in order with available space. The last value will be used if others don't have enough space. If no entries, then the tip will be placed in the area with the most space. Only enter an order for those you wish to use"), 
-    '#tree' => TRUE,
-  );
-  $positions_list = array('top', 'bottom', 'left', 'right');
-  foreach ($positions_list as $position) {
-    $form['tip']['positions'][$position] = array(
-      '#type' => 'textfield',
-      '#title' => t($position),
-      '#default_value' => (array_search($position, $positions) !== FALSE) ? array_search($position, $positions) : '', 
-      '#size' => 1,
-      '#maxlength' => 1,
-      '#prefix' => '<div class="beautytips-positions">',
-      '#suffix' => '</div>',
-    );
-  }
-  
-  $form['tip']['animation_on'] = array(
-    '#type' => 'select',
-    '#title' => t('Animation (On)'),
-    '#options' => array('' => '<none>', 'fadeIn' => 'fadeIn'),
-    '#description' => t("These animations will be applied to the tip when it is turn on or off."),
-    '#default_value' => is_object($tip) ? $tip->animation_on : '',
-    '#prefix' => '<div class="beautytips-animations">', 
-  );
-  $form['tip']['animation_off'] = array(
-    '#type' => 'select',
-    '#title' => t('Animation (Off)'),
-    '#options' => array('' => '<none>', 'fadeOut' => 'fadeOut', 'slideOut' => 'slideOut'),
-    '#default_value' => is_object($tip) ? $tip->animation_off : '',
-    '#suffix' => '</div>',
-  );
-
-  $options = array(t('Show on every page except the listed pages.'), t('Show on only the listed pages.'));
-  $description = t("Enter one page per line as Drupal paths. The '*' character is a wildcard. Example paths are %blog for the blog page and %blog-wildcard for every personal blog. %front is the front page.", array('%blog' => 'blog', '%blog-wildcard' => 'blog/*', '%front' => '<front>'));
-
-  $form['tip']['visibility'] = array(
-    '#type' => 'radios',
-    '#title' => t('Show beautytip on specific pages'),
-    '#options' => $options,
-    '#default_value' => is_object($tip) ? $tip->visibility : 0,
-    '#prefix' => '<div id="edit-tip-visibility-wrapper">',
-    '#suffix' => '</div>',
-  );
-  $form['tip']['pages'] = array(
-    '#type' => 'textarea',
-    '#title' => t('Pages'),
-    '#default_value' => is_object($tip) ? $tip->pages : '',
-    '#description' => $description,
-  );
-
-  $form['save'] = array(
-    '#type' => 'submit',
-    '#value' => t('Save configuration'),
-  );
-  $form['delete'] = array(
-    '#type' => 'submit',
-    '#value' => t('Delete'),
-  );
-
-  $form['#submit'][] = 'beautytips_manager_custom_tips_form_submit';
-  return $form;
-}
-
-/**
- * Validation callback for beautytips manager custom tips form.
- */
-function beautytips_manager_custom_tips_form_validate($form, &$form_state) {
-  // TODO: Validate?
-  $positions = $form_state['values']['tip']['positions'];
-  foreach ($positions as $position => $order) {
-    if ($order !== '' && !is_numeric($order)) {
-      form_set_error("tip][positions][$position", t("You must enter a numeric value for position order (Or leave it blank)."));
-    }
-  }
-}
-
-/**
- * Submission callback for beautytips manager custom tips form.
- */
-function beautytips_manager_custom_tips_form_submit($form, &$form_state) {
-  $tip = $form_state['values']['tip'];
-  $positions = array();
-  foreach ($tip['positions'] as $position => $order) {
-    if ($order !== '') {
-      while (isset($positions[$order])) {
-        $order++;
-      }
-      $positions[$order] = $position;
-    }
-  }
-  ksort($positions);
-  $tip['positions'] = (count($positions)) ? implode(',', $positions) : '';
-
-  beautytips_manager_save_custom_tip($tip);
-  cache_clear_all('beautytips:beautytips-ui-custom-tips', 'cache');
-  $form_state['redirect'] = 'admin/config/user-interface/beautytips/custom-tips';
-}
-
-/**
- * Form for editing a custom beautytip style.
- */
-function beautytips_manager_custom_styles_form($form, &$form_state, $id = NULL) {
-  
-  if (!is_null($id)) {
-    $style = beautytips_manager_get_custom_style($id);
-    $style_map = beautytips_manager_style_mapping();
-    $style_options = $style_map['options'];
-    $css_style_options = $style_map['css_options'];
-  }
-
-  $form = array();
-  $form['name'] = array(
-    '#type' => 'textfield',
-    '#title' => t('Style Name'),
-    '#description' => t('It must contain only alphanumeric characters and underscores.'),
-    '#default_value' => isset($style->name) ? $style->name : '',
-  );
-  $form['style'] = array(
-    '#type' => 'value',
-    '#value' => isset($style) ? $style : NULL,
-  );
-  // TODO: Add this into mapping
-  $style_info = array(
-    'fill' => t('background color (string - html color)'),
-    'strokeWidth' => t('width of border (integer)'),
-    'strokeStyle' => t('color of border (string - html color)'),
-    'width' => t('width of popup (number with px or em)'),
-    'padding' => t('space between content and border (number with px em)'),
-    'cornerRadius' => t('Controls roundness of corners (integer)'),
-    'spikeGirth' => t('thickness of spike (integer)'),
-    'spikeLength' => t('length of spike (integer)'),
-    'shadowBlur' => t('Size of popup shadow (integer)'),
-    'shadowColor' => t('Color of popup shadow (string - html color)'),
-  );
-  $form['custom_styles'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Custom Style Options'),
-    '#description' => t('<div id="beautytips-popup-changes"><div id="beauty-click-text"><p></p></div></div>'),
-    '#attributes' => array('class' => array('bt-custom-styles')),
-    '#tree' => TRUE,
-  );
-  foreach ($style_info as $option => $description) {
-    $form['custom_styles'][$option] = array(
-      '#title' => $option,
-      '#description' => $description,
-      '#type' => 'textfield',
-      '#default_value' => (isset($style_options) && isset($style->{$style_options[$option]}) && !is_null($style->{$style_options[$option]})) ? $style->{$style_options[$option]} : '',
-    );
-  }
-  $form['custom_styles']['shadow'] = array(
-    '#title' => 'shadow',
-    '#description' => t('Whether or not the popup has a shadow'),
-    '#type' => 'radios',
-    '#options' => array('default' => t('Default'), 'shadow' => t('Shadow On'), 'no_shadow' => t('Shadow Off')),
-    '#attributes' => array('class' => array('beautytips-options-shadow')),
-    '#default_value' => isset($style->shadow) ? $style->shadow : 'default',
-  );
-  $form['custom_styles']['cssClass'] = array(
-    '#title' => 'cssClass',
-    '#description' => t('The class that will be applied to the box wrapper div (of the TIP)'),
-    '#type' => 'textfield',
-    '#default_value' => isset($style->css_class) ? $style->css_class : '',
-  );
-  $css_style_info = array('color', 'fontFamily', 'fontWeight', 'fontSize');
-  $form['custom_styles']['css-styles'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Font Styling'),
-    '#description' => t('Enter css options for changing the font style'),
-    '#attributes' => array('class' => array('beautytips-css-styling')),
-    '#collapsible' => FALSE,
-  );
-  foreach ($css_style_info as $option) {
-    $form['custom_styles']['css-styles'][$option] = array(
-      '#title' => $option,
-      '#type' => 'textfield',
-      '#default_value' => (isset($css_style_options) && isset($style->{$css_style_options[$option]}) && !is_null($style->{$css_style_options[$option]})) ? $style->{$css_style_options[$option]} : '',
-    );
-  }
-
-  $path = drupal_get_path('module', 'beautytips');
-  // TODO: This could be in a library
-  drupal_add_js($path . '/other_libs/colorpicker/js/colorpicker.js');
-  drupal_add_css($path . '/other_libs/colorpicker/css/colorpicker.css');
-  beautytips_add_beautytips();
-  drupal_add_js($path . '/js/bt_custom_styles.js');
-  $form['save'] = array(
-    '#type' => 'submit',
-    '#value' => t('Save'),
-  );
-  return $form;
-}
-
-/**
- * Validation callback on beautytips_manager_custom_styles_form.
- */
-function beautytips_manager_custom_styles_form_validate($form, &$form_state) {
-  $values = $form_state['values'];
-  if (empty($values['name'])) {
-    form_set_error('name', t('You must name this custom style.'));
-  }
-  if (preg_match('/[^a-zA-Z0-9_]/', $values['name'])) {
-    form_set_error('name', t('Style name must be alphanumeric or underscores only.'));
-  }
-
-  $integer_fields = array('strokeWidth' => 'style', 'cornerRadius' => 'style', 'spikeGirth' => 'style', 'spikeLength' => 'style', 'shadowBlur' => 'style'); 
-  $pixel_fields = array('width' => 'style', 'padding' =>'style', 'fontSize' => 'css');
-
-  // Validate fields that expect a number
-  foreach ($integer_fields as $name => $type) {
-    $value = $type == 'css' ? $values['custom_styles']['css-styles'][$name] : $values['custom_styles'][$name];
-    if ($value) {
-      if (!ctype_digit($value)) {
-        $error_element = $type == 'css' ? 'custom_styles][css-styles][' . $name : 'custom_styles][' . $name;
-        form_set_error($error_element, t('You need to enter an integer value for <em>@name</em>', array('@name' => $name)));
-      }
-    }
-  }
-
-  // Validate fields that expect a number and unit
-  foreach ($pixel_fields as $name => $type) {
-    $value = $type == 'css' ? $values['custom_styles']['css-styles'][$name] : $values['custom_styles'][$name];
-    if ($value) {
-      $unit = substr($value, -2, 2);
-      $value = str_replace(array('px', ' ', 'em'), '', $value);
-      if (!is_numeric($value) || (!$value && $value != 0) || !in_array($unit, array('px', 'em'))) {
-        $error_element = $type == 'css' ? 'custom_styles][css-styles][' . $name : 'custom_styles][' . $name;
-        form_set_error($error_element, t('You need to enter a numeric value for <em>@name</em>, followed by <em>px</em> or <em>em</em>', array('@name' => $name)));
-      }
-    }
-  }
-
-}
-
-/**
- * Submission callback on beautytips_manager_custom_styles_form.
- */
-function beautytips_manager_custom_styles_form_submit($form, &$form_state) {
-  $style = new stdClass;
-  $style->name = $form_state['values']['name'];
-  $mapping = beautytips_manager_style_mapping();
-  foreach ($form_state['values']['custom_styles'] as $custom_style => $value) {
-    if (!is_array($value)) {
-      $field = $custom_style;
-      if (isset($mapping['options'][$custom_style])) {
-        $style->{$mapping['options'][$custom_style]} = $value;
-      }
-    }
-    else {
-      if ($custom_style == 'css-styles') {
-        foreach ($value as $css_style => $css_value) {
-          if (isset($mapping['css_options'][$css_style])) {
-            $style->{$mapping['css_options'][$css_style]} = $css_value;
-          }
-        }
-      }
-    }
-  }
-  if (!is_null($form_state['values']['style'])) {
-    $style->id = $form_state['values']['style']->id;
-  }
-  beautytips_manager_save_custom_style($style);
-  cache_clear_all('beautytips:beautytips-styles', 'cache');
-  $form_state['redirect'] = 'admin/config/user-interface/beautytips/custom-styles';
-}
-
-/**
- * Confirm form for deleting a custom beautytip.
- */
-function beautytips_manager_delete_tip_confirm_form($form, &$form_state, $id) {
-  $tip = beautytips_manager_get_custom_tip($id);
-  $form['id'] = array(
-    '#type' => 'value',
-    '#value' => $id,
-  );
-  $question = t('Are you sure you want to the beautytip applied to element %element?', array('%element' => $tip->element));
-  return confirm_form($form, $question, 'admin/config/user-interface/beautytips/custom-tips');
-}
-
-/**
- * Submit callback for beautytips delete confirm form.
- */
-function beautytips_manager_delete_tip_confirm_form_submit($form, &$form_state) {
-  beautytips_manager_delete_custom_tip($form_state['values']['id']);
-  cache_clear_all('beautytips:beautytips-ui-custom-tips', 'cache');
-  $form_state['redirect'] = 'admin/config/user-interface/beautytips/custom-tips';
-}
-
-/**
- * Page callback for style deletion form. 
- */
-function beautytips_manager_delete_style_page($id) {
-  $style = beautytips_manager_get_custom_style($id);
-  if ($style->name == variable_get('beautytips_default_style', 'plain')) {
-    return t('You cannot delete this style because is set as the default style.  You may change this <a href="@link">here</a>.', array('@link' => '/admin/config/user-interface/beautytips'));
-  }
-
-  return drupal_get_form('beautytips_manager_delete_style_confirm_form', $id);
-  
-}
-
-/**
- * Confirm form for deleting a custom beautytip style.
- */
-function beautytips_manager_delete_style_confirm_form($form, &$form_state, $id) {
-  $style = beautytips_manager_get_custom_style($id);
-  $form['id'] = array(
-    '#type' => 'value',
-    '#value' => $id,
-  );
-  $question = t('Are you sure you want to the beautytip stlye %style?', array('%style' => $style->name));
-  return confirm_form($form, $question, 'admin/config/user-interface/beautytips/custom-styles');
-}
-
-/**
- * Submit callback for beautytips delete confirm form.
- */
-function beautytips_manager_delete_style_confirm_form_submit($form, &$form_state) {
-  beautytips_manager_delete_custom_style($form_state['values']['id']);
-  $form_state['redirect'] = 'admin/config/user-interface/beautytips/custom-styles';
-}
diff --git a/beautytips_manager.info b/beautytips_manager.info
deleted file mode 100755
index 1519e7d..0000000
--- a/beautytips_manager.info
+++ /dev/null
@@ -1,6 +0,0 @@
-
-name = BeautyTips Manager
-description = Adds graphical manager for creating custom beautytips.
-package = User interface
-dependencies[] = beautytips
-core = 7.x
diff --git a/beautytips_manager.install b/beautytips_manager.install
deleted file mode 100755
index 17e36e3..0000000
--- a/beautytips_manager.install
+++ /dev/null
@@ -1,273 +0,0 @@
-<?php
-
-/**
- * @file
- * Code related to the installation and uninstallation of 
- *   custom beautytip and style administration.
- */
-
-/**
- * Implementation of hook_schema().
- */
-function beautytips_manager_schema() {
-  $schema = array();
-  $schema['beautytips_custom_tips'] = array(
-    'description' => t('Store custom defined beautytips.'), 
-    'fields' => array(
-      'id' => array(
-        'type' => 'serial',
-        'not null' => TRUE,
-        'description' => t('The unique id for the custom beautytip.'),
-      ),
-      'element' => array(
-        'type' => 'varchar',
-        'length' => 255,
-        'not null' => TRUE,
-        'description' => t('The element to which this beautytips will be applied.'),
-      ), 
-      'content_type' => array(
-        'type' => 'varchar',
-        'length' => 64, 
-        'description' => t('What kind of content will be grabbed for the display.'),
-      ),
-      'content' => array(
-        'type' => 'text',
-        'description' => t('The content that will be displayed. Depends on content type.'),
-      ),
-      'disable_link' => array(
-        'type' => 'int',
-        'not null' => TRUE,
-        'default' => 0,
-        'size' => 'tiny',
-        'unsigned' => TRUE,
-        'decription' => t('Whether to disable link or not.'),
-      ),
-      'trigger_on' => array(
-        'type' => 'varchar',
-        'length' => 32, 
-        'description' => t('The event that will turn the beautytips on.'),
-      ),
-      'trigger_off' => array(
-        'type' => 'varchar',
-        'length' => 32, 
-        'description' => t('The event that will turn the beautytips off.'),
-      ),
-      'style' => array(
-        'type' => 'varchar',
-        'length' => 64, 
-        'description' => t('The style of the beautytip.'),
-      ),
-      'shrink' => array(
-        'type' => 'int',
-        'not null' => TRUE,
-        'default' => 0,
-        'size' => 'tiny',
-        'decription' => t('Whether or to shrink to fit.'),
-      ),
-      'positions' => array(
-        'type' => 'varchar',
-        'length' => 64,
-        'default' => '',
-        'description' => t('The position order in which this beautytip should display.'),
-      ),
-      'animation_on' => array(
-        'type' => 'varchar',
-        'length' => 255, 
-        'description' => t('The animation that will occurs when the beautytips turns on.'),
-      ),
-      'animation_off' => array(
-        'type' => 'varchar',
-        'length' => 255, 
-        'description' => t('The animation that will occurs when the beautytips turns off.'),
-      ),
-      'visibility' => array(
-        'type' => 'int',
-        'not null' => TRUE,
-        'default' => 0,
-        'size' => 'tiny',
-        'description' => t('Flag to indicate how to show beautytips on pages. (0 = Show on all pages except listed pages, 1 = Show only on listed pages, 2 = Use custom PHP code to determine visibility)'),
-      ),
-      'pages' => array(
-        'type' => 'text',
-        'not null' => TRUE,
-        'description' => t('Contains a list of paths on which to include/exclude the beautytip, depending on "visibility" setting.'),
-      ),
-      'enabled' => array(
-        'type' => 'int',
-        'size' => 'tiny',
-        'unsigned' => TRUE,
-        'description' => t('Whether or not this tip is enabled'),
-      ),
-    ),
-    'primary key' => array('id'),
-  );
-  $schema['beautytips_custom_styles'] = array(
-    'description' => t('Store custom defined beautytip styles.'), 
-    'fields' => array(
-      'id' => array(
-        'type' => 'serial',
-        'not null' => TRUE,
-        'description' => t('The unique id for the custom beautytip style.'),
-      ),
-      'name' => array(
-        'type' => 'varchar',
-        'length' => 255, 
-        'description' => t('The unique name for this style.'),
-      ), 
-      'fill' => array(
-        'description' => t('background color (string - html color)'),
-        'type' => 'varchar',
-        'length' => 64,
-        'not null' => FALSE,
-      ),
-      'stroke_width' => array(
-        'type' => 'varchar',
-        'description' => t('width of border (integer)'),
-        'length' => 32,
-        'not null' => FALSE,
-      ),
-      'stroke_style' => array(
-        'description' => t('color of border (string - html color)'),
-        'type' => 'varchar',
-        'length' => 64,
-        'not null' => FALSE,
-      ),
-      'width' => array(
-        'description' => t('width of popup (number in px)'),
-        'type' => 'varchar',
-        'length' => 32,
-        'not null' => FALSE,
-      ),
-      'padding' => array(
-        'description' => t('space between content and border (number in px)'),
-        'type' => 'varchar',
-        'length' => 32,
-        'not null' => FALSE,
-      ),
-      'corner_radius' => array(
-        'description' => t('Controls roundness of corners (integer)'),
-        'type' => 'varchar',
-        'length' => 32,
-        'not null' => FALSE,
-      ),
-      'spike_girth' => array(
-        'description' => t('thickness of spike (integer)'),
-        'type' => 'varchar',
-        'length' => 32,
-        'not null' => FALSE,
-      ),
-      'spike_length' => array(
-        'description' => t('length of spike (integer)'),
-        'type' => 'varchar',
-        'length' => 32,
-        'not null' => FALSE,
-      ),
-      'shadow' => array(
-        'description' => t('Whether the shadow should be on, off, or default.'),
-        'type' => 'varchar',
-        'length' => 16,
-        'default' => 'default',
-      ),
-      'shadow_blur' => array(
-        'description' => t('Size of popup shadow (integer)'),
-        'type' => 'varchar',
-        'length' => 32,
-        'not null' => FALSE,
-      ),
-      'shadow_color' => array(
-        'description' => t('Color of popup shadow (string - html color)'),
-        'type' => 'varchar',
-        'length' => 32,
-        'not null' => FALSE,
-      ),
-      'css_class' => array(
-        'description' => t('css class of beautytip popup.'),
-        'type' => 'varchar',
-        'length' => 64,
-        'not null' => FALSE,
-      ),
-      'css_color' => array(
-        'description' => t('The color of the text.'), 
-        'type' => 'varchar',
-        'length' => 32,
-        'not null' => FALSE,
-      ),
-      'css_font_family' => array(
-        'description' => t('The font family of the text.'),
-        'type' => 'varchar',
-        'length' => 32,
-        'not null' => FALSE,
-      ),
-      'css_font_weight' => array(
-        'description' => t('The font weight of the text.'),
-        'type' => 'varchar',
-        'length' => 32,
-        'not null' => FALSE,
-      ),
-      'css_font_size' => array(
-        'description' => t('The font size of the text.'),
-        'type' => 'varchar',
-        'length' => 32,
-        'not null' => FALSE,
-      ),
-    ),
-    'primary key' => array('id'),
-  );
-  return $schema;
-}
-
-/**
- * Update to add enabled field.
- */
-function beautytips_manager_update_7000() {
-  $ret = array();
-
-  // Make sure this field doesn't already exist.
-  if (db_field_exists('beautytips_custom_tips', 'enabled')) {
-    return $ret;
-  }
-
-  $spec = array(
-    'type' => 'int',
-    'size' => 'tiny',
-    'unsigned' => TRUE,
-    'description' => t('Whether or not this tip is enabled'),
-  );
-  db_add_field('beautytips_custom_tips', 'enabled', $spec);
-  return $ret;
-}
-
-/**
- * Update to add enabled field.
- */
-function beautytips_manager_update_7001() {
-  $ret = array();
-
-  // Make sure this field doesn't already exist.
-  if (db_field_exists('beautytips_custom_tips', 'disable_link')) {
-    return $ret;
-  }
-  $spec = array(
-    'type' => 'int',
-    'not null' => TRUE,
-    'default' => 0,
-    'size' => 'tiny',
-    'unsigned' => TRUE,
-    'decription' => t('Whether to disable link or not.'),
-  );
-
-  db_add_field('beautytips_custom_tips', 'disable_link', $spec);
-  return $ret;
-}
-
-/**
- * Extend the length of the element field.
- */
-function beautytips_manager_update_7002() {
-  db_change_field('beautytips_custom_tips', 'element', 'element', array(
-    'type' => 'varchar',
-    'length' => 255,
-    'description' => t('The element to which this beautytips will be applied.'),
-    'not null' => TRUE,
-  ));
-}
diff --git a/beautytips_manager.module b/beautytips_manager.module
deleted file mode 100755
index 64b078f..0000000
--- a/beautytips_manager.module
+++ /dev/null
@@ -1,363 +0,0 @@
-<?php
-
-/**
- * @file
- * Code related to defining and displaying custom beautytips and styles.
- */
-
-/**
- * Implements hook_menu().
- */
-function beautytips_manager_menu() {
-  $items['admin/config/user-interface/beautytips/custom-tips'] = array(
-    'title' => 'BeautyTips Custom-Tips',
-    'page callback' => 'beautytips_manager_tips_manager_page',
-    'access arguments' => array('administer site configuration'),
-    'file' => 'beautytips_manager.admin.inc',
-    'type' => MENU_LOCAL_TASK,
-  );
-  $items['admin/config/user-interface/beautytips/custom-tips/%/edit'] = array(
-    'title' => 'BeautyTips Custom-Tip Edit',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('beautytips_manager_custom_tips_form', 5),
-    'access arguments' => array('administer site configuration'),
-    'file' => 'beautytips_manager.admin.inc',
-    'type' => MENU_VISIBLE_IN_BREADCRUMB,
-  );
-  $items['admin/config/user-interface/beautytips/custom-tips/%/delete'] = array(
-    'title' => 'BeautyTips Custom-Tip Delete',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('beautytips_manager_delete_tip_confirm_form', 5),
-    'access arguments' => array('administer site configuration'),
-    'file' => 'beautytips_manager.admin.inc',
-    'type' => MENU_VISIBLE_IN_BREADCRUMB,
-  );
-  $items['admin/config/user-interface/beautytips/custom-tips/add'] = array(
-    'title' => 'BeautyTips Custom-Tip Add',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('beautytips_manager_custom_tips_form'),
-    'access arguments' => array('administer site configuration'),
-    'file' => 'beautytips_manager.admin.inc',
-    'type' => MENU_LOCAL_ACTION,
-  );
-  $items['admin/config/user-interface/beautytips/custom-styles'] = array(
-    'title' => 'BeautyTips Custom Styles',
-    'page callback' => 'beautytips_manager_styles_manager_page',
-    'access arguments' => array('administer site configuration'),
-    'file' => 'beautytips_manager.admin.inc',
-    'type' => MENU_LOCAL_TASK,
-  );
-  $items['admin/config/user-interface/beautytips/custom-styles/%/edit'] = array(
-    'title' => 'BeautyTips Custom Style Edit',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('beautytips_manager_custom_styles_form', 5),
-    'access arguments' => array('administer site configuration'),
-    'file' => 'beautytips_manager.admin.inc',
-    'type' => MENU_VISIBLE_IN_BREADCRUMB,
-  );
-  $items['admin/config/user-interface/beautytips/custom-styles/%/delete'] = array(
-    'title' => 'BeautyTips Manager Delete',
-    'page callback' => 'beautytips_manager_delete_style_page',
-    'page arguments' => array(5),
-    'access arguments' => array('administer site configuration'),
-    'file' => 'beautytips_manager.admin.inc',
-    'type' => MENU_VISIBLE_IN_BREADCRUMB,
-  );
-  $items['admin/config/user-interface/beautytips/custom-styles/add'] = array(
-    'title' => 'BeautyTips Custom Style Add',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('beautytips_manager_custom_styles_form'),
-    'access arguments' => array('administer site configuration'),
-    'file' => 'beautytips_manager.admin.inc',
-    'type' => MENU_LOCAL_ACTION,
-  );
-  return $items;
-}
-
-/**
- *  Implements hook_init().
- */
-function beautytips_manager_init() {
-  $options = array();
-  $tips = beautytips_manager_get_custom_tips();
-  if (count($tips)) {
-    foreach ($tips as $tip) {
-      if (!$tip->enabled) {
-        continue;
-      }
-      // Match path if necessary
-      if ($tip->pages) {
-        $path = drupal_get_path_alias($_GET['q']);
-        // Compare with the internal and path alias (if any).
-        $page_match = drupal_match_path($path, $tip->pages);
-        if ($path != $_GET['q']) {
-          $page_match = $page_match || drupal_match_path($_GET['q'], $tip->pages);
-        }
-        // When $tip->visibility has a value of 0, the beautytip is displayed on
-        // all pages except those listed in $tip->pages. When set to 1, it
-        // is displayed only on those pages listed in $tip->pages.
-        $page_match = !($tip->visibility XOR $page_match);
-      }
-      else if (!$tip->visibility) {
-        $page_match = TRUE;
-      }
-      else {
-        $page_match = FALSE;
-      }
-      if ($page_match) {
-        $options['beautytips_manager_custom_' . $tip->id] = beautytips_manager_build_beautytip($tip);
-      }
-    }
-  }
-  if (count($options)) {
-    beautytips_add_beautytips($options);
-  }
-}
-
-/**
- * Implements hook_permission().
- */
-function beautytips_manager_permission() {
-  return array(
-    'use Javascript for custom beautytip display' => array(
-      'title' => t('Use Javascript for custom beautytip display'),
-    ),
-  );
-}
-
-/**
- * Delete a singular custom beautytip.
- */
-function beautytips_manager_delete_custom_tip($id) {
-  db_delete('beautytips_custom_tips')
-    ->condition('id', $id)
-    ->execute();
-}
-
-/**
- * Save a singular beautytip.
- */
-function beautytips_manager_save_custom_tip($tip) {
-  $tip = (object) $tip;
-  if (isset($tip->id) && $tip->id) {
-    drupal_write_record('beautytips_custom_tips', $tip, 'id');
-  }
-  else {
-    drupal_write_record('beautytips_custom_tips', $tip);
-  }
-  return $tip;
-}
-
-/**
- * Retrieve a list of all possible triggers.
- * TODO: Don't include all of these
- */
-function beautytips_manager_get_triggers() {
-  return array(
-    'hover' => 'hover',
-    'hoverIntent' => 'hoverIntent',
-    'click' => 'click',
-    'dblclick' => 'dblclick',
-    'blur' => 'blur',
-    'focus' => 'focus',
-    'mouseover' => 'mouseover',
-    'mouseout' => 'mouseout',
-    'mousedown' => 'mousedown',
-    'mousemove' => 'mousemove',
-    'mouseenter' => 'mouseenter',
-    'mouseleave' => 'mouseleave',
-    'change' => 'change',
-    'select' => 'select',
-    'submit' => 'submit',
-    'keydown' => 'keydown',
-    'keypress' => 'keypress',
-    'keyup' => 'keyup',
-    'error' => 'error',
-    'load' => 'load',
-    'unload' => 'unload',
-    'resize' => 'resize',
-    'scroll' => 'scroll',
-  );
-}
-
-/**
- * Retrieve all custom beautytips.
- */
-function beautytips_manager_get_custom_tips() {
-  $tips = array();
-  $cache = cache_get('beautytips:beautytips-ui-custom-tips');
-  if (!$cache) {
-    $results =  db_query("SELECT * FROM {beautytips_custom_tips}");
-    foreach ($results as $result) {
-      $tips[$result->id] = $result;
-    }
-    cache_set('beautytips:beautytips-ui-custom-tips', $tips);
-  }
-  else {
-    $tips = $cache->data;
-  }
-  
-  return $tips;
-}
-
-/**
- * Retrieves a single custom beautytip.
- */
-function beautytips_manager_get_custom_tip($id) {
-  $sql = "SELECT * FROM {beautytips_custom_tips} WHERE id = :id";
-  $result = db_query($sql, array(':id' => $id));
-  return $result->fetchObject();
-}
-
-/**
- * Given a custom tip, build an array of options
- *  that can be passed to beautytips_add_beautytips().
- */
-function beautytips_manager_build_beautytip($tip) {
-  $single_triggers = array('hover', 'hoverIntent');
-  $trigger = in_array($tip->trigger_on, $single_triggers) ? $tip->trigger_on : array($tip->trigger_on, $tip->trigger_off);
-  $options = array(
-    'cssSelect' => check_plain($tip->element),
-    'style' => $tip->style,
-    'trigger' => $trigger,
-    'shrinkToFit' => (boolean) $tip->shrink,
-    'ajaxDisableLink' => (boolean) $tip->disable_link,
-  );
-  if ($tip->animation_on) {
-    $options['animate']['on'] = $tip->animation_on;
-  }
-  if ($tip->animation_off) {
-    $options['animate']['off'] = $tip->animation_off;
-  }
-  if ($tip->positions) {
-    $options['positions'] = explode(',', $tip->positions);
-  }
-  switch ($tip->content_type) {
-    case 'attribute':
-      if ($tip->content) {
-        $options['contentSelector'] = "$(this).attr('" . check_plain($tip->content) . "')";
-      }
-      break;
-    case 'text':
-      $options['text'] = check_markup($tip->content);
-      break;
-    case 'ajax':
-      $options['ajaxPath'] = !$tip->content ? "$(this).attr('href')" : array("$(this).attr('href')", filter_xss($tip->content));
-      break;
-    case 'js':
-      $options['contentSelector'] = filter_xss($tip->content);
-      break;
-  }
-  return $options;
-} 
-
-/**
- * Delete a singular custom beautytip.
- */
-function beautytips_manager_delete_custom_style($id) {
-  db_delete('beautytips_custom_styles')
-    ->condition('id', $id)
-    ->execute();
-}
-
-/**
- * Save a singular beautytip style.
- */
-function beautytips_manager_save_custom_style($style) {
-  $style = (object) $style;
-  if (isset($style->id) && $style->id) {
-    drupal_write_record('beautytips_custom_styles', $style, 'id');
-  }
-  else {
-    drupal_write_record('beautytips_custom_styles', $style);
-  }
-  return $style;
-}
-
-/**
- * Contains an array of beautytip style options
- *  for mapping the names between php and javascript.
- */
-function beautytips_manager_style_mapping() {
-  return array(
-    'options' => array(
-      'fill' => 'fill',
-      'strokeWidth' => 'stroke_width',
-      'strokeStyle' => 'stroke_style',
-      'width' => 'width',
-      'padding' => 'padding',
-      'cornerRadius' => 'corner_radius',
-      'spikeGirth' => 'spike_girth',
-      'spikeLength' => 'spike_length',
-      'shadow' => 'shadow',
-      'shadowBlur' => 'shadow_blur',
-      'shadowColor' => 'shadow_color',
-      'cssClass' => 'css_class',
-    ),
-    'css_options' => array(
-      'color' => 'css_color',
-      'fontFamily' => 'css_font_family',
-      'fontWeight' => 'css_font_weight',
-      'fontSize' => 'css_font_size',
-    ),
-  );
-}
-
-/**
- * Get all defined custom styles.
- */
-function beautytips_manager_get_custom_styles() {
-  $styles = array();
-  $results =  db_query("SELECT * FROM {beautytips_custom_styles}");
-  foreach ($results as $result) {
-    $styles[$result->id] = $result;
-  }
-  return $styles;
-}
-
-/**
- * Grab a custom style from the database.
- */
-function beautytips_manager_get_custom_style($id) {
-  $sql = "SELECT * FROM {beautytips_custom_styles} WHERE id = :id";
-  $result = db_query($sql, array(':id' => $id));
-  return $result->fetchObject();
-}
-
-/**
- * Implements hook_define_beautytips_styles().
- */
-function beautytips_manager_define_beautytips_styles() {
-  $styles = array();
-  $custom_styles = beautytips_manager_get_custom_styles();
-  $style_map = beautytips_manager_style_mapping();
-  $style_options = array_flip($style_map['options']);
-  $css_style_options = array_flip($style_map['css_options']);
-
-  if (count($custom_styles)) {
-    foreach ($custom_styles as $id => $style) {
-      $options = array();
-      foreach ($style as $key => $value) {
-        if (isset($style_options[$key])) {
-          if ($key == 'shadow') {
-            if ($value != 'default') {
-              $options['shadow'] = $value == 'shadow' ? TRUE : FALSE;
-            }
-          }
-          else if (!is_null($value) && $value != '') {
-            // Add the setting and make sure integers stay as integers.
-            $options[$style_options[$key]]= (ctype_digit($value) || is_int($value)) ? (int) $value : check_plain($value);
-          }
-        }
-        else if (isset($css_style_options[$key])) {
-          if (!is_null($value) && $value != '') {
-            $options['cssStyles'][$css_style_options[$key]] = check_plain($value);
-          }
-        }
-      }
-      $styles[$style->name] = $options;
-    }
-  }
-  return $styles;
-}
-
diff --git a/beautytips_manager/beautytips_manager.info.yml b/beautytips_manager/beautytips_manager.info.yml
new file mode 100755
index 0000000..c4ef0b4
--- /dev/null
+++ b/beautytips_manager/beautytips_manager.info.yml
@@ -0,0 +1,8 @@
+
+name: BeautyTips Manager
+type: module
+description: Adds graphical manager for creating custom beautytips.
+package: User interface
+dependencies:
+  - beautytips
+core: 8.x
diff --git a/beautytips_manager/beautytips_manager.install b/beautytips_manager/beautytips_manager.install
new file mode 100755
index 0000000..dba6241
--- /dev/null
+++ b/beautytips_manager/beautytips_manager.install
@@ -0,0 +1,217 @@
+<?php
+
+/**
+ * @file
+ * Code related to the installation and uninstallation of
+ *   custom beautytip and style administration.
+ */
+
+/**
+ * Implementation of hook_schema().
+ */
+function beautytips_manager_schema() {
+  $schema = array();
+  $schema['beautytips_custom_tips'] = array(
+    'description' => t('Store custom defined beautytips.'),
+    'fields' => array(
+      'id' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => t('The unique id for the custom beautytip.'),
+      ),
+      'element' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'description' => t('The element to which this beautytips will be applied.'),
+      ),
+      'content_type' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'description' => t('What kind of content will be grabbed for the display.'),
+      ),
+      'content' => array(
+        'type' => 'text',
+        'description' => t('The content that will be displayed. Depends on content type.'),
+      ),
+      'disable_link' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'unsigned' => TRUE,
+        'decription' => t('Whether to disable link or not.'),
+      ),
+      'trigger_on' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'description' => t('The event that will turn the beautytips on.'),
+      ),
+      'trigger_off' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'description' => t('The event that will turn the beautytips off.'),
+      ),
+      'style' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'description' => t('The style of the beautytip.'),
+      ),
+      'shrink' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'decription' => t('Whether or to shrink to fit.'),
+      ),
+      'positions' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'default' => '',
+        'description' => t('The position order in which this beautytip should display.'),
+      ),
+      'animation_on' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'description' => t('The animation that will occurs when the beautytips turns on.'),
+      ),
+      'animation_off' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'description' => t('The animation that will occurs when the beautytips turns off.'),
+      ),
+      'visibility' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => t('Flag to indicate how to show beautytips on pages. (0 = Show on all pages except listed pages, 1 = Show only on listed pages, 2 = Use custom PHP code to determine visibility)'),
+      ),
+      'pages' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'description' => t('Contains a list of paths on which to include/exclude the beautytip, depending on "visibility" setting.'),
+      ),
+      'enabled' => array(
+        'type' => 'int',
+        'size' => 'tiny',
+        'unsigned' => TRUE,
+        'description' => t('Whether or not this tip is enabled'),
+      ),
+    ),
+    'primary key' => array('id'),
+  );
+  $schema['beautytips_custom_styles'] = array(
+    'description' => t('Store custom defined beautytip styles.'),
+    'fields' => array(
+      'id' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => t('The unique id for the custom beautytip style.'),
+      ),
+      'name' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'description' => t('The unique name for this style.'),
+      ),
+      'fill' => array(
+        'description' => t('background color (string - html color)'),
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => FALSE,
+      ),
+      'stroke_width' => array(
+        'type' => 'varchar',
+        'description' => t('width of border (integer)'),
+        'length' => 32,
+        'not null' => FALSE,
+      ),
+      'stroke_style' => array(
+        'description' => t('color of border (string - html color)'),
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => FALSE,
+      ),
+      'width' => array(
+        'description' => t('width of popup (number in px)'),
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => FALSE,
+      ),
+      'padding' => array(
+        'description' => t('space between content and border (number in px)'),
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => FALSE,
+      ),
+      'corner_radius' => array(
+        'description' => t('Controls roundness of corners (integer)'),
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => FALSE,
+      ),
+      'spike_girth' => array(
+        'description' => t('thickness of spike (integer)'),
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => FALSE,
+      ),
+      'spike_length' => array(
+        'description' => t('length of spike (integer)'),
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => FALSE,
+      ),
+      'shadow' => array(
+        'description' => t('Whether the shadow should be on, off, or default.'),
+        'type' => 'varchar',
+        'length' => 16,
+        'default' => 'default',
+      ),
+      'shadow_blur' => array(
+        'description' => t('Size of popup shadow (integer)'),
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => FALSE,
+      ),
+      'shadow_color' => array(
+        'description' => t('Color of popup shadow (string - html color)'),
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => FALSE,
+      ),
+      'css_class' => array(
+        'description' => t('css class of beautytip popup.'),
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => FALSE,
+      ),
+      'css_color' => array(
+        'description' => t('The color of the text.'),
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => FALSE,
+      ),
+      'css_font_family' => array(
+        'description' => t('The font family of the text.'),
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => FALSE,
+      ),
+      'css_font_weight' => array(
+        'description' => t('The font weight of the text.'),
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => FALSE,
+      ),
+      'css_font_size' => array(
+        'description' => t('The font size of the text.'),
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => FALSE,
+      ),
+    ),
+    'primary key' => array('id'),
+  );
+  return $schema;
+}
diff --git a/beautytips_manager/beautytips_manager.local_actions.yml b/beautytips_manager/beautytips_manager.local_actions.yml
new file mode 100644
index 0000000..0a54b66
--- /dev/null
+++ b/beautytips_manager/beautytips_manager.local_actions.yml
@@ -0,0 +1,11 @@
+beautytips_manager_add_tip:
+  route_name: beautytips_manager.customTipsAdd
+  title: 'BeautyTips Custom-Tip Add'
+  appears_on:
+    - beautytips_manager.customTips
+
+beautytips_manager_add_style:
+  route_name: beautytips_manager.customStylesAdd
+  title: 'BeautyTips Custom Style Add'
+  appears_on:
+    - beautytips_manager.customStyles
diff --git a/beautytips_manager/beautytips_manager.module b/beautytips_manager/beautytips_manager.module
new file mode 100755
index 0000000..2884ea3
--- /dev/null
+++ b/beautytips_manager/beautytips_manager.module
@@ -0,0 +1,342 @@
+<?php
+
+/**
+ * @file
+ * Code related to defining and displaying custom beautytips and styles.
+ */
+
+use Drupal\Core\Cache\CacheBackendInterface;
+
+/**
+ * Implements hook_menu().
+ */
+function beautytips_manager_menu() {
+  $items['admin/config/user-interface/beautytips/custom-tips'] = array(
+    'title' => 'BeautyTips Custom-Tips',
+    'route_name' => 'beautytips_manager.customTips',
+    'type' => MENU_LOCAL_TASK,
+  );
+  $items['admin/config/user-interface/beautytips/custom-tips/%/edit'] = array(
+    'title' => 'BeautyTips Custom-Tip Edit',
+    'route_name' => 'beautytips_manager.customTipsEdit',
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+  );
+  $items['admin/config/user-interface/beautytips/custom-tips/%/delete'] = array(
+    'title' => 'BeautyTips Custom-Tip Delete',
+    'route_name' => 'beautytips_manager.customTipsDelete',
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+  );
+  $items['admin/config/user-interface/beautytips/custom-tips/add'] = array(
+    'title' => 'BeautyTips Custom-Tip Add',
+    'route_name' => 'beautytips_manager.customTipsAdd',
+  );
+  $items['admin/config/user-interface/beautytips/custom-styles'] = array(
+    'title' => 'BeautyTips Custom Styles',
+    'route_name' => 'beautytips_manager.customStyles',
+    'type' => MENU_LOCAL_TASK,
+  );
+  $items['admin/config/user-interface/beautytips/custom-styles/%/edit'] = array(
+    'title' => 'BeautyTips Custom Style Edit',
+    'route_name' => 'beautytips_manager.customStylesEdit',
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+  );
+  $items['admin/config/user-interface/beautytips/custom-styles/%/delete'] = array(
+    'title' => 'BeautyTips Custom Style Delete',
+    'route_name' => 'beautytips_manager.customStylesDelete',
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+  );
+  $items['admin/config/user-interface/beautytips/custom-styles/add'] = array(
+    'title' => 'BeautyTips Custom Style Add',
+    'route_name' => 'beautytips_manager.customStylesAdd',
+  );
+  return $items;
+}
+
+/**
+ *  Implements hook_page_build().
+ */
+function beautytips_manager_page_build(&$page) {
+  $options = array();
+  $tips = beautytips_manager_get_custom_tips();
+  if (count($tips)) {
+    foreach ($tips as $tip) {
+      if (!$tip->enabled) {
+        continue;
+      }
+      // Match path if necessary
+      if ($tip->pages) {
+        // $path = drupal_get_path_alias(request_path());
+        $path = Drupal::service('path.alias_manager.cached')->getPathAlias(request_path());
+        // Compare with the internal and path alias (if any).
+        $page_match = drupal_match_path($path, $tip->pages);
+        if ($path != request_path()) {
+          $page_match = $page_match || drupal_match_path(request_path(), $tip->pages);
+        }
+        // When $tip->visibility has a value of 0, the beautytip is displayed on
+        // all pages except those listed in $tip->pages. When set to 1, it
+        // is displayed only on those pages listed in $tip->pages.
+        $page_match = !($tip->visibility XOR $page_match);
+      }
+      else if (!$tip->visibility) {
+        $page_match = TRUE;
+      }
+      else {
+        $page_match = FALSE;
+      }
+      if ($page_match) {
+        $options['beautytips_manager_custom_' . $tip->id] = beautytips_manager_build_beautytip($tip);
+      }
+    }
+  }
+  if (count($options)) {
+    beautytips_add_beautytips($options);
+  }
+}
+
+/**
+ * Implements hook_permission().
+ */
+function beautytips_manager_permission() {
+  return array(
+    'use Javascript for custom beautytip display' => array(
+      'title' => t('Use Javascript for custom beautytip display'),
+    ),
+  );
+}
+
+/**
+ * Delete a singular custom beautytip.
+ */
+function beautytips_manager_delete_custom_tip($id) {
+  db_delete('beautytips_custom_tips')
+    ->condition('id', $id)
+    ->execute();
+}
+
+/**
+ * Save a singular beautytip.
+ */
+function beautytips_manager_save_custom_tip($tip) {
+  $tip = (object) $tip;
+  if (isset($tip->id) && $tip->id) {
+    drupal_write_record('beautytips_custom_tips', $tip, 'id');
+  }
+  else {
+    drupal_write_record('beautytips_custom_tips', $tip);
+  }
+  return $tip;
+}
+
+/**
+ * Retrieve a list of all possible triggers.
+ * TODO: Don't include all of these
+ */
+function beautytips_manager_get_triggers() {
+  return array(
+    'hover' => 'hover',
+    'hoverIntent' => 'hoverIntent',
+    'click' => 'click',
+    'dblclick' => 'dblclick',
+    'blur' => 'blur',
+    'focus' => 'focus',
+    'mouseover' => 'mouseover',
+    'mouseout' => 'mouseout',
+    'mousedown' => 'mousedown',
+    'mousemove' => 'mousemove',
+    'mouseenter' => 'mouseenter',
+    'mouseleave' => 'mouseleave',
+    'change' => 'change',
+    'select' => 'select',
+    'submit' => 'submit',
+    'keydown' => 'keydown',
+    'keypress' => 'keypress',
+    'keyup' => 'keyup',
+    'error' => 'error',
+    'load' => 'load',
+    'unload' => 'unload',
+    'resize' => 'resize',
+    'scroll' => 'scroll',
+  );
+}
+
+/**
+ * Retrieve all custom beautytips.
+ */
+function beautytips_manager_get_custom_tips() {
+  $tips = array();
+  $cache = cache()->get('beautytips:beautytips-ui-custom-tips');
+  if (!$cache) {
+    $results =  db_query("SELECT * FROM {beautytips_custom_tips}");
+    foreach ($results as $result) {
+      $tips[$result->id] = $result;
+    }
+    cache()->set('beautytips:beautytips-ui-custom-tips', $tips, CacheBackendInterface::CACHE_PERMANENT, array('beautytips' => TRUE));
+  }
+  else {
+    $tips = $cache->data;
+  }
+
+  return $tips;
+}
+
+/**
+ * Retrieves a single custom beautytip.
+ */
+function beautytips_manager_get_custom_tip($id) {
+  $sql = "SELECT * FROM {beautytips_custom_tips} WHERE id = :id";
+  $result = db_query($sql, array(':id' => $id));
+  return $result->fetchObject();
+}
+
+/**
+ * Given a custom tip, build an array of options
+ *  that can be passed to beautytips_add_beautytips().
+ */
+function beautytips_manager_build_beautytip($tip) {
+  $single_triggers = array('hover', 'hoverIntent');
+  $trigger = in_array($tip->trigger_on, $single_triggers) ? $tip->trigger_on : array($tip->trigger_on, $tip->trigger_off);
+  $options = array(
+    'cssSelect' => check_plain($tip->element),
+    'style' => $tip->style,
+    'trigger' => $trigger,
+    'shrinkToFit' => (boolean) $tip->shrink,
+    'ajaxDisableLink' => (boolean) $tip->disable_link,
+  );
+  if ($tip->animation_on) {
+    $options['animate']['on'] = $tip->animation_on;
+  }
+  if ($tip->animation_off) {
+    $options['animate']['off'] = $tip->animation_off;
+  }
+  if ($tip->positions) {
+    $options['positions'] = explode(',', $tip->positions);
+  }
+  switch ($tip->content_type) {
+    case 'attribute':
+      if ($tip->content) {
+        $options['contentSelector'] = "$(this).attr('" . check_plain($tip->content) . "')";
+      }
+      break;
+    case 'text':
+      $options['text'] = check_markup($tip->content);
+      break;
+    case 'ajax':
+      $options['ajaxPath'] = !$tip->content ? "$(this).attr('href')" : array("$(this).attr('href')", filter_xss($tip->content));
+      break;
+    case 'js':
+      $options['contentSelector'] = filter_xss($tip->content);
+      break;
+  }
+  return $options;
+}
+
+/**
+ * Delete a singular custom beautytip.
+ */
+function beautytips_manager_delete_custom_style($id) {
+  db_delete('beautytips_custom_styles')
+    ->condition('id', $id)
+    ->execute();
+}
+
+/**
+ * Save a singular beautytip style.
+ */
+function beautytips_manager_save_custom_style($style) {
+  $style = (object) $style;
+  if (isset($style->id) && $style->id) {
+    drupal_write_record('beautytips_custom_styles', $style, 'id');
+  }
+  else {
+    drupal_write_record('beautytips_custom_styles', $style);
+  }
+  return $style;
+}
+
+/**
+ * Contains an array of beautytip style options
+ *  for mapping the names between php and javascript.
+ */
+function beautytips_manager_style_mapping() {
+  return array(
+    'options' => array(
+      'fill' => 'fill',
+      'strokeWidth' => 'stroke_width',
+      'strokeStyle' => 'stroke_style',
+      'width' => 'width',
+      'padding' => 'padding',
+      'cornerRadius' => 'corner_radius',
+      'spikeGirth' => 'spike_girth',
+      'spikeLength' => 'spike_length',
+      'shadow' => 'shadow',
+      'shadowBlur' => 'shadow_blur',
+      'shadowColor' => 'shadow_color',
+      'cssClass' => 'css_class',
+    ),
+    'css_options' => array(
+      'color' => 'css_color',
+      'fontFamily' => 'css_font_family',
+      'fontWeight' => 'css_font_weight',
+      'fontSize' => 'css_font_size',
+    ),
+  );
+}
+
+/**
+ * Get all defined custom styles.
+ */
+function beautytips_manager_get_custom_styles() {
+  $styles = array();
+  $results =  db_query("SELECT * FROM {beautytips_custom_styles}");
+  foreach ($results as $result) {
+    $styles[$result->id] = $result;
+  }
+  return $styles;
+}
+
+/**
+ * Grab a custom style from the database.
+ */
+function beautytips_manager_get_custom_style($id) {
+  $sql = "SELECT * FROM {beautytips_custom_styles} WHERE id = :id";
+  $result = db_query($sql, array(':id' => $id));
+  return $result->fetchObject();
+}
+
+/**
+ * Implements hook_define_beautytips_styles().
+ */
+function beautytips_manager_define_beautytips_styles() {
+  $styles = array();
+  $custom_styles = beautytips_manager_get_custom_styles();
+  $style_map = beautytips_manager_style_mapping();
+  $style_options = array_flip($style_map['options']);
+  $css_style_options = array_flip($style_map['css_options']);
+
+  if (count($custom_styles)) {
+    foreach ($custom_styles as $id => $style) {
+      $options = array();
+      foreach ($style as $key => $value) {
+        if (isset($style_options[$key])) {
+          if ($key == 'shadow') {
+            if ($value != 'default') {
+              $options['shadow'] = $value == 'shadow' ? TRUE : FALSE;
+            }
+          }
+          else if (!is_null($value) && $value != '') {
+            // Add the setting and make sure integers stay as integers.
+            $options[$style_options[$key]]= (ctype_digit($value) || is_int($value)) ? (int) $value : check_plain($value);
+          }
+        }
+        else if (isset($css_style_options[$key])) {
+          if (!is_null($value) && $value != '') {
+            $options['cssStyles'][$css_style_options[$key]] = check_plain($value);
+          }
+        }
+      }
+      $styles[$style->name] = $options;
+    }
+  }
+  return $styles;
+}
+
diff --git a/beautytips_manager/beautytips_manager.routing.yml b/beautytips_manager/beautytips_manager.routing.yml
new file mode 100644
index 0000000..ff7482d
--- /dev/null
+++ b/beautytips_manager/beautytips_manager.routing.yml
@@ -0,0 +1,63 @@
+beautytips_manager.customTips:
+  path: '/admin/config/user-interface/beautytips/custom-tips'
+  defaults:
+    _title: 'BeautyTips Custom-Tips'
+    _content: '\Drupal\beautytips_manager\Controller\BeautytipsManagerController::customTipsOverview'
+  requirements:
+    _permission: 'administer site configuration'
+
+beautytips_manager.customTipsEdit:
+  path: '/admin/config/user-interface/beautytips/custom-tips/{id}/edit'
+  defaults:
+    _title: 'BeautyTips Custom-Tip Edit'
+    _form: '\Drupal\beautytips_manager\Form\CustomTipsEditForm'
+  requirements:
+    _permission: 'administer site configuration'
+
+beautytips_manager.customTipsDelete:
+  path: '/admin/config/user-interface/beautytips/custom-tips/{id}/delete'
+  defaults:
+    _title: 'BeautyTips Custom-Tip Delete'
+    _form: '\Drupal\beautytips_manager\Form\CustomTipsDeleteForm'
+  requirements:
+    _permission: 'administer site configuration'
+
+beautytips_manager.customTipsAdd:
+  path: '/admin/config/user-interface/beautytips/custom-tips/add'
+  defaults:
+    _title: 'BeautyTips Custom-Tip Add'
+    _form: '\Drupal\beautytips_manager\Form\CustomTipsEditForm'
+  requirements:
+    _permission: 'administer site configuration'
+
+beautytips_manager.customStyles:
+  path: '/admin/config/user-interface/beautytips/custom-styles'
+  defaults:
+    _title: 'BeautyTips Custom Styles'
+    _content: '\Drupal\beautytips_manager\Controller\BeautytipsManagerController::customStylesOverview'
+  requirements:
+    _permission: 'administer site configuration'
+
+beautytips_manager.customStylesEdit:
+  path: '/admin/config/user-interface/beautytips/custom-styles/{id}/edit'
+  defaults:
+    _title: 'BeautyTips Custom Style Edit'
+    _form: '\Drupal\beautytips_manager\Form\CustomStylesEditForm'
+  requirements:
+    _permission: 'administer site configuration'
+
+beautytips_manager.customStylesDelete:
+  path: '/admin/config/user-interface/beautytips/custom-styles/{id}/delete'
+  defaults:
+    _title: 'BeautyTips Custom Style Delete'
+    _form: '\Drupal\beautytips_manager\Form\CustomStylesDeleteForm'
+  requirements:
+    _permission: 'administer site configuration'
+
+beautytips_manager.customStylesAdd:
+  path: '/admin/config/user-interface/beautytips/custom-styles/add'
+  defaults:
+    _title: 'BeautyTips Custom Style Add'
+    _form: '\Drupal\beautytips_manager\Form\CustomStylesEditForm'
+  requirements:
+    _permission: 'administer site configuration'
diff --git a/beautytips_manager/lib/Drupal/beautytips_manager/Controller/BeautytipsManagerController.php b/beautytips_manager/lib/Drupal/beautytips_manager/Controller/BeautytipsManagerController.php
new file mode 100644
index 0000000..d674702
--- /dev/null
+++ b/beautytips_manager/lib/Drupal/beautytips_manager/Controller/BeautytipsManagerController.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\node\beautytips_manager\BeautytipsManagerController.
+ */
+
+namespace Drupal\beautytips_manager\Controller;
+
+use Drupal\Core\Controller\ControllerBase;
+
+class BeautytipsManagerController extends ControllerBase {
+
+  /**
+   * Custom tips administration.
+   */
+  public function customTipsOverview() {
+    $rows = array();
+    $empty = '';
+    $header = array(t('Element'), t('Style'), t('Status'), t('Visibility'), t('Pages'), t('operations') ,'');
+    $tips = beautytips_manager_get_custom_tips();
+    if (count($tips)) {
+      $visibility = array(t('Show on every page except the listed pages.'), t('Show on only the listed pages.'));
+      foreach ($tips as $tip) {
+        $tip->pages = check_plain($tip->pages);
+        $pages = ($tip->pages != substr($tip->pages, 0, 40)) ? substr($tip->pages, 0, 40) . '...' : substr($tip->pages, 0, 40);
+        $rows[$tip->id]['element'] = check_plain($tip->element);
+        $rows[$tip->id]['style'] = $tip->style;
+        $rows[$tip->id]['enabled'] = $tip->enabled ? t('Enabled') : t('Disabled');
+        $rows[$tip->id]['visibility'] = $visibility[$tip->visibility];
+        $rows[$tip->id]['pages'] = $pages;
+        $rows[$tip->id]['edit'] = l(t('edit'), "admin/config/user-interface/beautytips/custom-tips/$tip->id/edit");
+        $rows[$tip->id]['delete'] = l(t('delete'), "admin/config/user-interface/beautytips/custom-tips/$tip->id/delete");
+      }
+    }
+    else {
+      $empty = t('There are no custom beautytips yet.');
+    }
+    return theme('table', array('header' => $header, 'rows' => $rows)) . $empty;
+  }
+
+  /**
+   * Custom styles administration.
+   */
+  public function customStylesOverview() {
+    $rows = array();
+    $empty = '';
+    $header = array(t('Name'), t('operations'), '');
+    $styles = beautytips_manager_get_custom_styles();
+    if (count($styles)) {
+      $visibility = array(t('Show on every page except the listed pages.'), t('Show on only the listed pages.'));
+      foreach ($styles as $style) {
+        $name = check_plain($style->name);
+        unset($style->name);
+        $rows[$style->id]['name'] = '<span class="bt-style-' . $name . '">' . $name . '</span>';
+        $rows[$style->id]['edit'] = l(t('edit'), "admin/config/user-interface/beautytips/custom-styles/$style->id/edit");
+        if ($name != variable_get('beautytips_default_style', 'plain')) {
+          $rows[$style->id]['delete'] = l(t('delete'), "admin/config/user-interface/beautytips/custom-styles/$style->id/delete");
+        }
+        else {
+          $rows[$style->id]['delete'] = t('Default style');
+        }
+
+        $options = array(
+          'cssSelect' => 'td .bt-style-' . $name,
+          'text' => t('<h2>Default Text</h2><p>Nam magna enim, accumsan eu, blandit sed, blandit a, eros.  Nam ante nulla, interdum vel, tristique ac, condimentum non, tellus.</p><p>Nulla facilisi. Nam magna enim, accumsan eu, blandit sed, blandit a, eros.</p>'),
+          'trigger' => 'hover',
+          'style' => $name,
+          //'shrinkToFit' => TRUE,
+        );
+        beautytips_add_beautytips(array($name => $options));
+      }
+    }
+    else {
+      $empty = t('There are no custom beautytip styles yet.');
+    }
+    return theme('table', array('header' => $header, 'rows' => $rows)) . $empty;
+  }
+}
diff --git a/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomStylesDeleteForm.php b/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomStylesDeleteForm.php
new file mode 100644
index 0000000..97e0359
--- /dev/null
+++ b/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomStylesDeleteForm.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\beautytips_manager\Form\CustomStylesDeleteForm.
+ */
+namespace Drupal\beautytips_manager\Form;
+
+use Drupal\Core\Form\ConfirmFormBase;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+
+class CustomStylesDeleteForm extends ConfirmFormBase {
+  protected $style;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'beautytips_manager_delete_style_confirm_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getQuestion() {
+    return t('Are you sure you want to the beautytip stlye %style?', array('%style' => $this->style->name));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCancelRoute() {
+    return array('route_name' => 'beautytips_manager.customStyles');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state, $id = NULL) {
+    $this->style = beautytips_manager_get_custom_style($id);
+    if (empty($this->style)) {
+      throw new NotFoundHttpException();
+    }
+
+    if ($this->style->name == \Drupal::config('beautytips.basic')->get('beautytips_default_style')) {
+      return array(
+        'warning' => array(
+          '#type' => 'markup',
+          '#markup' => t('You cannot delete this style because is set as the default style.  You may change this !link.', array('!link' => l(t('here'), 'admin/config/user-interface/beautytips'))),
+        ),
+      );
+    }
+    else {
+      return parent::buildForm($form, $form_state);
+    }
+
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    beautytips_manager_delete_custom_style($this->style->id);
+    $form_state['redirect'] = 'admin/config/user-interface/beautytips/custom-styles';
+  }
+}
diff --git a/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomStylesEditForm.php b/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomStylesEditForm.php
new file mode 100644
index 0000000..64ea593
--- /dev/null
+++ b/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomStylesEditForm.php
@@ -0,0 +1,171 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\beautytips_manager\Form\CustomStylesEditForm.
+ */
+namespace Drupal\beautytips_manager\Form;
+use Drupal\Core\Form\FormInterface;
+
+class CustomStylesEditForm implements FormInterface {
+  protected $style;
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'beautytips_manager_custom_styles_form';
+  }
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state, $id = NULL) {
+    if (!is_null($id)) {
+      $this->style = beautytips_manager_get_custom_style($id);
+      $style_map = beautytips_manager_style_mapping();
+      $style_options = $style_map['options'];
+      $css_style_options = $style_map['css_options'];
+    }
+
+    $form = array();
+    $form['name'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Style Name'),
+      '#description' => t('It must contain only alphanumeric characters and underscores.'),
+      '#default_value' => isset($this->style->name) ? $this->style->name : '',
+    );
+    // TODO: Add this into mapping
+    $style_info = array(
+      'fill' => t('background color (string - html color)'),
+      'strokeWidth' => t('width of border (integer)'),
+      'strokeStyle' => t('color of border (string - html color)'),
+      'width' => t('width of popup (number with px or em)'),
+      'padding' => t('space between content and border (number with px em)'),
+      'cornerRadius' => t('Controls roundness of corners (integer)'),
+      'spikeGirth' => t('thickness of spike (integer)'),
+      'spikeLength' => t('length of spike (integer)'),
+      'shadowBlur' => t('Size of popup shadow (integer)'),
+      'shadowColor' => t('Color of popup shadow (string - html color)'),
+    );
+    $form['custom_styles'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Custom Style Options'),
+      '#description' => t('<div id="beautytips-popup-changes"><div id="beauty-click-text"><p></p></div></div>'),
+      '#attributes' => array('class' => array('bt-custom-styles')),
+      '#tree' => TRUE,
+    );
+    foreach ($style_info as $option => $description) {
+      $form['custom_styles'][$option] = array(
+        '#title' => $option,
+        '#description' => $description,
+        '#type' => 'textfield',
+        '#default_value' => (isset($style_options) && isset($this->style->{$style_options[$option]}) && !is_null($this->style->{$style_options[$option]})) ? $this->style->{$style_options[$option]} : '',
+      );
+    }
+    $form['custom_styles']['shadow'] = array(
+      '#title' => 'shadow',
+      '#description' => t('Whether or not the popup has a shadow'),
+      '#type' => 'radios',
+      '#options' => array('default' => t('Default'), 'shadow' => t('Shadow On'), 'no_shadow' => t('Shadow Off')),
+      '#attributes' => array('class' => array('beautytips-options-shadow')),
+      '#default_value' => isset($this->style->shadow) ? $this->style->shadow : 'default',
+    );
+    $form['custom_styles']['cssClass'] = array(
+      '#title' => 'cssClass',
+      '#description' => t('The class that will be applied to the box wrapper div (of the TIP)'),
+      '#type' => 'textfield',
+      '#default_value' => isset($this->style->css_class) ? $this->style->css_class : '',
+    );
+    $css_style_info = array('color', 'fontFamily', 'fontWeight', 'fontSize');
+    $form['custom_styles']['css-styles'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Font Styling'),
+      '#description' => t('Enter css options for changing the font style'),
+      '#attributes' => array('class' => array('beautytips-css-styling')),
+      '#collapsible' => FALSE,
+    );
+    foreach ($css_style_info as $option) {
+      $form['custom_styles']['css-styles'][$option] = array(
+        '#title' => $option,
+        '#type' => 'textfield',
+        '#default_value' => (isset($css_style_options) && isset($this->style->{$css_style_options[$option]}) && !is_null($this->style->{$css_style_options[$option]})) ? $this->style->{$css_style_options[$option]} : '',
+      );
+    }
+
+    $path = drupal_get_path('module', 'beautytips');
+    // TODO: This could be in a library
+    drupal_add_js($path . '/other_libs/colorpicker/js/colorpicker.js');
+    drupal_add_css($path . '/other_libs/colorpicker/css/colorpicker.css');
+    beautytips_add_beautytips();
+    drupal_add_js($path . '/js/bt_custom_styles.js');
+    $form['save'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save'),
+    );
+    return $form;
+  }
+
+  public function validateForm(array &$form, array &$form_state) {
+    $values = $form_state['values'];
+    if (empty($values['name'])) {
+      \Drupal::formBuilder()->setErrorByName('name', $form_state, t('You must name this custom style.'));
+    }
+    if (preg_match('/[^a-zA-Z0-9_]/', $values['name'])) {
+      \Drupal::formBuilder()->setErrorByName('name', $form_state, t('Style name must be alphanumeric or underscores only.'));
+    }
+
+    $integer_fields = array('strokeWidth' => 'style', 'cornerRadius' => 'style', 'spikeGirth' => 'style', 'spikeLength' => 'style', 'shadowBlur' => 'style');
+    $pixel_fields = array('width' => 'style', 'padding' =>'style', 'fontSize' => 'css');
+
+    // Validate fields that expect a number
+    foreach ($integer_fields as $name => $type) {
+      $value = $type == 'css' ? $values['custom_styles']['css-styles'][$name] : $values['custom_styles'][$name];
+      if ($value) {
+        if (!ctype_digit($value)) {
+          $error_element = $type == 'css' ? 'custom_styles][css-styles][' . $name : 'custom_styles][' . $name;
+          \Drupal::formBuilder()->setErrorByName($error_element, $form_state, t('You need to enter an integer value for <em>@name</em>', array('@name' => $name)));
+        }
+      }
+    }
+
+    // Validate fields that expect a number and unit
+    foreach ($pixel_fields as $name => $type) {
+      $value = $type == 'css' ? $values['custom_styles']['css-styles'][$name] : $values['custom_styles'][$name];
+      if ($value) {
+        $unit = substr($value, -2, 2);
+        $value = str_replace(array('px', ' ', 'em'), '', $value);
+        if (!is_numeric($value) || (!$value && $value != 0) || !in_array($unit, array('px', 'em'))) {
+          $error_element = $type == 'css' ? 'custom_styles][css-styles][' . $name : 'custom_styles][' . $name;
+          \Drupal::formBuilder()->setErrorByName($error_element, $form_state, t('You need to enter a numeric value for <em>@name</em>, followed by <em>px</em> or <em>em</em>', array('@name' => $name)));
+        }
+      }
+    }
+  }
+
+  public function submitForm(array &$form, array &$form_state) {
+    $style = new \stdClass;
+    $style->name = $form_state['values']['name'];
+    $mapping = beautytips_manager_style_mapping();
+    foreach ($form_state['values']['custom_styles'] as $custom_style => $value) {
+      if (!is_array($value)) {
+        $field = $custom_style;
+        if (isset($mapping['options'][$custom_style])) {
+          $style->{$mapping['options'][$custom_style]} = $value;
+        }
+      }
+      else {
+        if ($custom_style == 'css-styles') {
+          foreach ($value as $css_style => $css_value) {
+            if (isset($mapping['css_options'][$css_style])) {
+              $style->{$mapping['css_options'][$css_style]} = $css_value;
+            }
+          }
+        }
+      }
+    }
+    if (!is_null($this->style)) {
+      $style->id = $this->style->id;
+    }
+    beautytips_manager_save_custom_style($style);
+    cache()->deleteTags(array('beautytips' => TRUE));
+    $form_state['redirect'] = 'admin/config/user-interface/beautytips/custom-styles';
+  }
+}
diff --git a/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomTipsAddForm.php b/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomTipsAddForm.php
new file mode 100644
index 0000000..91f18f0
--- /dev/null
+++ b/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomTipsAddForm.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\beautytips_manager\Form\CustomTipsDeleteForm.
+ */
+namespace Drupal\beautytips_manager\Form;
+use Drupal\Core\Form\ConfirmFormBase;
+
+class CustomTipsDeleteForm extends ConfirmFormBase {
+  protected $tip;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'beautytips_manager_delete_tip_confirm_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getQuestion() {
+    return t('Are you sure you want to the beautytip applied to element %element?', array('%element' => $this->tip->element));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCancelRoute() {
+    return array('route_name' => 'beautytips_manager.customTips');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state, $id = NULL) {
+    $this->tip = beautytips_manager_get_custom_tip($id);
+    dsm($this);
+
+    $form['id'] = array(
+      '#type' => 'value',
+      '#value' => $id,
+    );
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    beautytips_manager_delete_custom_tip($form_state['values']['id']);
+    cache()->deleteTags(array('beautytips' => TRUE));
+    $form_state['redirect'] = 'admin/config/user-interface/beautytips/custom-tips';
+  }
+}
diff --git a/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomTipsDeleteForm.php b/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomTipsDeleteForm.php
new file mode 100644
index 0000000..ae32907
--- /dev/null
+++ b/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomTipsDeleteForm.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\beautytips_manager\Form\CustomTipsDeleteForm.
+ */
+namespace Drupal\beautytips_manager\Form;
+
+use Drupal\Core\Form\ConfirmFormBase;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+
+class CustomTipsDeleteForm extends ConfirmFormBase {
+  protected $tip;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'beautytips_manager_delete_tip_confirm_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getQuestion() {
+    return t('Are you sure you want to the beautytip applied to element %element?', array('%element' => $this->tip->element));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCancelRoute() {
+    return array('route_name' => 'beautytips_manager.customTips');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state, $id = NULL) {
+    $this->tip = beautytips_manager_get_custom_tip($id);
+
+    if (empty($this->tip)) {
+      throw new NotFoundHttpException();
+    }
+
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    beautytips_manager_delete_custom_tip($this->tip->id);
+    cache()->deleteTags(array('beautytips' => TRUE));
+    $form_state['redirect'] = 'admin/config/user-interface/beautytips/custom-tips';
+  }
+}
diff --git a/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomTipsEditForm.php b/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomTipsEditForm.php
new file mode 100644
index 0000000..b2f3dce
--- /dev/null
+++ b/beautytips_manager/lib/Drupal/beautytips_manager/Form/CustomTipsEditForm.php
@@ -0,0 +1,209 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\beautytips_manager\Form\CustomTipsEditForm.
+ */
+namespace Drupal\beautytips_manager\Form;
+use Drupal\Core\Form\FormInterface;
+
+class CustomTipsEditForm implements FormInterface {
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'beautytips_manager_custom_tips_form';
+  }
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state, $id = NULL) {
+    drupal_add_css(drupal_get_path('module', 'beautytips') . '/css/beautytips.css');
+    $tip = beautytips_manager_get_custom_tip($id);
+    if (!isset($tip->id)) {
+      $tip = NULL;
+    }
+
+    $form = array();
+    $form['tip'] = array(
+      '#type' => 'markup',
+      '#value' => '',
+      '#tree' => TRUE,
+    );
+    $form['tip']['id'] = array(
+      '#type' => 'value',
+      '#value' => is_object($tip) ? $tip->id : 0,
+    );
+    $form['tip']['element'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Element'),
+      '#required' => TRUE,
+      '#maxlength' => 255,
+      '#default_value' => is_object($tip) ? $tip->element : '',
+    );
+    $form['tip']['enabled'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Enabled'),
+      '#default_value' => is_object($tip) ? $tip->enabled : TRUE,
+    );
+    $content_options = array('attribute' => 'attribute', 'text' => 'text', 'ajax' => 'ajax');
+    $description = t('Content to display in the beautytip.  The data entered here depends on the Content Type.');
+    $types = array();
+    $types[0] = t('attribute - Enter the attribute of the element that should be displayed. (If empty, the title will be selected.)');
+    $types[0] .= '<br />' . t('ex. "alt"');
+    $types[1] = t('text - Enter the text that should be displayed with in the beautytip.');
+    $types[1] .= '<br />' . t('ex. "This is my beautytip!"');
+    $types[2] = t('ajax - This will grab the page from the "href" attribute and display that page.  Enter css selectors to narrow the down the content from that page.');
+    $types[2] .= '<br />' . t('ex. "#my-id .my-class"');
+    if (user_access('use Javascript for custom beautytip display')) {
+      $content_options['js'] = 'js';
+      $types[3] = 'js - Directly enter javascript to select the content.';
+      $types[3] .= '<br />' . t('ex. "$(this).next(\'.description\').html()"');
+    }
+    $form['tip']['content_type'] = array(
+      '#type' => 'radios',
+      '#title' => t('Type of Content'),
+      '#description' => t('This helps determine from where to pull the content to be displayed.'),
+      '#options' => $content_options,
+      '#default_value' => is_object($tip) ? $tip->content_type : 0,
+    );
+    $form['tip']['content'] = array(
+      '#type' => 'textarea',
+      '#title' => t('Content to Display'),
+      '#description' => theme('item_list', array('items' => $types)),
+      '#default_value' => is_object($tip) ? $tip->content : '',
+    );
+    $triggers = beautytips_manager_get_triggers();
+    $form['tip']['trigger_on'] = array(
+      '#type' => 'select',
+      '#title' => t('Trigger On'),
+      '#description' => t('Not all events are available for all elements. See jQuery <a href="@events">events documentation</a> for details.', array('@events' => 'http://docs.jquery.com/Events')),
+      '#options' => $triggers,
+      '#default_value' => is_object($tip) ? $tip->trigger_on : 0,
+      '#prefix' => '<div class="beautytips-triggers">',
+    );
+    $form['tip']['trigger_off'] = array(
+      '#type' => 'select',
+      '#title' => t('Trigger Off'),
+      '#options' => $triggers,
+      '#suffix' => '</div>',
+      '#default_value' => is_object($tip) ? $tip->trigger_off : 0,
+    );
+
+    $form['tip']['disable_link'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Disable Link Click'),
+      '#description' => t('If you have chosen ajax as the type of content, and you would like to prevent the link from working, then check this box.'),
+      '#default_value' => is_object($tip) ? $tip->disable_link : 0,
+    );
+
+    $styles = beautytips_get_styles();
+    foreach ($styles as $key => $style) {
+      $style_options[$key] = $key;
+    }
+    $form['tip']['style'] = array(
+      '#type' => 'select',
+      '#title' => t('Style'),
+      '#options' => $style_options,
+      '#default_value' => is_object($tip) ? $tip->style : 'default',
+    );
+    $form['tip']['shrink'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Shrink to Fit'),
+      '#description' => t('Shrink the beautytip to the size of the content. This can sometimes help with sizing problems and is good for tips with just one line.'),
+      '#default_value' => is_object($tip) ? $tip->shrink : FALSE,
+    );
+
+    $positions = is_object($tip) ? explode(',', $tip->positions) : array();
+    $form['tip']['positions'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Positions'),
+      '#description' => t("Optionally enter the order of positions in which you want the tip to appear.  It will use first in order with available space. The last value will be used if others don't have enough space. If no entries, then the tip will be placed in the area with the most space. Only enter an order for those you wish to use"),
+      '#tree' => TRUE,
+    );
+    $positions_list = array('top', 'bottom', 'left', 'right');
+    foreach ($positions_list as $position) {
+      $form['tip']['positions'][$position] = array(
+        '#type' => 'textfield',
+        '#title' => t($position),
+        '#default_value' => (array_search($position, $positions) !== FALSE) ? array_search($position, $positions) : '',
+        '#size' => 1,
+        '#maxlength' => 1,
+        '#prefix' => '<div class="beautytips-positions">',
+        '#suffix' => '</div>',
+      );
+    }
+
+    $form['tip']['animation_on'] = array(
+      '#type' => 'select',
+      '#title' => t('Animation (On)'),
+      '#options' => array('' => '<none>', 'fadeIn' => 'fadeIn'),
+      '#description' => t("These animations will be applied to the tip when it is turn on or off."),
+      '#default_value' => is_object($tip) ? $tip->animation_on : '',
+      '#prefix' => '<div class="beautytips-animations">',
+    );
+    $form['tip']['animation_off'] = array(
+      '#type' => 'select',
+      '#title' => t('Animation (Off)'),
+      '#options' => array('' => '<none>', 'fadeOut' => 'fadeOut', 'slideOut' => 'slideOut'),
+      '#default_value' => is_object($tip) ? $tip->animation_off : '',
+      '#suffix' => '</div>',
+    );
+
+    $options = array(t('Show on every page except the listed pages.'), t('Show on only the listed pages.'));
+    $description = t("Enter one page per line as Drupal paths. The '*' character is a wildcard. Example paths are %blog for the blog page and %blog-wildcard for every personal blog. %front is the front page.", array('%blog' => 'blog', '%blog-wildcard' => 'blog/*', '%front' => '<front>'));
+
+    $form['tip']['visibility'] = array(
+      '#type' => 'radios',
+      '#title' => t('Show beautytip on specific pages'),
+      '#options' => $options,
+      '#default_value' => is_object($tip) ? $tip->visibility : 0,
+      '#prefix' => '<div id="edit-tip-visibility-wrapper">',
+      '#suffix' => '</div>',
+    );
+    $form['tip']['pages'] = array(
+      '#type' => 'textarea',
+      '#title' => t('Pages'),
+      '#default_value' => is_object($tip) ? $tip->pages : '',
+      '#description' => $description,
+    );
+
+    $form['save'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save configuration'),
+    );
+    $form['delete'] = array(
+      '#type' => 'submit',
+      '#value' => t('Delete'),
+    );
+
+    return $form;
+  }
+
+  public function validateForm(array &$form, array &$form_state) {
+    $positions = $form_state['values']['tip']['positions'];
+    foreach ($positions as $position => $order) {
+      if ($order !== '' && !is_numeric($order)) {
+        \Drupal::formBuilder()->setErrorByName("tip][positions][$position", $form_state, t("You must enter a numeric value for position order (Or leave it blank)."));
+      }
+    }
+  }
+
+  public function submitForm(array &$form, array &$form_state) {
+    $tip = $form_state['values']['tip'];
+    $positions = array();
+    foreach ($tip['positions'] as $position => $order) {
+      if ($order !== '') {
+        while (isset($positions[$order])) {
+          $order++;
+        }
+        $positions[$order] = $position;
+      }
+    }
+    ksort($positions);
+    $tip['positions'] = (count($positions)) ? implode(',', $positions) : '';
+
+    beautytips_manager_save_custom_tip($tip);
+    cache()->deleteTags(array('beautytips' => TRUE));
+    $form_state['redirect'] = 'admin/config/user-interface/beautytips/custom-tips';
+  }
+}
diff --git a/beautytips_ui.info b/beautytips_ui.info
deleted file mode 100644
index 1d6fd3a..0000000
--- a/beautytips_ui.info
+++ /dev/null
@@ -1,7 +0,0 @@
-
-name = BeautyTips UI
-description = Adds settings menu and contributed beautytip popups
-core = 7.x
-package = User interface 
-files[] = beautytips_ui.module
-dependencies[] = beautytips
diff --git a/beautytips_ui.module b/beautytips_ui.module
deleted file mode 100644
index c400bf0..0000000
--- a/beautytips_ui.module
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-
-/**
- * @file
- * Adds includes to Beautytips settings page and provides some built in functionality.
- * TODO: hook_theme invoke - maybe
- * Invoked include hooks: admin_info, menu_change, theme_change, form_change, menu_items
- * ex.  beautytips_textinput_info
- */
-
-function beautytips_ui_admin_settings(&$form) {
-  $items = beautytips_ui_include_invoke('beautytips', 'admin_info', $args = array());
-  if (is_array($items)) {
-    foreach ($items as $form_item) {
-      if (count($form_item)) {
-        $keys = array_keys($form_item);
-        if (count($keys)) {
-          foreach ($keys as $menu_item) {
-            $form[$menu_item] = $form_item[$menu_item];
-          }
-        }
-      }
-    }
-  }
-}
-
-/**
- *  Clear menu cache and theme registry in case beautytips help tips turned on or off
- */
-function beautytips_ui_admin_submit($form, $form_state) {
-  module_invoke('menu', 'rebuild');
-  cache_clear_all('*', 'cache_menu', TRUE);
-  drupal_theme_rebuild();
-}
-
-/**
- * Implementation of hook_menu.
- */
-function beautytips_ui_menu() {
-  $items = array(); 
-
-  $menu_items = beautytips_ui_include_invoke('beautytips', 'menu_items', $args = array());
-  if (is_array($menu_items)) {
-    foreach ($menu_items as $menu_item) {
-      if (is_array($menu_item)) {
-        $path = key($menu_item);
-        $items[$path] = $menu_item[$path]; 
-      }
-    }
-  } 
-  return $items;
-}
-
-/**
- * Determine whether an include implements a hook, cf. module_hook.
- *
- * @param $tooltip
- *   The name of the tooltip file (without the .inc extension), such as 'youtube' or 'google'.
- * @param $hook
- *   The name of the hook (e.g. "thumbnail", "settings", etc.).
- * @return
- *   TRUE if the tooltip is loaded and the hook is implemented.
- */
-function beautytips_ui_include_hook($module, $tooltip, $hook) {
-  return function_exists($module .'_'. $tooltip .'_'. $hook);
-}
-
-/**
- * Invoke hook in a particular include.
- *
- * @param $module
- *  the helper module
- * @param $tooltip
- *   The name of the tooltip (without the .inc extension).
- * @param $hook
- *   The name of the hook (e.g. "menu_change", "form_change", etc.).
- * @param ...
- *   Arguments to pass to the hook implementation.
- * @return
- *   The return value of the hook implementation.
- */
-function beautytips_ui_include_invoke($module, $hook, $args) {
-  $includes = beautytips_ui_include_list();
-  foreach ($includes as $tooltip) {
-    $function = $module .'_'. $tooltip .'_'. $hook;
-    $params[] = beautytips_ui_include_hook($module, $tooltip, $hook) ? call_user_func_array($function, $args) : NULL;
-  }
-  return $params;
-}
-
-/**
- * Maintains a list of all loaded include files.
- *
- * @param $file
- *   -------------------------
- * @return
- *   An array of all loaded includes. (w/o appended .inc)
- */
-function beautytips_ui_include_list() {
-  $files = array(
-    'drupal_help.inc' => 'drupal_help',
-    'textinput.inc' => 'textinput',
-  );
-  foreach ($files as $file => $name) {
-    module_load_include('inc', 'beautytips', 'includes/'. $name);
-  }
-
-  return $files;
-}
-
-/**
- * Implementation of hook_form_alter.
- * Adds beautytips for textareas and textfields
- */
-function beautytips_ui_form_alter(&$form, $form_state, $form_id) {
-  beautytips_ui_include_invoke('beautytips', 'form_change', 
-    array(
-      'form' => &$form,
-      'form_state' => $form_state,
-      'form_id' => $form_id,
-    )
-  );   
-}
-
-/**
- * Implementation of hook_menu_alter().
- */
-function beautytips_ui_menu_alter(&$items) {
-  beautytips_ui_include_invoke('beautytips', 'menu_change', array('items' => &$items));
-}
-
-/**
- * Implementation of hook_theme_registry_alter().
- */
-function beautytips_ui_theme_registry_alter(&$theme_registry) {
-  beautytips_ui_include_invoke('beautytips', 'theme_change', array('theme_registry' => &$theme_registry));
-}
diff --git a/beautytips_ui/beautytips_ui.info b/beautytips_ui/beautytips_ui.info
new file mode 100644
index 0000000..1d6fd3a
--- /dev/null
+++ b/beautytips_ui/beautytips_ui.info
@@ -0,0 +1,7 @@
+
+name = BeautyTips UI
+description = Adds settings menu and contributed beautytip popups
+core = 7.x
+package = User interface 
+files[] = beautytips_ui.module
+dependencies[] = beautytips
diff --git a/beautytips_ui/beautytips_ui.module b/beautytips_ui/beautytips_ui.module
new file mode 100644
index 0000000..c400bf0
--- /dev/null
+++ b/beautytips_ui/beautytips_ui.module
@@ -0,0 +1,137 @@
+<?php
+
+/**
+ * @file
+ * Adds includes to Beautytips settings page and provides some built in functionality.
+ * TODO: hook_theme invoke - maybe
+ * Invoked include hooks: admin_info, menu_change, theme_change, form_change, menu_items
+ * ex.  beautytips_textinput_info
+ */
+
+function beautytips_ui_admin_settings(&$form) {
+  $items = beautytips_ui_include_invoke('beautytips', 'admin_info', $args = array());
+  if (is_array($items)) {
+    foreach ($items as $form_item) {
+      if (count($form_item)) {
+        $keys = array_keys($form_item);
+        if (count($keys)) {
+          foreach ($keys as $menu_item) {
+            $form[$menu_item] = $form_item[$menu_item];
+          }
+        }
+      }
+    }
+  }
+}
+
+/**
+ *  Clear menu cache and theme registry in case beautytips help tips turned on or off
+ */
+function beautytips_ui_admin_submit($form, $form_state) {
+  module_invoke('menu', 'rebuild');
+  cache_clear_all('*', 'cache_menu', TRUE);
+  drupal_theme_rebuild();
+}
+
+/**
+ * Implementation of hook_menu.
+ */
+function beautytips_ui_menu() {
+  $items = array(); 
+
+  $menu_items = beautytips_ui_include_invoke('beautytips', 'menu_items', $args = array());
+  if (is_array($menu_items)) {
+    foreach ($menu_items as $menu_item) {
+      if (is_array($menu_item)) {
+        $path = key($menu_item);
+        $items[$path] = $menu_item[$path]; 
+      }
+    }
+  } 
+  return $items;
+}
+
+/**
+ * Determine whether an include implements a hook, cf. module_hook.
+ *
+ * @param $tooltip
+ *   The name of the tooltip file (without the .inc extension), such as 'youtube' or 'google'.
+ * @param $hook
+ *   The name of the hook (e.g. "thumbnail", "settings", etc.).
+ * @return
+ *   TRUE if the tooltip is loaded and the hook is implemented.
+ */
+function beautytips_ui_include_hook($module, $tooltip, $hook) {
+  return function_exists($module .'_'. $tooltip .'_'. $hook);
+}
+
+/**
+ * Invoke hook in a particular include.
+ *
+ * @param $module
+ *  the helper module
+ * @param $tooltip
+ *   The name of the tooltip (without the .inc extension).
+ * @param $hook
+ *   The name of the hook (e.g. "menu_change", "form_change", etc.).
+ * @param ...
+ *   Arguments to pass to the hook implementation.
+ * @return
+ *   The return value of the hook implementation.
+ */
+function beautytips_ui_include_invoke($module, $hook, $args) {
+  $includes = beautytips_ui_include_list();
+  foreach ($includes as $tooltip) {
+    $function = $module .'_'. $tooltip .'_'. $hook;
+    $params[] = beautytips_ui_include_hook($module, $tooltip, $hook) ? call_user_func_array($function, $args) : NULL;
+  }
+  return $params;
+}
+
+/**
+ * Maintains a list of all loaded include files.
+ *
+ * @param $file
+ *   -------------------------
+ * @return
+ *   An array of all loaded includes. (w/o appended .inc)
+ */
+function beautytips_ui_include_list() {
+  $files = array(
+    'drupal_help.inc' => 'drupal_help',
+    'textinput.inc' => 'textinput',
+  );
+  foreach ($files as $file => $name) {
+    module_load_include('inc', 'beautytips', 'includes/'. $name);
+  }
+
+  return $files;
+}
+
+/**
+ * Implementation of hook_form_alter.
+ * Adds beautytips for textareas and textfields
+ */
+function beautytips_ui_form_alter(&$form, $form_state, $form_id) {
+  beautytips_ui_include_invoke('beautytips', 'form_change', 
+    array(
+      'form' => &$form,
+      'form_state' => $form_state,
+      'form_id' => $form_id,
+    )
+  );   
+}
+
+/**
+ * Implementation of hook_menu_alter().
+ */
+function beautytips_ui_menu_alter(&$items) {
+  beautytips_ui_include_invoke('beautytips', 'menu_change', array('items' => &$items));
+}
+
+/**
+ * Implementation of hook_theme_registry_alter().
+ */
+function beautytips_ui_theme_registry_alter(&$theme_registry) {
+  beautytips_ui_include_invoke('beautytips', 'theme_change', array('theme_registry' => &$theme_registry));
+}
diff --git a/config/beautytips.basic.yml b/config/beautytips.basic.yml
new file mode 100755
index 0000000..b475a70
--- /dev/null
+++ b/config/beautytips.basic.yml
@@ -0,0 +1,7 @@
+beautytips_added_selectors_array: []
+beautytips_always_add: 0
+cssStyles: []
+beautytips_ltr: 0
+beautytips_default_style: 'plain'
+beautytips_custom_style: NULL
+beautytips_defaults: []
diff --git a/css/beautytips-ltr.css b/css/beautytips-ltr.css
old mode 100644
new mode 100755
diff --git a/css/beautytips.css b/css/beautytips.css
old mode 100644
new mode 100755
diff --git a/images/beauty-bubble.png b/images/beauty-bubble.png
old mode 100644
new mode 100755
diff --git a/images/blue-bubble.png b/images/blue-bubble.png
old mode 100644
new mode 100755
diff --git a/images/text-bubble.png b/images/text-bubble.png
old mode 100644
new mode 100755
diff --git a/includes/drupal_help.inc b/includes/drupal_help.inc
old mode 100644
new mode 100755
diff --git a/includes/textinput.inc b/includes/textinput.inc
old mode 100644
new mode 100755
diff --git a/js/beautytips.js b/js/beautytips.js
old mode 100644
new mode 100755
index 0972d9d..d073653
--- a/js/beautytips.js
+++ b/js/beautytips.js
@@ -2,16 +2,16 @@
 /**
  * Defines the default beautytip and adds them to the content on the page
  */
-(function ($) {
+(function ($, Drupal, drupalSettings) {
   Drupal.behaviors.beautytips = {
     attach: function(context, settings) {
       // Fix for drupal attach behaviors in case the plugin is not attached.
-      if (typeof(jQuery.bt) == 'undefined' && jQuery.bt == null){
+      if (typeof($.bt) == 'undefined' && $.bt == null){
         return;
       }
-      jQuery.bt.options.closeWhenOthersOpen = true;
-      var beautytips = Drupal.settings.beautytips;
-      var styles = Drupal.settings.beautytipStyles;
+      $.bt.options.closeWhenOthersOpen = true;
+      var beautytips = drupalSettings.beautytips;
+      var styles = drupalSettings.beautytipStyles;
 
       // Add the tooltips to the page
       for (var key in beautytips) {
@@ -120,7 +120,7 @@
       case 'none':
         break;
       case 'fadeOut':
-        btOptions['hideTip'] = function(box, callback) { 
+        btOptions['hideTip'] = function(box, callback) {
           $(box).animate({opacity: 0}, 500, callback);
         };
         break;
@@ -133,4 +133,4 @@
     }
     return btOptions;
   }
-})(jQuery);
+})(jQuery, Drupal, drupalSettings);
diff --git a/js/beautytips.min.js b/js/beautytips.min.js
old mode 100644
new mode 100755
diff --git a/js/bt_admin_page.js b/js/bt_admin_page.js
old mode 100644
new mode 100755
index 6306bbe..fd4648b
--- a/js/bt_admin_page.js
+++ b/js/bt_admin_page.js
@@ -2,105 +2,107 @@
 /**
  * jQuery to show on beautytips admin settings page
  */
-Drupal.behaviors.beautytipsAdmin = {
-  attach: function(context, settings) {
-    if (!jQuery("#edit-beautytips-always-add").attr("checked")) {
-      // Disable input and hide its description.
-      jQuery("#edit-beautytips-added-selectors").attr("disabled","disabled");
-      jQuery("#edit-beautytips-added-selectors-wrapper").hide(0);
-    }
-    jQuery("#edit-beautytips-always-add").bind("click", function() {
-      if (jQuery("#edit-beautytips-always-add").attr("checked")) {
-        // Auto-alias unchecked; enable input.
-        jQuery("#edit-beautytips-added-selectors").removeAttr("disabled");
-        jQuery("#edit-beautytips-added-selectors-wrapper").slideDown('fast');
-      }
-      else {
-        // Auto-alias checked; disable input.
-        jQuery("#edit-beautytips-added-selectors").attr("disabled","disabled");
-        jQuery("#edit-beautytips-added-selectors-wrapper").slideUp('fast');
+(function ($, Drupal, drupalSettings) {
+  Drupal.behaviors.beautytipsAdmin = {
+    attach: function(context, settings) {
+      if (!$('#edit-beautytips-always-add').prop('checked')) {
+        // Disable input and hide its description.
+        $('#edit-beautytips-added-selectors-array').prop('disabled', 'disabled');
+        $('.form-item-beautytips-added-selectors-array').hide(0);
       }
-    });
+      $('#edit-beautytips-always-add').bind('click', function() {
+        if ($('#edit-beautytips-always-add').prop('checked')) {
+          // Auto-alias unchecked; enable input.
+          $('#edit-beautytips-added-selectors-array').removeAttr('disabled');
+          $('.form-item-beautytips-added-selectors-array').slideDown('fast');
+        }
+        else {
+          // Auto-alias checked; disable input.
+          $('#edit-beautytips-added-selectors-array').prop('disabled', 'disabled');
+          $('.form-item-beautytips-added-selectors-array').slideUp('fast');
+        }
+      });
 
-    // Add the color picker to certain textfields
-    jQuery('#edit-bt-options-box-fill, #edit-bt-options-box-strokestyle, #edit-bt-options-box-shadowcolor, #edit-bt-options-css-color').ColorPicker({
-      onSubmit: function(hsb, hex, rgb, el) {
-        jQuery(el).val('#' + hex);
-        jQuery(el).ColorPickerHide();
-      },
-      onBeforeShow: function () {
-        value = this.value.replace("#", "");
-        jQuery(this).ColorPickerSetColor(value);
-      }
-    })
-    .bind('keyup', function(){
-      jQuery(this).ColorPickerSetColor(this.value);
-    });
+      // Add the color picker to certain textfields
+      $('#edit-bt-options-box-fill, #edit-bt-options-box-strokestyle, #edit-bt-options-box-shadowcolor, #edit-bt-options-css-color').ColorPicker({
+        onSubmit: function(hsb, hex, rgb, el) {
+          $(el).val('#' + hex);
+          $(el).ColorPickerHide();
+        },
+        onBeforeShow: function () {
+          value = this.value.replace("#", "");
+          $(this).ColorPickerSetColor(value);
+        }
+      })
+      .bind('keyup', function(){
+        $(this).ColorPickerSetColor(this.value);
+      });
 
 
-    var popupText = "Sed justo nibh, ultrices ut gravida et, laoreet et elit. Nullam consequat lacus et dui dignissim venenatis. Curabitur quis urna eget mi interdum viverra quis eu enim. Ut sit amet nunc augue. Morbi ferm entum ultricies velit sed aliquam. Etiam dui tortor, auctor sed tempus ac, auctor sed sapien.";
-    themeSettings = beautytipsGetThemeSettings();
-    currentTheme = jQuery("input[name='beautytips_default_style']:checked").val(); 
-    jQuery("#beauty-default-styles input").click(function() {
-      currentTheme = jQuery("input[name='beautytips_default_style']:checked").val();
-    });
+      var popupText = "Sed justo nibh, ultrices ut gravida et, laoreet et elit. Nullam consequat lacus et dui dignissim venenatis. Curabitur quis urna eget mi interdum viverra quis eu enim. Ut sit amet nunc augue. Morbi ferm entum ultricies velit sed aliquam. Etiam dui tortor, auctor sed tempus ac, auctor sed sapien.";
+      themeSettings = beautytipsGetThemeSettings();
+      currentTheme = $("input[name='beautytips_default_style']:checked").val();
+      $("#beauty-default-styles input").click(function() {
+        currentTheme = $("input[name='beautytips_default_style']:checked").val();
+      });
 
-    jQuery("#beautytips-popup-changes").click( function() {
-      options = beautytipsSetupDefaultOptions(themeSettings[currentTheme]); 
-      // General options
-      jQuery("#beautytips-site-wide-popup").next('fieldset').find('.fieldset-wrapper').children('.form-item:not(.beautytips-css-styling)').each( function() {
-        var name = jQuery(this).find('input').attr('name'); 
-        var optionName = name.replace("bt-options-box-", "");
-        var newValue = jQuery(this).find('input').val();
-        if (optionName == 'shadow') {
-          newValue = jQuery(".beautytips-options-shadow input[@name='bt-options-box-shadow']:checked").val();
-          newValue = newValue == 'default' ? null : (newValue == 'shadow' ? true : false);
-        }
-        if (newValue || newValue === false) {
-          if (optionName == 'cornerRadius') {
-            newValue = Number(newValue);
+      $("#beautytips-popup-changes").click( function() {
+        options = beautytipsSetupDefaultOptions(themeSettings[currentTheme]);
+        // General options
+        $("#beautytips-site-wide-popup").next('details').find('.details-wrapper').children('.form-item:not(.beautytips-css-styling)').each( function() {
+          var name = $(this).find('input').attr('name');
+          var optionName = name.replace("bt-options-box-", "");
+          var newValue = $(this).find('input').val();
+          if (optionName == 'shadow') {
+            newValue = $(".beautytips-options-shadow input[name='bt-options-box-shadow']:checked").val();
+            newValue = newValue == 'default' ? null : (newValue == 'shadow' ? true : false);
           }
-          options[optionName] = newValue;
-        }
-      });
-      // css options
-      jQuery(".beautytips-css-styling").children('.form-item').each( function() {
-        var newValue = jQuery(this).find('input').val();
-        var name = jQuery(this).find('input').attr('name'); 
-        var optionName = name.replace("bt-options-css-", "");
-        if (!options['cssStyles']) {
-          options['cssStyles'] = new Array();
-        }
-        if (newValue || newValue === false) {
-          options['cssStyles'][optionName] = newValue;
-        }
+          if (newValue || newValue === false) {
+            if (optionName == 'cornerRadius') {
+              newValue = Number(newValue);
+            }
+            options[optionName] = newValue;
+          }
+        });
+        // css options
+        $('.beautytips-css-styling .form-item').each( function() {
+          var newValue = $(this).find('input').val();
+          var name = $(this).find('input').attr('name');
+          var optionName = name.replace("bt-options-css-", "");
+          if (!options['cssStyles']) {
+            options['cssStyles'] = new Object();
+          }
+          if (newValue || newValue === false) {
+            options['cssStyles'][optionName] = newValue;
+          }
+        });
+        $(this).bt(popupText, options);
       });
-      jQuery(this).bt(popupText, options);
-    });
+    }
   }
-}
 
-function beautytipsSetupDefaultOptions(themeSettings) {
-  var options = new Array();
+  function beautytipsSetupDefaultOptions(themeSettings) {
+    var options = new Array();
 
-  for (var key in themeSettings) {
-    if (key == 'cssStyles') {
-      options['cssStyles'] = new Array();
-      for (var option in themeSettings['cssStyles']) {
-        options['cssStyles'][option] = themeSettings['cssStyles'][option];
+    for (var key in themeSettings) {
+      if (key == 'cssStyles') {
+        options['cssStyles'] = new Array();
+        for (var option in themeSettings['cssStyles']) {
+          options['cssStyles'][option] = themeSettings['cssStyles'][option];
+        }
+      }
+      else {
+        options[key] = themeSettings[key];
       }
     }
-    else {
-      options[key] = themeSettings[key];
-    }
-  }
-  options['positions'] = 'right';
-  options['trigger'] = ['dblclick', 'click'];
+    options['positions'] = 'right';
+    options['trigger'] = ['dblclick', 'click'];
 
-  return options;
-}
+    return options;
+  }
 
-function beautytipsGetThemeSettings() {
-  themeSettings = Drupal.settings.beautytips; 
-  return themeSettings;
-}
+  function beautytipsGetThemeSettings() {
+    themeSettings = drupalSettings.beautytips;
+    return themeSettings;
+  }
+})(jQuery, Drupal, drupalSettings);
diff --git a/js/bt_custom_styles.js b/js/bt_custom_styles.js
index d659fa5..2bb5c25 100755
--- a/js/bt_custom_styles.js
+++ b/js/bt_custom_styles.js
@@ -2,18 +2,18 @@
 /**
  * jQuery for viewing changes to custom beautytips style.
  */
-(function ($) {
+(function ($, Drupal, drupalSettings) {
   Drupal.behaviors.beautytipsCustomStyles = {
     attach: function(context, settings) {
       var btPopup = $("#beautytips-popup-changes");
       var popupText = "Sed justo nibh, ultrices ut gravida et, laoreet et elit. Nullam consequat lacus et dui dignissim venenatis. Curabitur quis urna eget mi interdum viverra quis eu enim. Ut sit amet nunc augue. Morbi ferm entum ultricies velit sed aliquam. Etiam dui tortor, auctor sed tempus ac, auctor sed sapien.";
-      var currentTheme = $("input[name='beautytips_default_style']:checked").val(); 
+      var currentTheme = $("input[name='beautytips_default_style']:checked").val();
       btPopup.bt(popupText, {trigger: 'none', clickAnywhereToClose: false, closeWhenOthersOpen: false, positions: 'bottom', cssClass: 'beautytips-fixed-beautytips'});
       btPopup.btOn();
 
-      
+
       // Add the color picker to certain textfields
-      $('#edit-custom-styles-fill, #edit-custom-styles-strokestyle, #edit-custom-styles-css-styles-color').ColorPicker({
+      $('#edit-custom-styles-fill, #edit-custom-styles-strokestyle, #edit-custom-styles-css-styles-color, #edit-custom-styles-shadowcolor').ColorPicker({
         onSubmit: function(hsb, hex, rgb, el) {
           $(el).val('#' + hex);
           $(el).ColorPickerHide();
@@ -27,17 +27,17 @@
         $(this).ColorPickerSetColor(this.value);
       });
 
-      var themeSettings = Drupal.settings.beautytips;
+      var themeSettings = drupalSettings.beautytips;
       $("#beauty-default-styles input").click(function() {
         currentTheme = $("input[name='beautytips_default_style']:checked").val();
       });
 
       function beautytipsStyleTip() {
-        btPopup.btOff(); 
-        options = beautytipsSetupDefaultOptions(themeSettings[currentTheme]); 
+        btPopup.btOff();
+        options = beautytipsSetupDefaultOptions(themeSettings[currentTheme]);
         // General options
         $(".bt-custom-styles .fieldset-wrapper").children('.form-item:not(.beautytips-css-styling)').each( function() {
-          var name = $(this).find('input').attr('name'); 
+          var name = $(this).find('input').attr('name');
           var optionName = name.replace("custom_styles[", "");
           optionName = optionName.replace("]", "");
           var newValue = $(this).find('input').val();
@@ -55,7 +55,7 @@
         // css options
         $(".beautytips-css-styling .fieldset-wrapper").children('.form-item').each( function() {
           var newValue = $(this).find('input').val();
-          var name = $(this).find('input').attr('name'); 
+          var name = $(this).find('input').attr('name');
           var optionName = name.replace("custom_styles[css-styles][", "");
           optionName = optionName.replace("]", "");
           if (!options['cssStyles']) {
@@ -67,7 +67,7 @@
         });
         options['cssClass'] = 'beautytips-fixed-beautytips';
         $("#beautytips-popup-changes").bt(popupText, options);
-        btPopup.btOn(); 
+        btPopup.btOn();
         $('.beautytips-fixed-beautytips').css('position', 'fixed');
       }
       beautytipsStyleTip();
@@ -105,5 +105,5 @@
 
     return options;
   }
-})(jQuery);
+})(jQuery, Drupal, drupalSettings);
 
diff --git a/js/jquery.bt.css b/js/jquery.bt.css
old mode 100644
new mode 100755
diff --git a/js/jquery.bt.js b/js/jquery.bt.js
old mode 100644
new mode 100755
index 23d6293..e30c50e
--- a/js/jquery.bt.js
+++ b/js/jquery.bt.js
@@ -5,9 +5,9 @@
  * @author Jeff Robbins - Lullabot - http://www.lullabot.com
  * @version 0.9.5 release candidate 1  (5/20/2009)
  */
- 
+
 jQuery.bt = {version: '0.9.5-rc1'};
- 
+
 /*
  * @type jQuery
  * @cat Plugins/bt
@@ -17,7 +17,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
  * http://www.opensource.org/licenses/mit-license.php
  * http://www.gnu.org/licenses/gpl.html
  *
- * Encourage development. If you use BeautyTips for anything cool 
+ * Encourage development. If you use BeautyTips for anything cool
  * or on a site that people have heard of, please drop me a note.
  * - jeff ^at lullabot > com
  *
@@ -25,7 +25,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
  *
  */
 
-;(function($) { 
+;(function($) {
   /**
    * @credit Inspired by Karl Swedberg's ClueTip
    *    (http://plugins.learningjquery.com/cluetip/), which in turn was inspired
@@ -73,10 +73,10 @@ jQuery.bt = {version: '0.9.5-rc1'};
    *
    * For more/better documentation and lots of examples, visit the demo page included with the distribution
    *
-   */ 
-  
+   */
+
   jQuery.fn.bt = function(content, options) {
-  
+
     if (typeof content != 'string') {
       var contentSelect = true;
       options = content;
@@ -85,36 +85,36 @@ jQuery.bt = {version: '0.9.5-rc1'};
     else {
       var contentSelect = false;
     }
-    
+
     // if hoverIntent is installed, use that as default instead of hover
     if (jQuery.fn.hoverIntent && jQuery.bt.defaults.trigger == 'hover') {
       jQuery.bt.defaults.trigger = 'hoverIntent';
     }
-  
+
     return this.each(function(index) {
-  
+
       var opts = jQuery.extend(false, jQuery.bt.defaults, jQuery.bt.options, options);
-  
+
       // clean up the options
       opts.spikeLength = numb(opts.spikeLength);
       opts.spikeGirth = numb(opts.spikeGirth);
       opts.overlap = numb(opts.overlap);
-      
+
       var ajaxTimeout = false;
-      
+
       /**
        * This is sort of the "starting spot" for the this.each()
        * These are the init functions to handle the .bt() call
        */
-  
+
       if (opts.killTitle) {
         $(this).find('[title]').andSelf().each(function() {
           if (!$(this).attr('bt-xTitle')) {
             $(this).attr('bt-xTitle', $(this).attr('title')).attr('title', '');
           }
         });
-      }    
-      
+      }
+
       if (typeof opts.trigger == 'string') {
         opts.trigger = [opts.trigger];
       }
@@ -127,7 +127,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
             this.btOff();
           }});
         $(this).hoverIntent(hoverOpts);
-      
+
       }
       else if (opts.trigger[0] == 'hover') {
         $(this).hover(
@@ -155,7 +155,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
         // $('#selector').btOn();
         // $('#selector').btOff();
       }
-      else if (opts.trigger.length > 1 && opts.trigger[0] != opts.trigger[1]) { 
+      else if (opts.trigger.length > 1 && opts.trigger[0] != opts.trigger[1]) {
         $(this)
           .bind(opts.trigger[0], function() {
             this.btOn();
@@ -175,8 +175,8 @@ jQuery.bt = {version: '0.9.5-rc1'};
           }
         });
       }
-      
-      
+
+
       /**
        *  The BIG TURN ON
        *  Any element that has been initiated
@@ -185,19 +185,19 @@ jQuery.bt = {version: '0.9.5-rc1'};
         if (typeof $(this).data('bt-box') == 'object') {
           // if there's already a popup, remove it before creating a new one.
           this.btOff();
-        } 
-  
+        }
+
         // trigger preBuild function
         // preBuild has no argument since the box hasn't been built yet
         opts.preBuild.apply(this);
-        
+
         // turn off other tips
         $(jQuery.bt.vars.closeWhenOpenStack).btOff();
-        
+
         // add the class to the target element (for hilighting, for example)
         // bt-active is always applied to all, but activeClass can apply another
         $(this).addClass('bt-active ' + opts.activeClass);
-  
+
         if (contentSelect && opts.ajaxPath == null) {
           // bizarre, I know
           if (opts.killTitle) {
@@ -211,7 +211,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
             $(this).attr('title', '');
           }
         }
-        
+
         // ----------------------------------------------
         // All the Ajax(ish) stuff is in this next bit...
         // ----------------------------------------------
@@ -228,7 +228,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
             var selector = url.slice(off, url.length);
             url = url.slice(0, off);
           }
-        
+
           // load any data cached for the given ajax path
           var cacheData = opts.ajaxCache ? $(document.body).data('btCache-' + url.replace(/\./g, '')) : null;
           if (typeof cacheData == 'string') {
@@ -236,7 +236,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
           }
           else {
             var target = this;
-                      
+
             // set up the options
             var ajaxOpts = jQuery.extend(false,
             {
@@ -256,13 +256,13 @@ jQuery.bt = {version: '0.9.5-rc1'};
                       // inject the contents of the document in, removing the scripts
                       // to avoid any 'Permission Denied' errors in IE
                       .append(XMLHttpRequest.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
-        
+
                       // Locate the specified elements
                       .find(selector) :
-        
+
                     // If not, just inject the full result
                     XMLHttpRequest.responseText;
-                   
+
                 }
                 else {
                   if (textStatus == 'timeout') {
@@ -284,23 +284,23 @@ jQuery.bt = {version: '0.9.5-rc1'};
           }
         }
         // </ ajax stuff >
-        
-  
+
+
         // now we start actually figuring out where to place the tip
-        
+
         // figure out how to compensate for the shadow, if present
         var shadowMarginX = 0; // extra added to width to compensate for shadow
         var shadowMarginY = 0; // extra added to height
         var shadowShiftX = 0;  // amount to shift the tip horizontally to allow for shadow
         var shadowShiftY = 0;  // amount to shift vertical
-        
+
         if (opts.shadow && !shadowSupport()) {
           // if browser doesn't support drop shadows, turn them off
           opts.shadow = false;
           // and bring in the noShadows options
           jQuery.extend(opts, opts.noShadowOpts);
         }
-        
+
         if (opts.shadow) {
           // figure out horizontal placement
           if (opts.shadowBlur > Math.abs(opts.shadowOffsetX)) {
@@ -310,7 +310,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
             shadowMarginX = opts.shadowBlur + Math.abs(opts.shadowOffsetX);
           }
           shadowShiftX = (opts.shadowBlur - opts.shadowOffsetX) > 0 ? opts.shadowBlur - opts.shadowOffsetX : 0;
-          
+
           // now vertical
           if (opts.shadowBlur > Math.abs(opts.shadowOffsetY)) {
             shadowMarginY = opts.shadowBlur * 2;
@@ -320,7 +320,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
           }
           shadowShiftY = (opts.shadowBlur - opts.shadowOffsetY) > 0 ? opts.shadowBlur - opts.shadowOffsetY : 0;
         }
-        
+
         if (opts.offsetParent){
           // if offsetParent is defined by user
           var offsetParent = $(opts.offsetParent);
@@ -339,11 +339,11 @@ jQuery.bt = {version: '0.9.5-rc1'};
 
         var width = $(this).btOuterWidth();
         var height = $(this).outerHeight();
-        
+
         if (typeof content == 'object') {
           // if content is a DOM object (as opposed to text)
           // use a clone, rather than removing the original element
-          // and ensure that it's visible 
+          // and ensure that it's visible
           if (content == null) {
             return;
           }
@@ -362,22 +362,24 @@ jQuery.bt = {version: '0.9.5-rc1'};
           // if content is empty, bail out...
           return;
         }
-        
+
         // create the tip content div, populate it, and style it
-        var $text = $('<div class="bt-content"></div>').append(content).css({padding: opts.padding, position: 'absolute', width: (opts.shrinkToFit ? 'auto' : opts.width), zIndex: opts.textzIndex, left: shadowShiftX, top: shadowShiftY}).css(opts.cssStyles);
+        var $text = $('<div class="bt-content"></div>').append(content);
+        $text.css({padding: opts.padding, position: 'absolute', width: (opts.shrinkToFit ? 'auto' : opts.width), zIndex: opts.textzIndex, left: shadowShiftX, top: shadowShiftY});
+        $text.css(opts.cssStyles);
         // create the wrapping box which contains text and canvas
         // put the content in it, style it, and append it to the same offset parent as the target
         var $box = $('<div class="bt-wrapper"></div>').append($text).addClass(opts.cssClass).css({position: 'absolute', width: opts.width, zIndex: opts.wrapperzIndex, visibility:'hidden'}).appendTo(offsetParent);
-        
+
         // use bgiframe to get around z-index problems in IE6
         // http://plugins.jquery.com/project/bgiframe
         if (jQuery.fn.bgiframe) {
           $text.bgiframe();
-          $box.bgiframe();  
+          $box.bgiframe();
         }
-  
+
         $(this).data('bt-box', $box);
-  
+
         // see if the text box will fit in the various positions
         var scrollTop = numb($(document).scrollTop());
         var scrollLeft = numb($(document).scrollLeft());
@@ -415,18 +417,18 @@ jQuery.bt = {version: '0.9.5-rc1'};
             }
           }
         }
-  
+
         // horizontal (left) offset for the box
         var horiz = left + ((width - textOutWidth) * .5);
         // vertical (top) offset for the box
         var vert = top + ((height - textOutHeight) * .5);
         var points = new Array();
         var textTop, textLeft, textRight, textBottom, textTopSpace, textBottomSpace, textLeftSpace, textRightSpace, crossPoint, textCenter, spikePoint;
-  
+
         // Yes, yes, this next bit really could use to be condensed
         // each switch case is basically doing the same thing in slightly different ways
         switch(position) {
-          
+
           // =================== TOP =======================
           case 'top':
             // spike on bottom
@@ -466,7 +468,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
             points[points.length] = {x: crossPoint.x + (opts.spikeGirth/2), y: textBottom, type: 'join'};
             points[points.length] = spikePoint;
             break;
-            
+
           // =================== LEFT =======================
           case 'left':
             // spike on right
@@ -505,7 +507,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
             points[points.length] = {x: textRight, y: crossPoint.y - opts.spikeGirth/2, type: 'join'};
             points[points.length] = spikePoint;
             break;
-            
+
           // =================== BOTTOM =======================
           case 'bottom':
             // spike on top
@@ -544,7 +546,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
             points[points.length] = {x: crossPoint.x - (opts.spikeGirth/2), y: textTop, type: 'join'};
             points[points.length] = spikePoint;
             break;
-          
+
           // =================== RIGHT =======================
           case 'right':
             // spike on left
@@ -584,16 +586,16 @@ jQuery.bt = {version: '0.9.5-rc1'};
             points[points.length] = spikePoint;
             break;
         } // </ switch >
-        
+
         var canvas = document.createElement('canvas');
         $(canvas).attr('width', (numb($text.btOuterWidth(true)) + opts.strokeWidth*2 + shadowMarginX)).attr('height', (numb($text.outerHeight(true)) + opts.strokeWidth*2 + shadowMarginY)).appendTo($box).css({position: 'absolute', zIndex: opts.boxzIndex});
 
-  
+
         // if excanvas is set up, we need to initialize the new canvas element
         if (typeof G_vmlCanvasManager != 'undefined') {
           canvas = G_vmlCanvasManager.initElement(canvas);
         }
-  
+
         if (opts.cornerRadius > 0) {
           // round the corners!
           var newPoints = new Array();
@@ -619,13 +621,13 @@ jQuery.bt = {version: '0.9.5-rc1'};
           // overwrite points with new version
           points = newPoints;
         }
-        
+
         var ctx = canvas.getContext("2d");
-        
+
         if (opts.shadow && opts.shadowOverlap !== true) {
-          
+
           var shadowOverlap = numb(opts.shadowOverlap);
-          
+
           // keep the shadow (and canvas) from overlapping the target element
           switch (position) {
             case 'top':
@@ -650,7 +652,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
               break;
           }
         }
-  
+
         drawIt.apply(ctx, [points], opts.strokeWidth);
         ctx.fillStyle = opts.fill;
         if (opts.shadow) {
@@ -670,17 +672,17 @@ jQuery.bt = {version: '0.9.5-rc1'};
           ctx.closePath();
           ctx.stroke();
         }
-          
+
         // trigger preShow function
         // function receives the box element (the balloon wrapper div) as an argument
         opts.preShow.apply(this, [$box[0]]);
-        
+
         // switch from visibility: hidden to display: none so we can run animations
         $box.css({display:'none', visibility: 'visible'});
-  
+
         // Here's where we show the tip
         opts.showTip.apply(this, [$box[0]]);
-          
+
         if (opts.overlay) {
           // EXPERIMENTAL AND FOR TESTING ONLY!!!!
           var overlay = $('<div class="bt-overlay"></div>').css({
@@ -694,24 +696,24 @@ jQuery.bt = {version: '0.9.5-rc1'};
             }).appendTo(offsetParent);
           $(this).data('overlay', overlay);
         }
-        
+
         if ((opts.ajaxPath != null && opts.ajaxCache == false) || ajaxTimeout) {
           // if ajaxCache is not enabled or if there was a server timeout,
           // remove the content variable so it will be loaded again from server
           content = false;
         }
-        
+
         // stick this element into the clickAnywhereToClose stack
         if (opts.clickAnywhereToClose) {
           jQuery.bt.vars.clickAnywhereStack.push(this);
           $(document).click(jQuery.bt.docClick);
         }
-        
+
         // stick this element into the closeWhenOthersOpen stack
         if (opts.closeWhenOthersOpen) {
           jQuery.bt.vars.closeWhenOpenStack.push(this);
         }
-  
+
         // trigger postShow function
         // function receives the box element (the balloon wrapper div) as an argument
         opts.postShow.apply(this, [$box[0]]);
@@ -721,22 +723,22 @@ jQuery.bt = {version: '0.9.5-rc1'};
         $(".bt-content").mouseout(function() {
           $(currentDiv).trigger('btContentHover');
         });
-  
+
       }; // </ turnOn() >
-  
+
       this.btOff = function() {
-      
+
         var box = $(this).data('bt-box');
         if (typeof box == 'undefined') {
           return;
         }
-  
+
         // trigger preHide function
         // function receives the box element (the balloon wrapper div) as an argument
         opts.preHide.apply(this, [box]);
-        
+
         var i = this;
-        
+
         // set up the stuff to happen AFTER the tip is hidden
         i.btCleanup = function(){
           var box = $(i).data('bt-box');
@@ -748,38 +750,38 @@ jQuery.bt = {version: '0.9.5-rc1'};
           }
           if (typeof contentOrig == 'object') {
             var clones = $(contentOrig.original).data('bt-clones');
-            $(contentOrig).data('bt-clones', arrayRemove(clones, contentOrig.clone));        
+            $(contentOrig).data('bt-clones', arrayRemove(clones, contentOrig.clone));
           }
           if (typeof overlay == 'object') {
             $(overlay).remove();
             $(i).removeData('bt-overlay');
           }
-          
+
           // remove this from the stacks
           jQuery.bt.vars.clickAnywhereStack = arrayRemove(jQuery.bt.vars.clickAnywhereStack, i);
           jQuery.bt.vars.closeWhenOpenStack = arrayRemove(jQuery.bt.vars.closeWhenOpenStack, i);
-          
+
           // remove the 'bt-active' and activeClass classes from target
           $(i).removeClass('bt-active ' + opts.activeClass);
-          
+
           // trigger postHide function
           // no box argument since it has been removed from the DOM
           opts.postHide.apply(i);
-          
+
         }
-        
+
         opts.hideTip.apply(this, [box, i.btCleanup]);
 
       }; // </ turnOff() >
-  
+
       var refresh = this.btRefresh = function() {
         this.btOff();
         this.btOn();
       };
-  
+
     }); // </ this.each() >
-  
-  
+
+
     function drawIt(points, strokeWidth) {
       this.moveTo(points[0].x, points[0].y);
       for (i=1;i<points.length;i++) {
@@ -795,7 +797,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
         }
       }
     }; // </ drawIt() >
-  
+
     /**
      * For odd stroke widths, round to the nearest .5 pixel to avoid antialiasing
      * http://developer.mozilla.org/en/Canvas_tutorial/Applying_styles_and_colors
@@ -811,17 +813,17 @@ jQuery.bt = {version: '0.9.5-rc1'};
       }
       return ret;
     }; // </ round5() >
-  
+
     /**
      * Ensure that a number is a number... or zero
      */
     function numb(num) {
       return parseInt(num) || 0;
     }; // </ numb() >
-    
+
     /**
      * Remove an element from an array
-     */ 
+     */
     function arrayRemove(arr, elem) {
       var x, newArr = new Array();
       for (x in arr) {
@@ -831,7 +833,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
       }
       return newArr;
     }; // </ arrayRemove() >
-    
+
     /**
      * Does the current browser support canvas?
      * This is a variation of http://code.google.com/p/browser-canvas-support/
@@ -842,21 +844,21 @@ jQuery.bt = {version: '0.9.5-rc1'};
         canvas_compatible = !!(document.createElement('canvas').getContext('2d')); // S60
       } catch(e) {
         canvas_compatible = !!(document.createElement('canvas').getContext); // IE
-      } 
+      }
       return canvas_compatible;
     }
-    
+
     /**
      * Does the current browser support canvas drop shadows?
      */
     function shadowSupport() {
-      
+
       // to test for drop shadow support in the current browser, uncomment the next line
       // return true;
-    
+
       // until a good feature-detect is found, we have to look at user agents
       try {
-        var userAgent = navigator.userAgent.toLowerCase();      
+        var userAgent = navigator.userAgent.toLowerCase();
         if (/webkit/.test(userAgent)) {
           // WebKit.. let's go!
           return true;
@@ -869,11 +871,11 @@ jQuery.bt = {version: '0.9.5-rc1'};
       catch(err) {
         // if there's an error, just keep going, we'll assume that drop shadows are not supported
       }
-            
+
       return false;
-      
+
     } // </ shadowSupport() >
-  
+
     /**
      * Given two points, find a point which is dist pixels from point1 on a line to point2
      */
@@ -891,7 +893,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
         return {x:x, y: point1.y};
       }
     }; // </ betweenPoint() >
-  
+
     function centerPoint(arcStart, corner, arcEnd) {
       var x = corner.x == arcStart.x ? arcEnd.x : arcStart.x;
       var y = corner.y == arcStart.y ? arcEnd.y : arcStart.y;
@@ -922,21 +924,21 @@ jQuery.bt = {version: '0.9.5-rc1'};
       }
       return {x: x, y: y, type: 'center', startAngle: startAngle, endAngle: endAngle};
     }; // </ centerPoint() >
-  
+
     /**
      * Find the intersection point of two lines, each defined by two points
      * arguments are x1, y1 and x2, y2 for r1 (line 1) and r2 (line 2)
      * It's like an algebra party!!!
      */
     function findIntersect(r1x1, r1y1, r1x2, r1y2, r2x1, r2y1, r2x2, r2y2) {
-  
+
       if (r2x1 == r2x2) {
         return findIntersectY(r1x1, r1y1, r1x2, r1y2, r2x1);
       }
       if (r2y1 == r2y2) {
         return findIntersectX(r1x1, r1y1, r1x2, r1y2, r2y1);
       }
-  
+
       // m = (y1 - y2) / (x1 - x2)  // <-- how to find the slope
       // y = mx + b                 // the 'classic' linear equation
       // b = y - mx                 // how to find b (the y-intersect)
@@ -945,13 +947,13 @@ jQuery.bt = {version: '0.9.5-rc1'};
       var r1b = r1y1 - (r1m * r1x1);
       var r2m = (r2y1 - r2y2) / (r2x1 - r2x2);
       var r2b = r2y1 - (r2m * r2x1);
-  
+
       var x = (r2b - r1b) / (r1m - r2m);
       var y = r1m * x + r1b;
-  
+
       return {x: x, y: y};
     }; // </ findIntersect() >
-  
+
     /**
      * Find the y intersection point of a line and given x vertical
      */
@@ -961,12 +963,12 @@ jQuery.bt = {version: '0.9.5-rc1'};
       }
       var r1m = (r1y1 - r1y2) / (r1x1 - r1x2);
       var r1b = r1y1 - (r1m * r1x1);
-  
+
       var y = r1m * x + r1b;
-  
+
       return {x: x, y: y};
     }; // </ findIntersectY() >
-  
+
     /**
      * Find the x intersection point of a line and given y horizontal
      */
@@ -976,17 +978,17 @@ jQuery.bt = {version: '0.9.5-rc1'};
       }
       var r1m = (r1y1 - r1y2) / (r1x1 - r1x2);
       var r1b = r1y1 - (r1m * r1x1);
-  
+
       // y = mx + b     // your old friend, linear equation
       // x = (y - b)/m  // linear equation solved for x
       var x = (y - r1b) / r1m;
-  
+
       return {x: x, y: y};
-  
+
     }; // </ findIntersectX() >
-  
+
   }; // </ jQuery.fn.bt() >
-  
+
   /**
    * jQuery's compat.js (used in Drupal's jQuery upgrade module, overrides the $().position() function
    *  this is a copy of that function to allow the plugin to work when compat.js is present
@@ -994,61 +996,61 @@ jQuery.bt = {version: '0.9.5-rc1'};
    *  and .btPosion() can be replaced with .position() above...
    */
   jQuery.fn.btPosition = function() {
-  
+
     function num(elem, prop) {
-      return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
+      return elem[0] && parseInt(jQuery(elem[0]).css(prop), 10 ) || 0;
     };
-  
+
     var left = 0, top = 0, results;
-  
+
     if ( this[0] ) {
       // Get *real* offsetParent
       var offsetParent = this.offsetParent(),
-  
+
       // Get correct offsets
       offset       = this.offset(),
       parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
-  
+
       // Subtract element margins
       // note: when an element has margin: auto the offsetLeft and marginLeft
       // are the same in Safari causing offset.left to incorrectly be 0
       offset.top  -= num( this, 'marginTop' );
       offset.left -= num( this, 'marginLeft' );
-  
+
       // Add offsetParent borders
       parentOffset.top  += num( offsetParent, 'borderTopWidth' );
       parentOffset.left += num( offsetParent, 'borderLeftWidth' );
-  
+
       // Subtract the two offsets
       results = {
         top:  offset.top  - parentOffset.top,
         left: offset.left - parentOffset.left
       };
     }
-  
+
     return results;
   }; // </ jQuery.fn.btPosition() >
-  
-  
+
+
   /**
   * jQuery's dimensions.js overrides the $().btOuterWidth() function
-  *  this is a copy of original jQuery's outerWidth() function to 
+  *  this is a copy of original jQuery's outerWidth() function to
   *  allow the plugin to work when dimensions.js is present
   */
   jQuery.fn.btOuterWidth = function(margin) {
-  
+
       function num(elem, prop) {
-          return elem[0] && parseInt(jQuery.curCSS(elem[0], prop, true), 10) || 0;
+          return elem[0] && parseInt(jQuery(elem[0]).css(prop), 10) || 0;
       };
-  
+
       return this["innerWidth"]()
       + num(this, "borderLeftWidth")
       + num(this, "borderRightWidth")
       + (margin ? num(this, "marginLeft")
       + num(this, "marginRight") : 0);
-  
+
   }; // </ jQuery.fn.btOuterWidth() >
-  
+
   /**
    * A convenience function to run btOn() (if available)
    * for each selected item
@@ -1060,9 +1062,9 @@ jQuery.bt = {version: '0.9.5-rc1'};
       }
     });
   }; // </ $().btOn() >
-  
+
   /**
-   * 
+   *
    * A convenience function to run btOff() (if available)
    * for each selected item
    */
@@ -1073,9 +1075,9 @@ jQuery.bt = {version: '0.9.5-rc1'};
       }
     });
   }; // </ $().btOff() >
-  
+
   jQuery.bt.vars = {clickAnywhereStack: [], closeWhenOpenStack: []};
-  
+
   /**
    * This function gets bound to the document's click event
    * It turns off all of the tips in the click-anywhere-to-close stack
@@ -1092,7 +1094,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
       $(document).unbind('click', jQuery.bt.docClick);
     }
   }; // </ docClick() >
-  
+
   /**
    * Defaults for the beauty tips
    *
@@ -1123,20 +1125,20 @@ jQuery.bt = {version: '0.9.5-rc1'};
                                              //   'hoverIntent'     // hover using hoverIntent plugin (settings below)
                                              // note:
                                              //   hoverIntent becomes default if available
-                                             
-    clickAnywhereToClose: true,              // clicking anywhere outside of the tip will close it 
+
+    clickAnywhereToClose: true,              // clicking anywhere outside of the tip will close it
     closeWhenOthersOpen: false,              // tip will be closed before another opens - stop >= 2 tips being on
-                                             
+
     shrinkToFit:      false,                 // should short single-line content get a narrower balloon?
     width:            '200px',               // width of tooltip box
-    
+
     padding:          '10px',                // padding for content (get more fine grained with cssStyles)
     spikeGirth:       10,                    // width of spike
     spikeLength:      15,                    // length of spike
     overlap:          0,                     // spike overlap (px) onto target (can cause problems with 'hover' trigger)
     overlay:          false,                 // display overlay on target (use CSS to style) -- BUGGY!
     killTitle:        true,                  // kill title tags to avoid double tooltips
-  
+
     textzIndex:       9999,                  // z-index for the text
     boxzIndex:        9998,                  // z-index for the "talk" box (should always be less than textzIndex)
     wrapperzIndex:    9997,
@@ -1148,19 +1150,19 @@ jQuery.bt = {version: '0.9.5-rc1'};
                                              // or use 'most' to use the area with the most space
     fill:             "rgb(255, 255, 102)",  // fill color for the tooltip box, you can use any CSS-style color definition method
                                              // http://www.w3.org/TR/css3-color/#numerical - not all methods have been tested
-    
+
     windowMargin:     10,                    // space (px) to leave between text box and browser edge
-  
+
     strokeWidth:      1,                     // width of stroke around box, **set to 0 for no stroke**
     strokeStyle:      "#000",                // color/alpha of stroke
-  
+
     cornerRadius:     5,                     // radius of corners (px), set to 0 for square corners
-    
+
                       // following values are on a scale of 0 to 1 with .5 being centered
-    
+
     centerPointX:     .5,                    // the spike extends from center of the target edge to this point
     centerPointY:     .5,                    // defined by percentage horizontal (x) and vertical (y)
-      
+
     shadow:           false,                 // use drop shadow? (only displays in Safari and FF 3.1) - experimental
     shadowOffsetX:    2,                     // shadow offset x (px)
     shadowOffsetY:    2,                     // shadow offset y (px)
@@ -1169,23 +1171,23 @@ jQuery.bt = {version: '0.9.5-rc1'};
     shadowOverlap:   false,                  // when shadows overlap the target element it can cause problem with hovering
                                              // set this to true to overlap or set to a numeric value to define the amount of overlap
     noShadowOpts:     {strokeStyle: '#999'},  // use this to define 'fall-back' options for browsers which don't support drop shadows
-    
+
     cssClass:         '',                    // CSS class to add to the box wrapper div (of the TIP)
     cssStyles:        {},                    // styles to add the text box
                                              //   example: {fontFamily: 'Georgia, Times, serif', fontWeight: 'bold'}
-                                                 
+
     activeClass:      'bt-active',           // class added to TARGET element when its BeautyTip is active
-  
+
     contentSelector:  "$(this).attr('title')", // if there is no content argument, use this selector to retrieve the title
                                              // a function which returns the content may also be passed here
-  
+
     ajaxPath:         null,                  // if using ajax request for content, this contains url and (opt) selector
                                              // this will override content and contentSelector
                                              // examples (see jQuery load() function):
                                              //   '/demo.html'
                                              //   '/help/ajax/snip'
                                              //   '/help/existing/full div#content'
-                                             
+
                                              // ajaxPath can also be defined as an array
                                              // in which case, the first value will be parsed as a jQuery selector
                                              // the result of which will be used as the ajaxPath
@@ -1194,7 +1196,7 @@ jQuery.bt = {version: '0.9.5-rc1'};
                                              //    ["$(this).attr('href')", 'div#content']
                                              //    ["$(this).parents('.wrapper').find('.title').attr('href')"]
                                              //    ["$('#some-element').val()"]
-                                             
+
     ajaxError:        '<strong>ERROR:</strong> <em>%error</em>',
                                              // error text, use "%error" to insert error from server
     ajaxLoading:     '<blink>Loading...</blink>',  // yes folks, it's the blink tag!
@@ -1203,28 +1205,28 @@ jQuery.bt = {version: '0.9.5-rc1'};
     ajaxCache:        true,                  // cache ajax results and do not send request to same url multiple times
     ajaxOpts:         {},                    // any other ajax options - timeout, passwords, processing functions, etc...
                                              // see http://docs.jquery.com/Ajax/jQuery.ajax#options
-                                      
+
     preBuild:         function(){},          // function to run before popup is built
     preShow:          function(box){},       // function to run before popup is displayed
     showTip:          function(box){
                         $(box).show();
                       },
     postShow:         function(box){},       // function to run after popup is built and displayed
-    
+
     preHide:          function(box){},       // function to run before popup is removed
     hideTip:          function(box, callback) {
                         $(box).hide();
                         callback();   // you MUST call "callback" at the end of your animations
                       },
     postHide:         function(){},          // function to run after popup is removed
-    
+
     hoverIntentOpts:  {                          // options for hoverIntent (if installed)
                         interval: 300,           // http://cherne.net/brian/resources/jquery.hoverIntent.html
                         timeout: 500
                       }
-                                                 
+
   }; // </ jQuery.bt.defaults >
-  
+
   jQuery.bt.options = {};
 
 })(jQuery);
diff --git a/js/jquery.bt.min.js b/js/jquery.bt.min.js
old mode 100644
new mode 100755
diff --git a/lib/Drupal/beautytips/Form/BeautytipsConfigForm.php b/lib/Drupal/beautytips/Form/BeautytipsConfigForm.php
new file mode 100755
index 0000000..c39027a
--- /dev/null
+++ b/lib/Drupal/beautytips/Form/BeautytipsConfigForm.php
@@ -0,0 +1,262 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\beautytips\Form\BeautytipsConfigForm.
+ */
+namespace Drupal\beautytips\Form;
+use Drupal\Core\Form\ConfigFormBase;
+
+/**
+ * Beautytips admin settings form
+ */
+class BeautytipsConfigForm extends ConfigFormBase {
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormID() {
+    return 'beautytips_admin';
+  }
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state) {
+    $config = \Drupal::config('beautytips.basic');
+
+    $form['beautytips_always_add'] = array(
+      '#title' => t('Add beautytips js to every page'),
+      '#description' => t('This allows you to give the class \'beautytips\' to any element on a page and the title attribute will popup as a beautytip.<br /> i.e. <i> &lt;p class="beautytips" title="type the text you want beautytips to display here"&gt .....&lt/p&gt</i>'),
+      '#type' => 'checkbox',
+      '#default_value' => $config->get('beautytips_always_add'),
+      '#weight' => -1,
+    );
+    $selectors = $config->get('beautytips_added_selectors_array');
+    $form['beautytips_added_selectors_array'] = array(
+      '#title' => t('Add beautytips to the following selectors'),
+      '#description' => t("Separate selectors with a comma.  Beautytips will be added to each of these on every page.  The element's title attribute will be the text used. (OPTIONAL)"),
+      '#type' => 'textfield',
+      '#default_value' => is_array($selectors) ? implode(", ", $selectors) : '',
+      '#weight' => -1,
+    );
+    $form['beautytips_ltr'] = array(
+      '#title' => t('Support Left to Right display'),
+      '#description' => t('Only check this if this is an ltr site.  This adds css to support it.'),
+      '#type' => 'checkbox',
+      '#default_value' => $config->get('beautytips_ltr'),
+    );
+    $form['beautytips_default_styles'] = array(
+      '#type' => 'details',
+      '#title' => 'Styling Options',
+      '#collapsible' => TRUE,
+      '#collapsed' => FALSE,
+    );
+    $styles = beautytips_get_styles(TRUE);
+    if (count($styles)) {
+      unset($styles['default']);
+      foreach ($styles as $name => $style) {
+        $bt_style_options[$name]['cssSelect'] = '#edit-beautytips-default-style-' . str_replace('_', '-', $name);
+        $bt_style_options[$name]['text'] = 'Aenean risus purus, pharetra in, blandit quis, gravida a, turpis.  Aenean risus purus, pharetra in, blandit quis, gravida a, turpis.  Aenean risus purus, pharetra in, blandit quis, gravida a, turpis.';
+        $bt_style_options[$name]['width'] = isset($style['width']) ? $style['width'] : '300px';
+        $bt_style_options[$name]['style'] = $name;
+        $style_options[$name] = $name;
+      }
+    }
+    $bt_style_options['default_hover'] = array(
+      'cssSelect' => '#beautytips-site-wide-popup',
+      'text' => 'Sed justo nibh, ultrices ut gravida et, laoreet et elit. Nullam consequat lacus et dui dignissim venenatis. Curabitur quis urna eget mi interdum viverra quis eu enim. Ut sit amet nunc augue. Morbi fermentum ultricies velit sed aliquam. Etiam dui tortor, auctor sed tempus ac, auctor sed sapien.',
+      'positions' => array('right'),
+    );
+    // TODO: Determine what to do if default style has been removed.
+    $form['beautytips_default_styles']['beautytips_default_style'] = array(
+      '#type' => 'radios',
+      '#title' => t('Choose a default style'),
+      '#description' => t('Mouse over the radio buttons to see a preview.'),
+      '#prefix' => '<div id="beauty-default-styles">',
+      '#suffix' => '</div>',
+      '#options' => $style_options,
+      '#default_value' => $config->get('beautytips_default_style'),
+    );
+    $style_options = array(
+      'fill' => t('background color (string - html color)'),
+      'strokeWidth' => t('width of border (integer)'),
+      'strokeStyle' => t('color of border (string - html color)'),
+      'width' => t('width of popup (number in px)'),
+      'padding' => t('space between content and border (number in px)'),
+      'cornerRadius' => t('Controls roundness of corners (integer)'),
+      'spikeGirth' => t('thickness of spike (integer)'),
+      'spikeLength' => t('length of spike (integer)'),
+      'shadowBlur' => t('Size of popup shadow (integer)'),
+      'shadowColor' => t('Color of popup shadow (string - html color)'),
+    );
+    $form['beautytips_default_styles']['custom_styles'] = array(
+      '#type' => 'details',
+      '#title' => t('Custom Style Options'),
+      '#description' => t('<b>Set a custom style.</b><br /> Note: These will use the default style that is selected as a base <br /> but will overide elements such as background color, border color etc.   <br /><i>Leave these empty unless you know what you are doing.</i><div id="beautytips-popup-changes"><div id="beauty-click-text"><p>Double Click here to view popup with custom changes</p></div></div>'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+      '#attributes' => array('class' => array('bt-custom-styles')),
+      '#prefix' => '<div id="beautytips-site-wide-popup"><div id="beauty-text"><p>Hover here to see the current site-wide beautytips</p></div></div>',
+    );
+    $custom_style = $config->get('beautytips_custom_style');
+    foreach ($style_options as $option => $description) {
+      $form['beautytips_default_styles']['custom_styles']['bt-options-box-' . $option] = array(
+        '#title' => $option,
+        '#description' => $description,
+        '#type' => 'textfield',
+        '#default_value' => isset($custom_style[$option]) ? $custom_style[$option] : '',
+      );
+    }
+    $form['beautytips_default_styles']['custom_styles']['bt-options-box-shadow'] = array(
+      '#title' => 'shadow',
+      '#description' => t('Whether or not the popup has a shadow'),
+      '#type' => 'radios',
+      '#options' => array('default' => t('Default'), 'shadow' => t('Shadow On'), 'no_shadow' => t('Shadow Off')),
+      '#attributes' => array('class' => array('beautytips-options-shadow')),
+      '#default_value' => isset($custom_style['shadow']) ? $custom_style['shadow'] : 'default',
+    );
+    $form['beautytips_default_styles']['custom_styles']['bt-options-cssClass'] = array(
+      '#title' => 'cssClass',
+      '#description' => t('The class that will be applied to the box wrapper div (of the TIP)'),
+      '#type' => 'textfield',
+      '#default_value' => isset($custom_style['cssClass']) ? $custom_style['cssClass'] : '',
+    );
+    $css_style_options = array('color', 'fontFamily', 'fontWeight', 'fontSize');
+    $form['beautytips_default_styles']['custom_styles']['css-styles'] = array(
+      '#type' => 'details',
+      '#title' => t('Font Styling'),
+      '#description' => t('Enter css options for changing the font style'),
+      '#attributes' => array('class' => array('beautytips-css-styling')),
+      '#collapsible' => FALSE,
+    );
+    foreach ($css_style_options as $option) {
+      $form['beautytips_default_styles']['custom_styles']['css-styles']['bt-options-css-' . $option] = array(
+        '#title' => $option,
+        '#type' => 'textfield',
+        '#default_value' => isset($custom_style['cssStyles'][$option]) ? $custom_style['cssStyles'][$option] : '',
+      );
+    }
+
+    $path = drupal_get_path('module', 'beautytips');
+    $form['#attached'] = array(
+      'js' => array(
+        $path . '/other_libs/colorpicker/js/colorpicker.js',
+        $path . '/js/bt_admin_page.js',
+      ),
+      'css' => array(
+        $path . '/other_libs/colorpicker/css/colorpicker.css',
+        $path .'/css/beautytips.css',
+      ),
+    );
+    beautytips_add_beautytips($bt_style_options);
+
+    if (module_exists('beautytips_ui')) {
+      beautytips_ui_admin_settings($form);
+    }
+
+    return parent::buildForm($form, $form_state);
+  }
+  /**
+   * {@inheritdoc}
+   */
+  public function validateForm(array &$form, array &$form_state) {
+    $values = $form_state['values'];
+    $integer_fields = array('bt-options-box-strokeWidth', 'bt-options-box-cornerRadius', 'bt-options-box-spikeGirth', 'bt-options-box-spikeLength', 'bt-options-box-shadowBlur');
+    $pixel_fields = array('bt-options-box-width', 'bt-options-box-padding', 'bt-options-css-fontSize');
+    $color_fields = array('bt-options-box-fill', 'bt-options-css-color', 'bt-options-box-shadowColor');
+    $sanitize_strings = array('bt-options-cssClass', 'bt-options-css-fontFamily', 'bt-options-css-fontWeight');
+
+    foreach ($integer_fields as $name) {
+      if ($values[$name]) {
+        if (!is_numeric($values[$name])) {
+          \Drupal::formBuilder()->setErrorByName($name, $form_state, t('You need to enter a numeric value for <em>@name</em>', array('@name' => str_replace(array('bt-options-box-', 'bt-options-css-'), '', $name))));
+        }
+        else {
+          $form_state['values'][$name] = round($values[$name]);
+        }
+      }
+    }
+
+    foreach ($pixel_fields as $name) {
+      if ($values[$name]) {
+        $unit = substr($values[$name], -2, 2);
+        $value = str_replace(array('px', ' ', 'em'), '', $values[$name]);
+        if (!is_numeric($value) || (!$value && $value != 0) || !in_array($unit, array('px', 'em'))) {
+          \Drupal::formBuilder()->setErrorByName($name, $form_state, t('You need to enter a numeric value for <em>@name</em>, followed by <em>px</em>', array('@name' => str_replace(array('bt-options-box-', 'bt-options-css-'), '', $name))));
+        }
+      }
+    }
+    parent::validateForm($form, $form_state);
+  }
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    $config = \Drupal::config('beautytips.basic');
+    $values = $form_state['values'];
+    if (count($values)) {
+      $custom_style = array();
+      $css_style = array();
+      foreach ($values as $option => $value) {
+        if (strpos($option, 'bt-options-box-') === 0) {
+          $option = str_replace('bt-options-box-', '', $option);
+          $custom_style[$option] = $value;
+        }
+        else if ($option == 'bt-options-cssClass') {
+          $option = str_replace('bt-options-', '', $option);
+          $custom_style[$option] = $value;
+        }
+        else if (strpos($option, 'bt-options-css-') === 0) {
+          $option = str_replace('bt-options-css-', '', $option);
+          if ($value) {
+            $css_style[$option] = $value;
+          }
+        }
+      }
+
+      // Store the defaults - they will be passed to javascript
+      $style = beautytips_get_style($values['beautytips_default_style']);
+      if (count($custom_style)) {
+        foreach ($custom_style as $option => $value) {
+          if ($option == 'shadow') {
+            if ($value != 'default') {
+              $style['shadow'] = $value == 'shadow' ? TRUE : FALSE;
+            }
+          }
+          else if (!empty($value) || $value == '0') {
+            $style[$option] = is_numeric($value) ? (int) $value : (string) $value;
+          }
+        }
+      }
+      if (count($css_style)) {
+        foreach ($css_style as $option => $value) {
+          if (!empty($value)) {
+            $style['cssStyles'][$option] = (string) $value;
+          }
+        }
+        if (!empty($css_style)) {
+          $custom_style['cssStyles'] = $css_style;
+        }
+      }
+      $config->set('beautytips_defaults', $style);
+      $config->set('beautytips_custom_style', $custom_style);
+      $config->set('beautytips_default_style', $values['beautytips_default_style']);
+      $config->set('beautytips_always_add', $values['beautytips_always_add']);
+      $config->set('beautytips_ltr', $values['beautytips_ltr']);
+      cache()->deleteTags(array('beautytips' => TRUE));
+
+      // Store array of selectors that bt will be added to on every page
+      $selectors = explode(",", $values['beautytips_added_selectors_array']);
+      if (count($selectors)) {
+        foreach ($selectors as $key => $selector) {
+          $selectors[$key] = trim($selector);
+        }
+      }
+      $config->set('beautytips_added_selectors_array', $selectors);
+    }
+    if (module_exists('beautytips_ui')) {
+      beautytips_ui_admin_submit($form, $form_state);
+    }
+    $config->save();
+    parent::submitForm($form, $form_state);
+  }
+}
+?>
diff --git a/other_libs/bgiframe_2.1.1/ChangeLog.txt b/other_libs/bgiframe_2.1.1/ChangeLog.txt
old mode 100644
new mode 100755
diff --git a/other_libs/bgiframe_2.1.1/META.json b/other_libs/bgiframe_2.1.1/META.json
old mode 100644
new mode 100755
diff --git a/other_libs/bgiframe_2.1.1/jquery.bgiframe.js b/other_libs/bgiframe_2.1.1/jquery.bgiframe.js
old mode 100644
new mode 100755
diff --git a/other_libs/bgiframe_2.1.1/jquery.bgiframe.min.js b/other_libs/bgiframe_2.1.1/jquery.bgiframe.min.js
old mode 100644
new mode 100755
diff --git a/other_libs/bgiframe_2.1.1/jquery.bgiframe.pack.js b/other_libs/bgiframe_2.1.1/jquery.bgiframe.pack.js
old mode 100644
new mode 100755
diff --git a/other_libs/jquery-1.2.6.js b/other_libs/jquery-1.2.6.js
old mode 100644
new mode 100755
diff --git a/other_libs/jquery-1.2.6.min.js b/other_libs/jquery-1.2.6.min.js
old mode 100644
new mode 100755
diff --git a/other_libs/jquery-1.3.2.js b/other_libs/jquery-1.3.2.js
old mode 100644
new mode 100755
diff --git a/other_libs/jquery-1.3.2.min.js b/other_libs/jquery-1.3.2.min.js
old mode 100644
new mode 100755
diff --git a/other_libs/jquery-1.3.min.js b/other_libs/jquery-1.3.min.js
old mode 100644
new mode 100755
diff --git a/other_libs/jquery.easing.1.3.js b/other_libs/jquery.easing.1.3.js
old mode 100644
new mode 100755
diff --git a/other_libs/jquery.hoverIntent.minified.js b/other_libs/jquery.hoverIntent.minified.js
old mode 100644
new mode 100755
