diff --git a/public/language/en-GB/pages.json b/public/language/en-GB/pages.json
index 6780f5cf5d..f6927e63a2 100644
--- a/public/language/en-GB/pages.json
+++ b/public/language/en-GB/pages.json
@@ -6,7 +6,10 @@
 	"popular-month": "Popular topics this month",
 	"popular-alltime": "All time popular topics",
 	"recent": "Recent Topics",
-	"top": "Top Voted Topics",
+	"top-day": "Top voted topics today",
+	"top-week": "Top voted topics this week",
+	"top-month": "Top voted topics this month",
+	"top-alltime": "Top Voted Topics",
 	"moderator-tools": "Moderator Tools",
 	"flagged-content": "Flagged Content",
 	"ip-blacklist": "IP Blacklist",
diff --git a/src/controllers/popular.js b/src/controllers/popular.js
index d8e7fbb4bf..138fc11817 100644
--- a/src/controllers/popular.js
+++ b/src/controllers/popular.js
@@ -3,7 +3,7 @@
 
 var async = require('async');
 var nconf = require('nconf');
-
+var validator = require('validator');
 
 var helpers = require('./helpers');
 var recentController = require('./recent');
@@ -26,7 +26,7 @@ popularController.get = function (req, res, next) {
 				data.breadcrumbs = helpers.buildBreadcrumbs(breadcrumbs);
 			}
 			var feedQs = data.rssFeedUrl.split('?')[1];
-			data.rssFeedUrl = nconf.get('relative_path') + '/popular/' + (req.query.term || 'alltime') + '.rss';
+			data.rssFeedUrl = nconf.get('relative_path') + '/popular/' + (validator.escape(String(req.query.term)) || 'alltime') + '.rss';
 			if (req.loggedIn) {
 				data.rssFeedUrl += '?' + feedQs;
 			}
diff --git a/src/controllers/recent.js b/src/controllers/recent.js
index e0d037d0f6..334d709784 100644
--- a/src/controllers/recent.js
+++ b/src/controllers/recent.js
@@ -37,7 +37,7 @@ recentController.getData = function (req, url, sort, callback) {
 	var rssToken;
 
 	if (!helpers.validFilters[filter] || (!term && req.query.term)) {
-		return callback();
+		return callback(null, null);
 	}
 	term = term || 'alltime';
 
diff --git a/src/controllers/top.js b/src/controllers/top.js
index b471acac60..718d9cfa47 100644
--- a/src/controllers/top.js
+++ b/src/controllers/top.js
@@ -2,6 +2,10 @@
 'use strict';
 
 var async = require('async');
+var nconf = require('nconf');
+var validator = require('validator');
+
+var helpers = require('./helpers');
 var recentController = require('./recent');
 
 var topController = module.exports;
@@ -15,6 +19,16 @@ topController.get = function (req, res, next) {
 			if (!data) {
 				return next();
 			}
+			var term = helpers.terms[req.query.term] || 'alltime';
+			if (req.originalUrl.startsWith(nconf.get('relative_path') + '/api/top') || req.originalUrl.startsWith(nconf.get('relative_path') + '/top')) {
+				data.title = '[[pages:top-' + term + ']]';
+			}
+
+			var feedQs = data.rssFeedUrl.split('?')[1];
+			data.rssFeedUrl = nconf.get('relative_path') + '/top/' + (validator.escape(String(req.query.term)) || 'alltime') + '.rss';
+			if (req.loggedIn) {
+				data.rssFeedUrl += '?' + feedQs;
+			}
 			res.render('top', data);
 		},
 	], next);
diff --git a/src/routes/feeds.js b/src/routes/feeds.js
index f800ab806d..f843e08e7a 100644
--- a/src/routes/feeds.js
+++ b/src/routes/feeds.js
@@ -16,11 +16,19 @@ var db = require('../database');
 var utils = require('../utils');
 var controllers404 = require('../controllers/404.js');
 
+var terms = {
+	daily: 'day',
+	weekly: 'week',
+	monthly: 'month',
+	alltime: 'alltime',
+};
+
 module.exports = function (app, middleware) {
 	app.get('/topic/:topic_id.rss', middleware.maintenanceMode, generateForTopic);
 	app.get('/category/:category_id.rss', middleware.maintenanceMode, generateForCategory);
 	app.get('/recent.rss', middleware.maintenanceMode, generateForRecent);
 	app.get('/top.rss', middleware.maintenanceMode, generateForTop);
+	app.get('/top/:term.rss', middleware.maintenanceMode, generateForTop);
 	app.get('/popular.rss', middleware.maintenanceMode, generateForPopular);
 	app.get('/popular/:term.rss', middleware.maintenanceMode, generateForPopular);
 	app.get('/recentposts.rss', middleware.maintenanceMode, generateForRecentPosts);
@@ -212,7 +220,8 @@ function generateForTop(req, res, next) {
 	if (parseInt(meta.config['feeds:disableRSS'], 10) === 1) {
 		return controllers404.send404(req, res);
 	}
-
+	var term = terms[req.params.term] || 'day';
+	var uid;
 	async.waterfall([
 		function (next) {
 			if (req.query.token && req.query.uid) {
@@ -222,13 +231,27 @@ function generateForTop(req, res, next) {
 			}
 		},
 		function (token, next) {
-			generateForTopics({
-				uid: token && token === req.query.token ? req.query.uid : req.uid,
+			uid = token && token === req.query.token ? req.query.uid : req.uid;
+
+			topics.getSortedTopics({
+				uid: uid,
+				start: 0,
+				stop: 19,
+				term: term,
+				sort: 'votes',
+			}, next);
+		},
+		function (result, next) {
+			generateTopicsFeed({
+				uid: uid,
 				title: 'Top Voted Topics',
 				description: 'A list of topics that have received the most votes',
-				feed_url: '/top.rss',
-				site_url: '/top',
-			}, 'topics:votes', req, res, next);
+				feed_url: '/top/' + (req.params.term || 'daily') + '.rss',
+				site_url: '/top/' + (req.params.term || 'daily'),
+			}, result.topics, next);
+		},
+		function (feed) {
+			sendFeed(feed, res);
 		},
 	], next);
 }
@@ -237,12 +260,7 @@ function generateForPopular(req, res, next) {
 	if (parseInt(meta.config['feeds:disableRSS'], 10) === 1) {
 		return controllers404.send404(req, res);
 	}
-	var terms = {
-		daily: 'day',
-		weekly: 'week',
-		monthly: 'month',
-		alltime: 'alltime',
-	};
+
 	var term = terms[req.params.term] || 'day';
 	var uid;
 	async.waterfall([