diff --git a/include/functions.php b/include/functions.php
index dc67b028a4d899f2f9bff9956db33af6ed64f5db..d328ea19d99d870730fd075065d8c89c300ad134 100644
--- a/include/functions.php
+++ b/include/functions.php
@@ -1912,6 +1912,8 @@
 				"prev_article" => __("Open previous article"),
 				"next_article_noscroll" => __("Open next article (don't scroll long articles)"),
 				"prev_article_noscroll" => __("Open previous article (don't scroll long articles)"),
+				"next_article_noexpand" => __("Move to next article (don't expand or mark read)"),
+				"prev_article_noexpand" => __("Move to previous article (don't expand or mark read)"),
 				"search_dialog" => __("Show search dialog")),
 			__("Article") => array(
 				"toggle_mark" => __("Toggle starred"),
@@ -1928,6 +1930,7 @@
 				"select_article_cursor" => __("Select article under cursor"),
 				"email_article" => __("Email article"),
 				"close_article" => __("Close/collapse article"),
+				"toggle_expand" => __("Toggle article expansion (combined mode)"),
 				"toggle_widescreen" => __("Toggle widescreen mode"),
 				"toggle_embed_original" => __("Toggle embed original")),
 			__("Article selection") => array(
diff --git a/js/tt-rss.js b/js/tt-rss.js
index 51257a693ec0fb4b4639073ffabe334424dcc008..8c5a657491087500995a7237f316f88cbf12424c 100644
--- a/js/tt-rss.js
+++ b/js/tt-rss.js
@@ -282,6 +282,12 @@ function init() {
 		hotkey_actions["prev_article_noscroll"] = function() {
 				moveToPost('prev', true);
 		};
+		hotkey_actions["next_article_noexpand"] = function() {
+				moveToPost('next', true, true);
+		};
+		hotkey_actions["prev_article_noexpand"] = function() {
+				moveToPost('prev', true, true);
+		};
 		hotkey_actions["collapse_article"] = function() {
 				var id = getActiveArticleId();
 				var elem = $("CICD-"+id);
@@ -292,6 +298,16 @@ function init() {
 					cdmExpandArticle(id);
 				}
 		};
+		hotkey_actions["toggle_expand"] = function() {
+				var id = getActiveArticleId();
+				var elem = $("CICD-"+id);
+				if(elem.visible()) {
+					cdmUnexpandArticle(null, id);
+				}
+				else {
+					cdmExpandArticle(id);
+				}
+		};
 		hotkey_actions["search_dialog"] = function() {
 				search();
 		};
diff --git a/js/viewfeed.js b/js/viewfeed.js
index 76f9bbaeed74d2076c9759da8e544f1fbb721e34..db1a4bf94c982bba1c9eb1b8f2a93853876c6db3 100644
--- a/js/viewfeed.js
+++ b/js/viewfeed.js
@@ -241,7 +241,7 @@ function render_article(article) {
 	}
 }
 
-function showArticleInHeadlines(id) {
+function showArticleInHeadlines(id, noexpand) {
 
 	try {
 		selectArticles("none");
@@ -252,7 +252,8 @@ function showArticleInHeadlines(id) {
 
 		var article_is_unread = crow.hasClassName("Unread");
 
-		crow.removeClassName("Unread");
+		if (!noexpand)
+			crow.removeClassName("Unread");
 		crow.addClassName("active");
 
 		selectArticles('none');
@@ -268,7 +269,7 @@ function showArticleInHeadlines(id) {
 
 		markHeadline(id);
 
-		if (article_is_unread)
+		if (article_is_unread && !noexpand)
 			_force_scheduled_update = true;
 
 	} catch (e) {
@@ -336,7 +337,7 @@ function article_callback2(transport, id) {
 	}
 }
 
-function view(id) {
+function view(id, activefeed, noexpand) {
 	try {
 		var oldrow = $("RROW-" + getActiveArticleId());
 		if (oldrow) oldrow.removeClassName("active");
@@ -344,6 +345,11 @@ function view(id) {
 		var crow = $("RROW-" + id);
 
 		if (!crow) return;
+		if (noexpand) {
+			setActiveArticleId(id);
+			showArticleInHeadlines(id, noexpand);
+			return;
+		}
 
 		console.log("loading article: " + id);
 
@@ -499,7 +505,7 @@ function togglePub(id, client_only, no_effects, note) {
 	}
 }
 
-function moveToPost(mode, noscroll) {
+function moveToPost(mode, noscroll, noexpand) {
 
 	try {
 
@@ -546,13 +552,13 @@ function moveToPost(mode, noscroll) {
 						scrollArticle(ctr.offsetHeight/4);
 
 					} else if (next_id) {
-						cdmExpandArticle(next_id);
+						cdmExpandArticle(next_id, noexpand);
 						cdmScrollToArticleId(next_id, true);
 					}
 
 				} else if (next_id) {
 					correctHeadlinesOffset(next_id);
-					view(next_id, getActiveFeedId());
+					view(next_id, getActiveFeedId(), noexpand);
 				}
 			}
 		}
@@ -570,7 +576,7 @@ function moveToPost(mode, noscroll) {
 						if (!noscroll && article.offsetTop < ctr.scrollTop) {
 							scrollArticle(-ctr.offsetHeight/4);
 						} else {
-							cdmExpandArticle(prev_id);
+							cdmExpandArticle(prev_id, noexpand);
 							cdmScrollToArticleId(prev_id, true);
 						}
 					} else {
@@ -579,17 +585,17 @@ function moveToPost(mode, noscroll) {
 							scrollArticle(-ctr.offsetHeight/3);
 						} else if (!noscroll && prev_article &&
 								prev_article.offsetTop < ctr.scrollTop) {
-							cdmExpandArticle(prev_id);
+							cdmExpandArticle(prev_id, noexpand);
 							scrollArticle(-ctr.offsetHeight/4);
 						} else if (prev_id) {
-							cdmExpandArticle(prev_id);
+							cdmExpandArticle(prev_id, noexpand);
 							cdmScrollToArticleId(prev_id, noscroll);
 						}
 					}
 
 				} else if (prev_id) {
 					correctHeadlinesOffset(prev_id);
-					view(prev_id, getActiveFeedId());
+					view(prev_id, getActiveFeedId(), noexpand);
 				}
 			}
 		}
@@ -1375,7 +1381,28 @@ function cdmCollapseArticle(event, id) {
 	}
 }
 
-function cdmExpandArticle(id) {
+function cdmUnexpandArticle(event, id) {
+	try {
+		var row = $("RROW-" + id);
+		var elem = $("CICD-" + id);
+
+		if (elem && row) {
+			var collapse = $$("div#RROW-" + id +
+				" span[class='collapseBtn']")[0];
+
+		  	Element.hide(elem);
+			Element.show("CEXC-" + id);
+			Element.hide(collapse);
+
+			if (event) Event.stop(event);
+		}
+
+	} catch (e) {
+		exception_error("cdmUnexpandArticle", e);
+	}
+}
+
+function cdmExpandArticle(id, noexpand) {
 	try {
 		console.log("cdmExpandArticle " + id);
 
@@ -1412,7 +1439,7 @@ function cdmExpandArticle(id) {
 
 		var cencw = $("CENCW-" + id);
 
-		if (!Element.visible(elem)) {
+		if (!Element.visible(elem) && !noexpand) {
 			if (cencw) {
 				cencw.innerHTML = htmlspecialchars_decode(cencw.innerHTML);
 				cencw.setAttribute('id', '');
@@ -1429,7 +1456,8 @@ function cdmExpandArticle(id) {
 		if (old_offset > new_offset)
 			$("headlines-frame").scrollTop -= (old_offset-new_offset);
 
-		toggleUnread(id, 0, true);
+		if (!noexpand)
+			toggleUnread(id, 0, true);
 		toggleSelected(id);
 		$("RROW-" + id).addClassName("active");