diff --git a/examples/displacement_transfer_function.py b/examples/displacement_transfer_function.py
new file mode 100644
index 0000000000000000000000000000000000000000..60754e931b378c9ff1573732eaa441d810e17035
--- /dev/null
+++ b/examples/displacement_transfer_function.py
@@ -0,0 +1,120 @@
+# -*- coding: utf-8 -*-
+"""
+Transfer function of mirror rotation to photodiode signal for a Fabry-Perot
+cavity.
+
+      ]------=----/--(=========================)
+                  |
+                  Y
+
+    laser   EOM      ITM      10m cavity      ETM
+
+              Photodiode
+
+This simulation sets up an optical environment in FINESSE and then creates
+a signal to rotate the ETM. This signal is then attached to the x-axis and
+added as a demodulation frequency to the photodiode to allow for a transfer
+function to be obtained.
+
+The magnitude and phase are then plotted, and the figure is saved as a PDF.
+
+Sean Leavey
+s.leavey.1@research.gla.ac.uk
+
+February 2014
+"""
+
+import pykat
+import pylab
+
+# instantiate PyKat object
+kat = pykat.finesse.kat()
+
+# create a FINESSE environment with an impedence matched Fabry-Perot cavity of length 10 m
+kat.parseCommands("""
+l laser 30.0 0.0 0.0 n_LASER_OUT
+s space_laser_to_eom 1.0 n_LASER_OUT n_EOM_IN
+mod eom 10M 0.3 2 pm 0.0 n_EOM_IN n_EOM_OUT
+s space_EOM_to_BS 0.01 n_EOM_OUT n_BS_A
+bs beamsplitter 0.1 0.9 0.0 0.0 n_BS_A dump n_BS_C n_BS_D
+s space_BS_to_ITM 0.1 n_BS_C n_ITM_IN
+m M_ITM_AR 0.001 0.999 0.0 n_ITM_IN n_ITM_BULK_IN
+attr M_ITM_AR Rcx -1.7763
+attr M_ITM_AR Rcy -1.7763
+attr M_ITM_AR r_ap 0.04645
+s M_ITM_BULK 0.027 1.45 n_ITM_BULK_IN n_ITM_BULK_OUT
+m M_ITM_HR 0.995 0.005 0.0 n_ITM_BULK_OUT n_ITM_OUT
+attr M_ITM_HR Rcx -5.7
+attr M_ITM_HR Rcy -5.7
+attr M_ITM_HR r_ap 0.04645
+s space_cavity 10 n_ITM_OUT n_ETM_IN
+m M_ETM_HR 0.995 0.005 0.0 n_ETM_IN n_ETM_BULK_IN
+attr M_ETM_HR Rcx 5.7
+attr M_ETM_HR Rcy 5.7
+attr M_ETM_HR r_ap 0.04645
+s M_ETM_BULK 0.027 1.45 n_ETM_BULK_IN n_ETM_BULK_OUT
+m M_ETM_AR 0.001 0.999 0.0 n_ETM_BULK_OUT dump
+attr M_ETM_AR Rcx 1.7763
+attr M_ETM_AR Rcy 1.7763
+attr M_ETM_AR r_ap 0.04645
+pd2 PD_PDH_i 10M max 1 n_BS_D
+cav cavity M_ITM_HR n_ITM_OUT M_ETM_HR n_ETM_IN
+""")
+
+##############################
+# define what we want to see #
+##############################
+
+# set up a mirror rotation signal
+kat.signals.apply(kat.M_ETM_HR.phi, 1, 180) # amplitude = 1, phase = 180 degrees
+
+# manually add yaxis command, as this is not implemented yet as of PyKat 0.3.1
+# this plots both magnitude and phase
+kat.parseKatCode("""
+yaxis lin abs:deg
+""")
+
+# set the x-axis to plot frequency between 1 Hz and 1 MHz
+kat.add(pykat.commands.xaxis('log', [1, 1e6], kat.signals.f, 1000))
+
+# now, we need to demodulate the photodiode at the frequency of the signal at each point on the x-axis
+kat.PD_PDH_i.f2.put(kat.xaxis.x)
+
+# turn off higher order TEM modes, we don't need these for this transfer function
+kat.maxtem = "off"
+
+##################
+# run simulation #
+##################
+
+result = kat.run()
+
+###########
+# plot it #
+###########
+
+# create figure with 2 subplots, sharing the x-axis
+figure, axes = pylab.subplots(2, sharex = True)
+
+# plot amplitude on first subplot
+axes[0].loglog(result.x, result.y[:, 0])
+axes[0].set_title('Amplitude')
+axes[0].set_ylabel(result.ylabels[0])
+axes[0].grid(True)
+
+# plot phase on second subplot
+axes[1].semilogx(result.x, result.y[:, 1])
+axes[1].set_title('Phase')
+axes[1].set_xlabel(result.xlabel)
+axes[1].set_ylabel(result.ylabels[1])
+axes[1].set_ylim([10, -100])
+axes[1].grid(True)
+
+# space everything properly
+figure.tight_layout()
+
+# save figure as a PDF
+pylab.savefig('displacement_transfer_function', format = 'PDF')
+
+# show
+pylab.show()