diff --git a/gstlal-calibration/bin/gstlal_compute_strain b/gstlal-calibration/bin/gstlal_compute_strain
index df7120675dfcb43f94781368b21bb4d608d2691c..fec34b7ad8c6410c7ede18961c3f4831b4e6a008 100755
--- a/gstlal-calibration/bin/gstlal_compute_strain
+++ b/gstlal-calibration/bin/gstlal_compute_strain
@@ -259,12 +259,13 @@ cleaning_check_range_low_min = float(DataCleaningConfigs["cleaningcheckrangelowm
 cleaning_check_range_low_max = float(DataCleaningConfigs["cleaningcheckrangelowmax"])
 cleaning_check_range_mid_min = float(DataCleaningConfigs["cleaningcheckrangemidmin"])
 cleaning_check_range_mid_max = float(DataCleaningConfigs["cleaningcheckrangemidmax"])
+powerlines_tf_median_time = float(DataCleaningConfigs["powerlinestfmediantime"]) if "powerlinestfmediantime" in DataCleaningConfigs else 1
 powerlines_tf_averaging_time = float(DataCleaningConfigs["powerlinestfaveragingtime"])
 powerlines_freq_var = float(DataCleaningConfigs["powerlinesfreqvar"])
 witness_channel_fft_time = float(DataCleaningConfigs["witnesschannelffttime"])
 num_witness_ffts = int(DataCleaningConfigs["numwitnessffts"])
 min_witness_ffts = int(DataCleaningConfigs["minwitnessffts"])
-witness_fir_length = float(DataCleaningConfigs["witnessfirlength"])
+witness_fir_length = DataCleaningConfigs["witnessfirlength"].split(";")
 witness_frequency_resolution = float(DataCleaningConfigs["witnessfrequencyresolution"])
 witness_tf_update_time = float(DataCleaningConfigs["witnesstfupdatetime"])
 critical_lock_loss_time = float(DataCleaningConfigs["criticallocklosstime"])
@@ -784,6 +785,7 @@ if ChannelNames["witnesschannellist"] != "None":
 	witness_channel_list = ChannelNames["witnesschannellist"].split(';')
 	witness_notch_frequencies = DataCleaningConfigs["witnessnotchfrequencies"].split(';')
 	witness_rates = SampleRates["witnesschannelsr"].split(';')
+	witness_highpasses = DataCleaningConfigs['witnesshighpasses'].split(';') if "witnesshighpasses" in DataCleaningConfigs else list(15 * numpy.ones(len(witness_channel_list)))
 	if len(witness_channel_list) != len(witness_notch_frequencies) or len(witness_channel_list) != len(witness_rates):
 		raise ValueError("WitnessChannelList, WitnessChannelSR, and WitnessNotchFrequencies must all be the same length, i.e., they must all have the same number of semicolons (;)")
 	for i in range(0, len(witness_channel_list)):
@@ -792,6 +794,7 @@ if ChannelNames["witnesschannellist"] != "None":
 			channel_list.append((instrument, witness_channel_list[i][j]))
 			headkeys.append(witness_channel_list[i][j])
 		witness_rates[i] = int(witness_rates[i])
+		witness_highpasses[i] = float(witness_highpasses[i])
 		witness_notch_frequencies[i] = witness_notch_frequencies[i].split(',')
 		if len(witness_notch_frequencies[i]) <= 1:
 			witness_notch_frequencies[i] = []
@@ -2240,7 +2243,7 @@ if remove_power_lines:
 	powerlines = calibration_parts.caps_and_progress(pipeline, head_dict["powerlines"], "audio/x-raw, format=F64LE, channels=1, channel-mask=(bitmask)0x0", "powerlines")
 	if remove_cal_lines and filter_latency_factor > 0:
 		powerlines = pipeparts.mkgeneric(pipeline, powerlines, "lal_insertgap", chop_length = int(1000000000 * filter_latency_factor * demodulation_filter_time))
-	clean_strain = calibration_parts.remove_harmonics_with_witness(pipeline, clean_strain, powerlines, 60, 5, powerlines_freq_var, filter_latency_factor, compute_rate = compute_factors_sr, rate_out = hoft_sr, num_avg = powerlines_tf_averaging_time * compute_factors_sr, noisesub_gate_bit = noisesubgatetee)
+	clean_strain = calibration_parts.remove_harmonics_with_witness(pipeline, clean_strain, powerlines, 60, 5, powerlines_freq_var, filter_latency_factor, compute_rate = compute_factors_sr, rate_out = hoft_sr, num_median = powerlines_tf_median_time, num_avg = powerlines_tf_averaging_time * compute_factors_sr, noisesub_gate_bit = noisesubgatetee)
 
 # Remove excess noise using any provided witness channels
 if witness_channel_list is not None:
@@ -2260,7 +2263,7 @@ if witness_channel_list is not None:
 		# How many samples between filter updates (does not include the samples used to compute the FIR filters
 		witness_tf_update_samples = int(witness_rates[i] * witness_tf_update_time)
 		# Length of FIR filters
-		witness_fir_samples = int(witness_fir_length * witness_rates[i])
+		witness_fir_samples = int(float(witness_fir_length[min(i, len(witness_fir_length) - 1)]) * witness_rates[i])
 		# Over how many samples should new FIR filters be tapered in?
 		witness_filter_taper_length = int(witness_rates[i] * witness_filter_taper_time)
 
@@ -2270,7 +2273,7 @@ if witness_channel_list is not None:
 				witnesses.append(calibration_parts.caps_and_progress(pipeline, head_dict[key], "audio/x-raw, format=F64LE, channels=1, channel-mask=(bitmask)0x0", key))
 		if len(witnesses) != len(witness_channel_list[i]):
 			print "WARNING: Not all requested witness channels are being used"
-		clean_strain = calibration_parts.clean_data(pipeline, clean_strain, hoft_sr, witnesses, witness_rates[i], witness_fft_samples, witness_fft_overlap, num_witness_ffts, min_witness_ffts, witness_tf_update_samples, witness_fir_samples, witness_frequency_resolution, witness_filter_taper_length, use_median = witness_tf_use_median, parallel_mode = witness_tf_parallel_mode, notch_frequencies = witness_notch_frequencies[i], noisesub_gate_bit = noisesubgatetee, delay_time = witness_delay_time, critical_lock_loss_time = critical_lock_loss_time, filename = None if witness_tf_filename is None else "%s_%d.txt" % (witness_tf_filename, i))
+		clean_strain = calibration_parts.clean_data(pipeline, clean_strain, hoft_sr, witnesses, witness_rates[i], witness_fft_samples, witness_fft_overlap, num_witness_ffts, min_witness_ffts, witness_tf_update_samples, witness_fir_samples, witness_frequency_resolution, witness_filter_taper_length, use_median = witness_tf_use_median, parallel_mode = witness_tf_parallel_mode, notch_frequencies = witness_notch_frequencies[i], high_pass = witness_highpasses[i], noisesub_gate_bit = noisesubgatetee, delay_time = witness_delay_time, critical_lock_loss_time = critical_lock_loss_time, filename = None if witness_tf_filename is None else "%s_%d.txt" % (witness_tf_filename, i))
 		witness_delay_time += witness_delay_increment
 
 if remove_cal_lines or remove_power_lines or witness_channel_list is not None:
diff --git a/gstlal-calibration/config_files/O2/H1/tests/H1DCS_AllCorrections_Cleaning.ini b/gstlal-calibration/config_files/O2/H1/tests/H1DCS_AllCorrections_Cleaning.ini
index b74058e99b4ea8b85d85265fe4e5403a115557d6..c490019d77417e948cda22d5e6251b54c0e2e563 100644
--- a/gstlal-calibration/config_files/O2/H1/tests/H1DCS_AllCorrections_Cleaning.ini
+++ b/gstlal-calibration/config_files/O2/H1/tests/H1DCS_AllCorrections_Cleaning.ini
@@ -208,9 +208,9 @@ CohUncDARMLine1Channel: CAL-CS_TDEP_DARM_LINE1_UNCERTAINTY
 PowerLinesChannel: PEM-EY_MAINSMON_EBAY_1_DQ
 # Comma-separated list of witness channels to use to subtract noise from h(t)
 # Set to None if no witness channels are to be used
-WitnessChannelList: IMC-WFS_A_DC_PIT_OUT_DQ,IMC-WFS_B_DC_PIT_OUT_DQ,IMC-WFS_A_DC_YAW_OUT_DQ,IMC-WFS_B_DC_YAW_OUT_DQ;PSL-DIAG_BULLSEYE_YAW_OUT_DQ,PSL-DIAG_BULLSEYE_WID_OUT_DQ,PSL-DIAG_BULLSEYE_PIT_OUT_DQ;ASC-DHARD_P_OUT_DQ,ASC-DHARD_Y_OUT_DQ,ASC-CHARD_P_OUT_DQ,ASC-CHARD_Y_OUT_DQ;LSC-SRCL_IN1_DQ,LSC-MICH_IN1_DQ,LSC-PRCL_IN1_DQ
+WitnessChannelList: IMC-WFS_A_DC_PIT_OUT_DQ,IMC-WFS_B_DC_PIT_OUT_DQ,IMC-WFS_A_DC_YAW_OUT_DQ,IMC-WFS_B_DC_YAW_OUT_DQ,PSL-DIAG_BULLSEYE_YAW_OUT_DQ,PSL-DIAG_BULLSEYE_WID_OUT_DQ,PSL-DIAG_BULLSEYE_PIT_OUT_DQ;ASC-DHARD_P_OUT_DQ,ASC-DHARD_Y_OUT_DQ,ASC-CHARD_P_OUT_DQ,ASC-CHARD_Y_OUT_DQ,LSC-SRCL_IN1_DQ,LSC-MICH_IN1_DQ,LSC-PRCL_IN1_DQ
 # What channel should we use to gate the noise subtraction and 60-Hz line subtraction
-NoiseSubGateChannel: GRD-ISC_LOCK_OK
+NoiseSubGateChannel: ODC-MASTER_CHANNEL_OUT_DQ
 ###############################
 # EPICS Records Channel Names #
 ###############################
@@ -286,7 +286,7 @@ EPICSRefSR: 16
 # Sample rate for power lines channel
 PowerLinesChannelSR: 1024
 # Sample rates at which transfer functions will be computed and witness channels will be filtered, given as a semicolon-separated list, e.g., 2048;2048;512;2048. This must be given if WitnessChannelList is not None, and it must be the same length.
-WitnessChannelSR: 2048;2048;512;2048
+WitnessChannelSR: 2048;512
 # Sample rates at which to compute and record TDCFs
 ComputeFactorsSR: 16
 RecordFactorsSR: 16
@@ -298,7 +298,7 @@ CBCHWInjBitmask: 16777216
 BurstHWInjBitmask: 33554432
 DetCharHWInjBitmask: 67108864
 StochHWInjBitmask: 8388608
-NoiseSubGateBitmask: 1
+NoiseSubGateBitmask: 4
 
 [PipelineConfigurations]
 BufferLength: 1.0
@@ -323,6 +323,7 @@ RemovePowerLines: Yes
 # Amount by which frequency of power lines varies with time
 PowerLinesFreqVar: 0.02
 # Time over which to average the transfer function between the power mains witness channel and h(t) at 60 Hz and harmonics
+PowerLinesTFMedianTime: 1
 PowerLinesTFAveragingTime: 128
 #######################################
 # Options for broadband noise removal #
@@ -334,11 +335,13 @@ NumWitnessFFTs: 509
 # Sets the minimum number of FFTs necessary to produce the first transfer functions and clean data after data flow starts.
 MinWitnessFFTs: 509
 # The length in seconds of the filters applied to the witness channels before subtracting from h(t)
-WitnessFIRLength: 0.5
+WitnessFIRLength: 0.5;1.6
 # The frequency resolution of the filters applied to the witness channels before subtracting from h(t). It can be advantageous to lower the frequency resolution in order to average over excess noise.
-WitnessFrequencyResolution: 1.0
+WitnessFrequencyResolution: 0.5
 # List of minima and maxima of frequency ranges where the Fourier transform of h(t) will be replaced by a straight line in the calculation of transfer functions between witness channels and h(t) for noise subtraction. Semicolons separate lists for different sets of witness channels. If no notches are desired, use zeros, e.g., \'0;0;0\'. Here is an example using the expected format: \'495.0,515.0,985.0,1015.0;59,60,119,121;0\' This can be useful, e.g., if there are loud lines in the signal that are not present in the witness channels.
-WitnessNotchFrequencies: 12.0,15.0,495.0,515.0,985.0,1015.0;12.0,15.0,495.0,515.0,985.0,1015.0;12.0,15.0;12.0,15.0,495.0,515.0,985.0,1015.0
+WitnessNotchFrequencies: 12.0,15.0,495.0,515.0,985.0,1015.0;0
+# Cutoff frequencies for high-pass filters for witness channels
+WitnessHighPasses: 12;10
 # The amount of time after transfer functions between witness channels and h(t) are finished to begin the calculation of the next set of transfer functions
 WitnessTFUpdateTime: 4
 # If lock-loss lasts at least this many seconds, transfer functions will revert to those computed at the beginning of a lock stretch. Set to zero to disbale.
diff --git a/gstlal-calibration/config_files/O2/H1/tests/H1DCS_AllCorrections_Cleaning_TEST.ini b/gstlal-calibration/config_files/O2/H1/tests/H1DCS_AllCorrections_Cleaning_TEST.ini
index 760e3463bffe67578b416eb1c7368d5930805faa..1e7788448351bb17cf693761df0820df684cb9f3 100644
--- a/gstlal-calibration/config_files/O2/H1/tests/H1DCS_AllCorrections_Cleaning_TEST.ini
+++ b/gstlal-calibration/config_files/O2/H1/tests/H1DCS_AllCorrections_Cleaning_TEST.ini
@@ -208,9 +208,9 @@ CohUncDARMLine1Channel: CAL-CS_TDEP_DARM_LINE1_UNCERTAINTY
 PowerLinesChannel: PEM-EY_MAINSMON_EBAY_1_DQ
 # Comma-separated list of witness channels to use to subtract noise from h(t)
 # Set to None if no witness channels are to be used
-WitnessChannelList: IMC-WFS_A_DC_PIT_OUT_DQ,IMC-WFS_B_DC_PIT_OUT_DQ,IMC-WFS_A_DC_YAW_OUT_DQ,IMC-WFS_B_DC_YAW_OUT_DQ;PSL-DIAG_BULLSEYE_YAW_OUT_DQ,PSL-DIAG_BULLSEYE_WID_OUT_DQ,PSL-DIAG_BULLSEYE_PIT_OUT_DQ;ASC-DHARD_P_OUT_DQ,ASC-DHARD_Y_OUT_DQ,ASC-CHARD_P_OUT_DQ,ASC-CHARD_Y_OUT_DQ;LSC-SRCL_IN1_DQ,LSC-MICH_IN1_DQ,LSC-PRCL_IN1_DQ
+WitnessChannelList: IMC-WFS_A_DC_PIT_OUT_DQ,IMC-WFS_B_DC_PIT_OUT_DQ,IMC-WFS_A_DC_YAW_OUT_DQ,IMC-WFS_B_DC_YAW_OUT_DQ,PSL-DIAG_BULLSEYE_YAW_OUT_DQ,PSL-DIAG_BULLSEYE_WID_OUT_DQ,PSL-DIAG_BULLSEYE_PIT_OUT_DQ;ASC-DHARD_P_OUT_DQ,ASC-DHARD_Y_OUT_DQ,ASC-CHARD_P_OUT_DQ,ASC-CHARD_Y_OUT_DQ,LSC-SRCL_IN1_DQ,LSC-MICH_IN1_DQ,LSC-PRCL_IN1_DQ
 # What channel should we use to gate the noise subtraction and 60-Hz line subtraction
-NoiseSubGateChannel: GRD-ISC_LOCK_OK
+NoiseSubGateChannel: ODC-MASTER_CHANNEL_OUT_DQ
 ###############################
 # EPICS Records Channel Names #
 ###############################
@@ -286,7 +286,7 @@ EPICSRefSR: 16
 # Sample rate for power lines channel
 PowerLinesChannelSR: 1024
 # Sample rates at which transfer functions will be computed and witness channels will be filtered, given as a semicolon-separated list, e.g., 2048;2048;512;2048. This must be given if WitnessChannelList is not None, and it must be the same length.
-WitnessChannelSR: 2048;2048;512;2048
+WitnessChannelSR: 2048;512
 # Sample rates at which to compute and record TDCFs
 ComputeFactorsSR: 16
 RecordFactorsSR: 16
@@ -298,7 +298,7 @@ CBCHWInjBitmask: 16777216
 BurstHWInjBitmask: 33554432
 DetCharHWInjBitmask: 67108864
 StochHWInjBitmask: 8388608
-NoiseSubGateBitmask: 1
+NoiseSubGateBitmask: 4
 
 [PipelineConfigurations]
 BufferLength: 1.0
@@ -323,6 +323,7 @@ RemovePowerLines: Yes
 # Amount by which frequency of power lines varies with time
 PowerLinesFreqVar: 0.02
 # Time over which to average the transfer function between the power mains witness channel and h(t) at 60 Hz and harmonics
+PowerLinesTFMedianTime: 1
 PowerLinesTFAveragingTime: 128
 #######################################
 # Options for broadband noise removal #
@@ -334,11 +335,13 @@ NumWitnessFFTs: 509
 # Sets the minimum number of FFTs necessary to produce the first transfer functions and clean data after data flow starts.
 MinWitnessFFTs: 509
 # The length in seconds of the filters applied to the witness channels before subtracting from h(t)
-WitnessFIRLength: 0.5
+WitnessFIRLength: 0.5;1.6
 # The frequency resolution of the filters applied to the witness channels before subtracting from h(t). It can be advantageous to lower the frequency resolution in order to average over excess noise.
-WitnessFrequencyResolution: 1.0
+WitnessFrequencyResolution: 0.5
 # List of minima and maxima of frequency ranges where the Fourier transform of h(t) will be replaced by a straight line in the calculation of transfer functions between witness channels and h(t) for noise subtraction. Semicolons separate lists for different sets of witness channels. If no notches are desired, use zeros, e.g., \'0;0;0\'. Here is an example using the expected format: \'495.0,515.0,985.0,1015.0;59,60,119,121;0\' This can be useful, e.g., if there are loud lines in the signal that are not present in the witness channels.
-WitnessNotchFrequencies: 12.0,15.0,495.0,515.0,985.0,1015.0;12.0,15.0,495.0,515.0,985.0,1015.0;12.0,15.0;12.0,15.0,495.0,515.0,985.0,1015.0
+WitnessNotchFrequencies: 12.0,15.0,495.0,515.0,985.0,1015.0;0
+# Cutoff frequencies for high-pass filters for witness channels
+WitnessHighPasses: 12;10
 # The amount of time after transfer functions between witness channels and h(t) are finished to begin the calculation of the next set of transfer functions
 WitnessTFUpdateTime: 4
 # If lock-loss lasts at least this many seconds, transfer functions will revert to those computed at the beginning of a lock stretch. Set to zero to disbale.
diff --git a/gstlal-calibration/python/calibration_parts.py b/gstlal-calibration/python/calibration_parts.py
index 7bb7c7a1bd14ae12cbf540f0360370cd374f63f7..69cdd2767d4c1aee104466fd8275d1e50d927df2 100644
--- a/gstlal-calibration/python/calibration_parts.py
+++ b/gstlal-calibration/python/calibration_parts.py
@@ -198,7 +198,7 @@ def remove_harmonics(pipeline, signal, f0, num_harmonics, f0_var, filter_latency
 
 	return elem
 
-def remove_harmonics_with_witness(pipeline, signal, witness, f0, num_harmonics, f0_var, filter_latency, compute_rate = 16, rate_out = 16384, num_avg = 2048, noisesub_gate_bit = None):
+def remove_harmonics_with_witness(pipeline, signal, witness, f0, num_harmonics, f0_var, filter_latency, compute_rate = 16, rate_out = 16384, num_median = 2048, num_avg = 160, noisesub_gate_bit = None):
 	# remove line(s) from a spectrum. filter length for demodulation (given in seconds) is adjustable
 	# function argument caps must be complex caps
 
@@ -260,7 +260,7 @@ def remove_harmonics_with_witness(pipeline, signal, witness, f0, num_harmonics,
 		# Remove worthless data from computation of transfer function if we can
 		if noisesub_gate_bit is not None:
 			tf_at_f = mkgate(pipeline, tf_at_f, noisesub_gate_bit, 1, attack_length = -((1.0 - filter_latency) * filter_samples))
-		tf_at_f = pipeparts.mkgeneric(pipeline, tf_at_f, "lal_smoothkappas", default_kappa_re = 0, array_size = 1, avg_array_size = num_avg, default_to_median = True, filter_latency = filter_latency)
+		tf_at_f = pipeparts.mkgeneric(pipeline, tf_at_f, "lal_smoothkappas", default_kappa_re = 0, array_size = num_median, avg_array_size = num_avg, default_to_median = True, filter_latency = filter_latency)
 
 		# Use gated, averaged transfer function to reconstruct the sinusoid as it appears in the signal from the witness channel
 		if filter_latency == 0.5:
@@ -926,7 +926,7 @@ def update_filters(filter_maker, arg, filter_taker, maker_prop_name, taker_prop_
 	firfilter = filter_maker.get_property(maker_prop_name)[filter_number][::-1]
 	filter_taker.set_property(taker_prop_name, firfilter)
 
-def clean_data(pipeline, signal, signal_rate, witnesses, witness_rate, fft_length, fft_overlap, num_ffts, min_ffts, update_samples, fir_length, frequency_resolution, filter_taper_length, use_median = False, parallel_mode = False, notch_frequencies = [], noisesub_gate_bit = None, delay_time = 0.0, critical_lock_loss_time = 0, filename = None):
+def clean_data(pipeline, signal, signal_rate, witnesses, witness_rate, fft_length, fft_overlap, num_ffts, min_ffts, update_samples, fir_length, frequency_resolution, filter_taper_length, use_median = False, parallel_mode = False, notch_frequencies = [], high_pass = 15.0, noisesub_gate_bit = None, delay_time = 0.0, critical_lock_loss_time = 0, filename = None):
 
 	#
 	# Use witness channels that monitor the environment to remove environmental noise
@@ -939,22 +939,21 @@ def clean_data(pipeline, signal, signal_rate, witnesses, witness_rate, fft_lengt
 	witness_tees = []
 	for i in range(0, len(witnesses)):
 		witnesses[i] = mkresample(pipeline, witnesses[i], 5, False, witness_rate)
-		witnesses[i] = highpass(pipeline, witnesses[i], witness_rate)
 		witness_tees.append(pipeparts.mktee(pipeline, witnesses[i]))
 
 	resampled_signal = mkresample(pipeline, signal_tee, 5, False, witness_rate)
 	transfer_functions = mkinterleave(pipeline, numpy.insert(witness_tees, 0, resampled_signal, axis = 0))
 	if noisesub_gate_bit is not None:
 		transfer_functions = mkgate(pipeline, transfer_functions, noisesub_gate_bit, 1)
-	transfer_functions = pipeparts.mkgeneric(pipeline, transfer_functions, "lal_transferfunction", fft_length = fft_length, fft_overlap = fft_overlap, num_ffts = num_ffts, min_ffts = min_ffts, update_samples = update_samples, make_fir_filters = -1, fir_length = fir_length, frequency_resolution = frequency_resolution, high_pass = 15, update_after_gap = True, use_median = use_median, parallel_mode = parallel_mode, notch_frequencies = notch_frequencies, use_first_after_gap = critical_lock_loss_time * witness_rate, update_delay_samples = int(delay_time * witness_rate), fir_timeshift = 0, filename = filename)
+	transfer_functions = pipeparts.mkgeneric(pipeline, transfer_functions, "lal_transferfunction", fft_length = fft_length, fft_overlap = fft_overlap, num_ffts = num_ffts, min_ffts = min_ffts, update_samples = update_samples, make_fir_filters = -1, fir_length = fir_length, frequency_resolution = frequency_resolution, high_pass = high_pass / 2.0, update_after_gap = True, use_median = use_median, parallel_mode = parallel_mode, notch_frequencies = notch_frequencies, use_first_after_gap = critical_lock_loss_time * witness_rate, update_delay_samples = int(delay_time * witness_rate), fir_timeshift = 0, filename = filename)
 	signal_minus_noise = [signal_tee]
 	for i in range(0, len(witnesses)):
 		if parallel_mode:
-			minus_noise = pipeparts.mkgeneric(pipeline, mkqueue(pipeline, witness_tees[i]), "lal_tdwhiten", kernel = numpy.zeros(fir_length), latency = fir_length / 2, taper_length = filter_taper_length, kernel_endtime = 0)
+			minus_noise = pipeparts.mkgeneric(pipeline, mkqueue(pipeline, highpass(pipeline, witness_tees[i], witness_rate, fcut = high_pass)), "lal_tdwhiten", kernel = numpy.zeros(fir_length), latency = fir_length / 2, taper_length = filter_taper_length, kernel_endtime = 0)
 			transfer_functions.connect("notify::fir-filters", update_filters, minus_noise, "fir_filters", "kernel", i)
 			transfer_functions.connect("notify::fir-endtime", update_property_simple, minus_noise, "fir_endtime", "kernel_endtime")
 		else:
-			minus_noise = pipeparts.mkgeneric(pipeline, witness_tees[i], "lal_tdwhiten", kernel = numpy.zeros(fir_length), latency = fir_length / 2, taper_length = filter_taper_length)
+			minus_noise = pipeparts.mkgeneric(pipeline, highpass(pipeline, witness_tees[i], witness_rate, fcut = high_pass), "lal_tdwhiten", kernel = numpy.zeros(fir_length), latency = fir_length / 2, taper_length = filter_taper_length)
 			transfer_functions.connect("notify::fir-filters", update_filters, minus_noise, "fir_filters", "kernel", i)
 		signal_minus_noise.append(mkresample(pipeline, minus_noise, 5, False, signal_rate))
 
diff --git a/gstlal-calibration/tests/check_calibration/Makefile b/gstlal-calibration/tests/check_calibration/Makefile
index 56bbc8a57bd3ab2ab5708da0bdb35dee6624f5da..d325b6ec33cff21b5f9f451062fe4c0c59d99bcc 100644
--- a/gstlal-calibration/tests/check_calibration/Makefile
+++ b/gstlal-calibration/tests/check_calibration/Makefile
@@ -27,7 +27,7 @@ GDSTESTCONFIGS = ../../config_files/PreER13/H1/H1GDS_TEST_1225558818.ini
 DCSTESTCONFIGS = ../../config_files/O2/H1/tests/H1DCS_AllCorrections_Cleaning_TEST.ini
 GDSSHMCONFIGS = ../../config_files/PreER13/H1/tests/H1GDS_1222058826_shm2frames.ini
 
-all: DCS_over_C02 noise_subtraction_ASD_DCH_DCS noise_subtraction_tf_DCH_DCS
+all: DCS_over_C02 noise_subtraction_ASD_DCH_DCS noise_subtraction_tf_DCS noise_subtraction_tf_DCH_DCS
 
 ###############################################
 ### These commands should change less often ###
@@ -135,6 +135,9 @@ noise_subtraction_tf_DCS: $(IFO)1_hoft_DCS_frames.cache
 noise_subtraction_tf_DCH_DCS: $(IFO)1_hoft_DCS_frames.cache $(IFO)1_clean_C02_frames.cache
 	python plot_transfer_function.py --gps-start-time $(PLOT_START) --gps-end-time $(PLOT_END) --ifo $(IFO)1 --numerator-frame-cache $(IFO)1_hoft_DCS_frames.cache --denominator-frame-cache $(IFO)1_clean_C02_frames.cache --numerator-channel-list DCS-CALIB_STRAIN_CLEAN --denominator-channel-name DCH-CLEAN_STRAIN_C02 --magnitude-min 0.7 --magnitude-max 1.3 --phase-min -20.0 --phase-max 20.0 --numerator-name 'DCS' --denominator-name 'DCH' --labels 'DCS_CLEAN / DCH_CLEAN' --use-median
 
+noise_subtraction_tf_DCS_DCH: $(IFO)1_hoft_DCS_frames.cache $(IFO)1_clean_C02_frames.cache
+	python plot_transfer_function.py --gps-start-time $(PLOT_START) --gps-end-time $(PLOT_END) --ifo $(IFO)1 --numerator-frame-cache $(IFO)1_clean_C02_frames.cache --denominator-frame-cache $(IFO)1_hoft_DCS_frames.cache --numerator-channel-list DCH-CLEAN_STRAIN_C02 --denominator-channel-name DCS-CALIB_STRAIN_CLEAN --magnitude-min 0.7 --magnitude-max 1.3 --phase-min -20.0 --phase-max 20.0 --numerator-name 'DCH' --denominator-name 'DCS' --labels 'DCH_CLEAN / DCS_CLEAN' --use-median
+
 filters:
 	if [ -d Filters/$(OBSRUN)/GDSFilters ]; then \
 		svn up Filters/$(OBSRUN)/GDSFilters; \