diff --git ctools.module ctools.module
index 59bf55f..c513c15 100644
--- ctools.module
+++ ctools.module
@@ -497,21 +497,40 @@ function ctools_cron() {
  *
  * @return $object
  *   An object containing
- *   - operator: Either 'and' or 'or'
+ *   - operator: Either 'and', 'or' or special operators intended for non-Views handlers
  *   - value: An array of numeric values.
  */
 function ctools_break_phrase($str) {
   $object = new stdClass();
 
-  if (preg_match('/^([0-9]+[+ ])+[0-9]+$/', $str)) {
-    // The '+' character in a query string may be parsed as ' '.
-    $object->operator = 'or';
-    $object->value = preg_split('/[+ ]/', $str);
+  // Split the string of items and set the operator.
+  // Note that check for space separated items must be carried out after
+  // separators containing spaces.
+  if (strpos($str, ' AND ')) {
+    $object->operator = 'special: AND ';
+    $object->value = explode(' AND ', $str);
+  }
+  elseif (strpos($str, ' OR ')) {
+    $object->operator = 'special: OR ';
+    $object->value = explode(' OR ', $str);
   }
-  else if (preg_match('/^([0-9]+,)*[0-9]+$/', $str)) {
+  elseif (strpos($str, ',')) {
     $object->operator = 'and';
     $object->value = explode(',', $str);
   }
+  elseif (strpos($str, '+')) {
+    $object->operator = 'or';
+    $object->value = explode('+', $str);
+  }
+  elseif (strpos($str, ' ')) {
+    $object->operator = 'or';
+    $object->value = explode(' ', $str);
+  }
+  // If only one (numeric) item is present, assume 'and' operator
+  elseif (is_numeric($str)) {
+    $object->operator = 'and';
+    $object->value = array($str);
+  }
 
   // Keep an 'error' value if invalid strings were given.
   if (!empty($str) && (empty($object->value) || !is_array($object->value))) {
diff --git plugins/contexts/terms.inc plugins/contexts/terms.inc
index 348987d..4e2560f 100644
--- plugins/contexts/terms.inc
+++ plugins/contexts/terms.inc
@@ -22,9 +22,9 @@ $plugin = array(
   'context name' => 'terms',
   'convert list' => array(
     'tid' => t('Term ID of first term'),
-    'tids' => t('Term ID of all term, separated by + or ,'),
+    'tids' => t('Term ID of all term, separated by + or , (or special operator)'),
     'name' => t('Term name of first term'),
-    'names' => t('Term name of all terms, separated by + or ,'),
+    'names' => t('Term name of all terms, separated by + or , (or special operator)'),
     'vid' => t('Vocabulary ID of first term'),
   ),
   'convert' => 'ctools_context_terms_convert',
@@ -55,7 +55,14 @@ function ctools_context_create_terms($empty, $data = NULL, $conf = FALSE) {
     }
     $context->data     = $data->term;
     $context->title    = $data->term->name;
-    $context->argument = implode($context->operator == 'or' ? '+' : ',', array_unique($context->tids));
+    // If special operators are used, concatenate the items with the special operator
+    if (substr($context->operator, 0, 8) == 'special:') {
+      $context->argument = implode(substr($context->operator, 8), array_unique($context->tids));
+    }
+    // If no special operators are used, concatenate with plus or comma
+    else {
+      $context->argument = implode($context->operator == 'or' ? ' + ' : ', ', array_unique($context->tids));
+    }
     return $context;
   }
 }
@@ -83,7 +90,14 @@ function ctools_context_terms_convert($context, $type) {
           while ($term = db_fetch_object($result)) {
             $names[$term->tid] = $term->name;
           }
-          $context->names = implode($context->operator == 'or' ? ' + ' : ', ', $names);
+          // If special operators are used, concatenate the names with the special operator
+          if (substr($context->operator, 0, 8) == 'special:') {
+            $context->names = implode(substr($context->operator, 8), $names);
+          }
+          else {
+            // If no special operators are used, concatenate with plus or comma
+            $context->names = implode($context->operator == 'or' ? ' + ' : ', ', $names);
+          }
         }
       }
       return $context->names;
diff --git plugins/relationships/terms_from_node.inc plugins/relationships/terms_from_node.inc
index a4ff71b..dccf79d 100644
--- plugins/relationships/terms_from_node.inc
+++ plugins/relationships/terms_from_node.inc
@@ -65,11 +65,16 @@ function ctools_terms_from_node_settings_form($conf) {
   $form['concatenator'] = array(
     '#title' => t('Concatenator'),
     '#type' => 'select',
-    '#options' => array(',' => ', (AND)', '+' => '+ (OR)'),
+    '#options' => array(
+      ',' => ', (AND)',
+      '+' => '+ (OR)',
+      ' AND ' => 'AND (special)',
+      ' OR ' => 'OR (special)',
+    ),
     '#default_value' => $conf['concatenator'],
     '#prefix' => '<div class="clear-block">',
     '#suffix' => '</div>',
-    '#description' => t("When the value from this context is passed on to a view as argument, the terms can be concatenated in the form of 1+2+3 (for OR) or 1,2,3 (for AND)."),
+    '#description' => t("When the value from this context is passed on to a view as argument, the terms can be concatenated in the form of 1+2+3 (for OR) or 1,2,3 (for AND). Special concatenators are normally intended for non-Views handlers."),
   );
 
   return $form;
