diff --git a/css/views-admin.bartik.css b/css/views-admin.bartik.css
index 06d0608..1dd43ab 100644
--- a/css/views-admin.bartik.css
+++ b/css/views-admin.bartik.css
@@ -73,119 +73,7 @@
 
 /* @group CTools */
 
-/* @group Buttons */
-
-.ctools-button-processed {
-  background-image:
-    -moz-linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f9f9f9 100%);
-  background-image:
-    -webkit-gradient(
-      linear,
-      left top,
-      left bottom,
-      color-stop(0.0, rgba(255, 255, 255, 1.0)),
-      color-stop(1.0, rgba(249, 249, 249, 1.0))
-    );
-  background-image:
-    -webkit-linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f9f9f9 100%);
-  background-image:
-    linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f9f9f9 100%);
-  border-radius: 5px;
-  padding-bottom: 1px;
-  padding-top: 1px;
-}
-
-.ctools-button-processed:hover {
-  background-image:
-    -moz-linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f1f1f1 100%);
-  background-image:
-    -webkit-gradient(
-      linear,
-      left top,
-      left bottom,
-      color-stop(0.0, rgba(255, 255, 255, 1.0)),
-      color-stop(1.0, rgba(241, 241, 241, 1.0))
-    );
-  background-image:
-    -webkit-linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f1f1f1 100%);
-  background-image:
-    linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f1f1f1 100%);
-}
-
-.ctools-button-processed li a,
-.views-ui-display-tab-actions .ctools-button-processed input {
-  padding-left: 9px;
-  padding-right: 9px;
-}
-
-.ctools-content ul.actions {
-  padding-bottom: 0;
-}
-
-.ctools-dropbutton-processed.open:hover {
-  background-image:
-    -moz-linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f9f9f9 100%);
-  background-image:
-    -webkit-gradient(
-      linear,
-      left top,
-      left bottom,
-      color-stop(0.0, rgba(255, 255, 255, 1.0)),
-      color-stop(1.0, rgba(249, 249, 249, 1.0))
-    );
-  background-image:
-    -webkit-linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f9f9f9 100%);
-  background-image:
-    linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f9f9f9 100%);
-}
-
-.ctools-dropbutton-processed.open {
-  -moz-box-shadow: 1px 1px 2px rgba(0,0,0,0.25);
-  -webkit-box-shadow: 1px 1px 2px rgba(0,0,0,0.25);
-  box-shadow: 1px 1px 2px rgba(0,0,0,0.25);
-}
-
-.ctools-twisty {
-  top: 0.6667em;
-}
-
-.ctools-dropbutton-processed.open .ctools-twisty {
-  top: 0.3333em;
-}
-
-.ctools-dropbutton-processed li a,
-.views-ui-display-tab-actions .ctools-dropbutton-processed input {
-  padding-right: 7px;
-}
-
-.views-ui-display-tab-actions .ctools-button-processed input.form-submit {
+.views-ui-display-tab-actions .dropbutton input.form-submit {
   margin-right: 0;
   margin-top: 0;
 }
@@ -210,12 +98,12 @@
   margin-top: 12px;
 }
 
-.views-ui-display-tab-actions .ctools-button input {
+.views-ui-display-tab-actions .dropbutton input {
   color: #0071B3;
 }
 
-.views-ui-display-tab-actions .ctools-button input:hover,
-.views-ui-display-tab-actions .ctools-button input:focus {
+.views-ui-display-tab-actions .dropbutton input:hover,
+.views-ui-display-tab-actions .dropbutton input:focus {
   color: #018FE2;
 }
 
diff --git a/css/views-admin.css b/css/views-admin.css
index b98a4bc..952d074 100644
--- a/css/views-admin.css
+++ b/css/views-admin.css
@@ -357,3 +357,8 @@ html.js span.js-only {
 }
 
 /* @end */
+
+.dropbutton,
+.dropbutton input {
+  text-transform: lowercase;
+}
diff --git a/css/views-admin.ctools-rtl.css b/css/views-admin.ctools-rtl.css
index dcdd4ff..35a577b 100644
--- a/css/views-admin.ctools-rtl.css
+++ b/css/views-admin.ctools-rtl.css
@@ -1,29 +1,11 @@
 /* @group Buttons */
 
-.ctools-dropbutton .ctools-content {
-  border-left: 1px solid #e8e8e8;
-}
-
-.ctools-content ul.actions {
-  padding-left: auto;
-  padding-right: 0;
-}
-
-.ctools-dropbutton .ctools-link {
-  border-right: 1px solid #ffffff;
-}
-
-.ctools-dropbutton li {
-  padding-left: 9px;
-  padding-left: auto;
-}
-
-.views-display-top .ctools-button {
+.no-js .views-display-top .dropbutton {
   left: 12px;
   right: auto;
 }
 
-.views-ui-display-tab-bucket .ctools-button {
+.views-ui-display-tab-bucket .dropbutton {
   left: 5px;
   right: auto;
 }
diff --git a/css/views-admin.ctools.css b/css/views-admin.ctools.css
index 91a1b80..de21f82 100644
--- a/css/views-admin.ctools.css
+++ b/css/views-admin.ctools.css
@@ -1,108 +1,20 @@
 /* @group Buttons */
 
-.ctools-button-processed {
-  background-color: #ffffff;
-  border-color: #cccccc;
-  font-size: 11px;
-  padding-bottom: 2px;
-  padding-top: 2px;
-}
-
-.ctools-button-processed,
-.ctools-button-processed input {
-  text-transform: lowercase;
-}
-
-.ctools-button-processed:hover {
-  border-color: #b8b8b8;
-}
-
-.ctools-button-processed:active {
-  border-color: #a0a0a0;
-}
-
-.ctools-button-processed .ctools-content {
-  padding-bottom: 0;
-  padding-top: 0;
-}
-
-.ctools-dropbutton-processed {
-  position: absolute;
-}
-
-.ctools-dropbutton-processed .ctools-content {
-  border-right: 1px solid #e8e8e8;
-}
-
-.ctools-dropbutton-processed .ctools-content ul {
-  margin: 0;
-  padding: 0;
-}
-
-.ctools-content ul.actions {
-  margin-top: 0;
-  margin-bottom: 0;
-  padding-left: 0;
-}
-
-.ctools-button-processed .ctools-content a {
-  background-image: none;
-  border: medium none;
-}
-
-.ctools-dropbutton-processed.open:hover {
-  border-color: #D0D0D0;
-}
-
-.ctools-dropbutton-processed.open {
-  z-index: 100;
-}
-
-.ctools-dropbutton-processed .ctools-link {
-  border-left: 1px solid #ffffff;
-}
-
-.ctools-dropbutton-processed.open .ctools-content {
-    padding-bottom: 4px;
-}
-
-.ctools-dropbutton-processed li a,
-.ctools-dropbutton-processed li input {
-  padding-right: 9px;
-}
-
-.ctools-dropbutton-processed.open li + li {
-  border-top: 1px solid #efefef;
-  margin-top: 4px;
-  padding-bottom: 0;
-  padding-top: 4px;
-}
-
-.ctools-twisty:focus {
-  outline: medium none;
-}
-
-.ctools-no-js .ctools-content ul {
-  margin-bottom: 0;
-  margin-top: 0;
-  padding-left: 0;
-}
-
-.views-display-top .ctools-button-processed {
+.views-display-top .dropbutton {
   font-size: 12px;
   position: absolute;
   right: 12px;
   top: 7px;
 }
 
-.views-ui-display-tab-bucket .ctools-button-processed {
+.views-ui-display-tab-bucket .dropbutton {
   position: absolute;
   right: 5px;
   top: 4px;
 }
 
-.views-ui-display-tab-actions .ctools-button-processed li a,
-.views-ui-display-tab-actions .ctools-button-processed input {
+.views-ui-display-tab-actions .dropbutton li a,
+.views-ui-display-tab-actions .dropbutton input {
   background: none;
   border: medium;
   font-family: inherit;
@@ -113,8 +25,9 @@
   margin-bottom: 0;
 }
 
-.views-ui-display-tab-actions .ctools-button-processed input:hover {
+.views-ui-display-tab-actions .dropbutton input:hover {
   background: none;
+  border: none;
 }
 
 /* @end */
diff --git a/css/views-admin.seven.css b/css/views-admin.seven.css
index 8ad4eb8..fc194d7 100644
--- a/css/views-admin.seven.css
+++ b/css/views-admin.seven.css
@@ -204,28 +204,6 @@ fieldset.fieldset-no-legend {
 
 /* @end */
 
-/* @group Buttons */
-
-.ctools-button-processed ul {
-  margin: 0;
-}
-
-/* Override for input elements that are themed like ctools-buttons */
-.ctools-button-processed input.form-submit:hover {
-  background-image: none;
-  color: #0074BD;
-  text-shadow: none;
-}
-
-.ctools-button-processed input.form-submit:active {
-  background: none;
-  border: medium none;
-  color: #0074BD;
-  text-shadow: none;
-}
-
-/* @end */
-
 /* @group Tables */
 
 table td,
@@ -422,97 +400,6 @@ table th {
 
 /* @end */
 
-/* @group CTools */
-
-/* @group Buttons */
-
-.ctools-button-processed {
-  background-image:
-    -moz-linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f9f9f9 100%);
-  background-image:
-    -webkit-gradient(
-      linear,
-      left top,
-      left bottom,
-      color-stop(0.0, rgba(255, 255, 255, 1.0)),
-      color-stop(1.0, rgba(249, 249, 249, 1.0))
-    );
-  background-image:
-    -webkit-linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f9f9f9 100%);
-  background-image:
-    linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f9f9f9 100%);
-  border-radius: 11px;
-}
-
-.ctools-button-processed:hover {
-  background-image:
-    -moz-linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f1f1f1 100%);
-  background-image:
-    -webkit-gradient(
-      linear,
-      left top,
-      left bottom,
-      color-stop(0.0, rgba(255, 255, 255, 1.0)),
-      color-stop(1.0, rgba(241, 241, 241, 1.0))
-    );
-  background-image:
-    -webkit-linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f1f1f1 100%);
-  background-image:
-    linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f1f1f1 100%);
-}
-
-.ctools-dropbutton-processed.open:hover {
-  background-image:
-    -moz-linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f9f9f9 100%);
-  background-image:
-    -webkit-gradient(
-      linear,
-      left top,
-      left bottom,
-      color-stop(0.0, rgba(255, 255, 255, 1.0)),
-      color-stop(1.0, rgba(249, 249, 249, 1.0))
-    );
-  background-image:
-    -webkit-linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f9f9f9 100%);
-  background-image:
-    linear-gradient(
-      -90deg,
-      #ffffff 0,
-      #f9f9f9 100%);
-}
-
-.ctools-dropbutton-processed.open {
-  -moz-box-shadow: 1px 1px 2px rgba(0,0,0,0.25);
-  -webkit-box-shadow: 1px 1px 2px rgba(0,0,0,0.25);
-  box-shadow: 1px 1px 2px rgba(0,0,0,0.25);
-}
-
-/* @end */
-
 /* @group Collapsible */
 
 .ctools-toggle {
@@ -539,7 +426,7 @@ table th {
   color: #008BCB;
 }
 
-.views-ui-display-tab-actions .ctools-button-processed input {
+.views-ui-display-tab-actions .dropbutton input {
   color: #0074BD;
 }
 
diff --git a/includes/admin.inc b/includes/admin.inc
index a768557..f72b9b8 100644
--- a/includes/admin.inc
+++ b/includes/admin.inc
@@ -1174,7 +1174,7 @@ function views_ui_render_display_top($view, $display_id) {
 
   // Extra actions for the display
   $element['extra_actions'] = array(
-    '#theme' => 'links__ctools_dropbutton',
+    '#theme' => 'dropbutton',
     '#attributes' => array(
         'id' => 'views-display-extra-actions',
         'class' => array(
@@ -1509,12 +1509,12 @@ function views_ui_get_display_tab_details($view, $display) {
   $is_enabled = $display->handler->getOption('enabled');
 
   if (!$is_display_deleted && !$is_default) {
-    $prefix = '<div class="ctools-no-js ctools-button ctools-dropbutton"><div class="ctools-link"><a href="#" class="ctools-twisty ctools-text">open</a></div><div class="ctools-content"><ul class="horizontal right actions">';
+    $prefix = '<div class="dropbutton dropbutton-multiple"><div class="dropbutton-link"><a href="#" class="dropbutton-arrow"><span class="element-invisible">' . t('Open dropbutton') . '</span></a></div><div class="dropbutton-content"><ul class="horizontal right actions">';
     $suffix = '</ul></div></div>';
     $item_element = 'li';
   }
   else {
-    $prefix = '<div class="ctools-button"><div class="ctools-content"><ul class="horizontal right actions">';
+    $prefix = '<div class="dropbutton"><div class="dropbutton-content"><ul class="horizontal right actions">';
     $suffix = '</ul></div></div>';
     $item_element = 'li';
   }
@@ -2186,7 +2186,7 @@ function views_ui_edit_form_get_bucket($type, $view, $display) {
   }
 
   // Render the array of links
-  $build['#actions'] = theme('links__ctools_dropbutton',
+  $build['#actions'] = theme('dropbutton',
     array(
       'links' => $actions,
       'attributes' => array(
diff --git a/js/views-admin.js b/js/views-admin.js
index ccddc5e..b7fbae4 100644
--- a/js/views-admin.js
+++ b/js/views-admin.js
@@ -914,7 +914,7 @@ else if (($row).hasClass('draggable') && $row.is(':visible')) {
 
   "use strict";
 
-  jQuery('.ctools-button', context).once('RemoveIconClass', function () {
+  jQuery('.dropbutton', context).once('RemoveIconClass', function () {
     var $ = jQuery;
     var $this = $(this);
     $('.icon', $this).removeClass('icon');
diff --git a/lib/Drupal/views/ViewListController.php b/lib/Drupal/views/ViewListController.php
index af0bc02..ca7b06b 100644
--- a/lib/Drupal/views/ViewListController.php
+++ b/lib/Drupal/views/ViewListController.php
@@ -77,7 +77,7 @@ public function getList() {
    */
   public function getRowData(EntityInterface $view) {
     $operations = $this->buildActionLinks($view);
-    $operations['#theme'] = 'links__ctools_dropbutton';
+    $operations['#theme'] = 'dropbutton';
     return array(
       'data' => array(
         'view_name' => theme('views_ui_view_info', array('view' => $view)),
diff --git a/views_dropbutton/dropbutton.base.css b/views_dropbutton/dropbutton.base.css
new file mode 100644
index 0000000..a73e02c
--- /dev/null
+++ b/views_dropbutton/dropbutton.base.css
@@ -0,0 +1,68 @@
+.dropbutton .dropbutton-content ul {
+  list-style-image: none;
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+.dropbutton .dropbutton-content ul li {
+  line-height: 1.333;
+}
+.dropbutton .dropbutton-content ul.actions {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+
+/**
+ * This creates the dropbutton arrow and inherits the link color.
+ */
+.dropbutton-link {
+  bottom: 0;
+  overflow: hidden;
+  position: absolute;
+  right: 0;
+  text-indent: 110%;
+  top: 0;
+  white-space: nowrap;
+  width: 17px;
+}
+.dropbutton-arrow {
+  border-bottom-color: transparent;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  border-style: solid;
+  border-width: 4px 4px 0;
+  display: none;
+  line-height: 0;
+  position: absolute;
+  right: 6px;
+  top: 0.667em;
+}
+
+.js .dropbutton-arrow {
+  display: inline-block;
+}
+.js .dropbutton {
+  display: inline-block;
+}
+.js .dropbutton-multiple {
+  padding-right: 18px;
+  position: relative;
+}
+.js .dropbutton-multiple .dropbutton-content ul {
+  margin: 0;
+  overflow: hidden;
+  padding: 0;
+}
+.js .dropbutton-multiple .dropbutton-content li,
+.js .dropbutton-multiple .dropbutton-content a {
+  display: block;
+}
+.js .dropbutton-multiple.open {
+  z-index: 100;
+}
+.js .dropbutton-multiple.open .dropbutton-arrow {
+  border-bottom: 4px solid;
+  border-top-color: transparent;
+  top: 0.333em;
+}
diff --git a/views_dropbutton/dropbutton.js b/views_dropbutton/dropbutton.js
new file mode 100644
index 0000000..a6e7f13
--- /dev/null
+++ b/views_dropbutton/dropbutton.js
@@ -0,0 +1,93 @@
+/**
+ * @file
+ * Implement a simple, clickable dropbutton menu.
+ *
+ * See dropbutton.theme.inc for primary documentation.
+ *
+ * The javascript relies on four classes:
+ * - The dropbutton must be fully contained in a div with the class
+ *   dropbutton. It must also contain the class dropbutton-no-js
+ *   which will be immediately removed by the javascript; this allows for
+ *   graceful degradation.
+ * - The trigger that opens the dropbutton must be an a tag wit hthe class
+ *   dropbutton-link. The href should just be '#' as this will never
+ *   be allowed to complete.
+ * - The part of the dropbutton that will appear when the link is clicked must
+ *   be a div with class dropbutton-container.
+ * - Finally, dropbutton-hover will be placed on any link that is being
+ *   hovered over, so that the browser can restyle the links.
+ *
+ * This tool isn't meant to replace click-tips or anything, it is specifically
+ * meant to work well presenting menus.
+ */
+
+(function ($) {
+
+"use strict";
+
+Drupal.behaviors.dropbutton = {
+  attach: function (context) {
+    // Process dropbuttons. Not all buttons are dropbuttons.
+    $(context).find('.dropbutton-multiple').once('dropbutton-multiple', function () {
+      var $dropbutton = $(this);
+      var $button = $dropbutton.find('.dropbutton-content');
+      var $secondaryActions = $button.find('li').not(':first');
+      var $arrow = $dropbutton.find(".dropbutton-link");
+      var open = false;
+      var hovering = false;
+      var timerID = 0;
+
+      var toggle = function (close) {
+        // if it's open or we're told to close it, close it.
+        if (open || close) {
+          // If we're just toggling it, close it immediately.
+          if (!close) {
+            open = false;
+            $secondaryActions.slideUp(100);
+            $dropbutton.removeClass('open');
+          }
+          else {
+            // If we were told to close it, wait half a second to make
+            // sure that's what the user wanted.
+            // Clear any previous timer we were using.
+            if (timerID) {
+              clearTimeout(timerID);
+            }
+            timerID = setTimeout(function () {
+              if (!hovering) {
+                open = false;
+                $secondaryActions.slideUp(100);
+                $dropbutton.removeClass('open');
+              }}, 500);
+          }
+        }
+        else {
+          // open it.
+          open = true;
+          $secondaryActions.animate({height: "show", opacity: "show"}, 100);
+          $dropbutton.addClass('open');
+        }
+      };
+      // Hide the secondary actions initially.
+      $secondaryActions.hide();
+
+      $arrow.click(function () {
+          toggle();
+          return false;
+        });
+
+      $dropbutton.hover(
+        function () {
+          hovering = true;
+        }, // hover in
+        function () { // hover out
+          hovering = false;
+          toggle(true);
+          return false;
+        }
+      );
+    });
+  }
+};
+
+})(jQuery);
diff --git a/views_dropbutton/dropbutton.theme.css b/views_dropbutton/dropbutton.theme.css
new file mode 100644
index 0000000..ba8f95d
--- /dev/null
+++ b/views_dropbutton/dropbutton.theme.css
@@ -0,0 +1,77 @@
+/**
+ * Make dropbuttons pretty.
+ */
+.dropbutton-content {
+  padding-bottom: 0;
+  padding-top: 0;
+}
+
+.dropbutton-arrow:focus {
+  outline: medium none;
+}
+
+.js .dropbutton {
+  background-image: -moz-linear-gradient(-90deg, white 0, #f9f9f9 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, white), color-stop(1, #f9f9f9));
+  background-image: -webkit-linear-gradient(-90deg, white 0, #f9f9f9 100%);
+  background-image: linear-gradient(-90deg, #ffffff 0%, #f9f9f9 100%);
+  border: #cccccc solid 1px;
+  border-radius: 5px;
+  cursor: pointer;
+  font-size: 11px;
+  padding-bottom: 1px;
+  padding-top: 1px;
+}
+.js .dropbutton:hover {
+  background-image: -moz-linear-gradient(-90deg, white 0, #f1f1f1 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, white), color-stop(1, #f1f1f1));
+  background-image: -webkit-linear-gradient(-90deg, white 0, #f1f1f1 100%);
+  background-image: linear-gradient(-90deg, #ffffff 0%, #f1f1f1 100%);
+  border-color: #b8b8b8;
+}
+.js .dropbutton:active {
+  border-color: #a0a0a0;
+}
+.js .dropbutton li a {
+  padding-left: 9px;
+  padding-right: 9px;
+}
+.js .dropbutton .dropbutton-content a {
+  background-image: none;
+  border: medium none;
+}
+.js .dropbutton-multiple {
+  background-color: inherit;
+  position: absolute;
+}
+.js .dropbutton-multiple .dropbutton-content {
+  border-right: 1px solid #e8e8e8;
+}
+.js .dropbutton-multiple.open {
+  -moz-box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.25);
+  -webkit-box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.25);
+  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.25);
+}
+.js .dropbutton-multiple.open:hover {
+  background-image: -moz-linear-gradient(-90deg, white 0, #f9f9f9 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, white), color-stop(1, #f9f9f9));
+  background-image: -webkit-linear-gradient(-90deg, white 0, #f9f9f9 100%);
+  background-image: linear-gradient(-90deg, #ffffff 0%, #f9f9f9 100%);
+  border-color: #d0d0d0;
+}
+.js .dropbutton-multiple.open .dropbutton-link {
+  border-left: 1px solid white;
+}
+.js .dropbutton-multiple.open .dropbutton-content {
+  padding-bottom: 4px;
+}
+.js .dropbutton-multiple.open li a,
+.js .dropbutton-multiple.open li input {
+  padding-right: 9px;
+}
+.js .dropbutton-multiple.open li + li {
+  border-top: 1px solid #efefef;
+  margin-top: 4px;
+  padding-bottom: 0;
+  padding-top: 4px;
+}
diff --git a/views_dropbutton/views_dropbutton.info b/views_dropbutton/views_dropbutton.info
new file mode 100644
index 0000000..592c2fc
--- /dev/null
+++ b/views_dropbutton/views_dropbutton.info
@@ -0,0 +1,2 @@
+name = Views Dropbutton
+core = 8.x
diff --git a/views_dropbutton/views_dropbutton.module b/views_dropbutton/views_dropbutton.module
new file mode 100644
index 0000000..ced5ee2
--- /dev/null
+++ b/views_dropbutton/views_dropbutton.module
@@ -0,0 +1,127 @@
+<?php
+
+/**
+ * Implements hook_theme().
+ */
+function views_dropbutton_theme($existing, $type, $theme, $path) {
+  return array(
+    'dropbutton' => array(
+      'variables' => array('title' => NULL, 'links' => NULL, 'attributes' => array()),
+    ),
+  );
+}
+
+/**
+ * Builds a render array for theme_dropbutton().
+ */
+function template_preprocess_dropbutton(&$variables) {
+  // Remove the 'inline' and 'links' classes.
+  if (!empty($variables['attributes']['class'])) {
+    foreach ($variables['attributes']['class'] as $key => $class) {
+      if ($class === 'inline' || $class === 'links') {
+        unset($variables['attributes']['class'][$key]);
+      }
+    }
+  }
+
+  $variables['element'] = array(
+    '#type' => 'container',
+    '#attached' => array(
+      'library' => array(
+        array('views_dropbutton', 'views.dropbutton'),
+      ),
+    ),
+    '#attributes' => array(
+      'class' => array(
+        'dropbutton',
+      ),
+      'id' => drupal_html_id('dropbutton'),
+    ),
+  );
+  if (count($variables['links']) > 1) {
+    $title = isset($variables['title']) ? check_plain($variables['title']) : t('Open dropbutton');
+    $variables['element']['#attributes']['class'][] = 'dropbutton-multiple';
+    $variables['element']['wrapper'] = array(
+      '#type' => 'container',
+      '#attributes' => array(
+        'class' => array(
+          'dropbutton-link',
+        ),
+      ),
+      'link' => array(
+        '#type' => 'link',
+        '#href' => '',
+        '#title' => '<span class="element-invisible">' . $title .  '</span>',
+        '#options' => array(
+          'fragment' => 'noname',
+          'html' => TRUE,
+        ),
+        '#attributes' => array(
+          'class' => array(
+            'dropbutton-arrow',
+          ),
+        ),
+      ),
+    );
+  }
+  $variables['element']['content'] = array(
+    '#type' => 'container',
+    '#attributes' => array(
+      'class' => array(
+        'dropbutton-content',
+      ),
+    ),
+    'links' => array(
+      '#theme' => 'links',
+      '#links' => $variables['links'],
+      '#attributes' => $variables['attributes'],
+    ),
+  );
+}
+
+/**
+ * Create a dropbutton menu.
+ *
+ * @param $title
+ *   The text to place in the clickable area to activate the dropbutton. This
+ *   text is indented to -9999px by default.
+ * @param $links
+ *   A list of links to provide within the dropbutton, suitable for use
+ *   in via Drupal's theme('links').
+ * @param $image
+ *   If true, the dropbutton link is an image and will not get extra decorations
+ *   that a text dropbutton link will.
+ * @param $class
+ *   An optional class to add to the dropbutton's container div to allow you
+ *   to style a single dropbutton however you like without interfering with
+ *   other dropbuttons.
+ */
+function theme_dropbutton($variables) {
+  return render($variables['element']);
+}
+
+/**
+ * Implements hook_library_info().
+ */
+function views_dropbutton_library_info() {
+  $path = drupal_get_path('module', 'views_dropbutton');
+  // Dropbutton.
+  $libraries['views.dropbutton'] = array(
+    'title' => 'Dropbutton',
+    'website' => 'http://drupal.org/node/1608878',
+    'version' => '1.0',
+    'js' => array(
+      "$path/dropbutton.js" => array(),
+    ),
+    'css' => array(
+      "$path/dropbutton.base.css" => array(),
+      "$path/dropbutton.theme.css" => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'jquery'),
+      array('system', 'jquery.once'),
+      array('system', 'drupal'),
+    ),
+  );
+  return $libraries;
+}
diff --git a/views_ui.info b/views_ui.info
index 5a9d772..b7b78b7 100644
--- a/views_ui.info
+++ b/views_ui.info
@@ -3,5 +3,6 @@ description = Administrative interface to views. Without this module, you cannot
 package = Views
 core = 8.x
 configure = admin/structure/views
+dependencies[] = views_dropbutton
 dependencies[] = views
 dependencies[] = views_ui_listing
