diff --git a/ui/gallery-prototype.js b/ui/gallery-prototype.js
index f8cbae3e..b3d8934f 100755
--- a/ui/gallery-prototype.js
+++ b/ui/gallery-prototype.js
@@ -195,27 +195,29 @@ function toKeyName(code){
 }
 
 // XXX merge this with showSetup as they are virtually identical...
-function showKeyboardBindings(){
-	var actions = {}
+// XXX revise!!
+function showSettingUI(data, get_value, get_handler){
+	var tree = {}
 	var groups = []
+	var groups_ui = {}
 	// build the group/action structure...
-	for(var a in ImageGrid.actions){
-		var group = ImageGrid[a].group
-		if(group.indexOf(groups) == -1){
+	for(var a in data){
+		var group = data[a].group!=null?data[a].group:'Other'
+		if(groups.indexOf(group) == -1){
 			groups.push(group)
 		}
-		if(actions[group] == null){
-			actions[group] = []
+		if(tree[group] == null){
+			tree[group] = []
 		}
-		actions[group].push([
-				ImageGrid[a].title!=null?ImageGrid[a].title:a, 
+		tree[group].push([
+				data[a].title!=null?data[a].title:a, 
 				a
 		])
 	}
 	// sort things...
 	groups.sort()
-	for(var g in actions){
-		actions[g].sort(function(a, b){
+	for(var g in tree){
+		tree[g].sort(function(a, b){
 			a = a[0]
 			b = b[0]
 			return a > b ? 1 : a < b ? -1 : 0
@@ -223,40 +225,65 @@ function showKeyboardBindings(){
 	}
 	// build the HTML...
 	var ui = $('
')
-	for(var g in actions){
+	for(var g in tree){
 		var group = null
-		for(var i=0; i')
-					.append($('').text(g!=null?g:'Other'))
+					.append($('').text(g))
 			}
 			var option
 			group.append(
 				option = $('').append($([
-					$('').text(actions[g][i][0])[0],
+					$('').text(tree[g][i][0])[0],
 					$('').html(
-						action.doc?action.doc.replace(/\n/g, '
'):'')[0],
+						elem.doc?elem.doc.replace(/\n/g, '
'):'')[0],
 					// XXX keys...
-					$('').text('KEY')[0],
+					$('').text(get_value(elem))[0],
 			])))
-			if(action.display == false){
+			if(elem.display == false){
 				option.addClass('disabled')
 			} else {
-				// XXX handler...
+				// handler...
+				var handler = get_handler(elem)
+				if(handler != null){
+					option.click(handler)
+				}
 			}
 		}
 		if(group != null){
-			ui.append(group)
+			groups_ui[g] = group
 		}
 	}
+	// put the Other group in the back...
+	var i = groups.indexOf('Other')
+	if(i != -1){
+		groups.splice(i, 1)
+		groups.push('Other')
+	}
+	// buildup the sorted groups...
+	for(var i=0; i')
-			// build options...
-			for(var n in opt_ps){
-				var disabled = false
-				var opt = opt_ps[n]
-				var group = opt.group
-				// handle disabled opts...
-				if(opt.display == false){
-					if(!DEBUG){
-						continue
-					}
-					disabled = true
-				}
-				// build an option...
-				var option = $('').append($([
-					$('').text(opt.title != null ? opt.title : n)[0],
-					$('').html(opt['doc'].replace(/\n/g, '
'))[0],
-					$('').text(opts[n])[0]
-				]))
-				// group things correctly...
-				if(group == null){
-					group = 'Other'
-				}
-				if(groups[group] == null){
-					groups[group] = $('')
-						.append($('').text(group))
-						.append(option)
-				} else {
-					groups[group].append(option)
-				}
-				// event handlers...
-				var handler = opt_ps[n].click_handler
-				if(disabled){
-					option.addClass('disabled')
-				} else if(handler != null){
-					option.click(handler)
-				}
-			}
-			// build groups...
-			for(var i = 0; i < ImageGrid.option_groups.length; i++){
-				var group_name = ImageGrid.option_groups[i]
-				opts_container.append(groups[group_name])
-			}
-			opts_container.append(groups['Other'])
-			opts_container.click(function(e){
-				// update the view...
-				// XXX do we need to redraw the whole thing on each click???
-				ImageGrid.showSetup()
-				e.preventDefault()
-				return false
-			})
-			showInOverlay(opts_container)
+			showSettingUI(ImageGrid.option_props, 
+					function(e){return ImageGrid.option[e.name]}, 
+					function(e){return e.click_handler})
 		}))
 
 
@@ -1484,15 +1466,15 @@ ImageGrid.GROUP('Zooming',
 			ImageGrid.setContainerScale(f)
 		}),
 	// the fit N image pack, for 1 <= N <= 9
-	ImageGrid.ACTION({ title: 'Fit single image' }, function fitImage(){ImageGrid.fitNImages(1)}),
-	ImageGrid.ACTION({ title: 'Fit two images' }, function fitTwoImages(){ImageGrid.fitNImages(2)}),
-	ImageGrid.ACTION({ title: 'Fit three images' }, function fitThreeImages(){ImageGrid.fitNImages(3)}),
-	ImageGrid.ACTION({ title: 'Fit four images' }, function fitFourImages(){ImageGrid.fitNImages(4)}),
-	ImageGrid.ACTION({ title: 'Fit five images' }, function fitFiveImages(){ImageGrid.fitNImages(5)}),
-	ImageGrid.ACTION({ title: 'Fit six images' }, function fitSixImages(){ImageGrid.fitNImages(6)}),
-	ImageGrid.ACTION({ title: 'Fit seven images' }, function fitSevenImages(){ImageGrid.fitNImages(7)}),
-	ImageGrid.ACTION({ title: 'Fit eight images' }, function fitEightImages(){ImageGrid.fitNImages(8)}),
-	ImageGrid.ACTION({ title: 'Fit nine images' }, function fitNineImages(){ImageGrid.fitNImages(9)})
+	ImageGrid.ACTION({ title: 'Fit 1 image' }, function fitImage(){ImageGrid.fitNImages(1)}),
+	ImageGrid.ACTION({ title: 'Fit 2 images' }, function fitTwoImages(){ImageGrid.fitNImages(2)}),
+	ImageGrid.ACTION({ title: 'Fit 3 images' }, function fitThreeImages(){ImageGrid.fitNImages(3)}),
+	ImageGrid.ACTION({ title: 'Fit 4 images' }, function fitFourImages(){ImageGrid.fitNImages(4)}),
+	ImageGrid.ACTION({ title: 'Fit 5 images' }, function fitFiveImages(){ImageGrid.fitNImages(5)}),
+	ImageGrid.ACTION({ title: 'Fit 6 images' }, function fitSixImages(){ImageGrid.fitNImages(6)}),
+	ImageGrid.ACTION({ title: 'Fit 7 images' }, function fitSevenImages(){ImageGrid.fitNImages(7)}),
+	ImageGrid.ACTION({ title: 'Fit 8 images' }, function fitEightImages(){ImageGrid.fitNImages(8)}),
+	ImageGrid.ACTION({ title: 'Fit 9 images' }, function fitNineImages(){ImageGrid.fitNImages(9)})
 )