diff --git a/includes/common.inc b/includes/common.inc
index 864acc9..2d1581c 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -354,6 +354,11 @@ function drupal_get_html_head() {
 function drupal_add_feed($url = NULL, $title = '') {
   $stored_feed_links = &drupal_static(__FUNCTION__, array());
 
+  // If RSS syndication is disabled, return an empty array.
+  if (variable_get('feed_enabled', 1) == 0) {
+    return $stored_feed_links;
+  }
+
   if (isset($url)) {
     $stored_feed_links[$url] = theme('feed_icon', array('url' => $url, 'title' => $title));
 
diff --git a/modules/node/node.module b/modules/node/node.module
index 30e9559..fb93a03 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -1523,6 +1523,9 @@ function node_permission() {
     'access content' => array(
       'title' => t('View published content'),
     ),
+    'access rss feeds' => array(
+      'title' => t('View RSS feeds'),
+    ),
     'view own unpublished content' => array(
       'title' => t('View own unpublished content'),
     ),
@@ -1949,7 +1952,7 @@ function node_menu() {
   $items['rss.xml'] = array(
     'title' => 'RSS feed',
     'page callback' => 'node_feed',
-    'access arguments' => array('access content'),
+    'access arguments' => array('access rss feeds'),
     'type' => MENU_CALLBACK,
   );
   // @todo Remove this loop when we have a 'description callback' property.
@@ -2123,12 +2126,16 @@ function node_block_view($delta = '') {
 
   switch ($delta) {
     case 'syndicate':
-      $block['subject'] = t('Syndicate');
-      $block['content'] = array(
-        '#theme' => 'feed_icon',
-        '#url' => 'rss.xml',
-        '#title' => t('Syndicate'),
-      );
+      // Only show this block if feeds are enabled and the current user
+      // has permission to access rss feeds.
+      if (variable_get('feed_enabled', 1) == 1 && user_access('access rss feeds')) {
+        $block['subject'] = t('Syndicate');
+        $block['content'] = array(
+          '#theme' => 'feed_icon',
+          '#url' => 'rss.xml',
+          '#title' => t('Syndicate'),
+        );
+      }
       break;
 
     case 'recent':
@@ -2153,6 +2160,13 @@ function node_block_view($delta = '') {
  */
 function node_block_configure($delta = '') {
   $form = array();
+  if ($delta == 'syndicate') {
+    // Show a warning on the syndicate block configuration if feeds
+    // are disabled.
+    if (variable_get('feed_enabled', 1) == 0) {
+      drupal_set_message(t('RSS syndication is currently disabled. You can enable it at !link.', array('!link' => l('RSS publishing settings', 'admin/config/services/rss-publishing'))), 'warning');
+    }
+  }
   if ($delta == 'recent') {
     $form['node_recent_block_count'] = array(
       '#type' => 'select',
@@ -2448,6 +2462,12 @@ function node_block_list_alter(&$blocks) {
 function node_feed($nids = FALSE, $channel = array()) {
   global $base_url, $language_content;
 
+  // If RSS feeds are disabled, return a simple page not found.
+  if (variable_get('feed_enabled', 1) == 0) {
+    drupal_not_found();
+    return;
+  }
+
   if ($nids === FALSE) {
     $nids = db_select('node', 'n')
       ->fields('n', array('nid', 'created'))
diff --git a/modules/system/system.admin.inc b/modules/system/system.admin.inc
index c63d00a..b2a1996 100644
--- a/modules/system/system.admin.inc
+++ b/modules/system/system.admin.inc
@@ -1835,6 +1835,13 @@ function system_image_toolkit_settings() {
  * @see system_settings_form()
  */
 function system_rss_feeds_settings() {
+  $form['feed_enabled'] = array(
+    '#type' => 'radios',
+    '#title' => t('RSS feed publishing'),
+    '#options' => array(0 => ('Disabled'), 1 => t('Enabled')),
+    '#default_value' => variable_get('feed_enabled', 1),
+    '#description' => t('You can enable or disable site-wide RSS feed publishing.')
+  );
   $form['feed_description'] = array(
     '#type' => 'textarea',
     '#title' => t('Feed description'),
diff --git a/profiles/minimal/minimal.install b/profiles/minimal/minimal.install
index 059f038..73ff85c 100644
--- a/profiles/minimal/minimal.install
+++ b/profiles/minimal/minimal.install
@@ -70,6 +70,6 @@ function minimal_install() {
   variable_set('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL);
 
   // Enable default permissions for system roles.
-  user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access content'));
-  user_role_grant_permissions(DRUPAL_AUTHENTICATED_RID, array('access content'));
+  user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access content', 'access rss feeds'));
+  user_role_grant_permissions(DRUPAL_AUTHENTICATED_RID, array('access content', 'access rss feeds'));
 }
diff --git a/profiles/standard/standard.install b/profiles/standard/standard.install
index 5d44717..46b9047 100644
--- a/profiles/standard/standard.install
+++ b/profiles/standard/standard.install
@@ -389,8 +389,8 @@ function standard_install() {
 
   // Enable default permissions for system roles.
   $filtered_html_permission = filter_permission_name($filtered_html_format);
-  user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access content', 'access comments', $filtered_html_permission));
-  user_role_grant_permissions(DRUPAL_AUTHENTICATED_RID, array('access content', 'access comments', 'post comments', 'skip comment approval', $filtered_html_permission));
+  user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access content', 'access rss feeds', 'access comments', $filtered_html_permission));
+  user_role_grant_permissions(DRUPAL_AUTHENTICATED_RID, array('access content', 'access rss feeds', 'access comments', 'post comments', 'skip comment approval', $filtered_html_permission));
 
   // Create a default role for site administrators, with all available permissions assigned.
   $admin_role = new stdClass();
