diff --git a/examples/injection_examples/basic_tutorial.py b/examples/injection_examples/basic_tutorial.py
index cb1b81c7b6ab560569f23b2a10ae88244d4a2ae9..c3548b4d41ad42bd5584c2bf863f00ffd79b385e 100644
--- a/examples/injection_examples/basic_tutorial.py
+++ b/examples/injection_examples/basic_tutorial.py
@@ -41,17 +41,13 @@ waveform_generator = tupak.WaveformGenerator(time_duration=time_duration,
                                              frequency_domain_source_model=tupak.gw.source.lal_binary_black_hole,
                                              parameters=injection_parameters,
                                              waveform_arguments=waveform_arguments)
+hf_signal = waveform_generator.frequency_domain_strain()
 
 # Set up interferometers.  In this case we'll use three interferometers (LIGO-Hanford (H1), LIGO-Livingston (L1),
 # and Virgo (V1)).  These default to their design sensitivity
-IFOs = []
-for name in ['H1', 'L1', 'V1']:
-    IFOs.append(
-        tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(
-            name, waveform_generator=waveform_generator,
-            injection_parameters=injection_parameters,
-            time_duration=time_duration,
-            sampling_frequency=sampling_frequency, outdir=outdir))
+IFOs = [tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(
+    name, injection_polarizations=hf_signal, injection_parameters=injection_parameters, time_duration=time_duration,
+    sampling_frequency=sampling_frequency, outdir=outdir) for name in ['H1', 'L1']]
 
 # Set up prior, which is a dictionary
 # By default we will sample all terms in the signal models.  However, this will take a long time for the calculation,
diff --git a/examples/injection_examples/basic_tutorial_dist_time_phase_marg.py b/examples/injection_examples/basic_tutorial_dist_time_phase_marg.py
index 3a9770f0398da7181ab146f75d3aa15bfc6eadd1..2d90386e16a2692f709f86106cf2cd7b64feb63c 100644
--- a/examples/injection_examples/basic_tutorial_dist_time_phase_marg.py
+++ b/examples/injection_examples/basic_tutorial_dist_time_phase_marg.py
@@ -39,11 +39,12 @@ waveform_generator = tupak.WaveformGenerator(time_duration=time_duration,
                                              frequency_domain_source_model=tupak.gw.source.lal_binary_black_hole,
                                              parameters=injection_parameters,
                                              waveform_arguments=waveform_arguments)
+hf_signal = waveform_generator.frequency_domain_strain()
 
 # Set up interferometers.  In this case we'll use three interferometers (LIGO-Hanford (H1), LIGO-Livingston (L1),
 # and Virgo (V1)).  These default to their design sensitivity
 IFOs = [tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(
-    name, waveform_generator=waveform_generator, injection_parameters=injection_parameters, time_duration=time_duration,
+    name, injection_polarizations=hf_signal, injection_parameters=injection_parameters, time_duration=time_duration,
     sampling_frequency=sampling_frequency, outdir=outdir) for name in ['H1', 'L1']]
 
 # Set up prior, which is a dictionary
diff --git a/examples/injection_examples/basic_tutorial_time_phase_marg.py b/examples/injection_examples/basic_tutorial_time_phase_marg.py
index 370539586a3b49f97bedb7225f310224ab1fff86..3f7525db6fc9daf48de68828f3bb4c65b05414fd 100644
--- a/examples/injection_examples/basic_tutorial_time_phase_marg.py
+++ b/examples/injection_examples/basic_tutorial_time_phase_marg.py
@@ -38,11 +38,12 @@ waveform_generator = tupak.WaveformGenerator(time_duration=time_duration,
                                              frequency_domain_source_model=tupak.gw.source.lal_binary_black_hole,
                                              parameters=injection_parameters,
                                              waveform_arguments=waveform_arguments)
+hf_signal = waveform_generator.frequency_domain_strain()
 
 # Set up interferometers.  In this case we'll use three interferometers (LIGO-Hanford (H1), LIGO-Livingston (L1),
 # and Virgo (V1)).  These default to their design sensitivity
 IFOs = [tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(
-    name, waveform_generator=waveform_generator, injection_parameters=injection_parameters, time_duration=time_duration,
+    name, injection_polarizations=hf_signal, injection_parameters=injection_parameters, time_duration=time_duration,
     sampling_frequency=sampling_frequency, outdir=outdir) for name in ['H1', 'L1']]
 
 # Set up prior, which is a dictionary
diff --git a/examples/injection_examples/change_sampled_parameters.py b/examples/injection_examples/change_sampled_parameters.py
index 8114c4734f1f2b3ba5a3a6f4f63cd570fb5f1bb1..d5766e5475075c4bbf969fc92127d33dd3d8cba7 100644
--- a/examples/injection_examples/change_sampled_parameters.py
+++ b/examples/injection_examples/change_sampled_parameters.py
@@ -32,16 +32,12 @@ waveform_generator = tupak.gw.waveform_generator.WaveformGenerator(
     parameter_conversion=tupak.gw.conversion.convert_to_lal_binary_black_hole_parameters,
     non_standard_sampling_parameter_keys=['chirp_mass', 'mass_ratio'],
     parameters=injection_parameters, waveform_arguments=waveform_arguments)
+hf_signal = waveform_generator.frequency_domain_strain()
 
 # Set up interferometers.
-IFOs = []
-for name in ['H1', 'L1', 'V1']:
-    IFOs.append(
-        tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(
-            name, waveform_generator=waveform_generator,
-            injection_parameters=injection_parameters,
-            time_duration=time_duration,
-            sampling_frequency=sampling_frequency, outdir=outdir))
+IFOs = [tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(
+    name, injection_polarizations=hf_signal, injection_parameters=injection_parameters, time_duration=time_duration,
+    sampling_frequency=sampling_frequency, outdir=outdir) for name in ['H1', 'L1', 'V1']]
 
 # Set up prior
 priors = tupak.gw.prior.BBHPriorSet()
diff --git a/examples/injection_examples/create_your_own_source_model.py b/examples/injection_examples/create_your_own_source_model.py
index 10dd2b0a36de0b039b0ec8fdd9b1bfef61e2d631..a595695044d828ef7205ee13fc72eafdec043e29 100644
--- a/examples/injection_examples/create_your_own_source_model.py
+++ b/examples/injection_examples/create_your_own_source_model.py
@@ -29,10 +29,11 @@ waveform_generator = tupak.gw.waveform_generator.WaveformGenerator(time_duration
                                                                    sampling_frequency=sampling_frequency,
                                                                    frequency_domain_source_model=sine_gaussian,
                                                                    parameters=injection_parameters)
+hf_signal = waveform_generator.frequency_domain_strain()
 
 # Set up interferometers.
 IFOs = [tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(
-    name, waveform_generator=waveform_generator,
+    name, injection_polarizations=hf_signal,
     injection_parameters=injection_parameters, time_duration=time_duration,
     sampling_frequency=sampling_frequency, outdir=outdir)
     for name in ['H1', 'L1', 'V1']]
diff --git a/examples/injection_examples/create_your_own_time_domain_source_model.py b/examples/injection_examples/create_your_own_time_domain_source_model.py
index 8c4f57affca36aec1e0122216660cd1f640ff73b..f89bb0f77c3ccbec9a9e39bd54bb23232ad7af06 100644
--- a/examples/injection_examples/create_your_own_time_domain_source_model.py
+++ b/examples/injection_examples/create_your_own_time_domain_source_model.py
@@ -36,6 +36,7 @@ waveform = tupak.gw.waveform_generator.WaveformGenerator(time_duration=time_dura
                                                          time_domain_source_model=time_domain_damped_sinusoid,
                                                          parameters=injection_parameters)
 
+hf_signal = waveform.frequency_domain_strain()
 #note we could plot the time domain signal with the following code
 # import matplotlib.pyplot as plt
 # plt.plot(waveform.time_array, waveform.time_domain_strain()['plus'])
@@ -46,14 +47,12 @@ waveform = tupak.gw.waveform_generator.WaveformGenerator(time_duration=time_dura
 
 
 # inject the signal into three interferometers
-IFOs = []
-for name in ['H1', 'L1', 'V1']:
-    IFOs.append(
-        tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(
-            name, waveform_generator=waveform,
-            injection_parameters=injection_parameters,
-            time_duration=time_duration,
-            sampling_frequency=sampling_frequency, outdir=outdir))
+IFOs = [tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(
+        name, injection_polarizations=hf_signal,
+        injection_parameters=injection_parameters, time_duration=time_duration,
+        sampling_frequency=sampling_frequency, outdir=outdir)
+        for name in ['H1', 'L1']]
+
 
 #  create the priors
 prior = injection_parameters.copy()
diff --git a/examples/injection_examples/how_to_specify_the_prior.py b/examples/injection_examples/how_to_specify_the_prior.py
index 10ba8d0c1a5838a6925f3aaef0c8aad6e9d1516a..d33fc753486bd01f8fbef8968a2cf407da54ecea 100644
--- a/examples/injection_examples/how_to_specify_the_prior.py
+++ b/examples/injection_examples/how_to_specify_the_prior.py
@@ -28,10 +28,11 @@ waveform_generator = tupak.WaveformGenerator(time_duration=time_duration,
                                              frequency_domain_source_model=tupak.gw.source.lal_binary_black_hole,
                                              parameters=injection_parameters,
                                              waveform_arguments=waveform_arguments)
+hf_signal = waveform_generator.frequency_domain_strain()
 
 # Set up interferometers.
 IFOs = [tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(
-    name, waveform_generator=waveform_generator, injection_parameters=injection_parameters, time_duration=time_duration,
+    name, injection_polarizations=hf_signal, injection_parameters=injection_parameters, time_duration=time_duration,
     sampling_frequency=sampling_frequency, outdir=outdir) for name in ['H1', 'L1', 'V1']]
 
 # Set up prior
diff --git a/examples/injection_examples/marginalized_likelihood.py b/examples/injection_examples/marginalized_likelihood.py
index 8d1e0ac0d5f2319095e20a8f38a18c82f4ab8018..6ada100981861f8cf52050c007d2dd71f51029a5 100644
--- a/examples/injection_examples/marginalized_likelihood.py
+++ b/examples/injection_examples/marginalized_likelihood.py
@@ -26,16 +26,12 @@ waveform_generator = tupak.WaveformGenerator(
     time_duration=time_duration, sampling_frequency=sampling_frequency,
     frequency_domain_source_model=tupak.gw.source.lal_binary_black_hole, parameters=injection_parameters,
     waveform_arguments=waveform_arguments)
+hf_signal = waveform_generator.frequency_domain_strain()
 
 # Set up interferometers.
-IFOs = []
-for name in ['H1', 'L1', 'V1']:
-    IFOs.append(
-        tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(
-            name, waveform_generator=waveform_generator,
-            injection_parameters=injection_parameters,
-            time_duration=time_duration,
-            sampling_frequency=sampling_frequency, outdir=outdir))
+IFOs = [tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(
+    name, injection_polarizations=hf_signal, injection_parameters=injection_parameters, time_duration=time_duration,
+    sampling_frequency=sampling_frequency, outdir=outdir) for name in ['H1', 'L1', 'V1']]
 
 # Set up prior
 priors = tupak.gw.prior.BBHPriorSet()
diff --git a/examples/injection_examples/sine_gaussian_example.py b/examples/injection_examples/sine_gaussian_example.py
index e06536374cc27ff9d0612fe560c1d7a80a92ea9c..adc1e9bbb1eb7dd17b147d32d04563a7c84f2c5d 100644
--- a/examples/injection_examples/sine_gaussian_example.py
+++ b/examples/injection_examples/sine_gaussian_example.py
@@ -29,11 +29,12 @@ waveform_generator = tupak.gw.waveform_generator.WaveformGenerator(time_duration
                                                                    sampling_frequency=sampling_frequency,
                                                                    frequency_domain_source_model=tupak.gw.source.sinegaussian,
                                                                    parameters=injection_parameters)
+hf_signal = waveform_generator.frequency_domain_strain()
 
 # Set up interferometers.  In this case we'll use three interferometers (LIGO-Hanford (H1), LIGO-Livingston (L1),
 # and Virgo (V1)).  These default to their design sensitivity
 IFOs = [tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(
-    name, waveform_generator=waveform_generator, injection_parameters=injection_parameters, time_duration=time_duration,
+    name, injection_polarizations=hf_signal, injection_parameters=injection_parameters, time_duration=time_duration,
     sampling_frequency=sampling_frequency, outdir=outdir) for name in ['H1', 'L1', 'V1']]
 
 # Set up prior, which is a dictionary
diff --git a/test/detector_tests.py b/test/detector_tests.py
index 9e2c5838d4a9ab1035d62f4121176b053b134195..da3ecfa14e0e9f782477c5d8d8f5c88522f8f6a9 100644
--- a/test/detector_tests.py
+++ b/test/detector_tests.py
@@ -247,9 +247,9 @@ class TestDetector(unittest.TestCase):
             parameters=dict(ra=0, dec=0, geocent_time=0, psi=0))
         self.assertTrue(np.array_equal(response, (plus+cross)*self.ifo.frequency_mask*np.exp(-0j)))
 
-    #def test_inject_signal_no_waveform_generator(self):
-    #    with self.assertRaises(ValueError):
-    #        self.ifo.inject_signal(waveform_generator=None, parameters=None)
+    def test_inject_signal_no_waveform_polarizations(self):
+        with self.assertRaises(ValueError):
+            self.ifo.inject_signal(injection_polarizations=None, parameters=None)
 
     def test_unit_vector_along_arm_default(self):
         with self.assertRaises(ValueError):
diff --git a/test/make_standard_data.py b/test/make_standard_data.py
index 59df56fdeae4cccec00a84de8d756ab954aa08f7..cc9731bf444f82f061591db94f58bba28442b0a9 100644
--- a/test/make_standard_data.py
+++ b/test/make_standard_data.py
@@ -36,8 +36,9 @@ waveform_generator = WaveformGenerator(time_duration=time_duration, sampling_fre
                                        frequency_domain_source_model=tupak.gw.source.lal_binary_black_hole,
                                        parameters=simulation_parameters)
 
+signal = waveform_generator.frequency_domain_strain()
 
-IFO = tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(name='H1', waveform_generator=waveform_generator,
+IFO = tupak.gw.detector.get_interferometer_with_fake_noise_and_injection(name='H1', injection_polarizations=signal,
                                                                          injection_parameters=simulation_parameters,
                                                                          time_duration=time_duration, plot=False,
                                                                          sampling_frequency=sampling_frequency)
diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py
index da8c05e81a45fdacb152bba4909fd3f496fbf01c..2c662d5c32be2560b0669fa3115ce0c23edeb0cb 100644
--- a/tupak/gw/detector.py
+++ b/tupak/gw/detector.py
@@ -732,21 +732,43 @@ class Interferometer(object):
 
         return signal_ifo
 
-    def inject_signal(self, waveform_generator, parameters):
+    def inject_signal(self,  parameters=None, injection_polarizations=None,
+                      waveform_generator=None):
         """ Inject a signal into noise
 
         Parameters
         ----------
-        waveform_generator: tupak.gw.waveform_generator
-            A WaveformGenerator instance using the source model to inject
         parameters: dict
-            parameters describing position and time of arrival of the signal
+            Parameters of the injection.
+        injection_polarizations: dict
+           Polarizations of waveform to inject, output of
+           `waveform_generator.frequency_domain_strain()`. If
+           `waveform_generator` is also given, the injection_polarizations will
+           be calculated directly and this argument can be ignored.
+        waveform_generator: tupak.gw.waveform_generator
+            A WaveformGenerator instance using the source model to inject. If
+            `injection_polarizations` is given, this will be ignored.
+
+        Note: if your signal takes a substantial amount of time to generate, or
+        you experience buggy behaviour. It is preferable to provide the
+        injection_polarizations directly.
+
+        Returns
+        -------
+        injection_polarizations: dict
+
         """
 
-        waveform_generator.parameters = parameters
-        waveform_polarizations = waveform_generator.frequency_domain_strain()
+        if injection_polarizations is None:
+            if waveform_generator is not None:
+                waveform_generator.parameters = parameters
+                injection_polarizations = waveform_generator.frequency_domain_strain()
+            else:
+                raise ValueError(
+                    "inject_signal needs one of waveform_generator or "
+                    "injection_polarizations.")
 
-        if waveform_polarizations is None:
+        if injection_polarizations is None:
             raise ValueError(
                 'Trying to inject signal which is None. The most likely cause'
                 ' is that waveform_generator.frequency_domain_strain returned'
@@ -757,7 +779,7 @@ class Interferometer(object):
                 'Injecting signal outside segment, start_time={}, merger time={}.'
                 .format(self.strain_data.start_time, parameters['geocent_time']))
 
-        signal_ifo = self.get_detector_response(waveform_polarizations, parameters)
+        signal_ifo = self.get_detector_response(injection_polarizations, parameters)
         if np.shape(self.frequency_domain_strain).__eq__(np.shape(signal_ifo)):
             self.strain_data.add_to_frequency_domain_strain(signal_ifo)
         else:
@@ -780,6 +802,8 @@ class Interferometer(object):
         for key in parameters:
             logging.info('  {} = {}'.format(key, parameters[key]))
 
+        return injection_polarizations
+
     def unit_vector_along_arm(self, arm):
         """
         Calculate the unit vector pointing along the specified arm in cartesian Earth-based coordinates.
@@ -1296,8 +1320,8 @@ def get_interferometer_with_open_data(
 
 
 def get_interferometer_with_fake_noise_and_injection(
-        name, injection_parameters, waveform_generator=None,
-        waveform_polarizations=None, sampling_frequency=4096, time_duration=4,
+        name, injection_parameters, injection_polarizations=None,
+        waveform_generator=None, sampling_frequency=4096, time_duration=4,
         start_time=None, outdir='outdir', label=None, plot=True, save=True,
         zero_noise=False):
     """
@@ -1310,8 +1334,14 @@ def get_interferometer_with_fake_noise_and_injection(
         Detector name, e.g., 'H1'.
     injection_parameters: dict
         injection parameters, needed for sky position and timing
+    injection_polarizations: dict
+       Polarizations of waveform to inject, output of
+       `waveform_generator.frequency_domain_strain()`. If
+       `waveform_generator` is also given, the injection_polarizations will
+       be calculated directly and this argument can be ignored.
     waveform_generator: tupak.gw.waveform_generator
-        A WaveformGenerator instance using the source model to inject
+        A WaveformGenerator instance using the source model to inject. If
+        `injection_polarizations` is given, this will be ignored.
     sampling_frequency: float
         sampling frequency for data, should match injection signal
     time_duration: float
@@ -1350,11 +1380,12 @@ def get_interferometer_with_fake_noise_and_injection(
         interferometer.set_strain_data_from_power_spectral_density(
             sampling_frequency=sampling_frequency, duration=time_duration,
             start_time=start_time)
-    interferometer.inject_signal(
-        waveform_generator=waveform_generator,
-        parameters=injection_parameters)
 
-    injection_polarizations = waveform_generator.frequency_domain_strain()
+    injection_polarizations = interferometer.inject_signal(
+        parameters=injection_parameters,
+        injection_polarizations=injection_polarizations,
+        waveform_generator=waveform_generator)
+
     signal = interferometer.get_detector_response(
         injection_polarizations, injection_parameters)