From 5d4a3a7636bf1137e87eab35f167a1b40ea3b494 Mon Sep 17 00:00:00 2001
From: Joshua Davidson <joshuadavidson2000@gmail.com>
Date: Mon, 30 Jan 2017 18:12:19 -0500
Subject: [PATCH] bugfix, itaf 127

---
 A320-main.xml                         |  19 +-
 Models/FlightDeck/a320.flightdeck.xml |  29 +-
 Nasal/PFD_FMA.nas                     |   6 +-
 Nasal/it-autoflight.nas               | 976 ++++++++++++++------------
 Nasal/systems.nas                     |   8 -
 Systems/autopilot-dlg.xml             |  94 ++-
 Systems/engine-timing.xml             |  32 +
 Systems/it-autoflight.xml             | 129 +++-
 8 files changed, 784 insertions(+), 509 deletions(-)

diff --git a/A320-main.xml b/A320-main.xml
index acae4e4e..586d30cc 100644
--- a/A320-main.xml
+++ b/A320-main.xml
@@ -249,6 +249,7 @@
 			<vorloc>-4.0</vorloc>
 			<alt>0.025</alt>
 			<vs>0.07</vs>
+			<fpa>0.30</fpa>
 			<flch>-0.35</flch>
 			<gs>0.10</gs>
 		</cmd>
@@ -259,16 +260,20 @@
 		</autoland>
 	</config>
 	<settings>
-		<enable-cws>0</enable-cws>
-		<flare-altitude>40</flare-altitude>
-		<land-enable>1</land-enable>
-		<land-flap>0.645</land-flap>
-		<retard-ft>40</retard-ft>
-		<retard-enable>0</retard-enable>
-		<toga-pitch>15</toga-pitch>
+		<enable-cws>0</enable-cws> <!-- Enable/Disable CWS -->
+		<flare-altitude>40</flare-altitude> <!-- Autoland Flare AGL -->
+		<land-enable>1</land-enable> <!-- Enable/Disable Autoland -->
+		<land-flap>0.645</land-flap> <!-- Minimum Flap used for Landing -->
+		<retard-ft>40</retard-ft> <!-- Enable Thrust Retard -->
+		<retard-enable>0</retard-enable> <!-- AGL to Thrust Retard -->
+		<togaspd>157</togaspd> <!-- V2 + 10kts -->
+		<lat-agl-ft>100</lat-agl-ft> <!-- Set to 999999 if you do not want T/O to change automatically to HDG, or LNAV -->
+		<reduc-agl-ft>1500</reduc-agl-ft> <!-- Set to 999999 if you do not want TOGA to change automatically to FLCH -->
 	</settings>
 </it-autoflight>
 
+
+
 	<autopilot>
 		<autobrake>
 			<config>
diff --git a/Models/FlightDeck/a320.flightdeck.xml b/Models/FlightDeck/a320.flightdeck.xml
index afe7300b..baf89f94 100644
--- a/Models/FlightDeck/a320.flightdeck.xml
+++ b/Models/FlightDeck/a320.flightdeck.xml
@@ -527,9 +527,14 @@
 			<button>1</button>
 			<repeatable>false</repeatable>
 			<binding>
-				<command>property-assign</command>
-				<property>/it-autoflight/input/vert</property>
-				<value>1</value>
+				<command>nasal</command>
+				<script>
+				if (getprop("/it-autoflight/settings/use-true-hdg-error") == 0) {
+					setprop("/it-autoflight/input/vert", 1);
+				} else if (getprop("/it-autoflight/settings/use-true-hdg-error") == 1) {
+					setprop("/it-autoflight/input/vert", 5);
+				}
+				</script>
 			</binding>
 		</action>
 		<action>
@@ -644,9 +649,12 @@
 				<value>1</value>
 			</binding>
 			<binding>
-				<command>property-assign</command>
-				<property>/it-autoflight/settings/use-fpa</property>
-				<value>1</value>
+				<command>nasal</command>
+				<script>
+				if (getprop("/it-autoflight/output/vert") == 5) {
+					setprop("/it-autoflight/input/vert", 1);
+				}
+				</script>
 			</binding>
 		</action>
 	</animation>
@@ -663,9 +671,12 @@
 				<value>0</value>
 			</binding>
 			<binding>
-				<command>property-assign</command>
-				<property>/it-autoflight/settings/use-fpa</property>
-				<value>0</value>
+				<command>nasal</command>
+				<script>
+				if (getprop("/it-autoflight/output/vert") == 1) {
+					setprop("/it-autoflight/input/vert", 5);
+				}
+				</script>
 			</binding>
 		</action>
 	</animation>
diff --git a/Nasal/PFD_FMA.nas b/Nasal/PFD_FMA.nas
index 9be5017d..b97aed9c 100644
--- a/Nasal/PFD_FMA.nas
+++ b/Nasal/PFD_FMA.nas
@@ -43,7 +43,7 @@ setlistener("/it-autoflight/mode/lat", func {
   } else if (lat == "ALGN") {
 	setprop("/modes/pfd/fma/roll-mode", "ALN");
   } else if (lat == "T/O") {
-	setprop("/modes/pfd/fma/roll-mode", " ");
+	setprop("/modes/pfd/fma/roll-mode", "RWY");
   }
 });
 
@@ -117,9 +117,9 @@ var fd = func {
   if (fd1 and fd2) {
     setprop("/modes/pfd/fma/fd-mode", "1FD2");
   } else if (fd1 and !fd2) {
-    setprop("/modes/pfd/fma/fd-mode", "FD1");
+    setprop("/modes/pfd/fma/fd-mode", "1FD-");
   } else if (fd2 and !fd1) {
-    setprop("/modes/pfd/fma/fd-mode", "FD2");
+    setprop("/modes/pfd/fma/fd-mode", "-FD2");
   } else {
     setprop("/modes/pfd/fma/fd-mode", " ");
   }
diff --git a/Nasal/it-autoflight.nas b/Nasal/it-autoflight.nas
index f62acbb0..891161c1 100644
--- a/Nasal/it-autoflight.nas
+++ b/Nasal/it-autoflight.nas
@@ -1,5 +1,5 @@
 # IT AUTOFLIGHT System Controller by Joshua Davidson (it0uchpods/411).
-# V3.0.0 Build 115
+# V3.0.0 Build 127
 # This program is 100% GPL!
 
 print("IT-AUTOFLIGHT: Please Wait!");
@@ -12,12 +12,12 @@ var ap_init = func {
 	setprop("/it-autoflight/input/cws", 0);
 	setprop("/it-autoflight/input/fd1", 0);
 	setprop("/it-autoflight/input/fd2", 0);
-	setprop("/it-autoflight/input/spd-kts", 200);
-	setprop("/it-autoflight/input/spd-mach", 0.68);
 	setprop("/it-autoflight/input/hdg", 360);
 	setprop("/it-autoflight/input/alt", 10000);
 	setprop("/it-autoflight/input/vs", 0);
+	setprop("/it-autoflight/input/fpa", 0);
 	setprop("/it-autoflight/input/lat", 5);
+	setprop("/it-autoflight/input/lat-arm", 0);
 	setprop("/it-autoflight/input/vert", 7);
 	setprop("/it-autoflight/input/bank-limit", 30);
 	setprop("/it-autoflight/input/trk", 0);
@@ -32,6 +32,8 @@ var ap_init = func {
 	setprop("/it-autoflight/output/appr-armed", 0);
 	setprop("/it-autoflight/output/thr-mode", 2);
 	setprop("/it-autoflight/output/retard", 0);
+	setprop("/it-autoflight/output/lat", 5);
+	setprop("/it-autoflight/output/vert", 7);
 	setprop("/it-autoflight/settings/min-pitch", -8);
 	setprop("/it-autoflight/settings/max-pitch", 8);
 	setprop("/it-autoflight/internal/min-pitch", -8);
@@ -39,9 +41,14 @@ var ap_init = func {
 	setprop("/it-autoflight/internal/alt", 10000);
 	setprop("/it-autoflight/internal/cwsr", 0);
 	setprop("/it-autoflight/internal/cwsp", 0);
-    setprop("/it-autoflight/autoland/target-vs", "-650");
-    setprop("/it-autoflight/mode/lat", "T/O");
-    setprop("/it-autoflight/mode/vert", "T/O CLB");
+	setprop("/it-autoflight/internal/fpa", 0);
+	setprop("/it-autoflight/autoland/target-vs", "-650");
+	setprop("/it-autoflight/mode/thr", "PITCH");
+	setprop("/it-autoflight/mode/arm", "HDG");
+	setprop("/it-autoflight/mode/lat", "T/O");
+	setprop("/it-autoflight/mode/vert", "T/O CLB");
+	setprop("/it-autoflight/input/spd-kts", 200);
+	setprop("/it-autoflight/input/spd-mach", 0.68);
 	thrustmode();
 	update_arms();
 	print("IT-AUTOFLIGHT: Done!");
@@ -49,253 +56,313 @@ var ap_init = func {
 
 # AP 1 Master System
 setlistener("/it-autoflight/input/ap1", func {
-  var apmas = getprop("/it-autoflight/input/ap1");
-  if (apmas == 0) {
-	setprop("/it-autoflight/output/ap1", 0);
-	setprop("/controls/flight/rudder", 0);
-	if (getprop("/it-autoflight/sound/enableapoffsound") == 1) {
-	  setprop("/it-autoflight/sound/apoffsound", 1);	
-	  setprop("/it-autoflight/sound/enableapoffsound", 0);	  
+	var apmas = getprop("/it-autoflight/input/ap1");
+	if (apmas == 0) {
+		setprop("/it-autoflight/output/ap1", 0);
+		setprop("/controls/flight/rudder", 0);
+		if (getprop("/it-autoflight/sound/enableapoffsound") == 1) {
+			setprop("/it-autoflight/sound/apoffsound", 1);	
+			setprop("/it-autoflight/sound/enableapoffsound", 0);	  
+		}
+	} else if (apmas == 1) {
+		if ((getprop("/gear/gear[1]/wow") == 0) and (getprop("/gear/gear[2]/wow") == 0)) {
+			setprop("/controls/flight/rudder", 0);
+			setprop("/it-autoflight/input/cws", 0);
+			setprop("/it-autoflight/output/ap1", 1);
+			setprop("/it-autoflight/sound/enableapoffsound", 1);
+			setprop("/it-autoflight/sound/apoffsound", 0);
+		}
 	}
-  } else if (apmas == 1) {
-	setprop("/controls/flight/rudder", 0);
-	setprop("/it-autoflight/input/cws", 0);
-	setprop("/it-autoflight/output/ap1", 1);
-	setprop("/it-autoflight/sound/enableapoffsound", 1);
-	setprop("/it-autoflight/sound/apoffsound", 0);
-  }
 });
 
 # AP 2 Master System
 setlistener("/it-autoflight/input/ap2", func {
-  var apmas = getprop("/it-autoflight/input/ap2");
-  if (apmas == 0) {
-	setprop("/it-autoflight/output/ap2", 0);
-	setprop("/controls/flight/rudder", 0);
-	if (getprop("/it-autoflight/sound/enableapoffsound2") == 1) {
-	  setprop("/it-autoflight/sound/apoffsound2", 1);	
-	  setprop("/it-autoflight/sound/enableapoffsound2", 0);	  
+	var apmas = getprop("/it-autoflight/input/ap2");
+	if (apmas == 0) {
+		setprop("/it-autoflight/output/ap2", 0);
+		setprop("/controls/flight/rudder", 0);
+		if (getprop("/it-autoflight/sound/enableapoffsound2") == 1) {
+			setprop("/it-autoflight/sound/apoffsound2", 1);	
+			setprop("/it-autoflight/sound/enableapoffsound2", 0);	  
+		}
+	} else if (apmas == 1) {
+		if ((getprop("/gear/gear[1]/wow") == 0) and (getprop("/gear/gear[2]/wow") == 0)) {
+			setprop("/controls/flight/rudder", 0);
+			setprop("/it-autoflight/input/cws", 0);
+			setprop("/it-autoflight/output/ap2", 1);
+			setprop("/it-autoflight/sound/enableapoffsound2", 1);
+			setprop("/it-autoflight/sound/apoffsound2", 0);
+		}
 	}
-  } else if (apmas == 1) {
-	setprop("/controls/flight/rudder", 0);
-	setprop("/it-autoflight/input/cws", 0);
-	setprop("/it-autoflight/output/ap2", 1);
-	setprop("/it-autoflight/sound/enableapoffsound2", 1);
-	setprop("/it-autoflight/sound/apoffsound2", 0);
-  }
 });
 
 # AT Master System
 setlistener("/it-autoflight/input/athr", func {
-  var atmas = getprop("/it-autoflight/input/athr");
-  if (atmas == 0) {
-	setprop("/it-autoflight/output/athr", 0);
-  } else if (atmas == 1) {
-	setprop("/it-autoflight/output/athr", 1);
-  }
+	var atmas = getprop("/it-autoflight/input/athr");
+	if (atmas == 0) {
+		setprop("/it-autoflight/output/athr", 0);
+	} else if (atmas == 1) {
+		setprop("/it-autoflight/output/athr", 1);
+	}
 });
 
 # CWS Master System
 setlistener("/it-autoflight/input/cws", func {
-  var cwsmas = getprop("/it-autoflight/input/cws");
-  if (cwsmas == 1) {
-	setprop("/it-autoflight/input/ap1", 0);
-	setprop("/it-autoflight/input/ap2", 0);
-	setprop("/it-autoflight/internal/cws-roll-deg", getprop("/orientation/roll-deg"));
-	setprop("/it-autoflight/internal/cws-pitch-deg", getprop("/orientation/pitch-deg"));
-	cwsrollt.start();
-	cwspitcht.start();
-	setprop("/it-autoflight/output/cws", 1);
-  } else if (cwsmas == 0) {
-	cwsrollt.stop();
-	cwspitcht.stop();
-	setprop("/it-autoflight/output/cws", 0);
-	setprop("/controls/flight/aileron-trim", 0);
-  }
+	var cwsmas = getprop("/it-autoflight/input/cws");
+	if (cwsmas == 1) {
+		if ((getprop("/gear/gear[1]/wow") == 0) and (getprop("/gear/gear[2]/wow") == 0)) {
+			setprop("/it-autoflight/input/ap1", 0);
+			setprop("/it-autoflight/input/ap2", 0);
+			setprop("/it-autoflight/internal/cws-roll-deg", getprop("/orientation/roll-deg"));
+			setprop("/it-autoflight/internal/cws-pitch-deg", getprop("/orientation/pitch-deg"));
+			cwsrollt.start();
+			cwspitcht.start();
+			setprop("/it-autoflight/output/cws", 1);
+		}
+	} else if (cwsmas == 0) {
+		cwsrollt.stop();
+		cwspitcht.stop();
+		setprop("/it-autoflight/output/cws", 0);
+		setprop("/controls/flight/aileron-trim", 0);
+	}
 });
 
 # Flight Director 1 Master System
 setlistener("/it-autoflight/input/fd1", func {
-  var fdmas = getprop("/it-autoflight/input/fd1");
-  if (fdmas == 0) {
-	setprop("/it-autoflight/output/fd1", 0);
-  } else if (fdmas == 1) {
-	setprop("/it-autoflight/output/fd1", 1);
-  }
+	var fdmas = getprop("/it-autoflight/input/fd1");
+	if (fdmas == 0) {
+		setprop("/it-autoflight/output/fd1", 0);
+	} else if (fdmas == 1) {
+		setprop("/it-autoflight/output/fd1", 1);
+	}
 });
 
 # Flight Director 2 Master System
 setlistener("/it-autoflight/input/fd2", func {
-  var fdmas = getprop("/it-autoflight/input/fd2");
-  if (fdmas == 0) {
-	setprop("/it-autoflight/output/fd2", 0);
-  } else if (fdmas == 1) {
-	setprop("/it-autoflight/output/fd2", 1);
-  }
+	var fdmas = getprop("/it-autoflight/input/fd2");
+	if (fdmas == 0) {
+		setprop("/it-autoflight/output/fd2", 0);
+	} else if (fdmas == 1) {
+		setprop("/it-autoflight/output/fd2", 1);
+	}
 });
 
 # Master Lateral
 setlistener("/it-autoflight/input/lat", func {
-  lateral();
+	if ((getprop("/gear/gear[1]/wow") == 0) and (getprop("/gear/gear[2]/wow") == 0)) {
+		lateral();
+	} else {
+		lat_arm();
+	}
 });
 
 var lateral = func {
-  var latset = getprop("/it-autoflight/input/lat");
-  if (latset == 0) {
-	alandt.stop();
-	alandt1.stop();
-	setprop("/it-autoflight/output/loc-armed", 0);
-	setprop("/it-autoflight/output/appr-armed", 0);
-	setprop("/it-autoflight/output/lat", 0);
-	setprop("/it-autoflight/mode/lat", "HDG");
-	setprop("/it-autoflight/mode/arm", " ");
-  } else if (latset == 1) {
-	alandt.stop();
-	alandt1.stop();
-	setprop("/it-autoflight/output/loc-armed", 0);
-	setprop("/it-autoflight/output/appr-armed", 0);
-	setprop("/it-autoflight/output/lat", 1);
-	setprop("/it-autoflight/mode/lat", "LNAV");
-	setprop("/it-autoflight/mode/arm", " ");
-  } else if (latset == 2) {
-	setprop("/instrumentation/nav/signal-quality-norm", 0);
-	setprop("/it-autoflight/output/loc-armed", 1);
-	setprop("/it-autoflight/output/appr-armed", 0);
-	setprop("/it-autoflight/mode/arm", "LOC");
-  } else if (latset == 3) {
-	alandt.stop();
-	alandt1.stop();
-	setprop("/it-autoflight/output/loc-armed", 0);
-	setprop("/it-autoflight/output/appr-armed", 0);
-	setprop("/it-autoflight/output/lat", 0);
-	setprop("/it-autoflight/mode/lat", "HDG");
-	setprop("/it-autoflight/mode/arm", " ");
-    var hdgnow = int(getprop("/orientation/heading-magnetic-deg")+0.5);
-	setprop("/it-autoflight/input/hdg", hdgnow);
-  } else if (latset == 4) {
-	setprop("/it-autoflight/output/lat", 4);
-	setprop("/it-autoflight/mode/lat", "ALGN");
-  } else if (latset == 5) {
-	setprop("/it-autoflight/output/lat", 5);
-  }
+	var latset = getprop("/it-autoflight/input/lat");
+	if (latset == 0) {
+		alandt.stop();
+		alandt1.stop();
+		setprop("/it-autoflight/output/loc-armed", 0);
+		setprop("/it-autoflight/output/appr-armed", 0);
+		setprop("/it-autoflight/output/lat", 0);
+		setprop("/it-autoflight/mode/lat", "HDG");
+		setprop("/it-autoflight/mode/arm", " ");
+	} else if (latset == 1) {
+		alandt.stop();
+		alandt1.stop();
+		setprop("/it-autoflight/output/loc-armed", 0);
+		setprop("/it-autoflight/output/appr-armed", 0);
+		setprop("/it-autoflight/output/lat", 1);
+		setprop("/it-autoflight/mode/lat", "LNAV");
+		setprop("/it-autoflight/mode/arm", " ");
+	} else if (latset == 2) {
+		setprop("/instrumentation/nav/signal-quality-norm", 0);
+		setprop("/it-autoflight/output/loc-armed", 1);
+		setprop("/it-autoflight/output/appr-armed", 0);
+		setprop("/it-autoflight/mode/arm", "LOC");
+	} else if (latset == 3) {
+		alandt.stop();
+		alandt1.stop();
+		setprop("/it-autoflight/output/loc-armed", 0);
+		setprop("/it-autoflight/output/appr-armed", 0);
+		var hdgnow = int(getprop("/orientation/heading-magnetic-deg")+0.5);
+		setprop("/it-autoflight/input/hdg", hdgnow);
+		setprop("/it-autoflight/output/lat", 0);
+		setprop("/it-autoflight/mode/lat", "HDG");
+		setprop("/it-autoflight/mode/arm", " ");
+	} else if (latset == 4) {
+		setprop("/it-autoflight/output/lat", 4);
+		setprop("/it-autoflight/mode/lat", "ALGN");
+	} else if (latset == 5) {
+		setprop("/it-autoflight/output/lat", 5);
+	}
+}
+
+var lat_arm = func {
+	var latset = getprop("/it-autoflight/input/lat");
+	if (latset == 0) {
+		setprop("/it-autoflight/input/lat-arm", 0);
+		setprop("/it-autoflight/mode/arm", "HDG");
+	} else if (latset == 1) {
+		setprop("/it-autoflight/input/lat-arm", 1);
+		setprop("/it-autoflight/mode/arm", "LNV");
+	} else if (latset == 3) {
+		var hdgnow = int(getprop("/orientation/heading-magnetic-deg")+0.5);
+		setprop("/it-autoflight/input/hdg", hdgnow);
+		setprop("/it-autoflight/input/lat-arm", 0);
+		setprop("/it-autoflight/mode/arm", "HDG");
+	}
 }
 
 # Master Vertical
 setlistener("/it-autoflight/input/vert", func {
-  vertical();
+	if ((getprop("/gear/gear[1]/wow") == 0) and (getprop("/gear/gear[2]/wow") == 0)) {
+		vertical();
+	}
 });
 
 var vertical = func {
-  var vertset = getprop("/it-autoflight/input/vert");
-  if (vertset == 0) {
-	alandt.stop();
-	alandt1.stop();
-	setprop("/it-autoflight/output/appr-armed", 0);
-	setprop("/it-autoflight/output/vert", 0);
-	setprop("/it-autoflight/mode/vert", "ALT HLD");
-	if (getprop("/it-autoflight/output/loc-armed")) {
-	  setprop("/it-autoflight/mode/arm", "LOC");
-	} else {
-	  setprop("/it-autoflight/mode/arm", " ");
+	var vertset = getprop("/it-autoflight/input/vert");
+	if (vertset == 0) {
+		alandt.stop();
+		alandt1.stop();
+		setprop("/it-autoflight/output/appr-armed", 0);
+		setprop("/it-autoflight/output/vert", 0);
+		setprop("/it-autoflight/mode/vert", "ALT HLD");
+		if (getprop("/it-autoflight/output/loc-armed")) {
+			setprop("/it-autoflight/mode/arm", "LOC");
+		} else {
+			setprop("/it-autoflight/mode/arm", " ");
+		}
+		var altnow = int((getprop("/instrumentation/altimeter/indicated-altitude-ft")+50)/100)*100;
+		setprop("/it-autoflight/input/alt", altnow);
+		setprop("/it-autoflight/internal/alt", altnow);
+		thrustmode();
+	} else if (vertset == 1) {
+		alandt.stop();
+		alandt1.stop();
+		var altinput = getprop("/it-autoflight/input/alt");
+		setprop("/it-autoflight/internal/alt", altinput);
+		var vsnow = int(getprop("/velocities/vertical-speed-fps")*0.6)*100;
+		setprop("/it-autoflight/input/vs", vsnow);
+		setprop("/it-autoflight/output/appr-armed", 0);
+		setprop("/it-autoflight/output/vert", 1);
+		setprop("/it-autoflight/mode/vert", "V/S");
+		if (getprop("/it-autoflight/output/loc-armed")) {
+			setprop("/it-autoflight/mode/arm", "LOC");
+		} else {
+			setprop("/it-autoflight/mode/arm", " ");
+		}
+		thrustmode();
+	} else if (vertset == 2) {
+		if (getprop("/it-autoflight/output/lat") == 2) {
+			# Do nothing because VORLOC is active
+		} else {
+			setprop("/instrumentation/nav/signal-quality-norm", 0);
+			setprop("/it-autoflight/output/loc-armed", 1);
+		}
+		setprop("/instrumentation/nav/gs-rate-of-climb", 0);
+		setprop("/it-autoflight/output/appr-armed", 1);
+		setprop("/it-autoflight/mode/arm", "ILS");
+		setprop("/it-autoflight/autoland/target-vs", "-650");
+	} else if (vertset == 3) {
+		alandt.stop();
+		alandt1.stop();
+		var calt = getprop("/instrumentation/altimeter/indicated-altitude-ft");
+		var alt = getprop("/it-autoflight/internal/alt");
+		var dif = calt - alt;
+		var pitchdeg = getprop("/orientation/pitch-deg");
+		if (calt < alt) {
+			setprop("/it-autoflight/internal/max-pitch", pitchdeg);
+		} else if (calt > alt) {
+			setprop("/it-autoflight/internal/min-pitch", pitchdeg);
+		}
+		minmaxtimer.start();
+		thrustmode();
+		setprop("/it-autoflight/output/vert", 0);
+		setprop("/it-autoflight/mode/vert", "ALT CAP");
+	} else if (vertset == 4) {
+		alandt.stop();
+		alandt1.stop();
+		var altinput = getprop("/it-autoflight/input/alt");
+		setprop("/it-autoflight/internal/alt", altinput);
+		var calt = getprop("/instrumentation/altimeter/indicated-altitude-ft");
+		var alt = getprop("/it-autoflight/internal/alt");
+		var dif = calt - alt;
+		if (dif < 550 and dif > -550) {
+			alt_on();
+		} else {
+			flch_on();
+		}
+		if (getprop("/it-autoflight/output/loc-armed")) {
+			setprop("/it-autoflight/mode/arm", "LOC");
+		} else {
+			setprop("/it-autoflight/mode/arm", " ");
+		}
+	} else if (vertset == 5) {
+		alandt.stop();
+		alandt1.stop();
+		fpa_calct.start();
+		var altinput = getprop("/it-autoflight/input/alt");
+		setprop("/it-autoflight/internal/alt", altinput);
+		var fpanow = (int(10*getprop("/it-autoflight/internal/fpa")))*0.1;
+		if (fpanow < 9.9 and fpanow > -9.9) {
+			setprop("/it-autoflight/input/fpa", fpanow);
+		} else if (fpanow >= 9.9) {
+			setprop("/it-autoflight/input/fpa", 9.9);
+		} else if (fpanow <= -9.9) {
+			setprop("/it-autoflight/input/fpa", -9.9);
+		}
+		setprop("/it-autoflight/output/appr-armed", 0);
+		setprop("/it-autoflight/output/vert", 5);
+		setprop("/it-autoflight/mode/vert", "FPA");
+		if (getprop("/it-autoflight/output/loc-armed")) {
+			setprop("/it-autoflight/mode/arm", "LOC");
+		} else {
+			setprop("/it-autoflight/mode/arm", " ");
+		}
+		thrustmode();
+	} else if (vertset == 6) {
+		setprop("/it-autoflight/output/vert", 6);
+		setprop("/it-autoflight/mode/vert", "LAND 3");
+		setprop("/it-autoflight/mode/arm", " ");
+		thrustmode();
+		alandt.stop();
+		alandt1.start();
+		setprop("/it-autoflight/autoland/target-vs", "-650");
+	} else if (vertset == 7) {
+		setprop("/it-autoflight/output/vert", 7);
+		setprop("/it-autoflight/mode/arm", " ");
+		var altinput = getprop("/it-autoflight/input/alt");
+		setprop("/it-autoflight/internal/alt", altinput);
+		thrustmode();
+		alandt.stop();
+		alandt1.stop();
 	}
-    var altnow = int((getprop("/instrumentation/altimeter/indicated-altitude-ft")+50)/100)*100;
-	setprop("/it-autoflight/input/alt", altnow);
-	setprop("/it-autoflight/internal/alt", altnow);
-	thrustmode();
-  } else if (vertset == 1) {
-	alandt.stop();
-	alandt1.stop();
-    var altinput = getprop("/it-autoflight/input/alt");
-	setprop("/it-autoflight/internal/alt", altinput);
-	var vsnow = int(getprop("/velocities/vertical-speed-fps")*0.6)*100;
-	setprop("/it-autoflight/input/vs", vsnow);
-	setprop("/it-autoflight/output/appr-armed", 0);
-	setprop("/it-autoflight/output/vert", 1);
-	setprop("/it-autoflight/mode/vert", "V/S");
-	if (getprop("/it-autoflight/output/loc-armed")) {
-	  setprop("/it-autoflight/mode/arm", "LOC");
-	} else {
-	  setprop("/it-autoflight/mode/arm", " ");
-	}
-	thrustmode();
-  } else if (vertset == 2) {
-    if (getprop("/it-autoflight/output/lat") == 2) {
-	  # Do nothing because VORLOC is active
-	} else {
-	  setprop("/instrumentation/nav/signal-quality-norm", 0);
-	  setprop("/it-autoflight/output/loc-armed", 1);
-	}
-	setprop("/instrumentation/nav/gs-rate-of-climb", 0);
-	setprop("/it-autoflight/output/appr-armed", 1);
-	setprop("/it-autoflight/mode/arm", "ILS");
-    setprop("/it-autoflight/autoland/target-vs", "-650");
-  } else if (vertset == 3) {
-	alandt.stop();
-	alandt1.stop();
-	var calt = getprop("/instrumentation/altimeter/indicated-altitude-ft");
-	var alt = getprop("/it-autoflight/internal/alt");
-	var dif = calt - alt;
-	var pitchdeg = getprop("/orientation/pitch-deg");
-    if (calt < alt) {
-      setprop("/it-autoflight/internal/max-pitch", pitchdeg);
-    } else if (calt > alt) {
-      setprop("/it-autoflight/internal/min-pitch", pitchdeg);
-    }
-	minmaxtimer.start();
-	thrustmode();
-	setprop("/it-autoflight/output/vert", 0);
-	setprop("/it-autoflight/mode/vert", "ALT CAP");
-  } else if (vertset == 4) {
-	alandt.stop();
-	alandt1.stop();
-	var altinput = getprop("/it-autoflight/input/alt");
-	setprop("/it-autoflight/internal/alt", altinput);
-    var calt = getprop("/instrumentation/altimeter/indicated-altitude-ft");
-    var alt = getprop("/it-autoflight/internal/alt");
-	var dif = calt - alt;
-	if (dif < 550 and dif > -550) {
-	  alt_on();
-    } else {
-	  flch_on();
-	}
-	if (getprop("/it-autoflight/output/loc-armed")) {
-	  setprop("/it-autoflight/mode/arm", "LOC");
-	} else {
-	  setprop("/it-autoflight/mode/arm", " ");
-	}
-  } else if (vertset == 5) {
-	# FPA not ready yet, so do nothing
-  } else if (vertset == 6) {
-	setprop("/it-autoflight/output/vert", 6);
-	setprop("/it-autoflight/mode/vert", "LAND 3");
-	setprop("/it-autoflight/mode/arm", " ");
-	thrustmode();
-	alandt.stop();
-	alandt1.start();
-    setprop("/it-autoflight/autoland/target-vs", "-650");
-  } else if (vertset == 7) {
-	setprop("/it-autoflight/output/vert", 7);
-	setprop("/it-autoflight/mode/arm", " ");
-    var altinput = getprop("/it-autoflight/input/alt");
-	setprop("/it-autoflight/internal/alt", altinput);
-	togasel();
-	thrustmode();
-	alandt.stop();
-	alandt1.stop();
-  }
 }
 
 var flch_on = func {
-  setprop("/it-autoflight/output/appr-armed", 0);
-  setprop("/it-autoflight/output/vert", 4);
-  thrustmodet.start();
+	setprop("/it-autoflight/output/appr-armed", 0);
+	setprop("/it-autoflight/output/vert", 4);
+	thrustmodet.start();
 }
 var alt_on = func {
-  setprop("/it-autoflight/output/appr-armed", 0);
-  setprop("/it-autoflight/output/vert", 0);
-  setprop("/it-autoflight/mode/vert", "ALT CAP");
-  setprop("/it-autoflight/internal/max-pitch", 8);
-  setprop("/it-autoflight/internal/min-pitch", -8);
+	setprop("/it-autoflight/output/appr-armed", 0);
+	setprop("/it-autoflight/output/vert", 0);
+	setprop("/it-autoflight/mode/vert", "ALT CAP");
+	setprop("/it-autoflight/internal/max-pitch", 8);
+	setprop("/it-autoflight/internal/min-pitch", -8);
+}
+
+var fpa_calc = func {
+	var VS = getprop("/velocities/vertical-speed-fps");
+	var TAS = getprop("/velocities/uBody-fps");
+	if(TAS < 10) TAS = 10;
+	if(VS < -200) VS =-200;
+	if (abs(VS/TAS) <= 1) {
+		var FPangle = math.asin(VS/TAS);
+		FPangle *=90;
+		setprop("/it-autoflight/internal/fpa", FPangle);
+	}
 }
 
 setlistener("/it-autoflight/input/kts-mach", func {
@@ -309,281 +376,311 @@ setlistener("/it-autoflight/input/kts-mach", func {
 	}
 });
 
-# Capture Logic
-setlistener("/it-autoflight/output/vert", func {
-  var vertm = getprop("/it-autoflight/output/vert");
-	if (vertm == 1) {
-      altcaptt.start();
-    } else if (vertm == 4) {
-      altcaptt.start();	
-	} else if (vertm == 5) {
-      altcaptt.start();	
-	} else if (vertm == 7) {
-      altcaptt.start();	
-	} else {
-	  altcaptt.stop();
-    }
+# TOGA
+setlistener("/it-autoflight/input/toga", func {
+	if (getprop("/it-autoflight/input/toga") == 1) {
+		setprop("/it-autoflight/input/vert", 7);
+		setprop("/it-autoflight/output/loc-armed", 0);
+		setprop("/it-autoflight/output/appr-armed", 0);
+		setprop("/it-autoflight/input/toga", 0);
+		togasel();
+	}
 });
 
+var togasel = func {
+	if ((getprop("/gear/gear[1]/wow") == 0) and (getprop("/gear/gear[2]/wow") == 0)) {
+		var iasnow = int(getprop("/instrumentation/airspeed-indicator/indicated-speed-kt")+0.5);
+		setprop("/it-autoflight/input/spd-kts", iasnow);
+		setprop("/it-autoflight/input/kts-mach", 0);
+		setprop("/it-autoflight/mode/vert", "G/A CLB");
+	} else {
+		setprop("/it-autoflight/input/lat", 5);
+		setprop("/it-autoflight/mode/lat", "T/O");
+		setprop("/it-autoflight/mode/vert", "T/O CLB");
+	}
+}
+
+setlistener("/it-autoflight/mode/vert", func {
+	var vertm = getprop("/it-autoflight/mode/vert");
+	if (vertm == "T/O CLB") {
+		reduct.start();
+		latarmt.start();
+	} else {
+		reduct.stop();
+		latarmt.stop();
+	}
+});
+
+var toga_reduc = func {
+	if (getprop("/position/gear-agl-ft") >= getprop("/it-autoflight/settings/reduc-agl-ft")) {
+		setprop("/it-autoflight/input/vert", 4);
+	}
+}
+
+var latarms = func {
+	if (getprop("/position/gear-agl-ft") >= getprop("/it-autoflight/settings/lat-agl-ft")) {
+		setprop("/it-autoflight/input/lat", getprop("/it-autoflight/input/lat-arm"));
+	}
+}
+
+# Altitude Capture and FPA Timer Logic
+setlistener("/it-autoflight/output/vert", func {
+	var vertm = getprop("/it-autoflight/output/vert");
+	if (vertm == 1) {
+		altcaptt.start();
+		fpa_calct.stop();
+	} else if (vertm == 4) {
+		altcaptt.start();
+		fpa_calct.stop();
+	} else if (vertm == 5) {
+		altcaptt.start();
+	} else if (vertm == 7) {
+		altcaptt.start();
+		fpa_calct.stop();
+	} else {
+		altcaptt.stop();
+		fpa_calct.stop();
+	}
+});
+
+# Altitude Capture
 var altcapt = func {
-  var vsnow = getprop("/it-autoflight/internal/vert-speed-fpm");
-  if ((vsnow >= 0 and vsnow < 500) or (vsnow < 0 and vsnow > -500)) {
-    setprop("/it-autoflight/internal/captvs", 100);
-    setprop("/it-autoflight/internal/captvsneg", -100);
-  } else  if ((vsnow >= 500 and vsnow < 1000) or (vsnow < -500 and vsnow > -1000)) {
-    setprop("/it-autoflight/internal/captvs", 150);
-    setprop("/it-autoflight/internal/captvsneg", -150);
-  } else  if ((vsnow >= 1000 and vsnow < 1500) or (vsnow < -1000 and vsnow > -1500)) {
-    setprop("/it-autoflight/internal/captvs", 200);
-    setprop("/it-autoflight/internal/captvsneg", -200);
-  } else  if ((vsnow >= 1500 and vsnow < 2000) or (vsnow < -1500 and vsnow > -2000)) {
-    setprop("/it-autoflight/internal/captvs", 300);
-    setprop("/it-autoflight/internal/captvsneg", -300);
-  } else  if ((vsnow >= 2000 and vsnow < 3000) or (vsnow < -2000 and vsnow > -3000)) {
-    setprop("/it-autoflight/internal/captvs", 450);
-    setprop("/it-autoflight/internal/captvsneg", -450);
-  } else  if ((vsnow >= 3000 and vsnow < 4000) or (vsnow < -3000 and vsnow > -4000)) {
-    setprop("/it-autoflight/internal/captvs", 650);
-    setprop("/it-autoflight/internal/captvsneg", -650);
-  } else  if ((vsnow >= 4000 and vsnow < 5000) or (vsnow < -4000 and vsnow > -5000)) {
-    setprop("/it-autoflight/internal/captvs", 1000);
-    setprop("/it-autoflight/internal/captvsneg", -1000);
-  } else  if ((vsnow >= 5000) or (vsnow < -5000)) {
-    setprop("/it-autoflight/internal/captvs", 1250);
-    setprop("/it-autoflight/internal/captvsneg", -1250);
-  }
-  var calt = getprop("/instrumentation/altimeter/indicated-altitude-ft");
-  var alt = getprop("/it-autoflight/internal/alt");
-  var dif = calt - alt;
-  if (dif < getprop("/it-autoflight/internal/captvs") and dif > getprop("/it-autoflight/internal/captvsneg")) {
-    setprop("/it-autoflight/input/vert", 3);
-    setprop("/it-autoflight/output/thr-mode", 0);
-  }
-  var altinput = getprop("/it-autoflight/input/alt");
-  setprop("/it-autoflight/internal/alt", altinput);
+	var vsnow = getprop("/it-autoflight/internal/vert-speed-fpm");
+	if ((vsnow >= 0 and vsnow < 500) or (vsnow < 0 and vsnow > -500)) {
+		setprop("/it-autoflight/internal/captvs", 100);
+		setprop("/it-autoflight/internal/captvsneg", -100);
+	} else  if ((vsnow >= 500 and vsnow < 1000) or (vsnow < -500 and vsnow > -1000)) {
+		setprop("/it-autoflight/internal/captvs", 150);
+		setprop("/it-autoflight/internal/captvsneg", -150);
+	} else  if ((vsnow >= 1000 and vsnow < 1500) or (vsnow < -1000 and vsnow > -1500)) {
+		setprop("/it-autoflight/internal/captvs", 200);
+		setprop("/it-autoflight/internal/captvsneg", -200);
+	} else  if ((vsnow >= 1500 and vsnow < 2000) or (vsnow < -1500 and vsnow > -2000)) {
+		setprop("/it-autoflight/internal/captvs", 300);
+		setprop("/it-autoflight/internal/captvsneg", -300);
+	} else  if ((vsnow >= 2000 and vsnow < 3000) or (vsnow < -2000 and vsnow > -3000)) {
+		setprop("/it-autoflight/internal/captvs", 450);
+		setprop("/it-autoflight/internal/captvsneg", -450);
+	} else  if ((vsnow >= 3000 and vsnow < 4000) or (vsnow < -3000 and vsnow > -4000)) {
+		setprop("/it-autoflight/internal/captvs", 650);
+		setprop("/it-autoflight/internal/captvsneg", -650);
+	} else  if ((vsnow >= 4000 and vsnow < 5000) or (vsnow < -4000 and vsnow > -5000)) {
+		setprop("/it-autoflight/internal/captvs", 1000);
+		setprop("/it-autoflight/internal/captvsneg", -1000);
+	} else  if ((vsnow >= 5000) or (vsnow < -5000)) {
+		setprop("/it-autoflight/internal/captvs", 1250);
+		setprop("/it-autoflight/internal/captvsneg", -1250);
+	}
+	var calt = getprop("/instrumentation/altimeter/indicated-altitude-ft");
+	var alt = getprop("/it-autoflight/internal/alt");
+	var dif = calt - alt;
+	if (dif < getprop("/it-autoflight/internal/captvs") and dif > getprop("/it-autoflight/internal/captvsneg")) {
+		setprop("/it-autoflight/input/vert", 3);
+		setprop("/it-autoflight/output/thr-mode", 0);
+	}
+	var altinput = getprop("/it-autoflight/input/alt");
+	setprop("/it-autoflight/internal/alt", altinput);
 }
 
 # Thrust Mode Selector
 var thrustmode = func {
-  var calt = getprop("/instrumentation/altimeter/indicated-altitude-ft");
-  var alt = getprop("/it-autoflight/internal/alt");
-  var vertm = getprop("/it-autoflight/output/vert");
-  if (vertm == 4) {
-    if (calt < alt) {
-	  setprop("/it-autoflight/output/thr-mode", 2);
-	  setprop("/it-autoflight/mode/thr", " PITCH");
-	  setprop("/it-autoflight/mode/vert", "SPD CLB");
-    } else if (calt > alt) {
-      setprop("/it-autoflight/output/thr-mode", 1);
-	  setprop("/it-autoflight/mode/thr", " PITCH");
-	  setprop("/it-autoflight/mode/vert", "SPD DES");
-    } else {
-	  setprop("/it-autoflight/output/thr-mode", 0);
-	  setprop("/it-autoflight/mode/thr", "THRUST");
-	  setprop("/it-autoflight/input/vert", 3);
+	var calt = getprop("/instrumentation/altimeter/indicated-altitude-ft");
+	var alt = getprop("/it-autoflight/internal/alt");
+	var vertm = getprop("/it-autoflight/output/vert");
+	if (vertm == 4) {
+		if (calt < alt) {
+			setprop("/it-autoflight/output/thr-mode", 2);
+			setprop("/it-autoflight/mode/thr", " PITCH");
+			setprop("/it-autoflight/mode/vert", "SPD CLB");
+		} else if (calt > alt) {
+			setprop("/it-autoflight/output/thr-mode", 1);
+			setprop("/it-autoflight/mode/thr", " PITCH");
+			setprop("/it-autoflight/mode/vert", "SPD DES");
+		} else {
+			setprop("/it-autoflight/output/thr-mode", 0);
+			setprop("/it-autoflight/mode/thr", "THRUST");
+			setprop("/it-autoflight/input/vert", 3);
+		}
+	} else if (vertm == 7) {
+		setprop("/it-autoflight/output/thr-mode", 2);
+		setprop("/it-autoflight/mode/thr", " PITCH");
+	} else {
+		setprop("/it-autoflight/output/thr-mode", 0);
+		setprop("/it-autoflight/mode/thr", "THRUST");
+		thrustmodet.stop();
 	}
-  } else if (vertm == 7) {
-	setprop("/it-autoflight/output/thr-mode", 2);
-	setprop("/it-autoflight/mode/thr", " PITCH");
-  } else {
-	setprop("/it-autoflight/output/thr-mode", 0);
-	setprop("/it-autoflight/mode/thr", "THRUST");
-	thrustmodet.stop();
-  }
 }
 
 # Min and Max Pitch Reset
 var minmax = func {
-  var calt = getprop("/instrumentation/altimeter/indicated-altitude-ft");
-  var alt = getprop("/it-autoflight/internal/alt");
-  var dif = calt - alt;
-  if (dif < 100 and dif > -100) {
-      setprop("/it-autoflight/internal/max-pitch", 8);
-      setprop("/it-autoflight/internal/min-pitch", -5);
-	  var vertmode = getprop("/it-autoflight/output/vert");
-	  if (vertmode == 1 or vertmode == 2 or vertmode == 4 or vertmode == 5 or vertmode == 6 or vertmode == 7) {
-	    # Do not change the vertical mode because we are not trying to capture altitude.
-	  } else {
-	    setprop("/it-autoflight/mode/vert", "ALT HLD");
-	  }
-	  minmaxtimer.stop();
-  }
+	var calt = getprop("/instrumentation/altimeter/indicated-altitude-ft");
+	var alt = getprop("/it-autoflight/internal/alt");
+	var dif = calt - alt;
+	if (dif < 100 and dif > -100) {
+		setprop("/it-autoflight/internal/max-pitch", 8);
+		setprop("/it-autoflight/internal/min-pitch", -5);
+		var vertmode = getprop("/it-autoflight/output/vert");
+		if (vertmode == 1 or vertmode == 2 or vertmode == 4 or vertmode == 5 or vertmode == 6 or vertmode == 7) {
+			# Do not change the vertical mode because we are not trying to capture altitude.
+		} else {
+			setprop("/it-autoflight/mode/vert", "ALT HLD");
+		}
+		minmaxtimer.stop();
+	}
 }
 
 # Retard
 setlistener("/controls/flight/flaps", func {
-  var flapc = getprop("/controls/flight/flaps");
-  var flapl = getprop("/it-autoflight/settings/land-flap");
-  if (flapc >= flapl) {
-	retardt.start();
-  } else {
-	retardt.stop();
-  }
+	var flapc = getprop("/controls/flight/flaps");
+	var flapl = getprop("/it-autoflight/settings/land-flap");
+	if (flapc >= flapl) {
+		retardt.start();
+	} else {
+		retardt.stop();
+	}
 });
 
 var retardchk = func {
-  if (getprop("/it-autoflight/settings/retard-enable") == 1) {
-    var altpos = getprop("/position/gear-agl-ft");
-    var retardalt = getprop("/it-autoflight/settings/retard-ft");
-    var aton = getprop("/it-autoflight/output/athr");
-    if (altpos < retardalt) {
-	  if (aton == 1) {
-	    setprop("/it-autoflight/output/retard", 1);
-	    setprop("/it-autoflight/mode/thr", "RETARD");
-		atofft.start();
-	  } else {
-	    setprop("/it-autoflight/output/retard", 0);
-		thrustmode();
-	  }
-    }
-  }
+	if (getprop("/it-autoflight/settings/retard-enable") == 1) {
+		var altpos = getprop("/position/gear-agl-ft");
+		var retardalt = getprop("/it-autoflight/settings/retard-ft");
+		var aton = getprop("/it-autoflight/output/athr");
+		if (altpos < retardalt) {
+			if (aton == 1) {
+				setprop("/it-autoflight/output/retard", 1);
+				setprop("/it-autoflight/mode/thr", "RETARD");
+				atofft.start();
+			} else {
+				setprop("/it-autoflight/output/retard", 0);
+				thrustmode();
+			}
+		}
+	}
 }
 
 var atoffchk = func{
-  var gear1 = getprop("/gear/gear[1]/wow");
-  var gear2 = getprop("/gear/gear[2]/wow");
-  if (gear1 == 1 or gear2 == 1) {
-	setprop("/it-autoflight/input/athr", 0);
-	setprop("/controls/engines/engine[0]/throttle", 0);
-	setprop("/controls/engines/engine[1]/throttle", 0);
-	setprop("/controls/engines/engine[2]/throttle", 0);
-	setprop("/controls/engines/engine[3]/throttle", 0);
-	setprop("/controls/engines/engine[4]/throttle", 0);
-	setprop("/controls/engines/engine[5]/throttle", 0);
-	setprop("/controls/engines/engine[6]/throttle", 0);
-	setprop("/controls/engines/engine[7]/throttle", 0);
-	atofft.stop();
-  }
+	var gear1 = getprop("/gear/gear[1]/wow");
+	var gear2 = getprop("/gear/gear[2]/wow");
+	if (gear1 == 1 or gear2 == 1) {
+		setprop("/it-autoflight/input/athr", 0);
+		setprop("/controls/engines/engine[0]/throttle", 0);
+		setprop("/controls/engines/engine[1]/throttle", 0);
+		setprop("/controls/engines/engine[2]/throttle", 0);
+		setprop("/controls/engines/engine[3]/throttle", 0);
+		setprop("/controls/engines/engine[4]/throttle", 0);
+		setprop("/controls/engines/engine[5]/throttle", 0);
+		setprop("/controls/engines/engine[6]/throttle", 0);
+		setprop("/controls/engines/engine[7]/throttle", 0);
+		atofft.stop();
+	}
 }
 
 # For Canvas Nav Display.
 setlistener("/it-autoflight/input/hdg", func {
-  setprop("/autopilot/settings/heading-bug-deg", getprop("/it-autoflight/input/hdg"));
+	setprop("/autopilot/settings/heading-bug-deg", getprop("/it-autoflight/input/hdg"));
 });
 
-# TOGA
-setlistener("/it-autoflight/input/toga", func {
-  if (getprop("/it-autoflight/input/toga") == 1) {
-	setprop("/it-autoflight/input/vert", 7);
-	setprop("/it-autoflight/output/loc-armed", 0);
-	setprop("/it-autoflight/output/appr-armed", 0);
-	setprop("/it-autoflight/input/toga", 0);
-  }
-});
-
-var togasel = func {
-  if ((getprop("/gear/gear[1]/wow") == 0) and (getprop("/gear/gear[2]/wow") == 0)) {
-    setprop("/it-autoflight/mode/vert", "G/A CLB");
-  } else {
-	setprop("/it-autoflight/input/lat", 5);
-	setprop("/it-autoflight/mode/lat", "T/O");
-    setprop("/it-autoflight/mode/vert", "T/O CLB");
-  }
-}
-
 # LOC and G/S arming
 var update_arms = func {
-  update_locarmelec();
-  update_apparmelec();
-
-  settimer(update_arms, 0.5);
+	update_locarmelec();
+	update_apparmelec();
+	settimer(update_arms, 0.5);
 }
 
 var update_locarmelec = func {
-  var loca = getprop("/it-autoflight/output/loc-armed");
-  if (loca) {
-    locarmcheck();
-  } else {
-    return 0;
-  }
+	var loca = getprop("/it-autoflight/output/loc-armed");
+	if (loca) {
+		locarmcheck();
+	} else {
+		return 0;
+	}
 }
 
 var update_apparmelec = func {
-  var appra = getprop("/it-autoflight/output/appr-armed");
-  if (appra) {
-    apparmcheck();
-  } else {
-    return 0;
-  }
+	var appra = getprop("/it-autoflight/output/appr-armed");
+	if (appra) {
+		apparmcheck();
+	} else {
+		return 0;
+	}
 }
 
 var locarmcheck = func {
-  var locdefl = getprop("instrumentation/nav/heading-needle-deflection-norm");
-  if ((locdefl < 0.9233) and (getprop("instrumentation/nav/signal-quality-norm") > 0.99)) {
-    setprop("/it-autoflight/output/loc-armed", 0);
-    setprop("/it-autoflight/output/lat", 2);
-	setprop("/it-autoflight/mode/lat", "LOC");
-	if (getprop("/it-autoflight/output/appr-armed") == 1) {
-	  # Do nothing because G/S is armed
+	var locdefl = getprop("instrumentation/nav/heading-needle-deflection-norm");
+	if ((locdefl < 0.9233) and (getprop("instrumentation/nav/signal-quality-norm") > 0.99)) {
+		setprop("/it-autoflight/output/loc-armed", 0);
+		setprop("/it-autoflight/output/lat", 2);
+		setprop("/it-autoflight/mode/lat", "LOC");
+		if (getprop("/it-autoflight/output/appr-armed") == 1) {
+			# Do nothing because G/S is armed
+		} else {
+			setprop("/it-autoflight/mode/arm", " ");
+		}
 	} else {
-	  setprop("/it-autoflight/mode/arm", " ");
+		return 0;
 	}
-  } else {
-	return 0;
-  }
 }
 
 var apparmcheck = func {
-  var signal = getprop("/instrumentation/nav/gs-needle-deflection-norm");
-  if (signal <= -0.000000001) {
-	setprop("/it-autoflight/output/appr-armed", 0);
-	setprop("/it-autoflight/output/vert", 2);
-	setprop("/it-autoflight/mode/vert", "G/S");
-	setprop("/it-autoflight/mode/arm", " ");
-	if (getprop("/it-autoflight/settings/land-enable") == 1){
-	  alandt.start();
+	var signal = getprop("/instrumentation/nav/gs-needle-deflection-norm");
+	if (signal <= -0.000000001) {
+		setprop("/it-autoflight/output/appr-armed", 0);
+		setprop("/it-autoflight/output/vert", 2);
+		setprop("/it-autoflight/mode/vert", "G/S");
+		setprop("/it-autoflight/mode/arm", " ");
+		if (getprop("/it-autoflight/settings/land-enable") == 1){
+			alandt.start();
+		}
+		thrustmode();
+	} else {
+		return 0;
 	}
-	thrustmode();
-  } else {
-	return 0;
-  }
 }
 
 # Autoland Stage 1 Logic (Land)
 var aland = func {
-  var ap1 = getprop("/it-autoflight/output/ap1");
-  var ap2 = getprop("/it-autoflight/output/ap2");
-  if (getprop("/position/gear-agl-ft") <= 100) {
-    if (ap1 or ap2) {
-      setprop("/it-autoflight/input/lat", 4);
-      setprop("/it-autoflight/input/vert", 6);
-    } else {
-	  alandt.stop();
-	  alandt1.stop();
-    }
-  }
+	var ap1 = getprop("/it-autoflight/output/ap1");
+	var ap2 = getprop("/it-autoflight/output/ap2");
+	if (getprop("/position/gear-agl-ft") <= 100) {
+		if (ap1 or ap2) {
+			setprop("/it-autoflight/input/lat", 4);
+			setprop("/it-autoflight/input/vert", 6);
+		} else {
+			alandt.stop();
+			alandt1.stop();
+		}
+	}
 }
 
 var aland1 = func {
-  var aglal = getprop("/position/gear-agl-ft");
-  var flarealt = getprop("/it-autoflight/settings/flare-altitude");
-  if (aglal <= flarealt and aglal > 5) {
-	setprop("/it-autoflight/mode/vert", "FLARE");
-    setprop("/it-autoflight/autoland/target-vs", "-120");
-  }
-  if ((getprop("/it-autoflight/output/ap1") == 0) and (getprop("/it-autoflight/output/ap2") == 0)) {
-	alandt.stop();
-	alandt1.stop();
-    setprop("/it-autoflight/output/loc-armed", 0);
-    setprop("/it-autoflight/output/lat", 2);
-	setprop("/it-autoflight/mode/lat", "LOC");
-	setprop("/it-autoflight/output/appr-armed", 0);
-	setprop("/it-autoflight/output/vert", 2);
-	setprop("/it-autoflight/mode/vert", "G/S");
-	setprop("/it-autoflight/mode/arm", " ");
-  }
-  var gear1 = getprop("/gear/gear[1]/wow");
-  var gear2 = getprop("/gear/gear[2]/wow");
-  if (gear1 == 1 or gear2 == 1) {
-    setprop("/it-autoflight/input/ap1", 0);
-    setprop("/it-autoflight/input/ap2", 0);
-	alandt1.stop();
-  }
+	var aglal = getprop("/position/gear-agl-ft");
+	var flarealt = getprop("/it-autoflight/settings/flare-altitude");
+	if (aglal <= flarealt and aglal > 5) {
+		setprop("/it-autoflight/mode/vert", "FLARE");
+		setprop("/it-autoflight/autoland/target-vs", "-120");
+	}
+	if ((getprop("/it-autoflight/output/ap1") == 0) and (getprop("/it-autoflight/output/ap2") == 0)) {
+		alandt.stop();
+		alandt1.stop();
+		setprop("/it-autoflight/output/loc-armed", 0);
+		setprop("/it-autoflight/output/lat", 2);
+		setprop("/it-autoflight/mode/lat", "LOC");
+		setprop("/it-autoflight/output/appr-armed", 0);
+		setprop("/it-autoflight/output/vert", 2);
+		setprop("/it-autoflight/mode/vert", "G/S");
+		setprop("/it-autoflight/mode/arm", " ");
+	}
+	var gear1 = getprop("/gear/gear[1]/wow");
+	var gear2 = getprop("/gear/gear[2]/wow");
+	if (gear1 == 1 or gear2 == 1) {
+		setprop("/it-autoflight/input/ap1", 0);
+		setprop("/it-autoflight/input/ap2", 0);
+		alandt1.stop();
+	}
 }
 
 # Autoland Stage 2 Logic (Rollout)
 
-
 # CWS
 var cwsroll = func {
   var ail = getprop("/controls/flight/aileron");
@@ -598,15 +695,15 @@ var cwsroll = func {
 }
 
 var cwspitch = func {
-  var elv = getprop("/controls/flight/elevator");
-  if (elv < 0.05 and elv > -0.05) {
-	if (getprop("/it-autoflight/internal/cwsp") == 0) {
-	  setprop("/it-autoflight/internal/cws-pitch-deg", getprop("/orientation/pitch-deg"));
+	var elv = getprop("/controls/flight/elevator");
+	if (elv < 0.05 and elv > -0.05) {
+		if (getprop("/it-autoflight/internal/cwsp") == 0) {
+			setprop("/it-autoflight/internal/cws-pitch-deg", getprop("/orientation/pitch-deg"));
+		}
+		setprop("/it-autoflight/internal/cwsp", 1);
+	} else {
+		setprop("/it-autoflight/internal/cwsp", 0);
 	}
-	setprop("/it-autoflight/internal/cwsp", 1);
-  } else {
-	setprop("/it-autoflight/internal/cwsp", 0);
-  }
 }
 
 # Timers
@@ -619,3 +716,6 @@ var alandt = maketimer(0.5, aland);
 var alandt1 = maketimer(0.5, aland1);
 var cwsrollt = maketimer(0.1, cwsroll);
 var cwspitcht = maketimer(0.1, cwspitch);
+var reduct = maketimer(0.5, toga_reduc);
+var latarmt = maketimer(0.5, latarms);
+var fpa_calct = maketimer(0.1, fpa_calc);
diff --git a/Nasal/systems.nas b/Nasal/systems.nas
index d603b7d8..991b6fda 100644
--- a/Nasal/systems.nas
+++ b/Nasal/systems.nas
@@ -198,14 +198,6 @@ var aglgears = func {
 
 aglgears();
 
-setlistener("/instrumentation/altimeter/indicated-altitude-ft", func {
-	setprop("/instrumentation/altimeter/indicated-altitude-ft-pfd", getprop("/instrumentation/altimeter/indicated-altitude-ft") / 100);
-});
-
-setlistener("/instrumentation/vertical-speed-indicator/indicated-speed-fpm", func {
-	setprop("/instrumentation/vertical-speed-indicator/indicated-speed-fpm-pfd", getprop("/instrumentation/vertical-speed-indicator/indicated-speed-fpm") / 100);
-});
-
 setlistener("/controls/parking-brake", func {
 	if (getprop("/controls/parking-brake") == 1) {
 		setprop("/electrical/switches/ext-pwr", 1);
diff --git a/Systems/autopilot-dlg.xml b/Systems/autopilot-dlg.xml
index b5834ee0..4aa8ab7d 100644
--- a/Systems/autopilot-dlg.xml
+++ b/Systems/autopilot-dlg.xml
@@ -757,12 +757,6 @@
 			<button>
                 <pref-width>40</pref-width>
 				<legend>FPA</legend>
-				<enable>
-					<equals>
-						<property>/it-autoflight/settings/disabled-button</property>
-						<value>blahblahblahblah</value>
-					</equals>
-				</enable>
 				<binding>
 				<command>property-assign</command>
 				<property>/it-autoflight/input/vert</property>
@@ -787,7 +781,7 @@
 			<text>
 				<row>0</row>
 				<col>0</col>
-				<label>ALT:</label>
+				<label>ALT: </label>
 			</text>
 			
 			<button>
@@ -871,7 +865,7 @@
 			<text>
 				<row>0</row>
 				<col>0</col>
-				<label>V/S:</label>
+				<label>V/S: </label>
 			</text>
 			
 			<button>
@@ -949,6 +943,90 @@
 			</button>
 		</group>
 		
+		<group>
+			<layout>table</layout>
+			
+			<text>
+				<row>0</row>
+				<col>0</col>
+				<label>FPA:</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>/it-autoflight/input/fpa</property>
+					<min>-9.9</min>
+					<max>9.9</max>
+					<step>-1</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>/it-autoflight/input/fpa</property>
+					<min>-9.9</min>
+					<max>9.9</max>
+					<step>-0.1</step>
+					<wrap>false</wrap>
+				</binding>
+			</button>
+
+			<input>
+				<row>0</row>
+				<col>3</col>
+                <pref-width>55</pref-width>
+				<property>/it-autoflight/input/fpa</property>
+				<live type="bool">true</live>
+				<binding>
+					<command>dialog-apply</command>
+				</binding>
+			</input>
+			
+			<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>/it-autoflight/input/fpa</property>
+					<min>-9.9</min>
+					<max>9.9</max>
+					<step>0.1</step>
+					<wrap>false</wrap>
+				</binding>
+			</button>
+			<button>
+				<row>0</row>
+				<col>5</col>
+				<halign>left</halign>
+                <pref-width>25</pref-width>
+                <pref-height>25</pref-height>
+				<legend>&gt;&gt;</legend>
+				<binding>
+					<command>property-adjust</command>
+					<property>/it-autoflight/input/fpa</property>
+					<min>-9.9</min>
+					<max>9.9</max>
+					<step>1</step>
+					<wrap>false</wrap>
+				</binding>
+			</button>
+		</group>
+		
 	</group>
 
 </PropertyList>
diff --git a/Systems/engine-timing.xml b/Systems/engine-timing.xml
index b7999f9d..d4828f52 100644
--- a/Systems/engine-timing.xml
+++ b/Systems/engine-timing.xml
@@ -115,5 +115,37 @@
         </input>
 		<output>/engines/engine[1]/fuel-flow_actual</output>
     </filter>
+	
+    <filter>
+        <name>Altitude PFD</name>
+        <type>gain</type>
+        <gain>1</gain>
+        <update-interval-secs type="double">0.05</update-interval-secs>
+        <input> 
+            <expression>
+                <div>
+                    <property>/instrumentation/altimeter/indicated-altitude-ft</property> 
+					<value>100</value>
+                </div>
+            </expression>
+        </input>
+		<output>/instrumentation/altimeter/indicated-altitude-ft-pfd</output>
+    </filter>
+	
+	<filter>
+        <name>V/S PFD</name>
+        <type>gain</type>
+        <gain>1</gain>
+        <update-interval-secs type="double">0.05</update-interval-secs>
+        <input> 
+            <expression>
+                <div>
+                    <property>/instrumentation/vertical-speed-indicator/indicated-speed-fpm</property> 
+					<value>100</value>
+                </div>
+            </expression>
+        </input>
+		<output>/instrumentation/vertical-speed-indicator/indicated-speed-fpm-pfd</output>
+    </filter>
 
 </PropertyList>
diff --git a/Systems/it-autoflight.xml b/Systems/it-autoflight.xml
index 81a1778f..16021bf0 100644
--- a/Systems/it-autoflight.xml
+++ b/Systems/it-autoflight.xml
@@ -77,7 +77,6 @@
     </period>
     <gain>1.0</gain>
   </filter>
-  
 
   <filter>
     <name>LNAV HDG ERROR DEG</name>
@@ -550,6 +549,44 @@
 		</config>
 	</pid-controller>
 	
+	<pid-controller>
+		<name>FPA HOLD</name>
+		<debug>false</debug>
+		<enable>
+			<condition>
+				<equals>
+					<property>/it-autoflight/output/vert</property>
+					<value>5</value>
+				</equals>
+			</condition>
+		</enable>
+		<input>
+			<property>/it-autoflight/internal/fpa</property>
+		</input>
+		<reference>
+			<property>/it-autoflight/input/fpa</property>
+		</reference>
+		<output>
+			<property>/it-autoflight/internal/target-pitch-deg</property>
+		</output>
+		<config>
+			<Kp>
+				<property>/it-autoflight/config/cmd/fpa</property>
+			</Kp>
+			<beta>1.0</beta>
+			<alpha>0.1</alpha>
+			<gamma>0.0</gamma>
+			<Ti>1.0</Ti>
+			<Td>0.00001</Td>
+			<u_min>
+				<value>-10</value>
+			</u_min>
+			<u_max>
+				<value>30</value>
+			</u_max>
+		</config>
+	</pid-controller>
+	
 	<pi-simple-controller>
 		<name>AUTOLAND VS HOLD</name>
 		<debug>false</debug>
@@ -726,6 +763,61 @@
             </u_max>
 		</config>
 	</pid-controller>
+	
+	<pid-controller>
+		<name>TOGA SPEED BY PITCH</name>
+		<debug>false</debug>
+		<enable>
+			<condition>
+				<or>
+					<equals>
+						<property>/it-autoflight/output/vert</property>
+						<value>7</value>
+					</equals>
+				</or>
+			</condition>
+		</enable>
+		<input>
+			<property>/it-autoflight/internal/lookahead-10-sec-airspeed-kt</property>
+		</input>
+		<reference>
+			<condition>
+				<equals>
+					<property>/it-autoflight/mode/vert</property>
+					<value>T/O CLB</value>
+				</equals>
+			</condition>
+			<property>/it-autoflight/settings/togaspd</property>
+		</reference>
+		<reference>
+			<condition>
+				<equals>
+					<property>/it-autoflight/mode/vert</property>
+					<value>G/A CLB</value>
+				</equals>
+			</condition>
+			<property>/it-autoflight/input/spd-kts</property>
+		</reference>
+		<output>
+			<property>/it-autoflight/internal/target-pitch-deg</property>
+		</output>
+		<config>
+			<Kp>
+				<property>/it-autoflight/config/cmd/flch</property>
+			</Kp>
+			<beta>1.0</beta>    
+			<alpha>0.1</alpha>  
+			<gamma>0.0</gamma>  
+			<Ti>10.0</Ti>        
+			<Td>0.00001</Td>    
+            <u_min>
+                <value>1.5</value>
+            </u_min>
+            <u_max>
+                <value>25.0</value>
+            </u_max>
+		</config>
+	</pid-controller>
 
 	<pid-controller>
 		<name>IT-CONTROLLER: PITCH</name>
@@ -748,23 +840,8 @@
 			<property>/orientation/pitch-deg</property>
 		</input>
 		<reference>
-			<condition>
-				<not-equals>
-					<property>/it-autoflight/output/vert</property>
-					<value>7</value>
-				</not-equals>
-			</condition>
 			<property>/it-autoflight/internal/target-pitch-deg</property>
 		</reference>
-		<reference>
-			<condition>
-				<equals>
-					<property>/it-autoflight/output/vert</property>
-					<value>7</value>
-				</equals>
-			</condition>
-			<property>/it-autoflight/settings/toga-pitch</property>
-		</reference>
 		<output>
 			<property>/it-autoflight/internal/elevator-cmd</property>
 		</output>
@@ -1198,12 +1275,6 @@
 		<type>gain</type>
 		<gain>1.0</gain>
 		<input>
-			<condition>
-				<not-equals>
-					<property>/it-autoflight/output/vert</property>
-					<value>7</value>
-				</not-equals>
-			</condition>
 			<expression>
 				<dif>
 					<property>/it-autoflight/internal/target-pitch-deg</property>
@@ -1211,20 +1282,6 @@
 				</dif>
 			</expression>
 		</input>
-		<input>
-			<condition>
-				<equals>
-					<property>/it-autoflight/output/vert</property>
-					<value>7</value>
-				</equals>
-			</condition>
-			<expression>
-				<dif>
-					<property>/it-autoflight/settings/toga-pitch</property>
-					<property>/orientation/pitch-deg</property>
-				</dif>
-			</expression>
-		</input>
 		<output>/it-autoflight/fd/pitch-bar</output>
 	</filter>