diff --git a/A320-100-CFM.xml b/A320-100-CFM.xml
index 4c179888..7d87dcdc 100644
--- a/A320-100-CFM.xml
+++ b/A320-100-CFM.xml
@@ -449,7 +449,6 @@ xsi:noNamespaceSchemaLocation="http://jsbsim.sourceforge.net/JSBSim.xsd">
 		</tank>
 	</propulsion>
 
-	<system file="pushback" />
 	<system file="electrical" />
 	<system file="fuel" />
 	<system file="glass-effect1" />
diff --git a/A320-200-CFM.xml b/A320-200-CFM.xml
index 9b8bb8ff..f6f7fb5e 100644
--- a/A320-200-CFM.xml
+++ b/A320-200-CFM.xml
@@ -449,7 +449,6 @@ xsi:noNamespaceSchemaLocation="http://jsbsim.sourceforge.net/JSBSim.xsd">
 		</tank>
 	</propulsion>
 
-	<system file="pushback" />
 	<system file="fuel" />
 	<system file="electrical" />
 	<system file="glass-effect1" />
diff --git a/A320-200-IAE.xml b/A320-200-IAE.xml
index 6cc6b204..c52cfa98 100644
--- a/A320-200-IAE.xml
+++ b/A320-200-IAE.xml
@@ -449,7 +449,6 @@ xsi:noNamespaceSchemaLocation="http://jsbsim.sourceforge.net/JSBSim.xsd">
 		</tank>
 	</propulsion>
 
-	<system file="pushback" />
 	<system file="electrical" />
 	<system file="fuel" />
 	<system file="glass-effect1" />
diff --git a/A320-main.xml b/A320-main.xml
index 8b3c955c..0420bae3 100644
--- a/A320-main.xml
+++ b/A320-main.xml
@@ -28,10 +28,27 @@
 
 		<model>
 			<pushback>
-				<kp type="double">5000</kp>
-				<ki type="double">200</ki>
-				<kd type="double">500</kd>
-				<position-norm type="double">0</position-norm>
+				<enabled type="int"/>
+				<available type="int">1</available>
+				<yaw-deg alias="/fdm/jsbsim/fcs/steer-deg"/>
+				<target-speed-km_h type="float">0.0</target-speed-km_h>
+				<K_p type="float">5000.0</K_p>
+				<K_i type="float">200.0</K_i>
+				<F_i type="float">25000.0</F_i>
+				<K_d type="float">500.0</K_d>
+				<driver>
+					<tow-distance-m type="float">-60.0</tow-distance-m>
+					<face-heading-deg type="float">0.0</face-heading-deg>
+					<steer-cmd-norm alias="/controls/flight/rudder"/>
+					<K_V_push type="float">5.0</K_V_push>
+					<F_V_push type="float">5.0</F_V_push>
+					<S_min-m type="float">5.0</S_min-m>
+					<K_psi_push type="float">0.05</K_psi_push>
+					<K_V_turn type="float">1.4</K_V_turn>
+					<F_V_turn type="float">7.0</F_V_turn>
+					<K_psi_turn type="float">0.1</K_psi_turn>
+					<V_min type="float">1.5</V_min>
+				</driver>
 			</pushback>
 			<icing>
 				<iceable>
@@ -230,8 +247,10 @@
 					<item>
 						<label>Pushback</label>
 						<binding>
-							<command>dialog-show</command>
-							<dialog-name>pushback</dialog-name>
+							<command>nasal</command>
+							<script>
+							autopush.push_dlg.open();
+							</script>
 						</binding>
 					</item>
 					<item>
@@ -1455,6 +1474,22 @@
 		<icing>
 			<file>Aircraft/IDG-A32X/Nasal/icing.nas</file>
 		</icing>
+		<autopush>
+			<file>Nasal/autopush.nas</file>
+		</autopush>
+		<autopush_driver>
+			<file>Nasal/autopush_driver.nas</file>
+		</autopush_driver>
 	</nasal>
-
+	<fdm>
+		<jsbsim>
+			<external_reactions>
+		        	<pushback>
+		        		<magnitude alias="/sim/model/pushback/force-lbf"/>
+			        	<x alias="/sim/model/pushback/force-x"/>
+			        	<y alias="/sim/model/pushback/force-y"/>
+			        </pushback>
+			</external_reactions>
+		</jsbsim>
+	</fdm>
 </PropertyList>
diff --git a/A320neo-CFM.xml b/A320neo-CFM.xml
index f240ddd4..c2344ea8 100644
--- a/A320neo-CFM.xml
+++ b/A320neo-CFM.xml
@@ -449,7 +449,6 @@ xsi:noNamespaceSchemaLocation="http://jsbsim.sourceforge.net/JSBSim.xsd">
 		</tank>
 	</propulsion>
 
-	<system file="pushback" />
 	<system file="electrical" />
 	<system file="fuel" />
 	<system file="glass-effect1" />
diff --git a/A320neo-PW.xml b/A320neo-PW.xml
index 94da872a..f565b8f2 100644
--- a/A320neo-PW.xml
+++ b/A320neo-PW.xml
@@ -449,7 +449,6 @@ xsi:noNamespaceSchemaLocation="http://jsbsim.sourceforge.net/JSBSim.xsd">
 		</tank>
 	</propulsion>
 
-	<system file="pushback" />
 	<system file="electrical" />
 	<system file="fuel" />
 	<system file="glass-effect1" />
diff --git a/Models/A320-100-CFM.xml b/Models/A320-100-CFM.xml
index 62bb0afd..4e6fb174 100644
--- a/Models/A320-100-CFM.xml
+++ b/Models/A320-100-CFM.xml
@@ -316,7 +316,7 @@
 	<!-- Other non-aircraft models -->
 	<model>
 		<name>Pushback</name>
-		<path>Models/Airport/Pushback/Goldhofert.xml</path>
+		<path>Models/Goldhofert-autopush.xml</path>
 		<offsets>
 			<x-m>5.55</x-m>
 			<y-m>0</y-m>
diff --git a/Models/A320-200-CFM.xml b/Models/A320-200-CFM.xml
index 8a1abda1..3b2f71bd 100644
--- a/Models/A320-200-CFM.xml
+++ b/Models/A320-200-CFM.xml
@@ -348,7 +348,7 @@
 	<!-- Other non-aircraft models -->
 	<model>
 		<name>Pushback</name>
-		<path>Models/Airport/Pushback/Goldhofert.xml</path>
+		<path>Models/Goldhofert-autopush.xml</path>
 		<offsets>
 			<x-m>5.55</x-m>
 			<y-m>0</y-m>
diff --git a/Models/A320-200-IAE.xml b/Models/A320-200-IAE.xml
index 02707e48..bc17b952 100644
--- a/Models/A320-200-IAE.xml
+++ b/Models/A320-200-IAE.xml
@@ -344,7 +344,7 @@
 	<!-- Other non-aircraft models -->
 	<model>
 		<name>Pushback</name>
-		<path>Models/Airport/Pushback/Goldhofert.xml</path>
+		<path>Models/Goldhofert-autopush.xml</path>
 		<offsets>
 			<x-m>5.55</x-m>
 			<y-m>0</y-m>
diff --git a/Models/A320neo-CFM.xml b/Models/A320neo-CFM.xml
index 96963b37..8b47fce4 100644
--- a/Models/A320neo-CFM.xml
+++ b/Models/A320neo-CFM.xml
@@ -325,7 +325,7 @@
 	<!-- Other non-aircraft models -->
 	<model>
 		<name>Pushback</name>
-		<path>Models/Airport/Pushback/Goldhofert.xml</path>
+		<path>Models/Goldhofert-autopush.xml</path>
 		<offsets>
 			<x-m>5.55</x-m>
 			<y-m>0</y-m>
diff --git a/Models/A320neo-PW.xml b/Models/A320neo-PW.xml
index 6e76706a..03f9897b 100644
--- a/Models/A320neo-PW.xml
+++ b/Models/A320neo-PW.xml
@@ -325,7 +325,7 @@
 	<!-- Other non-aircraft models -->
 	<model>
 		<name>Pushback</name>
-		<path>Models/Airport/Pushback/Goldhofert.xml</path>
+		<path>Models/Goldhofert-autopush.xml</path>
 		<offsets>
 			<x-m>5.55</x-m>
 			<y-m>0</y-m>
diff --git a/Models/Goldhofert-autopush.xml b/Models/Goldhofert-autopush.xml
new file mode 100644
index 00000000..1f256db7
--- /dev/null
+++ b/Models/Goldhofert-autopush.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+AUTOPUSH
+
+Copyright (c) 2018 Michael Danilov <mike.d.ft402 -eh- gmail.com>
+Original code (c) FlightGear
+Distribute under the terms of GPLv2.
+
+-->
+<PropertyList>
+  <path>Models/Airport/Pushback/Goldhofert.ac</path>
+
+  <!-- Trucks models and artworks courtesy of XPGoodWay Team
+(http://www.xpgoodwayteam.org/site_xpushback/) -->
+
+  <model>
+    <path>Models/Airport/Pushback/Goldhofert-warning-light.xml</path>
+    <offsets>
+      <x-m>-2.908</x-m>
+      <y-m>0.260</y-m>
+      <z-m>1.326</z-m>
+      <heading-deg>0</heading-deg>
+    </offsets>
+  </model>
+
+  <model>
+    <path>Models/Airport/Pushback/Goldhofert-warning-light.xml</path>
+    <offsets>
+      <x-m>-1.781</x-m>
+      <y-m>0.260</y-m>
+      <z-m>1.326</z-m>
+      <heading-deg>90</heading-deg>
+    </offsets>
+  </model>
+
+ <animation>
+   <type>spin</type>
+   <object-name>wheelfl</object-name>
+   <object-name>wheelfr</object-name>
+   <!-- SETTING The aircraft's front wheel rollspeed in m/s. -->
+   <property>gear/gear[0]/rollspeed-ms</property>
+   <factor>-16.3</factor>
+   <center>
+     <x-m>-2.8976</x-m>
+     <y-m>0</y-m>
+     <z-m>0.5809</z-m>
+   </center>
+   <axis>
+     <x>0</x>
+     <y>1</y>
+     <z>0</z>
+   </axis>
+ </animation>
+
+ <animation>
+   <type>spin</type>
+   <object-name>wheelrl</object-name>
+   <object-name>wheelrr</object-name>
+   <!-- SETTING The aircraft's front wheel rollspeed in m/s. -->
+   <property>gear/gear[0]/rollspeed-ms</property>
+   <factor>-16.3</factor>
+   <center>
+     <x-m>2.0501</x-m>
+     <y-m>0</y-m>
+     <z-m>0.5735</z-m>
+   </center>
+   <axis>
+     <x>0</x>
+     <y>1</y>
+     <z>0</z>
+   </axis>
+ </animation>
+
+ <animation>
+   <type>select</type>
+   <condition>
+     <!-- SETTING Whether connected. -->
+     <property>sim/model/pushback/connected</property>
+   </condition>
+ </animation>
+
+ <animation>
+   <type>rotate</type>
+   <!-- SETTING Normalized steering. -->
+   <property>gear/gear/steering-norm</property>
+   <!-- SETTING Max steering. -->
+   <factor>70.0</factor>
+   <center>
+     <x-m>0</x-m>
+     <y-m>0</y-m>
+     <z-m>0</z-m>
+   </center>
+   <axis>
+     <x>0</x>
+     <y>0</y>
+     <z>-1</z>
+   </axis>
+ </animation>
+
+ <animation>
+   <type>translate</type>
+   <!-- SETTING Gear compression. -->
+   <property>gear/gear[0]/compression-ft</property>
+   <factor>0.3048</factor>
+   <axis>
+     <x>0</x>
+     <y>0</y>
+     <z>1</z>
+   </axis>
+ </animation>
+
+ <animation>
+   <type>rotate</type>
+   <!-- SETTING Aircraft pitch. -->
+   <property>orientation/pitch-deg</property>
+   <!-- SETTING Average ground pitch. -->
+   <offset-deg>2.0</offset-deg>
+   <center>
+     <x-m>0</x-m>
+     <y-m>0</y-m>
+     <z-m>0</z-m>
+   </center>
+   <axis>
+     <x>0</x>
+     <y>1</y>
+     <z>0</z>
+   </axis>
+ </animation>
+</PropertyList>
diff --git a/Nasal/autopush.nas b/Nasal/autopush.nas
new file mode 100644
index 00000000..b5ea5059
--- /dev/null
+++ b/Nasal/autopush.nas
@@ -0,0 +1,74 @@
+# AUTOPUSH
+# Basic pushback logic class.
+#
+# Copyright (c) 2018 Michael Danilov <mike.d.ft402 -eh- gmail.com>
+# Distribute under the terms of GPLv2.
+
+var push_dlg = gui.Dialog.new("sim/gui/dialogs/autopush/push/dialog", "Aircraft/IDG-A32X/Systems/autopush.xml");
+
+var _K_p = nil;
+var _K_i = nil;
+var _K_d = nil;
+var _F_i = nil;
+var _int = nil;
+var _deltaV_old = nil;
+var _t_old = nil;
+
+var loop = func() {
+	if (!getprop("/sim/model/pushback/available")) {
+		stop();
+		return;
+	}
+	var force = 0.0;
+	# Rollspeed is only adequate if the wheel is touching the ground.
+	if (getprop("/gear/gear[0]/wow")) {
+		var deltaV =
+		getprop("/sim/model/pushback/target-speed-km_h") -
+		getprop("/gear/gear[0]/rollspeed-ms") * 3.6;
+		var dV = deltaV - _deltaV_old;
+		var t = getprop("/sim/time/elapsed-sec");
+		var dt = math.max(t - _t_old, 0.0001);
+		_int = math.min(math.max(_int + dV * dt, -_F_i), _F_i);
+		force = (_K_p * deltaV + _K_d * dV / dt + _K_i * _int) * KG2LB;
+		_deltaV_old = deltaV;
+		_t_old = t;
+		var yaw = getprop("/sim/model/pushback/yaw-deg") * D2R;
+		setprop("/sim/model/pushback/force-x", math.cos(yaw));
+		setprop("/sim/model/pushback/force-y", math.sin(yaw));
+	}
+	setprop("/sim/model/pushback/force-lbf", force);
+}
+
+var timer = maketimer(0.026, func{loop()});
+
+var start = func() {
+	_K_p = getprop("/sim/model/pushback/K_p");
+	_K_i = getprop("/sim/model/pushback/K_i");
+	_K_d = getprop("/sim/model/pushback/K_d");
+	_F_i = getprop("/sim/model/pushback/F_i");
+	_int = 0.0;
+	_deltaV_old = 0.0;
+	_t_old = getprop("/sim/time/elapsed-sec");
+	setprop("/sim/model/pushback/connected", 1);
+	if (!timer.isRunning) {
+		screen.log.write("(pushback): Release brakes.");
+	}
+	timer.start();
+}
+
+var stop = func() {
+	if (timer.isRunning) {
+		screen.log.write("(pushback): Pushback disconnected, bypass pin removed.");
+	}
+	timer.stop();
+	setprop("/sim/model/pushback/force-lbf", 0.0);
+	setprop("/sim/model/pushback/connected", 0);
+}
+
+var toggle = func(){
+	if (getprop("/sim/model/pushback/enabled") * getprop("/sim/model/pushback/available")) {
+		start();
+	} else {
+		stop();
+	}
+}
diff --git a/Nasal/autopush_driver.nas b/Nasal/autopush_driver.nas
new file mode 100644
index 00000000..5845df65
--- /dev/null
+++ b/Nasal/autopush_driver.nas
@@ -0,0 +1,111 @@
+# AUTOPUSH
+# Pushback driver class.
+#
+# Command the pushback to tow/push the aircract facing set heading.
+#
+# Copyright (c) 2018 Michael Danilov <mike.d.ft402 -eh- gmail.com>
+# Distribute under the terms of GPLv2.
+
+
+# FIXME When facing, acccount for current steering position, to work without dry steering.
+
+
+var _K_V_push = nil;
+var _F_V_push = nil;
+var _S_min = nil;
+var _K_psi_push = nil;
+var _K_V_turn = nil;
+var _F_V_turn = nil;
+var _K_psi_turn = nil;
+var _V_min = nil;
+
+var _turning = nil;
+var _sign = nil;
+var _target = nil;
+var _psi_parking = nil;
+var _psi_turn = nil;
+
+var loop = func() {
+	if	(!getprop("/sim/model/pushback/connected")) {
+		stop();
+		return;
+	}
+	var V = 0.0;
+	var steering = 0.0;
+	var deltapsi = 0.0;
+	var psi = getprop("/orientation/heading-magnetic-deg");
+	if (!_turning) {
+		# Initially follow a straight line parallel to our initial heading.
+		var (A, S) = courseAndDistance(_target);
+		S *= NM2M;
+		# Stop when the bearing flips, guarante against infinite pushing.
+		if ((abs(S) < _S_min) + (abs(saw180(_psi_parking - A - math.min(_sign, 0.0) * 180.0) > 90.0))) {
+			_turning = 1;
+			screen.log.write("(pushback): Turning to face heading " ~ int(_psi_turn) ~ ".");
+		}
+		deltapsi = saw180(_psi_parking - psi);
+		V = math.min(math.max(_K_V_push * _sign * (S / _S_min), -_F_V_push), _F_V_push);
+		steering = math.min(math.max(_K_psi_push * _sign * deltapsi, -1.0), 1.0);
+	} else {
+		# Turn (almost) in place.
+		deltapsi = saw180(_psi_turn - psi);
+		V = math.min(math.max(_K_V_turn * _sign * abs(deltapsi), -_F_V_turn), _F_V_turn);
+		# We are done when the heading error is small.
+		if (abs(V) < _V_min) {
+			stop();
+			return;
+		}
+		steering = math.min(math.max(_K_psi_turn * _sign * deltapsi, -1.0), 1.0);
+	}
+	setprop("/sim/model/pushback/target-speed-km_h", V);
+	setprop("/sim/model/pushback/driver/steer-cmd-norm", steering);
+}
+
+var timer = maketimer(0.051, func{loop()});
+
+var start = func() {
+	_K_V_push = getprop("/sim/model/pushback/driver/K_V_push");
+	_F_V_push = getprop("/sim/model/pushback/driver/F_V_push");
+	_S_min = getprop("/sim/model/pushback/driver/S_min-m");
+	_K_psi_push = getprop("/sim/model/pushback/driver/K_psi_push");
+	_K_V_turn = getprop("/sim/model/pushback/driver/K_V_turn");
+	_F_V_turn = getprop("/sim/model/pushback/driver/F_V_turn");
+	_K_psi_turn = getprop("/sim/model/pushback/driver/K_psi_turn");
+	_V_min = getprop("/sim/model/pushback/driver/V_min");
+	if (!getprop("/sim/model/pushback/connected")) {
+		return;
+	}
+	towdist = getprop("/sim/model/pushback/driver/tow-distance-m");
+	_target = geo.aircraft_position();
+	_psi_parking = getprop("/orientation/heading-deg");
+	_target.apply_course_distance(_psi_parking, towdist);
+	_psi_turn = getprop("/sim/model/pushback/driver/face-heading-deg");
+	_sign = 1.0 - 2.0 * (towdist < 0.0);
+	_turning = 0;
+	timer.start();
+	if (_sign < 0.0) {
+		screen.log.write("(pushback): Pushing back.");
+	} else {
+		screen.log.write("(pushback): Towing.");
+	}
+}
+
+var stop = func() {
+	if (timer.isRunning) {
+		screen.log.write("(pushback): Done.");
+		setprop("/controls/flight/rudder", 0);
+	}
+	timer.stop();
+	setprop("/sim/model/pushback/target-speed-km_h", 0.0);
+}
+
+# Sawtooth: -180..+180 deg.
+var saw180 = func(p) {
+	while (p <= -180.0) {
+		p += 360.0;
+	}
+	while (p > 180.0) {
+		p -= 360.0;
+	}
+	return p;
+}
diff --git a/Resources/autopush-README.txt b/Resources/autopush-README.txt
new file mode 100644
index 00000000..698db78e
--- /dev/null
+++ b/Resources/autopush-README.txt
@@ -0,0 +1,117 @@
+AUTOMATIC PUSHBACK FOR FLIGHTGEAR
+Version 0.1.1
+
+Copyright (c) 2018 Michael Danilov <mike.d.ft402 -eh- gmail.com>
+Some of the code (c) FlightGear
+Distribute under the terms of GPLv2.
+
+
+FILES
+
+Nasal/autopush-README.txt       this file
+Models/Goldhofert-autopush.xml  the animation for FGDATA's Goldhofer
+Nasal/autopush.nas              basic pushback logic
+Nasal/autopush_driver.nas       pushback driver
+gui/dialogs/autopush.xml	GUI dialog
+
+
+INSTALLATION
+
+Only the minimal working example is covered here. Later you will have
+to implement correct steering in your FDM (driving the
+"/sim/model/pushback/yaw-deg") and pushback availability
+("/sim/model/pushback/available") -- because those are too
+aircraft-specific.
+
+1. Set up the pushback logic. Add the following tags in your set.xml.
+   Replace the "/fdm/jsbsim/gear/unit[0]/steering/pos-deg" with the
+   property for the front wheel steering degrees of your aircraft.
+
+   Under <sim><model>:
+
+ <pushback>
+  <enabled type="int"/>
+  <available type="int">1</available>
+  <yaw-deg alias="/fdm/jsbsim/gear/unit[0]/steering/pos-deg"/>
+  <target-speed-km_h type="float">0.0</target-speed-km_h>
+  <K_p type="float">100.0</K_p>
+  <K_i type="float">25.0</K_i>
+  <F_i type="float">25000.0</F_i>
+  <K_d type="float">0.0</K_d>
+  <driver>
+   <tow-distance-m type="float">-60.0</tow-distance-m>
+   <face-heading-deg type="float">0.0</face-heading-deg>
+   <steer-cmd-norm alias="/controls/flight/rudder"/>
+   <K_V_push type="float">10.0</K_V_push>
+   <F_V_push type="float">10.0</F_V_push>
+   <S_min-m type="float">5.0</S_min-m>
+   <K_psi_push type="float">0.05</K_psi_push>
+   <K_V_turn type="float">1.4</K_V_turn>
+   <F_V_turn type="float">7.0</F_V_turn>
+   <K_psi_turn type="float">0.2</K_psi_turn>
+   <V_min type="float">2.5</V_min>
+  </driver>
+ </pushback>
+
+   Under <nasal>:
+
+ <autopush>
+  <file>Nasal/autopush.nas</file>
+ </autopush>
+ <autopush_driver>
+  <file>Nasal/autopush_driver.nas</file>
+ </autopush_driver>
+
+2. Connect the FDM's external force.
+
+ a) JSBSim:
+
+  a.1. Add the following under <external_reactions> of your
+       JSBSim XML. Change the coordinates under <location> to equal
+       those of your front bogey.
+
+ <force name="tractor" frame="BODY">
+  <location unit="M">
+   <x>0.0</x>
+   <y>0.0</y>
+   <z>0.0</z>
+  </location>
+  <direction>
+   <x>1.0</x>
+   <y>0.0</y>
+   <z>0.0</z>
+  </direction>
+ </force>
+
+  a.2. Add the following under <fdm><jsbsim><external_reactions> of
+       your set.xml.
+
+   <tractor>
+    <magnitude alias="/sim/model/pushback/force-lbf"/>
+    <x alias="/sim/model/pushback/force-x"/>
+    <y alias="/sim/model/pushback/force-y"/>
+   </tractor>
+
+ b) YASim: TODO
+
+3. Copy the gui/dialogs/autopush.xml from the distribution to your
+   aircraft's gui/dialogs directory. Add it to the menu (see
+   FlightGear documentation for editing the menu).
+
+4. Copy the Models/Goldhofert-autopush.xml to your aircraft's Models/
+   directory. Edit all the places marked by "SETTING" to match your
+   setup. Include it in your Model XML, with offsets equal to the
+   front wheel's contact point.
+
+5. Add the following in your Model XML. Change the coordinates under
+   <offsets> to equal those of your front bogey.
+
+ <model>
+  <name>Pushback</name>
+  <path>Models/Airport/Pushback/Goldhofert-autopush.xml</path>
+  <offsets>
+   <x-m>0.0</x-m>
+   <y-m>0.0</y-m>
+   <z-m>0.0</z-m>
+  </offsets>
+ </model>
diff --git a/Systems/autopush.xml b/Systems/autopush.xml
new file mode 100644
index 00000000..e76df763
--- /dev/null
+++ b/Systems/autopush.xml
@@ -0,0 +1,375 @@
+<?xml version="1.0"?>
+
+<!--
+
+AUTOPUSH
+Pushback dialog.
+
+Copyright (c) 2018 Michael Danilov <mike.d.ft402 -eh- gmail.com>
+Original code (c) FlightGear
+Distribute under the terms of GPLv2.
+
+-->
+
+<PropertyList>
+
+	<name>autopush</name>
+	<layout>vbox</layout>
+
+	<group>
+		<layout>hbox</layout>
+		
+		<text>
+			<label>Pushback</label>
+		</text>
+		
+		<empty>
+			<stretch>true</stretch>
+		</empty>
+		
+        <button>
+            <halign>right</halign>
+            <pref-width>20</pref-width>
+            <pref-height>20</pref-height>
+            <legend>X</legend>
+            <key>Esc</key>
+            <binding>
+                <command>dialog-close</command>
+            </binding>
+        </button>
+	</group>
+
+	<hrule/>
+
+	<group>
+		<stretch>true</stretch>
+		<layout>vbox</layout>
+		<halign>center</halign>
+		<valign>top</valign>
+		
+		<checkbox>
+			<halign>left</halign>
+			<label>Connect</label>
+			<property>/sim/model/pushback/enabled</property>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+			<binding>
+				<command>nasal</command>
+				<script>autopush.toggle();</script>
+			</binding>
+		</checkbox>
+		
+		<hrule/>
+
+		<group>
+			<layout>table</layout>
+			
+			<text>
+				<row>0</row>
+				<col>0</col>
+				<label>Speed:   </label>
+			</text>
+			
+			<button>
+				<row>0</row>
+				<col>1</col>
+				<pref-width>25</pref-width>
+				<pref-height>25</pref-height>
+				<legend>&lt;</legend>
+				<binding>
+					<command>property-adjust</command>
+					<property>/sim/model/pushback/target-speed-km_h</property>
+					<min>-15</min>
+					<max>15</max>
+					<step>-1</step>
+					<wrap>false</wrap>
+				</binding>
+			</button>
+			
+			<slider>
+				<row>0</row>
+				<col>2</col>
+				<min>-15</min>
+				<max>15</max>
+				<property>/sim/model/pushback/target-speed-km_h</property>
+				<live>true</live>
+				<binding>
+					<command>dialog-apply</command>
+				</binding>
+			</slider>
+			
+			<button>
+				<row>0</row>
+				<col>3</col>
+				<pref-width>25</pref-width>
+				<pref-height>25</pref-height>
+				<legend>&gt;</legend>
+				<binding>
+					<command>property-adjust</command>
+					<property>/sim/model/pushback/target-speed-km_h</property>
+					<min>-15</min>
+					<max>15</max>
+					<step>1</step>
+					<wrap>false</wrap>
+				</binding>
+			</button>
+			
+			<button>
+				<row>0</row>
+				<col>4</col>
+				<pref-width>50</pref-width>
+				<pref-height>25</pref-height>
+				<legend>Stop</legend>
+				<binding>
+					<command>property-assign</command>
+					<property>/sim/model/pushback/target-speed-km_h</property>
+					<value>0</value>
+				</binding>
+			</button>
+			
+			<text>
+				<row>0</row>
+				<col>5</col>
+				<pref-width>16</pref-width>
+				<property>/sim/model/pushback/target-speed-km_h</property>
+				<format>%3.0f</format>
+				<live>true</live>
+			</text>
+			
+			<text>
+				<row>0</row>
+				<col>6</col>
+				<label>km/h</label>
+			</text>
+		</group>
+
+		<hrule/>
+
+		<group>
+			<layout>table</layout>
+			
+			<text>
+				<row>0</row>
+				<col>0</col>
+				<halign>left</halign>
+				<label>Distance:</label>
+			</text>
+			
+			<button>
+				<row>0</row>
+				<col>1</col>
+				<pref-width>25</pref-width>
+				<pref-height>25</pref-height>
+				<legend>&lt;&lt;</legend>
+				<binding>
+					<command>property-adjust</command>
+					<property>/sim/model/pushback/driver/tow-distance-m</property>
+					<min>-100</min>
+					<max>100</max>
+					<step>-10</step>
+					<wrap>false</wrap>
+				</binding>
+			</button>
+			
+			<button>
+				<row>0</row>
+				<col>2</col>
+				<pref-width>25</pref-width>
+				<pref-height>25</pref-height>
+				<legend>&lt;</legend>
+				<binding>
+					<command>property-adjust</command>
+					<property>/sim/model/pushback/driver/tow-distance-m</property>
+					<min>-100</min>
+					<max>100</max>
+					<step>-1</step>
+					<wrap>false</wrap>
+				</binding>
+			</button>
+			
+			<slider>
+				<row>0</row>
+				<col>3</col>
+				<min>-100</min>
+				<max>100</max>
+				<property>/sim/model/pushback/driver/tow-distance-m</property>
+				<live>true</live>
+				<binding>
+					<command>dialog-apply</command>
+				</binding>
+			</slider>
+			
+			<button>
+				<row>0</row>
+				<col>4</col>
+				<pref-width>25</pref-width>
+				<pref-height>25</pref-height>
+				<legend>&gt;</legend>
+				<binding>
+					<command>property-adjust</command>
+					<property>/sim/model/pushback/driver/tow-distance-m</property>
+					<min>-100</min>
+					<max>100</max>
+					<step>1</step>
+					<wrap>false</wrap>
+				</binding>
+			</button>
+			
+			<button>
+				<row>0</row>
+				<col>5</col>
+				<pref-width>25</pref-width>
+				<pref-height>25</pref-height>
+				<legend>&gt;&gt;</legend>
+				<binding>
+					<command>property-adjust</command>
+					<property>/sim/model/pushback/driver/tow-distance-m</property>
+					<min>-100</min>
+					<max>100</max>
+					<step>10</step>
+					<wrap>false</wrap>
+				</binding>
+			</button>
+			
+			<text>
+				<row>0</row>
+				<col>6</col>
+				<pref-width>16</pref-width>
+				<property>/sim/model/pushback/driver/tow-distance-m</property>
+				<format>%4.0f</format>
+				<live>true</live>
+			</text>
+			
+			<text>
+				<row>0</row>
+				<col>7</col>
+				<label>m    </label>
+			</text>
+		</group>
+
+		<group>
+			<layout>table</layout>
+			
+			<text>
+				<row>0</row>
+				<col>0</col>
+				<halign>left</halign>
+				<label>Facing:  </label>
+			</text>
+			
+			<button>
+				<row>0</row>
+				<col>1</col>
+				<pref-width>25</pref-width>
+				<pref-height>25</pref-height>
+				<legend>&lt;&lt;</legend>
+				<binding>
+					<command>property-adjust</command>
+					<property>/sim/model/pushback/driver/face-heading-deg</property>
+					<min>0</min>
+					<max>360</max>
+					<step>-10</step>
+					<wrap>false</wrap>
+				</binding>
+			</button>
+			
+			<button>
+				<row>0</row>
+				<col>2</col>
+				<pref-width>25</pref-width>
+				<pref-height>25</pref-height>
+				<legend>&lt;</legend>
+				<binding>
+					<command>property-adjust</command>
+					<property>/sim/model/pushback/driver/face-heading-deg</property>
+					<min>0</min>
+					<max>360</max>
+					<step>-1</step>
+					<wrap>false</wrap>
+				</binding>
+			</button>
+			
+			<slider>
+				<row>0</row>
+				<col>3</col>
+				<min>0</min>
+				<max>360</max>
+				<property>/sim/model/pushback/driver/face-heading-deg</property>
+				<live>true</live>
+				<binding>
+					<command>dialog-apply</command>
+				</binding>
+			</slider>
+			
+			<button>
+				<row>0</row>
+				<col>4</col>
+				<pref-width>25</pref-width>
+				<pref-height>25</pref-height>
+				<legend>&gt;</legend>
+				<binding>
+					<command>property-adjust</command>
+					<property>/sim/model/pushback/driver/face-heading-deg</property>
+					<min>0</min>
+					<max>360</max>
+					<step>1</step>
+					<wrap>false</wrap>
+				</binding>
+			</button>
+			
+			<button>
+				<row>0</row>
+				<col>5</col>
+				<pref-width>25</pref-width>
+				<pref-height>25</pref-height>
+				<legend>&gt;&gt;</legend>
+				<binding>
+					<command>property-adjust</command>
+					<property>/sim/model/pushback/driver/face-heading-deg</property>
+					<min>0</min>
+					<max>360</max>
+					<step>10</step>
+					<wrap>false</wrap>
+				</binding>
+			</button>
+			
+			<text>
+				<row>0</row>
+				<col>6</col>
+				<pref-width>16</pref-width>
+				<property>/sim/model/pushback/driver/face-heading-deg</property>
+				<format>%3.0f</format>
+				<live>true</live>
+			</text>
+			
+			<text>
+				<row>0</row>
+				<col>7</col>
+				<label>     </label>
+			</text>
+		</group>
+
+		<group>
+			<layout>hbox</layout>
+			
+			<button>
+				<legend>Start</legend>
+				<binding>
+					<command>nasal</command>
+					<script>autopush_driver.start();</script>
+				</binding>
+			</button>
+			
+			<button>
+				<legend>Stop</legend>
+				<binding>
+					<command>nasal</command>
+					<script>autopush_driver.stop();</script>
+				</binding>
+			</button>
+		</group>
+
+	</group>
+
+</PropertyList>
diff --git a/Systems/pushback.xml b/Systems/pushback.xml
deleted file mode 100644
index abb72c46..00000000
--- a/Systems/pushback.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version='1.0' encoding='UTF-8' ?>
-
-<!--
-##############################################
-# Copyright (c) Joshua Davidson (it0uchpods) #
-##############################################
--->
-
-<system name="pushback">
- <property>/sim/model/pushback/target-speed-fps</property>
- <channel name="Pushback">
-
-   <switch name="systems/pushback/linked">
-     <default value="-1"/>
-     <test value="0">
-       /sim/model/pushback/position-norm gt 0.95
-       /gear/gear/wow == 1
-       gear/unit[0]/wheel-speed-fps lt 50
-     </test>
-   </switch>
-
-   <summer name="systems/pushback/speed-error">
-     <input>/sim/model/pushback/target-speed-fps</input>
-     <input>-gear/unit[0]/wheel-speed-fps</input>
-   </summer>
-
-   <pid name="systems/pushback/force">
-     <input>systems/pushback/speed-error</input>
-     <kp>/sim/model/pushback/kp</kp>
-     <ki>/sim/model/pushback/ki</ki>
-     <kd>/sim/model/pushback/kd</kd>
-     <trigger>systems/pushback/linked</trigger>
-     <output>/sim/model/pushback/force</output>
-   </pid>
-
-   <switch name="systems/pushback/force-output">
-     <default value="0"/>
-     <test value="systems/pushback/force">
-       systems/pushback/linked == 0
-     </test>
-     <output>external_reactions/pushback/magnitude</output>
-   </switch>
-
- </channel>
-</system>