diff --git a/ui (gen4)/index.html b/ui (gen4)/index.html
index 5caf204e..137d0cea 100755
--- a/ui (gen4)/index.html	
+++ b/ui (gen4)/index.html	
@@ -66,7 +66,7 @@
 
 
 
-
+/* DEBUG stuff... */
 .container-center {
 	position: absolute;
 	top: 50%;
@@ -109,7 +109,7 @@
 	-moz-transition: all 0.2s linear;
 	transition: all 0.2s linear;
 }
-
+/* DEBUG end */
 
 
 
@@ -133,7 +133,9 @@ require('nw.gui').Window.get().showDevTools()
 
 
 	
 
 
@@ -143,7 +145,10 @@ require('nw.gui').Window.get().showDevTools()
 		
 	 
 	-->
+
+	
 	 
+	
 
 
 
diff --git a/ui (gen4)/ribbons.js b/ui (gen4)/ribbons.js
index fee69152..8618b92f 100755
--- a/ui (gen4)/ribbons.js	
+++ b/ui (gen4)/ribbons.js	
@@ -169,7 +169,7 @@ module.RibbonsPrototype = {
 
 	// Helpers...
 
-	// XXX
+	// XXX need a better way of doing this...
 	preventTransitions: function(){
 		this.viewer.addClass('no-transitions')
 	},
@@ -210,7 +210,6 @@ module.RibbonsPrototype = {
 	// 		gets the visible size of the image tile in pixels.
 	//
 	// XXX try and make image size the product of vmin and scale...
-	// XXX is this the right place for this???
 	getVisibleImageSize: function(dim){
 		dim = dim == null ? 'width' : dim
 		var img = this.viewer.find('.image')
@@ -240,7 +239,8 @@ module.RibbonsPrototype = {
 	getScale: function(){
 		return getElementScale(this.viewer.find('.ribbon-set'))
 	},
-	// Get ribbon set scale...
+
+	// Set ribbon set scale...
 	//
 	// NOTE: this will also set origin...
 	setScale: function(scale, t, l){
@@ -277,6 +277,7 @@ module.RibbonsPrototype = {
 	// NOTE: this will also compensate for scaling.
 	//
 	// XXX make this work sync without affecting animation...
+	// XXX DEBUG: remove point updating when not needed...
 	setOrigin: function(a, b){
 		//this.preventTransitions()
 
@@ -300,7 +301,11 @@ module.RibbonsPrototype = {
 
 		// XXX when transitions are enabled this will make the view jump...
 		shiftOriginTo(ribbon_set, l, t)
-		setElementOffset($('.point'), l, t)
+
+		// XXX DEBUG: remove when done...
+		if($('.point').length > 0){
+			setElementOffset($('.point'), l, t)
+		}
 
 		//this.restoreTransitions(true)
 
@@ -368,76 +373,6 @@ module.RibbonsPrototype = {
 
 	// Contextual getters...
 	
-	// Get ribbon...
-	//
-	// Get current ribbon:
-	//	.getRibbon()
-	//	.getRibbon('current')
-	//		-> ribbon
-	//
-	// Get base ribbon:
-	//	.getRibbon('base')
-	//		-> ribbon
-	//
-	// Get ribbon by its index/gid:
-	//	.getRibbon(index)
-	//	.getRibbon(gid)
-	//		-> ribbon
-	//
-	// Get ribbon by image:
-	//	.getRibbon(image)
-	//		-> ribbon
-	//		NOTE: image must be .getImage(..) compatible.
-	//
-	// Get ribbons from list:
-	//	.getRibbon($(..))
-	//	.getRibbon([..])
-	//		-> ribbon(s)
-	//		NOTE: this will filter the list but not search the tree...
-	//
-	//
-	// NOTE: if current image is unset then this will not be able to 
-	// 		get it.
-	// NOTE: if base ribbon is unset this will return the first ribbon.
-	getRibbon: function(target){
-		// current...
-		if(target == null || target == 'current') {
-			return this.getImage().parents('.ribbon').first()
-
-		// dom element...
-		} else if(target instanceof $
-				&& target.hasClass('image')){
-			return this.getImage(target).parents('.ribbon').first()
-
-		// base...
-		} else if(target == 'base'){
-			var r = this.viewer.find('.base.ribbon').first()
-			if(r.length == 0){
-				return this.viewer.find('.ribbon').first()
-			}
-			return r
-
-		// index...
-		} else if(typeof(target) == typeof(123)){
-			return this.viewer.find('.ribbon').eq(target)
-
-		// gid...
-		} else if(typeof(target) == typeof('str')){
-			//return this.viewer.find('.ribbon[gid="'+JSON.stringify(target)+'"]')
-			var r = this.viewer.find('.ribbon[gid='+JSON.stringify(target)+']')
-			// if no ribbon is found, try and get an image and it's ribbon...
-			return r.length == 0 
-				? this.getImage(target).parents('.ribbon').first()
-				: r
-		}
-		return $(target).filter('.ribbon')
-	},
-	// Like .getRibbon(..) but returns ribbon index instead of the actual 
-	// ribbon object...
-	getRibbonOrder: function(target){
-		return this.viewer.find('.ribbon').index(this.getRibbon(target))
-	},
-
 	// Get image...
 	//
 	// Get current image:
@@ -534,6 +469,76 @@ module.RibbonsPrototype = {
 		return marks
 	},
 
+	// Get ribbon...
+	//
+	// Get current ribbon:
+	//	.getRibbon()
+	//	.getRibbon('current')
+	//		-> ribbon
+	//
+	// Get base ribbon:
+	//	.getRibbon('base')
+	//		-> ribbon
+	//
+	// Get ribbon by its index/gid:
+	//	.getRibbon(index)
+	//	.getRibbon(gid)
+	//		-> ribbon
+	//
+	// Get ribbon by image:
+	//	.getRibbon(image)
+	//		-> ribbon
+	//		NOTE: image must be .getImage(..) compatible.
+	//
+	// Get ribbons from list:
+	//	.getRibbon($(..))
+	//	.getRibbon([..])
+	//		-> ribbon(s)
+	//		NOTE: this will filter the list but not search the tree...
+	//
+	//
+	// NOTE: if current image is unset then this will not be able to 
+	// 		get it.
+	// NOTE: if base ribbon is unset this will return the first ribbon.
+	getRibbon: function(target){
+		// current...
+		if(target == null || target == 'current') {
+			return this.getImage().parents('.ribbon').first()
+
+		// dom element...
+		} else if(target instanceof $
+				&& target.hasClass('image')){
+			return this.getImage(target).parents('.ribbon').first()
+
+		// base...
+		} else if(target == 'base'){
+			var r = this.viewer.find('.base.ribbon').first()
+			if(r.length == 0){
+				return this.viewer.find('.ribbon').first()
+			}
+			return r
+
+		// index...
+		} else if(typeof(target) == typeof(123)){
+			return this.viewer.find('.ribbon').eq(target)
+
+		// gid...
+		} else if(typeof(target) == typeof('str')){
+			//return this.viewer.find('.ribbon[gid="'+JSON.stringify(target)+'"]')
+			var r = this.viewer.find('.ribbon[gid='+JSON.stringify(target)+']')
+			// if no ribbon is found, try and get an image and it's ribbon...
+			return r.length == 0 
+				? this.getImage(target).parents('.ribbon').first()
+				: r
+		}
+		return $(target).filter('.ribbon')
+	},
+	// Like .getRibbon(..) but returns ribbon index instead of the actual 
+	// ribbon object...
+	getRibbonOrder: function(target){
+		return this.viewer.find('.ribbon').index(this.getRibbon(target))
+	},
+
 
 	// Basic manipulation...
 
@@ -568,8 +573,6 @@ module.RibbonsPrototype = {
 	// 		attached then the target will be appended to the end.
 	// NOTE: this uses the DOM data for placement, this may differ from 
 	// 		the actual data.
-	//
-	// XXX interaction animation...
 	placeRibbon: function(target, position){
 		// get create the ribbon...
 		var ribbon = this.getRibbon(target)
@@ -618,10 +621,6 @@ module.RibbonsPrototype = {
 	//
 	// NOTE: mode defaults to 'before'.
 	// NOTE: if image gid does not exist it will be created.
-	//
-	// XXX interaction animation...
-	// XXX mode is ugly...
-	// XXX should this be strongly or weakly coupled to images.updateImage(..)???
 	placeImage: function(target, to, mode){
 		mode = mode == null ? 'before' : mode
 		var img = this.getImage(target)
@@ -854,8 +853,6 @@ module.RibbonsPrototype = {
 	//
 	// NOTE: gids and ribbon must be .getImage(..) and .getRibbon(..) 
 	// 		compatible...
-	//
-	// XXX should this be strongly or weakly coupled to images.updateImage(..)???
 	updateRibbon: function(gids, ribbon){
 		// get/create the ribbon...
 		var r = this.getRibbon(ribbon)
@@ -1072,8 +1069,6 @@ module.RibbonsPrototype = {
 	// NOTE: gid must be a .getImage(..) compatible object.
 	// NOTE: for keyword and offset to work an image must be focused.
 	// NOTE: overflowing offset will focus first/last image.
-	//
-	// XXX interaction animation...
 	focusImage: function(target){
 		var cur = this.viewer
 			.find('.current.image')
@@ -1085,6 +1080,7 @@ module.RibbonsPrototype = {
 
 	// Set base ribbon...
 	//
+	// XXX is this really needed here???
 	// XXX should this support keywords a-la .focusImage(..)???
 	setBaseRibbon: function(gid){
 		this.viewer.find('.base.ribbon').removeClass('base')
@@ -1196,10 +1192,6 @@ module.RibbonsPrototype = {
 	// NOTE: this can be applied in bulk, e.g. 
 	// 		this.rotateImage($('.image'), 'cw') will rotate all the 
 	// 		loaded images clockwise.
-	//
-	// XXX should this be strongly or weakly coupled to images.updateImage(..) 
-	// 		or images.correctImageProportionsForRotation(..)???
-	// XXX should .correctImageProportionsForRotation(..) be in images???
 	rotateImage: function(target, direction){
 		target = this.getImage(target)
 
@@ -1281,10 +1273,10 @@ module.RibbonsPrototype = {
 
 	// shorthands...
 	// XXX should these be here???
-	//rotateCW: function(target){ return this.rotateImage(target, 'cw') },
-	//rotateCCW: function(target){ return this.rotateImage(target, 'ccw') },
-	//flipVertical: function(target){ return this.flipImage(target, 'vertical') },
-	//flipHorizontal: function(target){ return this.flipImage(target, 'horizontal') },
+	rotateCW: function(target){ return this.rotateImage(target, 'cw') },
+	rotateCCW: function(target){ return this.rotateImage(target, 'ccw') },
+	flipVertical: function(target){ return this.flipImage(target, 'vertical') },
+	flipHorizontal: function(target){ return this.flipImage(target, 'horizontal') },
 
 
 	// UI manipulation...
diff --git a/ui (gen4)/viewer.js b/ui (gen4)/viewer.js
index 9434d959..73395daa 100755
--- a/ui (gen4)/viewer.js	
+++ b/ui (gen4)/viewer.js	
@@ -492,7 +492,7 @@ actions.Actions(Client, {
 		function(){  }],
 
 
-	// XXX
+	// XXX these are cheating...
 	shiftImageUp: [
 		function(target){
 			return function(){