diff --git a/gstlal-burst/bin/gstlal_cs_triggergen b/gstlal-burst/bin/gstlal_cs_triggergen
index aba4ba83411e5bd85fe96c8dd7ebb013ccc11c40..143ed0ded66c0622da349d5519ca04acf149ae9c 100755
--- a/gstlal-burst/bin/gstlal_cs_triggergen
+++ b/gstlal-burst/bin/gstlal_cs_triggergen
@@ -14,6 +14,7 @@ Gst.init(None)
 from gstlal import datasource
 from gstlal import pipeio
 from gstlal import pipeparts
+from gstlal import reference_psd
 from gstlal import simplehandler
 from gstlal import snglbursttable 
 from gstlal import streamburca
@@ -95,12 +96,13 @@ options, filenames = parse_command_line()
 #
 
 class PipelineHandler(simplehandler.Handler):
-	def __init__(self, mainloop, pipeline, xmldoc, template_banks, sngl_burst, analyzed_seglistdict, reference_psds, firbanks, triggergens):
+	def __init__(self, mainloop, pipeline, xmldoc, template_banks, sngl_burst, analyzed_seglistdict, reference_psds, whitens, firbanks, triggergens):
 		simplehandler.Handler.__init__(self, mainloop, pipeline)
 		self.lock = threading.Lock()
 		self.template_bank = template_banks
 		self.sngl_burst = sngl_burst
 		self.analyzed_seglistdict = analyzed_seglistdict
+		self.whitens = whitens
 		self.firbank = firbanks
 		self.triggergen = triggergens
 		# template normalization. use central_freq to uniquely identify templates
@@ -234,6 +236,10 @@ class PipelineHandler(simplehandler.Handler):
 				timestamp = psd.epoch
 			else:
 				psd = self.reference_psd[instrument]
+				deltaf = self.whitens[instrument].get_property("delta-f")
+				psd_interp = reference_psd.interpolate_psd(psd, deltaf)
+				self.whitens[instrument].set_property("psd-mode", 1)
+				self.whitens[instrument].set_property("mean-psd", psd_interp.data.data)
 
 			stability = float(message.src.get_property("n-samples")) / message.src.get_property("average-samples")
 
@@ -412,6 +418,7 @@ analyzed_seglistdict = segments.segmentlistdict()
 mainloop = GObject.MainLoop()
 pipeline = Gst.Pipeline(name="pipeline")
 
+whiten = dict.fromkeys(all_ifos, None)
 firbank = dict.fromkeys(all_ifos, None)
 triggergen = dict.fromkeys(all_ifos, None)
 
@@ -431,9 +438,7 @@ for ifo in all_ifos:
 		head = datasource.mksegmentsrcgate(pipeline, head, vetolists[ifo], invert_output = True, leaky = True)
 	# limit the maximum buffer duration.  keeps RAM use under control
 	# in the even that we are loading gigantic frame files
-	# FIXME currently needs to be >= fft_length (= 32s) for mkwhiten to work. (I think)
-	# when the reference_psd can be used for mkwhiten, change the block duration to shorter time.
-	head = pipeparts.mkreblock(pipeline, head, block_duration = 64 * 1000000000)
+	head = pipeparts.mkreblock(pipeline, head, block_duration = 8 * 1000000000)
 
 
 	#
@@ -448,13 +453,7 @@ for ifo in all_ifos:
 	# whitener, resampler and caps filter
 	#
 
-	# FIXME if reference psd is available use that for whitening data
-	# the below code doesn't work...
-	#if options.reference_psd is not None:
-		#head = pipeparts.mkwhiten(pipeline, head, fft_length = 32, name = "lal_whiten_%s" % ifo, psd_mode = 1, mean_psd = psd[ifo].data.data)
-	#else:
-		#head = pipeparts.mkwhiten(pipeline, head, fft_length = 32, name = "lal_whiten_%s" % ifo)
-	head = pipeparts.mkwhiten(pipeline, head, fft_length = 32, name = "lal_whiten_%s" % ifo)
+	head = whiten[ifo] = pipeparts.mkwhiten(pipeline, head, fft_length = 8, name = "lal_whiten_%s" % ifo)
 	head = pipeparts.mkaudioconvert(pipeline, head)
 	head = pipeparts.mkresample(pipeline, head)
 	# FIXME NO hardcoding original sample rate!
@@ -480,7 +479,7 @@ for ifo in all_ifos:
 # handler
 #
 
-handler = PipelineHandler(mainloop, pipeline, xmldoc, template_bank_table, sngl_burst_table, analyzed_seglistdict, psd, firbank, triggergen)
+handler = PipelineHandler(mainloop, pipeline, xmldoc, template_bank_table, sngl_burst_table, analyzed_seglistdict, psd, whiten, firbank, triggergen)
 
 
 #