diff --git a/lib/Drupal/twitter/Plugin/Filter/TwitterFilterHashtag.php b/lib/Drupal/twitter/Plugin/Filter/TwitterFilterHashtag.php
new file mode 100644
index 0000000..3988d76
--- /dev/null
+++ b/lib/Drupal/twitter/Plugin/Filter/TwitterFilterHashtag.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\twitter\Plugin\Filter\TwitterFilterHashtag.
+ */
+
+namespace Drupal\twitter\Plugin\Filter;
+
+use Drupal\filter\Annotation\Filter;
+use Drupal\Core\Annotation\Translation;
+use Drupal\filter\Plugin\FilterBase;
+
+/**
+ * Provides a filter to convert twitter hashtag references into links.
+ *
+ * @Filter(
+ *   id = "twitter_hashtag",
+ *   module = "twitter",
+ *   title = @Translation("Twitter #hashtag converter"),
+ *   description = @Translation("Converts Twitter-style #hashtags into links to hashtags.org."),
+ *   type = FILTER_TYPE_TRANSFORM_IRREVERSIBLE
+ * )
+ */
+class TwitterFilterHashtag extends FilterBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function process($text, $langcode, $cache, $cache_id) {
+    $prefix = '#';
+    $destination = config('twitter.settings')->get('search') . '?q=%23';
+    return _twitter_filter_text($text, $prefix, $destination);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function tips($long = FALSE) {
+    $search_url = config('twitter.settings')->get('search');
+    return t('Twitter-style #hashtags are linked to !url.', array(
+      '!url' => l($search_url, $search_url))
+    );
+  }
+
+}
diff --git a/lib/Drupal/twitter/Plugin/Filter/TwitterFilterLinks.php b/lib/Drupal/twitter/Plugin/Filter/TwitterFilterLinks.php
new file mode 100644
index 0000000..e909a2b
--- /dev/null
+++ b/lib/Drupal/twitter/Plugin/Filter/TwitterFilterLinks.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\twitter\Plugin\Filter\TwitterFilterLinks.
+ */
+
+namespace Drupal\twitter\Plugin\Filter;
+
+use Drupal\filter\Annotation\Filter;
+use Drupal\Core\Annotation\Translation;
+use Drupal\filter\Plugin\FilterBase;
+
+/**
+ * Provides a filter to optimize SEO in twitter links.
+ *
+ * @Filter(
+ *   id = "twitter_links",
+ *   module = "twitter",
+ *   title = @Translation("Twitter link converter"),
+ *   description = @Translation("Makes links in Twitter messages to be opened in new windows and adds rel=nofollow so these links do not penalize SEO."),
+ *   type = FILTER_TYPE_TRANSFORM_IRREVERSIBLE
+ * )
+ */
+class TwitterFilterLinks extends FilterBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function process($text, $langcode, $cache, $cache_id) {
+    return str_replace("<a ", '<a target="_blank" rel="nofollow" ', $text);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function tips($long = FALSE) {
+    return t('Twitter message links are opened in new windows and rel="nofollow" is added.');
+  }
+
+}
diff --git a/lib/Drupal/twitter/Plugin/Filter/TwitterFilterUsername.php b/lib/Drupal/twitter/Plugin/Filter/TwitterFilterUsername.php
new file mode 100644
index 0000000..a4e137e
--- /dev/null
+++ b/lib/Drupal/twitter/Plugin/Filter/TwitterFilterUsername.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\twitter\Plugin\Filter\TwitterFilterUsername.
+ */
+
+namespace Drupal\twitter\Plugin\Filter;
+
+use Drupal\filter\Annotation\Filter;
+use Drupal\Core\Annotation\Translation;
+use Drupal\filter\Plugin\FilterBase;
+
+/**
+ * Provides a filter to convert twitter username references into links.
+ *
+ * @Filter(
+ *   id = "twitter_username",
+ *   module = "twitter",
+ *   title = @Translation("Twitter @username converter"),
+ *   description = @Translation("Converts Twitter-style @usernames into links to Twitter account pages.ernames into links to Twitter account pages."),
+ *   type = FILTER_TYPE_TRANSFORM_IRREVERSIBLE
+ * )
+ */
+class TwitterFilterUsername extends FilterBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function process($text, $langcode, $cache, $cache_id) {
+    $prefix = '@';
+    $destination = config('twitter.settings')->get('host') . '/';
+    return _twitter_filter_text($text, $prefix, $destination);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function tips($long = FALSE) {
+    return t('Twitter-style @usernames are linked to their Twitter account pages.');
+  }
+
+}
diff --git a/twitter.module b/twitter.module
index 54e8291..945d39b 100644
--- a/twitter.module
+++ b/twitter.module
@@ -201,79 +201,18 @@ function twitter_cron() {
 }
 
 /**
- * Implements hook_filter_info()
- */
-function twitter_filter_info() {
-  $filters['twitter_username'] = array(
-    'title' => t('Twitter @username converter'),
-    'description' => t('Converts Twitter-style @usernames into links to Twitter account pages.'),
-    'type' => FILTER_TYPE_TRANSFORM_IRREVERSIBLE,
-    'process callback' => '_twitter_filter_username',
-    'tips callback' => '_twitter_filter_tip_username',
-  );
-  $filters['twitter_hashtag'] = array(
-    'title' => t('Twitter #hashtag converter'),
-    'description' => t('Converts Twitter-style #hashtags into links to hashtags.org.'),
-    'type' => FILTER_TYPE_TRANSFORM_IRREVERSIBLE,
-    'process callback' => '_twitter_filter_hashtag',
-    'tips callback' => '_twitter_filter_tip_hashtag',
-  );
-  $filters['twitter_links'] = array(
-    'title' => t('Twitter link converter'),
-    'description' => t('Makes links in Twitter messages to be opened in new windows and adds ' .
-                       'rel="nofollow" so these links do not penalize SEO.'),
-    'type' => FILTER_TYPE_TRANSFORM_IRREVERSIBLE,
-    'process callback' => '_twitter_filter_link',
-    'tips callback' => '_twitter_filter_tip_link',
-  );
-
-  return $filters;
-}
-
-/**
- * Filter tips callback function for Twitter usernames.
- */
-function _twitter_filter_tip_username($filter, $format, $long = FALSE) {
-  return t('Twitter-style @usernames are linked to their Twitter account pages.');
-}
-
-/**
- * Filter tips callback function for Twitter hashtags.
- */
-function _twitter_filter_tip_hashtag($format, $long = FALSE) {
-  return t('Twitter-style #hashtags are linked to !url.', array(
-    '!url' => '<a href="http://search.twitter.com/">search.twitter.com</a>')
-  );
-}
-
-/**
- * Filter tips callback function for Twitter links.
- */
-function _twitter_filter_tip_link($filter, $format, $long = FALSE) {
-  return t('Twitter message links are opened in new windows and rel="nofollow" is added.');
-}
-
-/**
- * Callback for twitter @username converter.
- */
-function _twitter_filter_username($text, $filter) {
-  $prefix = '@';
-  $destination = config('twitter.settings')->get('host') . '/';
-  return _twitter_filter_text($text, $prefix, $destination);
-}
-
-/**
- * Callback for twitter #hashtag converter.
- */
-function _twitter_filter_hashtag($text, $filter) {
-  $prefix = '#';
-  $destination = config('twitter.settings')->get('search') . '/search?q=%23';
-  return _twitter_filter_text($text, $prefix, $destination);
-}
-
-/**
  * This helper function converts Twitter-style @usernames and #hashtags into
  * actual links.
+ *
+ * @param string $text
+ *   The text string to be filtered.
+ * @param string $prefix
+ *   The Twitter prefix to filter by.
+ * @param string $destination
+ *   The base url for links filtered.
+ *
+ * @return string
+ *   The filtered text.
  */
 function _twitter_filter_text($text, $prefix, $destination) {
   $matches = array(
@@ -290,13 +229,6 @@ function _twitter_filter_text($text, $prefix, $destination) {
 }
 
 /**
- * Callback for twitter link converter.
- */
-function _twitter_filter_link($text, $filter) {
-  return str_replace("<a ", '<a target="_blank" rel="nofollow" ', $text);
-}
-
-/**
  * Implements hook_views_api().
  */
 function twitter_views_api() {
