diff --git a/ui/base.js b/ui/base.js
index a01e4ea1..de4c8c2c 100755
--- a/ui/base.js
+++ b/ui/base.js
@@ -877,27 +877,79 @@ function rotateImage(direction, image){
 	})
 
 	$('.viewer').trigger('rotating' + direction.capitalize(), [image])
+
+	return image
 }
 
 
 function rotateLeft(image){
-	rotateImage('left', image)
+	return rotateImage('left', image)
 }
 function rotateRight(image){
-	rotateImage('right', image)
+	return rotateImage('right', image)
 }
 
 
 
 /******************************************************** Flipping ***/
 
-function flipVertical(image){
-	// XXX
+function getImageFlipState(image){
+	image = image == null ? getImage() : $(image)
+	var state = image.attr('flipped')
+
+	if(state == null){
+		return []
+	}
+
+	state = state.split(',').map(function(e){ return e.trim() })
+
+	return state
+}
+function setImageFlipState(image, state){
+	image = image == null ? getImage() : $(image)
+	
+	if(state.length == 0){
+		image.removeAttr('flipped')
+	} else if(state != null){
+		image.attr('flipped', state.join(', '))
+	}
+
+	return image
+}
+
+// XXX not yet implemented...
+// 		...mostly because it will conflict with turning and require a
+// 		very tightly woven with rotation code, both JS and CSS...
+// 		i.e. requiring two sets of rotation styles, one for flipped 
+// 		and another for horizontally flipped image.
+// 		...at least flipping will not affect the square/viewer aspect 
+// 		ratio of images.
+function flipImage(direction, image){
+	image = image == null ? getImage() : $(image)
+	image.each(function(i, e){
+		var img = $(this)
+		var state = getImageFlipState(img)
+		var i = state.indexOf(direction)
+
+		if(i >= 0){
+			state.splice(i, 1)
+		} else {
+			state.push(direction)
+		}
+		setImageFlipState(image, state)
+	})
+
+	$('.viewer').trigger('flipping' + direction.capitalize(), [image])
+
+	return image
 }
 
 
+function flipVertical(image){
+	return flipImage('vertical')
+}
 function flipHorizontal(image){
-	// XXX
+	return flipImage('horizontal')
 }
 
 
diff --git a/ui/data.js b/ui/data.js
index 0153e8bf..ce5d21e0 100755
--- a/ui/data.js
+++ b/ui/data.js
@@ -1425,6 +1425,8 @@ function updateRibbonsFromFavDirs(){
 * Actions...
 */
 
+/******************************************************** Extension **/
+
 // Open image in an external editor/viewer
 //
 // NOTE: this will open the default editor/viewer.
@@ -1438,6 +1440,9 @@ function openImage(){
 }
 
 
+
+/********************************************************** Sorting **/
+
 function reverseImageOrder(){
 	DATA.order.reverse()
 	updateRibbonOrder()
@@ -1466,6 +1471,9 @@ function sortImagesByName(reverse){
 }
 
 
+
+/*************************************************** Manual sorting **/
+
 // Ordering images...
 // NOTE: this a bit more complicated than simply shifting an image 
 // 		left/right the DATA.order, we have to put it before or after
diff --git a/ui/index.html b/ui/index.html
index 61a822ec..31a2cbff 100755
--- a/ui/index.html
+++ b/ui/index.html
@@ -4,6 +4,8 @@
 
 
 
+
+
 
 
 
 
+
+
 
 
 
diff --git a/ui/layout.css b/ui/layout.css
index dcb68c26..2ac2ec2e 100755
--- a/ui/layout.css
+++ b/ui/layout.css
@@ -1,677 +1,622 @@
-/**********************************************************************
-* 
-**********************************************************************/
-
-body {
-	font-family: sans-serif;
-	padding: 0px;
-	margin: 0px;
-}
-
-
-
-/********************************************************** Viewer ***/
-.viewer {
-	position: relative;
-	width: 100%;
-	height: 100%;
-	overflow: hidden;
-
-	/*border: solid blue 1px;*/
-	box-sizing: border-box;
-
-	-moz-user-select: none;
-	-webkit-user-select: none;
-	-o-user-select: none;
-	-ms-user-select: none;
-	user-select: none;
-}
-
-
-
-/****************************************************** Ribbon set ***/
-.ribbon-set {
-	position: absolute;
-	display: block;
-
-	/* NOTE: this needs for scaling/zooming to behave correctly and not 
-			shift the element, when its dimensions change... 
-			...this is because .ribbon-set will both be used for scaling 
-			and aligning... */
-	transform-origin: top left;
-	-ms-transform-origin: top left;
-	-webkit-transform-origin: top left; /* Safari and Chrome */
-}
-.ribbon-set:empty:after {
-	display: block;
-	top: 0px;
-	left: 0px;
-	width: 100%;
-	height: 100%;
-	content: "Empty";
-	text-align: center;
-}
-
-
-
-/********************************************************** Ribbon ***/
-.ribbon {
-	position: relative;
-	display: block;
-	height: auto;
-	min-width: 0px;
-	overflow: visible;
-	white-space: nowrap;
-	font-size: 0;
-
-	margin-top: 20px;
-	margin-bottom: 20px;
-}
-.ribbon:empty {
-	display: none;
-}
-.ribbon:first-child {
-	margin-top: 0px;
-}
-.ribbon:last-child {
-	margin-bottom: 0px;
-}
-
-
-
-/*********************************************************** Image ***/
-.image {
-	position: relative;
-	display: inline-block;
-	vertical-align: middle;
-	text-align:left;
-	width: 300px;
-	height: 300px;
-	font-size: 12pt;
-	overflow: hidden;
-
-	box-sizing: border-box;
-	color: white;
-
-	text-shadow: black 0.1em 0.1em 0.4em, black 0.1em 0.1em;
-
-	background: no-repeat 50% black;
-	background-size: contain;
-	/* XXX do we need this? */
-	border: solid black 5px;
-}
-.current.image {
-	background: no-repeat 50% black;
-	background-size: contain;
-
-	/* XXX remove this... */
-	border: solid red 5px;
-}
-
-
-/* image turning... */
-/* NOTE: need to account for proportions after turning... */
-.image[orientation="90"] {
-	-webkit-transform: rotate(90deg);
-	-moz-transform: rotate(90deg);
-	-o-transform: rotate(90deg);
-	-ms-transform: rotate(90deg);
-	transform: rotate(90deg);
-}
-.image[orientation="180"] {
-	-webkit-transform: rotate(180deg);
-	-moz-transform: rotate(180deg);
-	-o-transform: rotate(180deg);
-	-ms-transform: rotate(180deg);
-	transform: rotate(180deg);
-}
-.image[orientation="270"] {
-	-webkit-transform: rotate(270deg);
-	-moz-transform: rotate(270deg);
-	-o-transform: rotate(270deg);
-	-ms-transform: rotate(270deg);
-	transform: rotate(270deg);
-}
-
-
-/* default backgrounds */
-/* XXX not sure if we need these... */
-/*
-.image {
-	background-image: url(images/loading.gif);
-}
-.image[orientation="90"] {
-	background-image: url(images/loading-90deg.gif);
-}
-.image[orientation="180"] {
-	background-image: url(images/loading-180deg.gif);
-}
-.image[orientation="270"] {
-	background-image: url(images/loading-270deg.gif);
-}
-*/
-
-
-
-/***************************************************** Image marks ***/
-.marks-visible.viewer .marked.image:after {
-	display: block;
-	position: absolute;
-	content: "";
-	font-size: 0pt;
-	border: none;
-
-	width: 15px;
-	height: 15px;
-
-	bottom: 5px;
-	right: 5px;
-
-	border-radius: 50%;
-	background: blue;
-}
-.marks-visible.viewer .marked.image[orientation="90"]:after {
-	top: 5px;
-	right: 5px;
-}
-.marks-visible.viewer .marked.image[orientation="180"]:after {
-	top: 5px;
-	left: 5px;
-}
-.marks-visible.viewer .marked.image[orientation="270"]:after {
-	bottom: 5px;
-	left: 5px;
-}
-
-/* XXX make the marks position relative to viewer or gidden compleatly */
-.marks-visible.single-image-mode.viewer .marked.image:after {
-	display: none;
-}
-
-/* corner mark... (a-la bookmarks in PortableMag) */
-/*
-.marks-visible.viewer .marked.image:after {
-	display: block;
-	position: absolute;
-	content: "";
-	font-size: 0pt;
-	border: none;
-
-	width: 30px;
-	height: 30px;
-
-	top: -15px;
-	right: -15px;
-
-	background: blue;
-
-	-webkit-transform: rotate(45deg);
-	-moz-transform: rotate(45deg);
-	-o-transform: rotate(45deg);
-	-ms-transform: rotate(45deg);
-	transform: rotate(45deg);
-}
-.marks-visible.viewer .marked.image[orientation="90"]:after {
-	top: -15px;
-	left: -15px;
-}
-.marks-visible.viewer .marked.image[orientation="180"]:after {
-	bottom: -15px;
-	left: -15px;
-}
-.marks-visible.viewer .marked.image[orientation="270"]:after {
-	bottom: -15px;
-	right: -15px;
-}
-*/
-
-
-/*.marks-visible.viewer:not(.single-image-mode):after {*/
-/*
-.marks-visible.viewer:after {
-	display: block;
-	position: absolute;
-	content: "";
-	font-size: 0pt;
-
-	top: 10px;
-	right: 10px;
-	width: 10px;
-	height: 10px;
-
-	border: solid 2px blue;
-	border-radius: 50%;
-	background: blue;
-}
-.marked-only-view.viewer:after {
-	display: block;
-	position: absolute;
-	content: "";
-	font-size: 0pt;
-	top: 10px;
-	right: 10px;
-	width: 10px;
-	height: 10px;
-
-	border: solid 2px blue;
-	border-radius: 50%;
-	background: transparent;
-}
-.marked-only-view.marks-visible.viewer:after {
-	background: blue;
-}
-*/
-
-/* XXX should we use opacity??? */
-.marked-only-view.viewer:not(.marks-visible) .image:not(.marked) {
-	opacity: 0.3;
-}
-
-
-
-/****************************************************** Image info ***/
-.image .inline-image-info {
-	display: none;
-
-	position: absolute;
-	bottom: 0px;
-	width: 100%;
-	background: black;
-	opacity: 0.7;
-}
-.image .inline-image-info:hover {
-	-moz-user-select: auto;
-	-webkit-user-select: auto;
-	-o-user-select: auto;
-	-ms-user-select: auto;
-	user-select: auto;
-}
-.image .inline-image-info::selection {
-	color: white;
-	background: red;
-}
-.image-info-visible.viewer .global-image-info,
-.image-info-visible.viewer .image:hover .inline-image-info {
-	display: block;
-}
-.single-image-mode.viewer .image:hover .inline-image-info {
-	display: none;
-}
-.image[orientation="90"] .inline-image-info {
-	top: auto;
-	left: 100%;
-
-	-ms-transform-origin: bottom left;
-	-webkit-transform-origin: bottom left;
-	transform-origin: bottom left;
-
-	-webkit-transform: rotate(-90deg);
-	-moz-transform: rotate(-90deg);
-	-o-transform: rotate(-90deg);
-	-ms-transform: rotate(-90deg);
-	transform: rotate(-90deg);
-}
-.image[orientation="180"] .inline-image-info {
-	top: 0px;
-	bottom: auto;
-
-	-webkit-transform: rotate(180deg);
-	-moz-transform: rotate(180deg);
-	-o-transform: rotate(180deg);
-	-ms-transform: rotate(180deg);
-	transform: rotate(180deg);
-}
-.image[orientation="270"] .inline-image-info {
-	top: auto;
-	left: auto;
-	right: 100%;
-
-	-ms-transform-origin: bottom right;
-	-webkit-transform-origin: bottom right;
-	transform-origin: bottom right;
-
-	-webkit-transform: rotate(90deg);
-	-moz-transform: rotate(90deg);
-	-o-transform: rotate(90deg);
-	-ms-transform: rotate(90deg);
-	transform: rotate(90deg);
-}
-
-.overlay-info {
-	display: none;
-	position: absolute;
-
-	bottom: 0px;
-	left: 0px;
-	width: 100%;
-	padding: 2px;
-	padding-left: 10px;
-	padding-right: 10px;
-	box-sizing: border-box;
-
-	background: black;
-	color: white;
-
-	opacity: 0.6;
-}
-.overlay-info:hover {
-	-moz-user-select: auto;
-	-webkit-user-select: auto;
-	-o-user-select: auto;
-	-ms-user-select: auto;
-	user-select: auto;
-}
-.overlay-info .float-right {
-	float: right;
-}
-.overlay-info .secondary {
-	font-style: italic;
-	font-size: small;
-	color: silver;
-}
-.overlay-info::selection,
-.overlay-info ::selection {
-	color: white;
-	background: red;
-}
-
-
-
-/*************************************************** Global status ***/
-.global-status {
-	display: block;
-	opacity: 1;
-	z-index: 1000;
-}
-
-
-
-/****************************************************** Indicators ***/
-.up-indicator,
-.down-indicator,
-.start-indicator,
-.end-indicator {
-	display: block;
-	position: absolute;
-	content: "";
-	top: 0px;
-	left: 50%;
-	height: 50px;
-	width: 100px;
-	margin-left: -50px;
-
-	overflow: hidden;
-
-	cursor: hand;
-}
-.up-indicator:after,
-.down-indicator:after {
-	display: inline-block;
-	position: absolute;
-	content: "";
-	width: 50px;
-	height: 50px;
-
-	bottom: -25px;
-	left: 25px;
-
-	background: yellow;
-
-	-webkit-transform: rotate(45deg);
-	-moz-transform: rotate(45deg);
-	-o-transform: rotate(45deg);
-	-ms-transform: rotate(45deg);
-	transform: rotate(45deg);
-}
-.down-indicator {
-	top: auto;
-	bottom: 0px;
-}
-.down-indicator:after {
-	top: -25px;
-	bottom: auto;
-}
-.start-indicator,
-.end-indicator {
-	left: 0px;
-	width: 10px;
-	height: 100%;
-	margin: 0px;
-
-	background: yellow;
-}
-.end-indicator {
-	left: auto;
-	right: 0px;
-}
-/* default state */
-.up-indicator,
-.down-indicator,
-.start-indicator,
-.end-indicator {
-	display: none;
-}
-
-
-/* these are generic containers for indicators */
-.global-mode-indicators {
-	position: absolute;
-	top: 15px;
-	right: 15px;
-	height: 20px;
-	width: auto;
-
-	font-size: small;
-}
-.global-mode-indicators>* {
-	margin-left: 10px;
-}
-.global-mode-indicators .circle {
-	display: inline-block;
-	width: 10px;
-	height: 10px;
-	border-radius: 50%;
-}
-/* hide indicators in single image mode */
-.single-image-mode.viewer .global-mode-indicators {
-	opacity: 0.5;
-}
-.light.single-image-mode.viewer .global-mode-indicators {
-	opacity: 0.1;
-}
-.dark.single-image-mode.viewer .global-mode-indicators {
-	opacity: 0.6;
-}
-.single-image-mode.viewer .global-mode-indicators:hover {
-	opacity: 1;
-}
-
-/* context indicators */
-.context-mode-indicators {
-	position: absolute;
-	right: 15px;
-	bottom: 15px;
-	height: 20px;
-	width: auto;
-
-	font-size: small;
-}
-.context-mode-indicators>* {
-	margin-left: 10px;
-}
-.context-mode-indicators .circle {
-	display: inline-block;
-	width: 10px;
-	height: 10px;
-	border-radius: 50%;
-}
-
-
-/* actual indicators */
-/* marks... */
-.global-mode-indicators .marked-only-visible,
-.global-mode-indicators .marks-visible,
-.context-mode-indicators .current-image-marked {
-	display: none;
-	color: blue;
-}
-.global-mode-indicators .marked-only-visible .shown,
-.global-mode-indicators .marks-visible .shown,
-.context-mode-indicators .current-image-marked .shown {
-	display: none;
-}
-.global-mode-indicators .marked-only-visible:after,
-.global-mode-indicators .marks-visible:after,
-.context-mode-indicators .current-image-marked:after {
-	display: inline-block;
-	width: 10px;
-	height: 10px;
-	border-radius: 50%;
-	content: "";
-	background-color: blue;
-	border: solid 2px blue;
-	margin-left: 5px;
-}
-.marks-visible.viewer .global-mode-indicators .marks-visible {
-	display: inline-block;
-}
-.marked-only-view.viewer .global-mode-indicators .marks-visible {
-	display: none;
-}
-.marked-only-view.viewer .global-mode-indicators .marked-only-visible {
-	display: inline-block;
-}
-.marked-only-view.viewer:not(.marks-visible) .global-mode-indicators .marked-only-visible:after {
-	background-color: transparent;
-}
-/* image mark in single image mode... */
-.context-mode-indicators .current-image-marked {
-	display: none;
-	color: blue;
-}
-.single-image-mode.marks-visible.viewer .context-mode-indicators .current-image-marked.shown {
-	display: inline-block;
-}
-
-
-
-/********************************************** Mode: single image ***/
-.single-image-mode.viewer .image {
-	background-color: transparent;
-	/* NOTE: need to keep a distance from screen borders... */
-	border: solid transparent 2px;
-}
-.single-image-mode.viewer .image:not(.current) {
-	/* XXX for some reason this breaks the alignment on large magnifications...
-	display: none;
-	*/
-	/* XXX this makes images pass through the :visible filter...
-	opacity: 0;
-	*/
-	visibility: hidden;
-}
-
-
-
-/********************************************************** Themes ***/
-/* XXX this is by no means final... */
-.viewer,
-.light.viewer,
-.light.viewer .overlay-block .background {
-	background: white;
-}
-
-.gray.viewer,
-.gray.viewer .overlay-block .background {
-	background: #333;
-}
-
-.dark.viewer,
-.dark.viewer .overlay-block .background {
-	background: #0a0a0a;
-}
-
-
-
-/********************************************************* Overlay ***/
-.overlay-block {
-	display: none;
-	position: absolute:
-	top: 0px;
-	left: 0px;
-	height: 100%;
-	width: 100%;
-}
-.viewer.overlay .overlay-block {
-	display: block;
-}
-.overlay-block .content {
-}
-.overlay-block .background {
-	position: absolute:
-	top: 0px;
-	left: 0px;
-	height: 100%;
-	width: 100%;
-	opacity: 0.7;
-}
-
-
-
-/************************************************************ Help ***/
-/* this is for sliding stuff */
-.viewer.drawer-mode {
-	box-shadow: 0px 0px 50px 0px silver;
-}
-
-/* help */
-.keyboard-help {
-	width: 80%;
-	margin-top: 20px;
-	margin-left: 15%;
-	margin-right: 5%;
-	margin-bottom: 100px;
-}
-.keyboard-help .section-doc {
-	font-size: small;
-	vertical-align: top;
-	font-style: italic;
-}
-.keyboard-help th {
-	text-align: left;
-	height: 50px;
-	vertical-align: bottom;
-	border-bottom: solid gray 1px;
-}
-.keyboard-help tr:hover {
-	background: #eee;
-	vertical-align: top;
-}
-.keyboard-help tr td:first-child {
-	color: gray;
-	font-style: italic;
-	padding-right: 20px;
-	padding-left: 10px;
-}
-.keyboard-help .section-doc td:only-child {
-	padding-right: 0px;
-	padding-left: 0px;
-}
-
-
-
-/********************************************************* utility ***/
-.expanding-text .hidden {
-	display: none;
-}
-.expanding-text:hover .shown {
-	display: none;
-}
-.expanding-text:hover .hidden {
-	display: inline;
-}
-
-
-
-
-/*********************************************************************/
+/**********************************************************************
+* 
+**********************************************************************/
+body {
+  font-family: sans-serif;
+  padding: 0px;
+  margin: 0px;
+}
+/********************************************************** Viewer ***/
+.viewer {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  /*border: solid blue 1px;*/
+
+  box-sizing: border-box;
+  -moz-user-select: none;
+  -webkit-user-select: none;
+  -o-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+/****************************************************** Ribbon set ***/
+.ribbon-set {
+  position: absolute;
+  display: block;
+  /* NOTE: this needs for scaling/zooming to behave correctly and not 
+			shift the element, when its dimensions change... 
+			...this is because .ribbon-set will both be used for scaling 
+			and aligning... */
+
+  transform-origin: top left;
+  -ms-transform-origin: top left;
+  -webkit-transform-origin: top left;
+  /* Safari and Chrome */
+
+}
+.ribbon-set:empty:after {
+  display: block;
+  top: 0px;
+  left: 0px;
+  width: 100%;
+  height: 100%;
+  content: "Empty";
+  text-align: center;
+}
+/********************************************************** Ribbon ***/
+.ribbon {
+  position: relative;
+  display: block;
+  height: auto;
+  min-width: 0px;
+  overflow: visible;
+  white-space: nowrap;
+  font-size: 0;
+  margin-top: 20px;
+  margin-bottom: 20px;
+}
+.ribbon:empty {
+  display: none;
+}
+.ribbon:first-child {
+  margin-top: 0px;
+}
+.ribbon:last-child {
+  margin-bottom: 0px;
+}
+/*********************************************************** Image ***/
+.image {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  text-align: left;
+  width: 300px;
+  height: 300px;
+  font-size: 12pt;
+  overflow: hidden;
+  box-sizing: border-box;
+  color: white;
+  text-shadow: black 0.1em 0.1em 0.4em, black 0.1em 0.1em;
+  background: no-repeat 50% #000000;
+  background-size: contain;
+  /* XXX do we need this? */
+
+  border: solid black 5px;
+}
+.current.image {
+  background: no-repeat 50% #000000;
+  background-size: contain;
+  /* XXX remove this... */
+
+  border: solid red 5px;
+}
+/* image turning... */
+/* NOTE: need to account for proportions after turning... */
+.image[orientation="90"] {
+  -webkit-transform: rotate(90deg);
+  -moz-transform: rotate(90deg);
+  -o-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+.image[orientation="180"] {
+  -webkit-transform: rotate(180deg);
+  -moz-transform: rotate(180deg);
+  -o-transform: rotate(180deg);
+  -ms-transform: rotate(180deg);
+  transform: rotate(180deg);
+}
+.image[orientation="270"] {
+  -webkit-transform: rotate(270deg);
+  -moz-transform: rotate(270deg);
+  -o-transform: rotate(270deg);
+  -ms-transform: rotate(270deg);
+  transform: rotate(270deg);
+}
+/* Flipped vertically only... */
+/* NOTE: wee need to do all possible combinations here as we can't 
+ 	combine different parts of a transform attr from different 
+ 	classes */
+.image[flipped*="vertical"] {
+  -moz-transform: scaleY(-1);
+  -o-transform: scaleY(-1);
+  -webkit-transform: scaleY(-1);
+  -ms-transform: scaleY(-1);
+  transform: scaleY(-1);
+}
+/* Flipped horizontally only... */
+.image[flipped*="horizontal"] {
+  -moz-transform: scaleX(-1);
+  -o-transform: scaleX(-1);
+  -webkit-transform: scaleX(-1);
+  -ms-transform: scaleX(-1);
+  transform: scaleX(-1);
+}
+/* Flipped vertically only... */
+.image[flipped*="vertical"][flipped*="horizontal"] {
+  -moz-transform: scaleX(-1) scaleY(-1);
+  -o-transform: scaleX(-1) scaleY(-1);
+  -webkit-transform: scaleX(-1) scaleY(-1);
+  -ms-transform: scaleX(-1) scaleY(-1);
+  transform: scaleX(-1) scaleY(-1);
+}
+/* default backgrounds */
+/* XXX not sure if we need these... */
+/*
+.image {
+	background-image: url(images/loading.gif);
+}
+.image[orientation="90"] {
+	background-image: url(images/loading-90deg.gif);
+}
+.image[orientation="180"] {
+	background-image: url(images/loading-180deg.gif);
+}
+.image[orientation="270"] {
+	background-image: url(images/loading-270deg.gif);
+}
+*/
+/***************************************************** Image marks ***/
+.marks-visible.viewer .marked.image:after {
+  display: block;
+  position: absolute;
+  content: "";
+  font-size: 0pt;
+  border: none;
+  width: 15px;
+  height: 15px;
+  bottom: 5px;
+  right: 5px;
+  border-radius: 50%;
+  background: blue;
+}
+.marks-visible.viewer .marked.image[orientation="90"]:after {
+  top: 5px;
+  right: 5px;
+}
+.marks-visible.viewer .marked.image[orientation="180"]:after {
+  top: 5px;
+  left: 5px;
+}
+.marks-visible.viewer .marked.image[orientation="270"]:after {
+  bottom: 5px;
+  left: 5px;
+}
+/* XXX make the marks position relative to viewer or gidden compleatly */
+.marks-visible.single-image-mode.viewer .marked.image:after {
+  display: none;
+}
+/* corner mark... (a-la bookmarks in PortableMag) */
+/*
+.marks-visible.viewer .marked.image:after {
+	display: block;
+	position: absolute;
+	content: "";
+	font-size: 0pt;
+	border: none;
+
+	width: 30px;
+	height: 30px;
+
+	top: -15px;
+	right: -15px;
+
+	background: blue;
+
+	-webkit-transform: rotate(45deg);
+	-moz-transform: rotate(45deg);
+	-o-transform: rotate(45deg);
+	-ms-transform: rotate(45deg);
+	transform: rotate(45deg);
+}
+.marks-visible.viewer .marked.image[orientation="90"]:after {
+	top: -15px;
+	left: -15px;
+}
+.marks-visible.viewer .marked.image[orientation="180"]:after {
+	bottom: -15px;
+	left: -15px;
+}
+.marks-visible.viewer .marked.image[orientation="270"]:after {
+	bottom: -15px;
+	right: -15px;
+}
+*/
+/*.marks-visible.viewer:not(.single-image-mode):after {*/
+/*
+.marks-visible.viewer:after {
+	display: block;
+	position: absolute;
+	content: "";
+	font-size: 0pt;
+
+	top: 10px;
+	right: 10px;
+	width: 10px;
+	height: 10px;
+
+	border: solid 2px blue;
+	border-radius: 50%;
+	background: blue;
+}
+.marked-only-view.viewer:after {
+	display: block;
+	position: absolute;
+	content: "";
+	font-size: 0pt;
+	top: 10px;
+	right: 10px;
+	width: 10px;
+	height: 10px;
+
+	border: solid 2px blue;
+	border-radius: 50%;
+	background: transparent;
+}
+.marked-only-view.marks-visible.viewer:after {
+	background: blue;
+}
+*/
+/* XXX should we use opacity??? */
+.marked-only-view.viewer:not(.marks-visible) .image:not(.marked) {
+  opacity: 0.3;
+}
+/****************************************************** Image info ***/
+.image .inline-image-info {
+  display: none;
+  position: absolute;
+  bottom: 0px;
+  width: 100%;
+  background: black;
+  opacity: 0.7;
+}
+.image .inline-image-info:hover {
+  -moz-user-select: auto;
+  -webkit-user-select: auto;
+  -o-user-select: auto;
+  -ms-user-select: auto;
+  user-select: auto;
+}
+.image .inline-image-info::selection {
+  color: white;
+  background: red;
+}
+.image-info-visible.viewer .global-image-info,
+.image-info-visible.viewer .image:hover .inline-image-info {
+  display: block;
+}
+.single-image-mode.viewer .image:hover .inline-image-info {
+  display: none;
+}
+.image[orientation="90"] .inline-image-info {
+  top: auto;
+  left: 100%;
+  -ms-transform-origin: bottom left;
+  -webkit-transform-origin: bottom left;
+  transform-origin: bottom left;
+  -webkit-transform: rotate(-90deg);
+  -moz-transform: rotate(-90deg);
+  -o-transform: rotate(-90deg);
+  -ms-transform: rotate(-90deg);
+  transform: rotate(-90deg);
+}
+.image[orientation="180"] .inline-image-info {
+  top: 0px;
+  bottom: auto;
+  -webkit-transform: rotate(180deg);
+  -moz-transform: rotate(180deg);
+  -o-transform: rotate(180deg);
+  -ms-transform: rotate(180deg);
+  transform: rotate(180deg);
+}
+.image[orientation="270"] .inline-image-info {
+  top: auto;
+  left: auto;
+  right: 100%;
+  -ms-transform-origin: bottom right;
+  -webkit-transform-origin: bottom right;
+  transform-origin: bottom right;
+  -webkit-transform: rotate(90deg);
+  -moz-transform: rotate(90deg);
+  -o-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+.overlay-info {
+  display: none;
+  position: absolute;
+  bottom: 0px;
+  left: 0px;
+  width: 100%;
+  padding: 2px;
+  padding-left: 10px;
+  padding-right: 10px;
+  box-sizing: border-box;
+  background: black;
+  color: white;
+  opacity: 0.6;
+}
+.overlay-info:hover {
+  -moz-user-select: auto;
+  -webkit-user-select: auto;
+  -o-user-select: auto;
+  -ms-user-select: auto;
+  user-select: auto;
+}
+.overlay-info .float-right {
+  float: right;
+}
+.overlay-info .secondary {
+  font-style: italic;
+  font-size: small;
+  color: silver;
+}
+.overlay-info::selection,
+.overlay-info ::selection {
+  color: white;
+  background: red;
+}
+/*************************************************** Global status ***/
+.global-status {
+  display: block;
+  opacity: 1;
+  z-index: 1000;
+}
+/****************************************************** Indicators ***/
+.up-indicator,
+.down-indicator,
+.start-indicator,
+.end-indicator {
+  display: block;
+  position: absolute;
+  content: "";
+  top: 0px;
+  left: 50%;
+  height: 50px;
+  width: 100px;
+  margin-left: -50px;
+  overflow: hidden;
+  cursor: hand;
+}
+.up-indicator:after,
+.down-indicator:after {
+  display: inline-block;
+  position: absolute;
+  content: "";
+  width: 50px;
+  height: 50px;
+  bottom: -25px;
+  left: 25px;
+  background: yellow;
+  -webkit-transform: rotate(45deg);
+  -moz-transform: rotate(45deg);
+  -o-transform: rotate(45deg);
+  -ms-transform: rotate(45deg);
+  transform: rotate(45deg);
+}
+.down-indicator {
+  top: auto;
+  bottom: 0px;
+}
+.down-indicator:after {
+  top: -25px;
+  bottom: auto;
+}
+.start-indicator,
+.end-indicator {
+  left: 0px;
+  width: 10px;
+  height: 100%;
+  margin: 0px;
+  background: yellow;
+}
+.end-indicator {
+  left: auto;
+  right: 0px;
+}
+/* default state */
+.up-indicator,
+.down-indicator,
+.start-indicator,
+.end-indicator {
+  display: none;
+}
+/* these are generic containers for indicators */
+.global-mode-indicators {
+  position: absolute;
+  top: 15px;
+  right: 15px;
+  height: 20px;
+  width: auto;
+  font-size: small;
+}
+.global-mode-indicators > * {
+  margin-left: 10px;
+}
+.global-mode-indicators .circle {
+  display: inline-block;
+  width: 10px;
+  height: 10px;
+  border-radius: 50%;
+}
+/* hide indicators in single image mode */
+.single-image-mode.viewer .global-mode-indicators {
+  opacity: 0.5;
+}
+.light.single-image-mode.viewer .global-mode-indicators {
+  opacity: 0.1;
+}
+.dark.single-image-mode.viewer .global-mode-indicators {
+  opacity: 0.6;
+}
+.single-image-mode.viewer .global-mode-indicators:hover {
+  opacity: 1;
+}
+/* context indicators */
+.context-mode-indicators {
+  position: absolute;
+  right: 15px;
+  bottom: 15px;
+  height: 20px;
+  width: auto;
+  font-size: small;
+}
+.context-mode-indicators > * {
+  margin-left: 10px;
+}
+.context-mode-indicators .circle {
+  display: inline-block;
+  width: 10px;
+  height: 10px;
+  border-radius: 50%;
+}
+/* actual indicators */
+/* marks... */
+.global-mode-indicators .marked-only-visible,
+.global-mode-indicators .marks-visible,
+.context-mode-indicators .current-image-marked {
+  display: none;
+  color: blue;
+}
+.global-mode-indicators .marked-only-visible .shown,
+.global-mode-indicators .marks-visible .shown,
+.context-mode-indicators .current-image-marked .shown {
+  display: none;
+}
+.global-mode-indicators .marked-only-visible:after,
+.global-mode-indicators .marks-visible:after,
+.context-mode-indicators .current-image-marked:after {
+  display: inline-block;
+  width: 10px;
+  height: 10px;
+  border-radius: 50%;
+  content: "";
+  background-color: blue;
+  border: solid 2px blue;
+  margin-left: 5px;
+}
+.marks-visible.viewer .global-mode-indicators .marks-visible {
+  display: inline-block;
+}
+.marked-only-view.viewer .global-mode-indicators .marks-visible {
+  display: none;
+}
+.marked-only-view.viewer .global-mode-indicators .marked-only-visible {
+  display: inline-block;
+}
+.marked-only-view.viewer:not(.marks-visible) .global-mode-indicators .marked-only-visible:after {
+  background-color: transparent;
+}
+/* image mark in single image mode... */
+.context-mode-indicators .current-image-marked {
+  display: none;
+  color: blue;
+}
+.single-image-mode.marks-visible.viewer .context-mode-indicators .current-image-marked.shown {
+  display: inline-block;
+}
+/********************************************** Mode: single image ***/
+.single-image-mode.viewer .image {
+  background-color: transparent;
+  /* NOTE: need to keep a distance from screen borders... */
+
+  border: solid transparent 2px;
+}
+.single-image-mode.viewer .image:not(.current) {
+  /* XXX for some reason this breaks the alignment on large magnifications...
+	display: none;
+	*/
+
+  /* XXX this makes images pass through the :visible filter...
+	opacity: 0;
+	*/
+
+  visibility: hidden;
+}
+/********************************************************** Themes ***/
+/* XXX this is by no means final... */
+.viewer,
+.light.viewer,
+.light.viewer .overlay-block .background {
+  background: white;
+}
+.gray.viewer,
+.gray.viewer .overlay-block .background {
+  background: #333;
+}
+.dark.viewer,
+.dark.viewer .overlay-block .background {
+  background: #0a0a0a;
+}
+/********************************************************* Overlay ***/
+.overlay-block {
+  display: none;
+  position: absolute:
+	top: 0px;
+  left: 0px;
+  height: 100%;
+  width: 100%;
+}
+.viewer.overlay .overlay-block {
+  display: block;
+}
+.overlay-block .background {
+  position: absolute:
+	top: 0px;
+  left: 0px;
+  height: 100%;
+  width: 100%;
+  opacity: 0.7;
+}
+/************************************************************ Help ***/
+/* this is for sliding stuff */
+.viewer.drawer-mode {
+  box-shadow: 0px 0px 50px 0px silver;
+}
+/* help */
+.keyboard-help {
+  width: 80%;
+  margin-top: 20px;
+  margin-left: 15%;
+  margin-right: 5%;
+  margin-bottom: 100px;
+}
+.keyboard-help .section-doc {
+  font-size: small;
+  vertical-align: top;
+  font-style: italic;
+}
+.keyboard-help th {
+  text-align: left;
+  height: 50px;
+  vertical-align: bottom;
+  border-bottom: solid gray 1px;
+}
+.keyboard-help tr:hover {
+  background: #eee;
+  vertical-align: top;
+}
+.keyboard-help tr td:first-child {
+  color: gray;
+  font-style: italic;
+  padding-right: 20px;
+  padding-left: 10px;
+}
+.keyboard-help .section-doc td:only-child {
+  padding-right: 0px;
+  padding-left: 0px;
+}
+/********************************************************* utility ***/
+.expanding-text .hidden {
+  display: none;
+}
+.expanding-text:hover .shown {
+  display: none;
+}
+.expanding-text:hover .hidden {
+  display: inline;
+}
+/**********************************************************************
+* vim:set spell ft=css :                                             */
diff --git a/ui/layout.less b/ui/layout.less
index 23bee377..e9fc8d2d 100755
--- a/ui/layout.less
+++ b/ui/layout.less
@@ -122,18 +122,10 @@ body {
 	.rotate(90deg);
 }
 .image[orientation="180"] {
-	-webkit-transform: rotate(180deg);
-	-moz-transform: rotate(180deg);
-	-o-transform: rotate(180deg);
-	-ms-transform: rotate(180deg);
-	transform: rotate(180deg);
+	.rotate(180deg);
 }
 .image[orientation="270"] {
-	-webkit-transform: rotate(270deg);
-	-moz-transform: rotate(270deg);
-	-o-transform: rotate(270deg);
-	-ms-transform: rotate(270deg);
-	transform: rotate(270deg);
+	.rotate(270deg);
 }
 
 
diff --git a/ui/setup.js b/ui/setup.js
index aeb39282..8d45df7a 100755
--- a/ui/setup.js
+++ b/ui/setup.js
@@ -16,7 +16,7 @@ function setupIndicators(){
 		.click(function(){ toggleMarkesView() })
 	showGlobalIndicator(
 			'marked-only-visible', 
-			'Marked only images visible (alt-F2)')
+			'Marked only images visible (shift-F2)')
 		.css('cursor', 'hand')
 		.click(function(){ toggleMarkedOnlyView() })
 
diff --git a/ui/ui.js b/ui/ui.js
index d0bf6278..cf6ad069 100755
--- a/ui/ui.js
+++ b/ui/ui.js
@@ -175,9 +175,15 @@ function updateStatus(message){
 
 
 // Same as updateInfo(...) but will aslo show and animate-close the message
+//
+// XXX the next call will not reset the animation of the previous, rather 
+// 		it will pause it and rezume...
+// 		...not sure if this is correct.
 function showStatus(message){
 	return updateStatus.apply(null, arguments)
-		.stop()
+		//.stop()
+		.stop(true, false)
+		//.finish()
 		.show()
 		.delay(500)
 		.fadeOut(800)
@@ -193,7 +199,9 @@ function showErrorStatus(message){
 	message.splice(0, 0, 'Error:')
 	return updateStatus.apply(null, message)
 		.one('click', function(){ $(this).fadeOut() })
-		.stop()
+		//.stop()
+		.stop(true, false)
+		//.finish()
 		.show()
 }