diff --git a/plugins/wysiwyg/pullquote.inc b/plugins/wysiwyg/pullquote.inc
new file mode 100644
index 0000000..58e3f6f
--- /dev/null
+++ b/plugins/wysiwyg/pullquote.inc
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * Implements hook_INCLUDE_plugin().
+ * See wysiwyg.api.php
+ */
+function pullquote_pullquote_plugin() {
+  $plugins['pullquote'] = array(
+    'title' => t('Pull quote'),
+    'vendor url' => 'http://drupal.org/project/pullquote',
+    'icon file' => 'pullquote.gif',
+    'icon title' => t('Insert a pull quote'),
+    'settings' => array(),
+    'extended_valid_elements' => array(
+      'span[class]',
+    ),
+  );
+  return $plugins;
+}
diff --git a/plugins/wysiwyg/pullquote/images/pullquote.gif b/plugins/wysiwyg/pullquote/images/pullquote.gif
new file mode 100644
index 0000000000000000000000000000000000000000..84c174d8fd2cb836d3dfdd776996846d7a0684ef
GIT binary patch
literal 85
zcmZ?wbhEHb6k!l%n8?H+)GWln!0`Y7e;}#&lZBCifr&u}$Yub^Gcc)5>0f!8>;4Vq
mq+`i%*GlC1OCI!K>)pQ8`{cG)+}l5KT)*ve>zAA;gEauNv>Ukq

literal 0
HcmV?d00001

diff --git a/plugins/wysiwyg/pullquote/pullquote.css b/plugins/wysiwyg/pullquote/pullquote.css
new file mode 100644
index 0000000..99c303c
--- /dev/null
+++ b/plugins/wysiwyg/pullquote/pullquote.css
@@ -0,0 +1,3 @@
+span.pullquote {
+  border-bottom: 2px dotted green;
+}
\ No newline at end of file
diff --git a/plugins/wysiwyg/pullquote/pullquote.js b/plugins/wysiwyg/pullquote/pullquote.js
new file mode 100644
index 0000000..f2f74c2
--- /dev/null
+++ b/plugins/wysiwyg/pullquote/pullquote.js
@@ -0,0 +1,40 @@
+(function ($) {
+
+Drupal.wysiwyg.plugins['pullquote'] = {
+
+  isNode: function(node) {
+    return ($(node).is('span.pullquote'));
+  },
+
+  invoke: function(data, settings, instanceId) {
+    console.log(data);
+    if (data.format == 'html') {
+      if ($(data.node).is('span.pullquote')) {
+        // pullquote already here so unwrap
+        if (data.content == '') {
+          // no selected text. wrap just the current node
+          $(data.node).replaceWith($(data.node).html());
+        }
+        else {
+          // unwrap the selected text
+          Drupal.wysiwyg.instances[instanceId].insert(
+            $(data.content).remove().html()
+          );
+        }
+      }
+      else {
+        // not looking at a pullquote so wrap
+        if (data.content == '') {
+          $(data.node).wrapInner('<span class="pullquote" />');
+        }
+        else {
+          Drupal.wysiwyg.instances[instanceId].insert(
+            $('<div>').append($('<span class="pullquote" />').append(data.content)).remove().html()
+          );
+        }
+      }
+    }
+  },
+};
+
+})(jQuery);
diff --git a/pullquote.module b/pullquote.module
index 0cc9a4b..42c68f8 100644
--- a/pullquote.module
+++ b/pullquote.module
@@ -25,3 +25,13 @@ function pullquote_help($path, $arg) {
   }
   return $output;
 }
+
+/**
+ * Implements hook_wysiwyg_include_directory().
+ */
+function pullquote_wysiwyg_include_directory($type) {
+  switch ($type) {
+    case 'plugins':
+      return 'plugins/wysiwyg';
+  }
+}
