diff --git a/ui/data.js b/ui/data.js
index d8d52368..6dfebbe8 100755
--- a/ui/data.js
+++ b/ui/data.js
@@ -567,6 +567,184 @@ function getGIDBefore(gid, ribbon, search, data){
 }
 
 
+// Get "count" of GIDs starting with a given gid ("from")
+//
+// NOTE: this will not include the 'from' GID in the resulting list, 
+// 		unless inclusive is set to true.
+// NOTE: count can be either negative or positive, this will indicate 
+// 		load direction...
+// NOTE: this can calculate the ribbon number where the image is located.
+// NOTE: if an image can be in more than one ribbon, one MUST suply the
+// 		correct ribbon number...
+//
+// XXX do we need more checking???
+// XXX Race condition: when this is called while DATA is not yet fully 
+// 		loaded (old data), the from gid will not be present in 
+// 		DATA.ribbons...
+function getGIDsAfter(count, gid, ribbon, inclusive, data){
+	if(count == 0){
+		return []
+	}
+	// default values...
+	gid = gid == null ? getImageGID() : gid
+	data = data == null ? DATA : data
+	ribbon = ribbon == null ? getRibbonIndex() : ribbon
+	count = count == null ? Math.round(LOAD_SCREENS * getScreenWidthInImages()) : count
+	ribbon = ribbon == null ? getGIDRibbonIndex(gid, data) : ribbon
+
+	// get a local gid...
+	gid = data.ribbons[ribbon].indexOf(gid) < 0 ? getGIDBefore(gid, ribbon) : gid
+	ribbon = data.ribbons[ribbon]
+
+	// ribbon this is empty or non-existant...
+	// XXX need to check when can we get a ribbon == undefined case...
+	// 		...race?
+	//if(ribbon == null){
+	//	// XXX
+	//}
+	if(ribbon == null || ribbon.length == 0){
+		return []
+	}
+	if(count > 0){
+		var c = inclusive == null ? 1 : 0
+		var start = ribbon.indexOf(gid) + c
+		return ribbon.slice(start, start + count)
+	} else {
+		var c = inclusive == null ? 0 : 1
+		var end = ribbon.indexOf(gid)
+		return ribbon.slice((Math.abs(count) >= end ? 0 : end + count + c), end + c)
+	}
+}
+
+
+// Get a sub-ribbon of count elements around a given gid
+//
+//	+- ribbon	   count
+//	v			|<------>|
+// 	ooooooooooooooooXoooooooooooooooo	->	ooooXoooo
+// 					^
+// 				   gid
+//
+// If gid does not exist in the requested ribbon then getGIDBefore() is
+// used to get an appropriate alternative gid.
+//
+// If gid is less than count/2 to ribbon head/tail, then less than count
+// gids will be returned
+//
+//	   count
+//  |<------>|
+// 	   oXoooooooooooooooo	->	___oXoooo
+// 		^
+// 	   gid
+//
+//
+// Setting force_count will make this always return count images, even 
+// at the start and end of the ribbon.
+//
+//		  count
+//	   |<------>|
+// 	   oXoooooooooooooooo	->	oXooooooo
+// 		^
+// 	   gid
+//
+// Otherwise this will return less.
+//
+// NOTE: skipping gid and ribbon while passing data may not work correctly...
+// NOTE: count represents section diameter...
+function getGIDsAround(count, gid, ribbon, data, force_count){
+	if(count == 0){
+		return []
+	}
+	// default values...
+	data = data == null ? DATA : data
+	gid = gid == null ? getImageGID() : gid
+	ribbon = ribbon == null ? getRibbonIndex() : ribbon
+	// XXX is this out of context here???
+	count = count == null ? Math.round(LOAD_SCREENS * getScreenWidthInImages()) : count
+
+	var ribbon_data = data.ribbons[ribbon]
+	// get a gid that's in the current ribbon...
+	gid = ribbon_data.indexOf(gid) < 0 ? getGIDBefore(gid, ribbon, null, data) : gid
+
+	// calculate the bounds...
+	var i = ribbon_data.indexOf(gid)
+
+	var start = i - Math.floor(count/2)
+	start = start < 0 ? 0 : start
+
+	var end = i + Math.ceil(count/2)
+	end = end > ribbon_data.length ? ribbon_data.length : end
+
+	// force count by extending the ribbon at the opposite end...
+	if(force_count && ribbon_data.length > count){
+		var d = count - (end - start)
+
+		start = end >= ribbon_data.length ? start - d  : start
+		start = start < 0 ? 0 : start
+
+		end = start <= 0 ? end + d : end
+		end = end > ribbon_data.length ? ribbon_data.length : end
+	}
+
+	// get the actual data...
+	return ribbon_data.slice(start, end)
+}
+
+
+// NOTE: this expects that both arrays cleanly intersect each other only 
+// 		once...
+// XXX this sometimes returns a null and a value which seems to be 
+// 		impossible...
+// 		...this does not affect anything, but still need to investigate...
+function getCommonSubArrayOffsets(L1, L2){
+	var res = {}
+
+	// defaults for if one of the lists is empty...
+	if(L1.length == 0){
+		res.left = -(L2.length)
+		res.right = 0
+		return res
+	} else if(L2.length == 0){
+		res.left = L1.length 
+		res.right = 0
+		return res
+	}
+
+	// head...
+	var a = L2.indexOf(L1[0])
+	var b = L1.indexOf(L2[0])
+	res.left = a >= 0 ? -a 
+			: b >= 0 ? b 
+			: null
+
+	// tail...
+	a = L2.indexOf(L1[L1.length-1])
+	b = L1.indexOf(L2[L2.length-1])
+	res.right = a >= 0 ? -(L2.length - a - 1)
+			: b >= 0 ? L1.length - b - 1
+			: null
+
+	return res
+}
+
+
+// NOTE: this expects that bot arrays cleanly intersect each other only 
+// 		once...
+function getCommonSubArray(L1, L2){
+	var res = getCommonSubArrayOffsets(L1, L2)
+	var left = res.left
+	var right = res.right
+
+	if(left == null && right == null){
+		return []
+	}
+
+	//a = L1.slice(Math.max(0, left), L1.length - Math.max(right, 0))
+	//b = L2.slice(Math.max(0, -left), L2.length - Math.max(-right, 0))
+	return L1.slice(Math.max(0, left), L1.length - Math.max(right, 0))
+}
+
+
 // Base URL interface...
 //
 // NOTE: changing a base URL will trigger a baseURLChanged event...
@@ -1196,61 +1374,10 @@ function shiftRibbonsBy(n, gid, data){
 
 
 
-/**********************************************************************
-* Format conversion
-*/
-
-// Convert legacy Gen1 data format to current Gen3 (v2.0)
-function convertDataGen1(data, cmp){
-	var res = {
-		data: {
-			version: '2.0',
-			current: null,
-			ribbons: [],
-			order: [], 
-		},
-		images: {}
-	}
-	cmp = cmp == null ?
-			function(a, b){ 
-				return imageDateCmp(a, b, null, res.images) 
-			}
-			: cmp
-	var ribbons = res.data.ribbons
-	var order = res.data.order
-	var images = res.images
-
-	// position...
-	res.data.current = data.position
-	
-	// ribbons and images...
-	$.each(data.ribbons, function(i, input_images){
-		var ribbon = []
-		ribbons.push(ribbon)
-		for(var id in input_images){
-			var image = input_images[id]
-			ribbon.push(id)
-			order.push(id)
-			images[id] = image
-		}
-		ribbon.sort(cmp)
-	})
-
-	order.sort(cmp)
-
-	// XXX STUB
-	res.data.current = order[0]
-
-	return res
-}
-
-
-
 /**********************************************************************
 * Loaders
 */
 
-
 function updateImageIndicators(gid, image){
 	gid = gid == null ? getImageGID() : gid
 	image = image == null ? getImage() : $(image)
@@ -1354,9 +1481,6 @@ function updateImage(image, gid, size, sync){
 	// flip...
 	setImageFlipState(image, img_data.flipped == null ? [] : img_data.flipped)
 
-	// XXX filter settings...
-	// XXX
-
 	// NOTE: this only has effect on non-square image blocks...
 	correctImageProportionsForRotation(image)
 
@@ -1423,184 +1547,6 @@ function updateImages(size){
 */
 
 
-// Get "count" of GIDs starting with a given gid ("from")
-//
-// NOTE: this will not include the 'from' GID in the resulting list, 
-// 		unless inclusive is set to true.
-// NOTE: count can be either negative or positive, this will indicate 
-// 		load direction...
-// NOTE: this can calculate the ribbon number where the image is located.
-// NOTE: if an image can be in more than one ribbon, one MUST suply the
-// 		correct ribbon number...
-//
-// XXX do we need more checking???
-// XXX Race condition: when this is called while DATA is not yet fully 
-// 		loaded (old data), the from gid will not be present in 
-// 		DATA.ribbons...
-function getGIDsAfter(count, gid, ribbon, inclusive, data){
-	if(count == 0){
-		return []
-	}
-	// default values...
-	gid = gid == null ? getImageGID() : gid
-	data = data == null ? DATA : data
-	ribbon = ribbon == null ? getRibbonIndex() : ribbon
-	count = count == null ? Math.round(LOAD_SCREENS * getScreenWidthInImages()) : count
-	ribbon = ribbon == null ? getGIDRibbonIndex(gid, data) : ribbon
-
-	// get a local gid...
-	gid = data.ribbons[ribbon].indexOf(gid) < 0 ? getGIDBefore(gid, ribbon) : gid
-	ribbon = data.ribbons[ribbon]
-
-	// ribbon this is empty or non-existant...
-	// XXX need to check when can we get a ribbon == undefined case...
-	// 		...race?
-	//if(ribbon == null){
-	//	// XXX
-	//}
-	if(ribbon == null || ribbon.length == 0){
-		return []
-	}
-	if(count > 0){
-		var c = inclusive == null ? 1 : 0
-		var start = ribbon.indexOf(gid) + c
-		return ribbon.slice(start, start + count)
-	} else {
-		var c = inclusive == null ? 0 : 1
-		var end = ribbon.indexOf(gid)
-		return ribbon.slice((Math.abs(count) >= end ? 0 : end + count + c), end + c)
-	}
-}
-
-
-// Get a sub-ribbon of count elements around a given gid
-//
-//	+- ribbon	   count
-//	v			|<------>|
-// 	ooooooooooooooooXoooooooooooooooo	->	ooooXoooo
-// 					^
-// 				   gid
-//
-// If gid does not exist in the requested ribbon then getGIDBefore() is
-// used to get an appropriate alternative gid.
-//
-// If gid is less than count/2 to ribbon head/tail, then less than count
-// gids will be returned
-//
-//	   count
-//  |<------>|
-// 	   oXoooooooooooooooo	->	___oXoooo
-// 		^
-// 	   gid
-//
-//
-// Setting force_count will make this always return count images, even 
-// at the start and end of the ribbon.
-//
-//		  count
-//	   |<------>|
-// 	   oXoooooooooooooooo	->	oXooooooo
-// 		^
-// 	   gid
-//
-// Otherwise this will return less.
-//
-// NOTE: skipping gid and ribbon while passing data may not work correctly...
-// NOTE: count represents section diameter...
-function getGIDsAround(count, gid, ribbon, data, force_count){
-	if(count == 0){
-		return []
-	}
-	// default values...
-	data = data == null ? DATA : data
-	gid = gid == null ? getImageGID() : gid
-	ribbon = ribbon == null ? getRibbonIndex() : ribbon
-	// XXX is this out of context here???
-	count = count == null ? Math.round(LOAD_SCREENS * getScreenWidthInImages()) : count
-
-	var ribbon_data = data.ribbons[ribbon]
-	// get a gid that's in the current ribbon...
-	gid = ribbon_data.indexOf(gid) < 0 ? getGIDBefore(gid, ribbon, null, data) : gid
-
-	// calculate the bounds...
-	var i = ribbon_data.indexOf(gid)
-
-	var start = i - Math.floor(count/2)
-	start = start < 0 ? 0 : start
-
-	var end = i + Math.ceil(count/2)
-	end = end > ribbon_data.length ? ribbon_data.length : end
-
-	// force count by extending the ribbon at the opposite end...
-	if(force_count && ribbon_data.length > count){
-		var d = count - (end - start)
-
-		start = end >= ribbon_data.length ? start - d  : start
-		start = start < 0 ? 0 : start
-
-		end = start <= 0 ? end + d : end
-		end = end > ribbon_data.length ? ribbon_data.length : end
-	}
-
-	// get the actual data...
-	return ribbon_data.slice(start, end)
-}
-
-
-// NOTE: this expects that both arrays cleanly intersect each other only 
-// 		once...
-// XXX this sometimes returns a null and a value which seems to be 
-// 		impossible...
-// 		...this does not affect anything, but still need to investigate...
-function getCommonSubArrayOffsets(L1, L2){
-	var res = {}
-
-	// defaults for if one of the lists is empty...
-	if(L1.length == 0){
-		res.left = -(L2.length)
-		res.right = 0
-		return res
-	} else if(L2.length == 0){
-		res.left = L1.length 
-		res.right = 0
-		return res
-	}
-
-	// head...
-	var a = L2.indexOf(L1[0])
-	var b = L1.indexOf(L2[0])
-	res.left = a >= 0 ? -a 
-			: b >= 0 ? b 
-			: null
-
-	// tail...
-	a = L2.indexOf(L1[L1.length-1])
-	b = L1.indexOf(L2[L2.length-1])
-	res.right = a >= 0 ? -(L2.length - a - 1)
-			: b >= 0 ? L1.length - b - 1
-			: null
-
-	return res
-}
-
-
-// NOTE: this expects that bot arrays cleanly intersect each other only 
-// 		once...
-function getCommonSubArray(L1, L2){
-	var res = getCommonSubArrayOffsets(L1, L2)
-	var left = res.left
-	var right = res.right
-
-	if(left == null && right == null){
-		return []
-	}
-
-	//a = L1.slice(Math.max(0, left), L1.length - Math.max(right, 0))
-	//b = L2.slice(Math.max(0, -left), L2.length - Math.max(-right, 0))
-	return L1.slice(Math.max(0, left), L1.length - Math.max(right, 0))
-}
-
-
 // Load count images around a given image/gid into the given ribbon.
 //
 function loadImagesAround(count, gid, ribbon, data, force_count){
@@ -1822,22 +1768,6 @@ function updateRibbonOrder(no_reload_viewer){
 }
 
 
-// Action wrapper of alignDataToRibbon(...)
-//
-// Align ribbons to the current ribbon.
-//
-// XXX need to change the default to base ribbon for production...
-function alignRibbons(ribbon){
-	console.warn('alignRibbons(): not yet ready for production use!')
-	// XXX remove this line for production....
-	ribbon = ribbon == null ? getRibbonIndex() : ribbon
-
-	DATA = alignDataToRibbon(ribbon)
-
-	reloadViewer()
-}
-
-
 // Focus next/prev image in order...
 //
 // This differs form nextImage/prevImage in that these are not 
@@ -1858,6 +1788,22 @@ var prevImageInOrder = makePrevFromListAction(
 		})
 
 
+// Action wrapper of alignDataToRibbon(...)
+//
+// Align ribbons to the current ribbon.
+//
+// XXX need to change the default to base ribbon for production...
+function alignRibbons(ribbon){
+	console.warn('alignRibbons(): not yet ready for production use!')
+	// XXX remove this line for production....
+	ribbon = ribbon == null ? getRibbonIndex() : ribbon
+
+	DATA = alignDataToRibbon(ribbon)
+
+	reloadViewer()
+}
+
+
 
 /******************************************************* Extension ***/
 
diff --git a/ui/formats.js b/ui/formats.js
new file mode 100755
index 00000000..652dab4a
--- /dev/null
+++ b/ui/formats.js
@@ -0,0 +1,63 @@
+/**********************************************************************
+* 
+*
+*
+**********************************************************************/
+
+//var DEBUG = DEBUG != null ? DEBUG : true
+
+
+/*********************************************************************/
+
+// Convert legacy Gen1 data format to current Gen3 (v2.0)
+function convertDataGen1(data, cmp){
+	var res = {
+		data: {
+			version: '2.0',
+			current: null,
+			ribbons: [],
+			order: [], 
+		},
+		images: {}
+	}
+	cmp = cmp == null ?
+			function(a, b){ 
+				return imageDateCmp(a, b, null, res.images) 
+			}
+			: cmp
+	var ribbons = res.data.ribbons
+	var order = res.data.order
+	var images = res.images
+
+	// position...
+	res.data.current = data.position
+	
+	// ribbons and images...
+	$.each(data.ribbons, function(i, input_images){
+		var ribbon = []
+		ribbons.push(ribbon)
+		for(var id in input_images){
+			var image = input_images[id]
+			ribbon.push(id)
+			order.push(id)
+			images[id] = image
+		}
+		ribbon.sort(cmp)
+	})
+
+	order.sort(cmp)
+
+	// XXX STUB
+	res.data.current = order[0]
+
+	return res
+}
+
+
+
+
+
+
+
+/**********************************************************************
+* vim:set ts=4 sw=4 :                                                */
diff --git a/ui/index.html b/ui/index.html
index 326741d7..6e98f076 100755
--- a/ui/index.html
+++ b/ui/index.html
@@ -30,6 +30,7 @@
 
 
 
+