Index: Open-ILS/src/perlmods/OpenILS/Application/Circ/Holds.pm
===================================================================
--- Open-ILS/src/perlmods/OpenILS/Application/Circ/Holds.pm	(revision 16639)
+++ Open-ILS/src/perlmods/OpenILS/Application/Circ/Holds.pm	(working copy)
@@ -1574,10 +1574,12 @@
 	$logger->info("circulator: searching for best hold at org ".$user->ws_ou.
         " and copy $bc with a hold stalling interval of ". ($hold_stall_interval || "(none)"));
 
+    my $fifo = $U->ou_ancestor_setting_value($user->ws_ou, 'circ.hold_fifo');
+
 	# search for what should be the best holds for this copy to fulfill
 	my $best_holds = $U->storagereq(
 		"open-ils.storage.action.hold_request.nearest_hold.atomic",
-		$user->ws_ou, $copy->id, 10, $hold_stall_interval );
+		$user->ws_ou, $copy->id, 10, $hold_stall_interval, $fifo );
 
 	unless(@$best_holds) {
 
Index: Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/action.pm
===================================================================
--- Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/action.pm	(revision 16639)
+++ Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/action.pm	(working copy)
@@ -267,7 +267,10 @@
 	my $cp = shift;
 	my $limit = int(shift()) || 10;
 	my $age = shift() || '0 seconds';
+    my $fifo = shift();
 
+    my $holdsort = $fifo ? "h.request_time, h.selection_depth DESC, p.prox " : "p.prox, h.selection_depth DESC, h.request_time ";
+
 	my $ids = action::hold_request->db_Main->selectcol_arrayref(<<"	SQL", {}, $here, $cp, $age);
 		SELECT	h.id
 		  FROM	action.hold_request h
@@ -279,10 +282,7 @@
 		  	AND h.cancel_time IS NULL
 		  	AND (h.expire_time IS NULL OR h.expire_time > NOW())
             AND h.frozen IS FALSE
-		ORDER BY
-			p.prox,
-			h.selection_depth DESC,
-			h.request_time
+		ORDER BY $holdsort
 		LIMIT $limit
 	SQL
 	
Index: Open-ILS/xul/staff_client/server/admin/org_unit_settings.xhtml
===================================================================
--- Open-ILS/xul/staff_client/server/admin/org_unit_settings.xhtml	(revision 16639)
+++ Open-ILS/xul/staff_client/server/admin/org_unit_settings.xhtml	(working copy)
@@ -206,6 +206,11 @@
                     desc : '&staff.server.admin.org_settings.opac.allow_pending_address.desc;',
                     type : 'bool'
                 },
+                'circ.holds_fifo' : {
+                    label : 'Holds: FIFO',
+                    desc : 'Force holds to a more strict First-In, First-Out capture',
+                    type : 'bool'
+                },
                 /*
                 'ui.circ.show_billing_tab_on_bills' : {
                     label : '&staff.server.admin.org_settings.ui.circ.show_billing_tab_on_bills;',
