diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb
index f595ada8676..ad0e8cb5409 100644
--- a/app/controllers/posts_controller.rb
+++ b/app/controllers/posts_controller.rb
@@ -9,7 +9,7 @@ class PostsController < ApplicationController
   # Need to be logged in for all actions here
   before_filter :ensure_logged_in, except: [:show, :replies, :by_number, :short_link, :reply_history, :revisions, :latest_revision, :expand_embed, :markdown_id, :markdown_num, :cooked, :latest]
 
-  skip_before_filter :preload_json, :check_xhr, only: [:markdown_id, :markdown_num, :short_link]
+  skip_before_filter :preload_json, :check_xhr, only: [:markdown_id, :markdown_num, :short_link, :latest]
 
   def markdown_id
     markdown Post.find(params[:id].to_i)
@@ -42,16 +42,26 @@ class PostsController < ApplicationController
     # Remove posts the user doesn't have permission to see
     # This isn't leaking any information we weren't already through the post ID numbers
     posts = posts.reject { |post| !guardian.can_see?(post) }
-
     counts = PostAction.counts_for(posts, current_user)
 
-    render_json_dump(serialize_data(posts,
-                                    PostSerializer,
-                                    scope: guardian,
-                                    root: 'latest_posts',
-                                    add_raw: true,
-                                    all_post_actions: counts)
-    )
+    respond_to do |format|
+      format.rss do
+        @posts = posts
+        @title = "#{SiteSetting.title} - #{I18n.t("rss_description.posts")}"
+        @link = Discourse.base_url
+        @description = I18n.t("rss_description.posts")
+        render 'posts/latest', formats: [:rss]
+      end
+      format.json do
+        render_json_dump(serialize_data(posts,
+                                        PostSerializer,
+                                        scope: guardian,
+                                        root: 'latest_posts',
+                                        add_raw: true,
+                                        all_post_actions: counts)
+                                      )
+      end
+    end
   end
 
   def cooked
diff --git a/app/views/posts/latest.rss.erb b/app/views/posts/latest.rss.erb
new file mode 100644
index 00000000000..04aeb027870
--- /dev/null
+++ b/app/views/posts/latest.rss.erb
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<rss version="2.0" xmlns:discourse="http://www.discourse.org/" xmlns:atom="http://www.w3.org/2005/Atom">
+  <channel>
+    <% lang = SiteSetting.find_by_name('default_locale').try(:value) %>
+    <% site_email = SiteSetting.find_by_name('contact_email').try(:value) %>
+    <title><%= @title %></title>
+    <link><%= @link %></link>
+    <description><%= @description %></description>
+    <% @posts.each do |post| %>
+      <% next unless post.user %>
+      <item>
+        <title><%= post.topic.title %></title>
+        <author><%= "no-reply@example.com (@#{post.user.username}#{" #{post.user.name}" if (post.user.name.present? && SiteSetting.enable_names?)})" -%></author>
+        <description><![CDATA[ <%= post.cooked.html_safe %> ]]></description>
+        <link><%= Discourse.base_url + post.url %></link>
+        <pubDate><%= post.created_at.rfc2822 %></pubDate>
+        <guid isPermaLink="false">post-<%= post.id %></guid>
+      </item>
+    <% end %>
+  </channel>
+</rss>
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index 9ca22fef336..fc8525206f4 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -173,6 +173,7 @@ en:
   rss_description:
     latest: "Latest topics"
     hot: "Hot topics"
+    posts: "Latest posts"
   too_late_to_edit: "That post was created too long ago. It can no longer be edited or deleted."
 
   excerpt_image: "image"