diff --git a/includes/markup.inc b/includes/markup.inc
new file mode 100644
index 0000000..e75e6a9
--- /dev/null
+++ b/includes/markup.inc
@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * Marks an object's __toString() method as returning markup.
+ *
+ * Objects that implement this interface will not be automatically XSS filtered
+ * by the render system or automatically escaped by the theme engine.
+ */
+interface MarkupInterface extends \JsonSerializable {
+
+  /**
+   * Returns markup.
+   *
+   * @return string
+   *   The markup.
+   */
+  public function __toString();
+
+}
+
+
+/**
+ * Defines an object that passes safe strings through the Views render system.
+ *
+ * This object should only be constructed with a known safe string. If there is
+ * any risk that the string contains user-entered data that has not been
+ * filtered first, it must not be used.
+ */
+class view_markup implements MarkupInterface, \Countable {
+
+  /**
+   * The safe string.
+   *
+   * @var string
+   */
+  protected $string;
+
+  /**
+   * Creates a Markup object if necessary.
+   *
+   * If $string is equal to a blank string then it is not necessary to create a
+   * Markup object. If $string is an object that implements MarkupInterface it
+   * is returned unchanged.
+   *
+   * @param mixed $string
+   *   The string to mark as safe. This value will be cast to a string.
+   *
+   * @return \MarkupInterface
+   *   A safe string.
+   */
+  public static function create($string) {
+    if ($string instanceof MarkupInterface) {
+      return $string;
+    }
+    $string = (string) $string;
+    if ($string === '') {
+      return '';
+    }
+    $safe_string = new static();
+    $safe_string->string = $string;
+    return $safe_string;
+  }
+
+  /**
+   * Returns the string version of the Markup object.
+   *
+   * @return string
+   *   The safe string content.
+   */
+  public function __toString() {
+    return $this->string;
+  }
+
+  /**
+   * Returns the string length.
+   *
+   * @return int
+   *   The length of the string.
+   */
+  public function count() {
+    return strlen($this->string);
+  }
+
+  /**
+   * Returns a representation of the object for use in JSON serialization.
+   *
+   * @return string
+   *   The safe string content.
+   */
+  public function jsonSerialize() {
+    return $this->__toString();
+  }
+
+}
diff --git a/modules/node/views_plugin_row_node_rss.inc b/modules/node/views_plugin_row_node_rss.inc
index 6671892..83fb1cc 100644
--- a/modules/node/views_plugin_row_node_rss.inc
+++ b/modules/node/views_plugin_row_node_rss.inc
@@ -74,7 +74,6 @@ class views_plugin_row_node_rss extends views_plugin_row {
     return check_plain($options[$this->options['item_length']]);
   }
 
-
   function pre_render($values) {
     $nids = array();
     foreach ($values as $row) {
@@ -158,10 +157,12 @@ class views_plugin_row_node_rss extends views_plugin_row {
       $item_text .= drupal_render($build);
     }
 
+    views_include('markup');
+
     $item = new stdClass();
-    $item->description = $item_text;
-    $item->title = $node->title;
-    $item->link = $node->link;
+    $item->title = view_markup::create(check_plain($node->title));
+    $item->description = view_markup::create(check_plain($item_text));
+    $item->link = view_markup::create($node->link);
     $item->elements = $node->rss_elements;
     $item->nid = $node->nid;
 
diff --git a/plugins/views_plugin_row_rss_fields.inc b/plugins/views_plugin_row_rss_fields.inc
index 9355e83..e498ed6 100644
--- a/plugins/views_plugin_row_rss_fields.inc
+++ b/plugins/views_plugin_row_rss_fields.inc
@@ -122,25 +122,28 @@ class views_plugin_row_rss_fields extends views_plugin_row {
 
     // Create the RSS item object.
     $item = new stdClass();
-    $item->title = $this->get_field($row_index, $this->options['title_field']);
-    $item->link = url($this->get_field($row_index, $this->options['link_field']), array('absolute' => TRUE));
-    $item->description = $this->get_field($row_index, $this->options['description_field']);
+    $item->title = view_markup::create($this->get_field($row_index, $this->options['title_field']));
+    $item->link = view_markup::create(url($this->get_field($row_index, $this->options['link_field']), array('absolute' => TRUE)));
+    $item->description = view_markup::create($this->get_field($row_index, $this->options['description_field']));
+
     $item->elements = array(
       array('key' => 'pubDate', 'value' => $this->get_field($row_index, $this->options['date_field'])),
       array(
         'key' => 'dc:creator',
-        'value' => $this->get_field($row_index, $this->options['creator_field']),
+        'encoded' => TRUE,
+        'value' => view_markup::create($this->get_field($row_index, $this->options['creator_field'])),
         'namespace' => array('xmlns:dc' => 'http://purl.org/dc/elements/1.1/'),
       ),
     );
     $guid_is_permalink_string = 'false';
-    $item_guid = $this->get_field($row_index, $this->options['guid_field_options']['guid_field']);
+    $item_guid = view_markup::create($this->get_field($row_index, $this->options['guid_field_options']['guid_field']));
     if ($this->options['guid_field_options']['guid_field_is_permalink']) {
       $guid_is_permalink_string = 'true';
-      $item_guid = url($item_guid, array('absolute' => TRUE));
+      $item_guid = view_markup::create(url($item_guid, array('absolute' => TRUE)));
     }
     $item->elements[] = array(
       'key' => 'guid',
+      'encoded' => TRUE,
       'value' => $item_guid,
       'attributes' => array('isPermaLink' => $guid_is_permalink_string),
     );
diff --git a/theme/theme.inc b/theme/theme.inc
index e7f7a15..4863cdb 100644
--- a/theme/theme.inc
+++ b/theme/theme.inc
@@ -927,9 +927,9 @@ function template_preprocess_views_view_row_rss(&$vars) {
   $options  = &$vars['options'];
   $item     = &$vars['row'];
 
-  $vars['title'] = check_plain($item->title);
-  $vars['link'] = check_url($item->link);
-  $vars['description'] = check_plain($item->description);
+  $vars['title'] = ($item->title instanceof MarkupInterface) ? $item->title : check_plain($item->title);
+  $vars['link'] = ($item->link instanceof MarkupInterface) ? $item->link : check_url($item->link);
+  $vars['description'] = ($item->description instanceof MarkupInterface) ? $item->description : check_plain($item->description);
   $vars['item_elements'] = empty($item->elements) ? '' : format_xml_elements($item->elements);
 }
 
diff --git a/views.info b/views.info
index 5189bea..5e59c17 100644
--- a/views.info
+++ b/views.info
@@ -66,6 +66,7 @@ files[] = includes/base.inc
 files[] = includes/handlers.inc
 files[] = includes/plugins.inc
 files[] = includes/view.inc
+files[] = includes/markup.inc
 ; Modules
 files[] = modules/aggregator/views_handler_argument_aggregator_fid.inc
 files[] = modules/aggregator/views_handler_argument_aggregator_iid.inc
