diff --git a/includes/processor_stopwords.inc b/includes/processor_stopwords.inc
new file mode 100644
index 0000000..c4a4184
--- /dev/null
+++ b/includes/processor_stopwords.inc
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * Processor for removing stopwords from index and search terms.
+ */
+class SearchApiStopWords extends SearchApiAbstractProcessor {
+
+  public function configurationForm() {
+    $form = array(
+      'stopwords' => array(
+        '#type' => 'textarea',
+        '#title' => t('Stopwords'),
+        '#description' => t('Enter a comma separated list of !stopwords that are removed from content before it is indexed and from search terms before searching.', array('!stopwords' => l(t('stop words'), "http://en.wikipedia.org/wiki/Stop_words", array('external' => TRUE)))),
+        '#default_value' => t('but, did, the, etc'),
+      ),
+    );
+
+    if (!empty($this->options)) {
+      $form['stopwords']['#default_value'] = $this->options['stopwords'];
+    }
+    return $form;
+  }
+
+  function configurationFormValidate(array $form, array &$values, array &$form_state) {
+    $stopwords = trim($values['stopwords']);
+    if (empty($stopwords)) {
+      $el = $form['stopwords'];
+      form_error($el, $el['#title'] . ': ' . t('At least one stopword is required.'));
+    }
+  }
+
+  // @todo Do we need to make sure there is a full text field?
+  public function preprocessSearchQuery(SearchApiQuery $query) {
+    $stopwords = $this->getStopWords();
+    if (!is_array($stopwords)) {
+      return;
+    }
+    $keys = $query->getKeys();
+    foreach ($keys as $key => $value) {
+      if (is_numeric($key) && in_array($value, $stopwords)) {
+        unset($keys[$key]);
+        $this->ignored[] = $value;
+      }
+    }
+  }
+
+  public function postprocessSearchResults(array &$response, SearchApiQuery $query) {
+    // This adds stopped search terms to the message about short or common keys.
+    $response['ignored'] += $this->ignored;
+  }
+
+  public function preprocessIndexItems(array &$items) {
+    foreach ($items as &$item) {
+      foreach ($item as $name => &$field) {
+        if ($this->testField($name, $field)) {
+          $this->stopWords($field);
+        }
+      }
+    }
+  }
+
+  protected function stopWords(&$field) {
+    $stopwords = $this->getStopWords();
+    if (!is_array($stopwords)) {
+      return;
+    }
+    foreach ($field['value'] as $key => &$value) {
+      $words = $this->processWords($value['value']) ;
+      if (is_array($words)) {
+        $value['value'] = implode(' ', array_diff($words, $stopwords));
+      }
+    }
+  }
+
+  protected function getStopWords() {
+    $stopwords = str_replace(' ', '', $this->options['stopwords']);
+    return explode(',', $stopwords);
+  }
+
+  protected function processWords($value) {
+    $words = explode(' ', $value);
+    if ($words) {
+      return (array_filter($words));
+    }
+    return FALSE;
+  }
+}
diff --git a/search_api.info b/search_api.info
index d444c92..bec4967 100644
--- a/search_api.info
+++ b/search_api.info
@@ -17,6 +17,7 @@ files[] = includes/processor.inc
 files[] = includes/processor_html_filter.inc
 files[] = includes/processor_ignore_case.inc
 files[] = includes/processor_tokenizer.inc
+files[] = includes/processor_stopwords.inc
 files[] = includes/query.inc
 files[] = includes/server_entity.inc
 files[] = includes/service.inc
diff --git a/search_api.module b/search_api.module
index 56d7220..b893187 100644
--- a/search_api.module
+++ b/search_api.module
@@ -677,6 +677,14 @@ function search_api_search_api_processor_info() {
     'class' => 'SearchApiHtmlFilter',
     'weight' => 10,
   );
+  $processors['search_api_stopwords'] = array(
+    'name' => t('Stopwords'),
+    'description' => t('This processor prevents collections of words from being indexed and removes them from search terms.' .
+        'Using stopwords can reduce the size of your search index and may offer some small performance gains.' .
+        'However, phrase searching will fail when a stopword is within a searched phrase.'),
+    'class' => 'SearchApiStopWords',
+    'weight' => 15,
+  );
   $processors['search_api_tokenizer'] = array(
     'name' => t('Tokenizer'),
     'description' => t('Tokenizes fulltext data by stripping whitespace. ' .
@@ -685,7 +693,6 @@ function search_api_search_api_processor_info() {
     'class' => 'SearchApiTokenizer',
     'weight' => 20,
   );
-
   return $processors;
 }
 
