diff --git a/Aircraft/Instruments-3d/cdu/boeing.nas b/Aircraft/Instruments-3d/cdu/boeing.nas
index 511a49c67..4cfb6884c 100644
--- a/Aircraft/Instruments-3d/cdu/boeing.nas
+++ b/Aircraft/Instruments-3d/cdu/boeing.nas
@@ -103,13 +103,16 @@ var key = func(v) {
 				if (cduDisplay == "DEP_ARR_INDEX"){
 					cduDisplay = "RTE1_ARR";
 				}
-				if (cduDisplay == "EICAS_MODES"){
+				else if (cduDisplay == "EICAS_MODES"){
 					eicasDisplay = "GEAR";
 				}
-				if (cduDisplay == "EICAS_SYN"){
+				else if (cduDisplay == "EICAS_SYN"){
 					eicasDisplay = "DRS";
 				}
-				if (cduDisplay == "RTE1_LEGS"){
+				else if (cduDisplay == "MENU"){
+					eicasDisplay = "EICAS_MODES";
+				}
+				else if (cduDisplay == "RTE1_LEGS"){
 					setprop("/autopilot/route-manager/route/wp[2]/altitude-ft",cduInput);
 					if (substr(cduInput,0,2) == "FL"){
 						setprop("/autopilot/route-manager/route/wp[2]/altitude-ft",substr(cduInput,2)*100);
@@ -193,7 +196,7 @@ var key = func(v) {
 				if (cduDisplay == "APP_REF"){
 					cduDisplay = "INIT_REF";
 				}
-				if ((cduDisplay == "IDENT") or (cduDisplay = "PERF_INIT") or (cduDisplay = "POS_INIT") or (cduDisplay = "POS_REF") or (cduDisplay = "THR_LIM") or (cduDisplay = "TO_REF")){
+				if ((cduDisplay == "IDENT") or (cduDisplay = "MAINT") or (cduDisplay = "PERF_INIT") or (cduDisplay = "POS_INIT") or (cduDisplay = "POS_REF") or (cduDisplay = "THR_LIM") or (cduDisplay = "TO_REF")){
 					cduDisplay = "INIT_REF";
 				}
 			}
@@ -201,24 +204,27 @@ var key = func(v) {
 				if (cduDisplay == "THR_LIM"){
 					cduDisplay = "TO_REF";
 				}
-				if (cduDisplay == "APP_REF"){
+				else if (cduDisplay == "APP_REF"){
 					cduDisplay = "THR_LIM";
 				}
-				if ((cduDisplay == "RTE1_1") or (cduDisplay == "RTE1_LEGS")){
+				else if ((cduDisplay == "RTE1_1") or (cduDisplay == "RTE1_LEGS")){
 					setprop("/autopilot/route-manager/input","@ACTIVATE");
 				}
-				if ((cduDisplay == "POS_INIT") or (cduDisplay == "DEP") or (cduDisplay == "RTE1_ARR") or (cduDisplay == "RTE1_DEP")){
+				else if ((cduDisplay == "POS_INIT") or (cduDisplay == "DEP") or (cduDisplay == "RTE1_ARR") or (cduDisplay == "RTE1_DEP")){
 					cduDisplay = "RTE1_1";
 				}
-				if ((cduDisplay == "IDENT") or (cduDisplay == "TO_REF")){
+				else if ((cduDisplay == "IDENT") or (cduDisplay == "TO_REF")){
 					cduDisplay = "POS_INIT";
 				}
-				if (cduDisplay == "EICAS_SYN"){
+				else if (cduDisplay == "EICAS_SYN"){
 					cduDisplay = "EICAS_MODES";
 				}
-				if (cduDisplay == "EICAS_MODES"){
+				else if (cduDisplay == "EICAS_MODES"){
 					cduDisplay = "EICAS_SYN";
 				}
+				else if (cduDisplay == "INIT_REF"){
+					cduDisplay = "MAINT";
+				}
 			}
 			
 			setprop("/instrumentation/cdu/display",cduDisplay);
@@ -268,8 +274,10 @@ var cdu = func{
 		if (display == "MENU") {
 			title = "MENU";
 			line1l = "<FMC";
+			line1rt = "EFIS CP";
 			line1r = "SELECT>";
 			line2l = "<ACARS";
+			line2rt = "EICAS CP";
 			line2r = "SELECT>";
 			line6l = "<ACMS";
 			line6r = "CMC>";
@@ -364,6 +372,14 @@ var cdu = func{
 			line6l = "<APPROACH";
 			line6r = "MAINT>";
 		}
+		if (display == "MAINT") {
+			title = "MAINTENANCE INDEX";
+			line1l = "<CROS LOAD";
+			line1r = "BITE>";
+			line2l = "<PERF FACTORS";
+			line3l = "<IRS MONITOR";
+			line6l = "<INDEX";
+		}
 		if (display == "NAV_RAD") {
 			title = "NAV RADIO";
 			line1lt = "VOR L";
@@ -446,10 +462,10 @@ var cdu = func{
 			line5l = "<RTE COPY";
 			line6l = "<RTE 2";
 			if (getprop("/autopilot/route-manager/active") == 1){
-				line6r = "ACTIVATE>";
+				line6r = "PERF INIT>";
 				}
 			else {
-				line6r = "PERF INIT>";
+				line6r = "ACTIVATE>";
 				}
 		}
 		if (display == "RTE1_2") {
diff --git a/Aircraft/Instruments-3d/radar2/radar2.nas b/Aircraft/Instruments-3d/radar2/radar2.nas
index e2c772f98..0ae530ad2 100644
--- a/Aircraft/Instruments-3d/radar2/radar2.nas
+++ b/Aircraft/Instruments-3d/radar2/radar2.nas
@@ -555,8 +555,15 @@ var Target = {
 	get_closure_rate : func() {
 		var dt = ElapsedSec.getValue() - me.TimeLast.getValue();
 		var rng = me.Range.getValue();
-		var t_distance = me.RangeLast.getValue() - rng;
-		var cr = t_distance/dt*3600;
+		var lrng = me.RangeLast.getValue();
+		if ( debug.isnan(rng) or debug.isnan(lrng)) {
+			print("####### get_closure_rate(): rng or lrng = nan ########");
+			me.ClosureRate.setValue(0);
+			me.RangeLast.setValue(0);
+			return(0);
+		}
+		var t_distance = lrng - rng;
+		var	cr = (dt > 0) ? t_distance/dt*3600 : 0;
 		me.ClosureRate.setValue(cr);
 		me.RangeLast.setValue(rng);
 		return(cr);
diff --git a/Aircraft/c172p/Engines/eng_io320.xml b/Aircraft/c172p/Engines/eng_io320.xml
index 22c1be211..b7cc52706 100644
--- a/Aircraft/c172p/Engines/eng_io320.xml
+++ b/Aircraft/c172p/Engines/eng_io320.xml
@@ -12,13 +12,13 @@
 -->
 
 <piston_engine name="IO320">
-  <minmp unit="INHG">         6.5  </minmp>	<!-- Deprecated -->
+  <minmp unit="INHG">         8.3  </minmp>	<!-- Deprecated -->
   <maxmp unit="INHG">        28.5  </maxmp>	
   <displacement unit="IN3"> 320.0  </displacement>
   <maxhp>                   160.0  </maxhp>	
   <!-- bsfc>                      0.37 </bsfc -->
   <cycles>                    4.0  </cycles>
-  <idlerpm>                 550.0  </idlerpm>
+  <idlerpm>                 600.0  </idlerpm>
   <maxrpm>                 2700.0  </maxrpm>
   <maxthrottle>               1.0  </maxthrottle>
   <minthrottle>               0.1  </minthrottle>
diff --git a/Aircraft/c172p/Models/GearScissorInterpolation.xml b/Aircraft/c172p/Models/GearScissorInterpolation.xml
new file mode 100644
index 000000000..239776a14
--- /dev/null
+++ b/Aircraft/c172p/Models/GearScissorInterpolation.xml
@@ -0,0 +1,87 @@
+<PropertyList>
+<entry>
+<ind>0.000</ind>
+<dep>0.000</dep>
+</entry>
+<entry>
+<ind>0.050</ind>
+<dep>2.799</dep>
+</entry>
+<entry>
+<ind>0.100</ind>
+<dep>5.504</dep>
+</entry>
+<entry>
+<ind>0.150</ind>
+<dep>8.130</dep>
+</entry>
+<entry>
+<ind>0.200</ind>
+<dep>10.688</dep>
+</entry>
+<entry>
+<ind>0.250</ind>
+<dep>13.187</dep>
+</entry>
+<entry>
+<ind>0.300</ind>
+<dep>15.637</dep>
+</entry>
+<entry>
+<ind>0.350</ind>
+<dep>18.044</dep>
+</entry>
+<entry>
+<ind>0.400</ind>
+<dep>20.415</dep>
+</entry>
+<entry>
+<ind>0.450</ind>
+<dep>22.755</dep>
+</entry>
+<entry>
+<ind>0.500</ind>
+<dep>25.068</dep>
+</entry>
+<entry>
+<ind>0.550</ind>
+<dep>27.360</dep>
+</entry>
+<entry>
+<ind>0.600</ind>
+<dep>29.635</dep>
+</entry>
+<entry>
+<ind>0.650</ind>
+<dep>31.896</dep>
+</entry>
+<entry>
+<ind>0.700</ind>
+<dep>34.147</dep>
+</entry>
+<entry>
+<ind>0.750</ind>
+<dep>36.393</dep>
+</entry>
+<entry>
+<ind>0.800</ind>
+<dep>38.635</dep>
+</entry>
+<entry>
+<ind>0.850</ind>
+<dep>40.878</dep>
+</entry>
+<entry>
+<ind>0.900</ind>
+<dep>43.126</dep>
+</entry>
+<entry>
+<ind>0.950</ind>
+<dep>45.381</dep>
+</entry>
+<entry>
+<ind>1.000</ind>
+<dep>47.647</dep>
+</entry>
+</PropertyList>
+
diff --git a/Aircraft/c172p/Models/MainRotationInterpolation.xml b/Aircraft/c172p/Models/MainRotationInterpolation.xml
new file mode 100644
index 000000000..58a28e886
--- /dev/null
+++ b/Aircraft/c172p/Models/MainRotationInterpolation.xml
@@ -0,0 +1,87 @@
+<?xml version = '1.0' encoding = 'UTF-8' ?>
+<PropertyList>
+<entry>
+<ind>0.000</ind>
+<dep>0.000</dep>
+</entry>
+<entry>
+<ind>0.050</ind>
+<dep>1.305</dep>
+</entry>
+<entry>
+<ind>0.100</ind>
+<dep>2.583</dep>
+</entry>
+<entry>
+<ind>0.150</ind>
+<dep>3.836</dep>
+</entry>
+<entry>
+<ind>0.200</ind>
+<dep>5.067</dep>
+</entry>
+<entry>
+<ind>0.250</ind>
+<dep>6.276</dep>
+</entry>
+<entry>
+<ind>0.300</ind>
+<dep>7.467</dep>
+</entry>
+<entry>
+<ind>0.350</ind>
+<dep>8.639</dep>
+</entry>
+<entry>
+<ind>0.400</ind>
+<dep>9.794</dep>
+</entry>
+<entry>
+<ind>0.450</ind>
+<dep>10.934</dep>
+</entry>
+<entry>
+<ind>0.500</ind>
+<dep>12.059</dep>
+</entry>
+<entry>
+<ind>0.550</ind>
+<dep>13.171</dep>
+</entry>
+<entry>
+<ind>0.600</ind>
+<dep>14.270</dep>
+</entry>
+<entry>
+<ind>0.650</ind>
+<dep>15.357</dep>
+</entry>
+<entry>
+<ind>0.700</ind>
+<dep>16.433</dep>
+</entry>
+<entry>
+<ind>0.750</ind>
+<dep>17.498</dep>
+</entry>
+<entry>
+<ind>0.800</ind>
+<dep>18.554</dep>
+</entry>
+<entry>
+<ind>0.850</ind>
+<dep>19.601</dep>
+</entry>
+<entry>
+<ind>0.900</ind>
+<dep>20.639</dep>
+</entry>
+<entry>
+<ind>0.950</ind>
+<dep>21.668</dep>
+</entry>
+<entry>
+<ind>1.000</ind>
+<dep>22.691</dep>
+</entry>
+</PropertyList>
diff --git a/Aircraft/c172p/Models/c172p.xml b/Aircraft/c172p/Models/c172p.xml
index 1cf1c4bb8..678574c5d 100644
--- a/Aircraft/c172p/Models/c172p.xml
+++ b/Aircraft/c172p/Models/c172p.xml
@@ -2286,8 +2286,7 @@
  <animation>
    <type>rotate</type>
    <object-name>TopLink</object-name>
-   <property>gear/gear[0]/compression-rotation-deg</property>
-   <factor>-1</factor>
+   <property>gear/gear[0]/compression-norm</property>
    <center>
      <x-m>-0.95412</x-m>
      <y-m>0.0</y-m>
@@ -2295,16 +2294,16 @@
    </center>
    <axis>
      <x>0.0</x>
-     <y>1.0</y>
+     <y>-1.0</y>
      <z>0.0</z>
    </axis>
+   <interpolation include="GearScissorInterpolation.xml"/>
  </animation>
 
  <animation>
    <type>rotate</type>
    <object-name>BottomLink</object-name>
-   <property>gear/gear[0]/compression-rotation-deg</property>
-   <factor>1</factor>
+   <property>gear/gear[0]/compression-norm</property>
    <center>
      <x-m>-1.02349</x-m>
      <y-m>0.0</y-m>
@@ -2315,6 +2314,7 @@
      <y>1.0</y>
      <z>0.0</z>
    </axis>
+   <interpolation include="GearScissorInterpolation.xml"/>
  </animation>
 
  <animation>
@@ -2322,8 +2322,7 @@
    <object-name>fairing3</object-name>
    <object-name>RightWheelStrut</object-name>
    <object-name>RightWheel</object-name>
-   <property>gear/gear[2]/compression-rotation-deg</property>
-   <factor>1.0</factor>
+   <property>gear/gear[2]/compression-norm</property>
    <center>
      <x-m>0.711</x-m>
      <y-m>0.4518</y-m>
@@ -2334,6 +2333,7 @@
      <y>0.0</y>
      <z>0.0</z>
    </axis>
+   <interpolation include="MainRotationInterpolation.xml"/>
  </animation>
 
  <animation>
@@ -2341,18 +2341,18 @@
    <object-name>fairing2</object-name>
    <object-name>LeftWheelStrut</object-name>
    <object-name>LeftWheel</object-name>
-   <property>gear/gear[1]/compression-rotation-deg</property>
-   <factor>-1.0</factor>
+   <property>gear/gear[1]/compression-norm</property>
    <center>
      <x-m>0.711</x-m>
      <y-m>-0.4518</y-m>
      <z-m>-0.70</z-m>
    </center>
    <axis>
-     <x>1.0</x>
+     <x>-1.0</x>
      <y>0.0</y>
      <z>0.0</z>
    </axis>
+   <interpolation include="MainRotationInterpolation.xml"/>
  </animation>
 
  <!--Lights-->
diff --git a/Aircraft/c172p/Nasal/action-sim.nas b/Aircraft/c172p/Nasal/action-sim.nas
deleted file mode 100644
index 8c514b148..000000000
--- a/Aircraft/c172p/Nasal/action-sim.nas
+++ /dev/null
@@ -1,137 +0,0 @@
-##
-#  action-sim.nas   Updates various simulated features every frame
-##
-
-#   Initialize local variables
-var H = nil;
-var L = nil;
-var phi = nil;
-var C = nil;
-
-# set up filters for these actions
-
-var cdi0_lowpass = aircraft.lowpass.new(0.5);
-var cdi1_lowpass = aircraft.lowpass.new(0.5);
-var gs0_lowpass = aircraft.lowpass.new(0.5);
-var gs1_lowpass = aircraft.lowpass.new(0.5);
-
-# Properties
-
-var propNav0 = props.globals.getNode("instrumentation/nav[0]", 1);
-var propNav1 = props.globals.getNode("instrumentation/nav[1]", 1);
-var navLights = props.globals.getNode("controls/lighting/nav-lights", 1);
-var instrumentsNorm = props.globals.getNode("controls/lighting/instruments-norm", 1);
-var instrumentLightFactor = props.globals.getNode("sim/model/material/instruments/factor", 1);
-var panelLights = props.globals.getNode("controls/lighting/panel-norm", 1);
-var dhN_ft = props.globals.getNode("gear/gear[0]/compression-ft", 1);
-var dhR_ft = props.globals.getNode("gear/gear[2]/compression-ft", 1);
-var dhL_ft = props.globals.getNode("gear/gear[1]/compression-ft", 1);
-var propGear0 = props.globals.getNode("gear/gear[0]", 1);
-var propGear1 = props.globals.getNode("gear/gear[1]", 1);
-var propGear2 = props.globals.getNode("gear/gear[2]", 1);
-
-# Associate Nodes
-
-var cdiNAV0 = propNav0.getNode("heading-needle-deflection", 1);
-var cdiNAV1 = propNav1.getNode("heading-needle-deflection", 1);
-var gsNAV0  = propNav0.getNode("gs-needle-deflection-norm", 1);
-var gsNAV1  = propNav1.getNode("gs-needle-deflection-norm", 1);
-var filteredCDI0 = propNav0.getNode("filtered-cdiNAV0-deflection", 1);
-var filteredCDI1 = propNav1.getNode("filtered-cdiNAV1-deflection", 1);
-var filteredGS0  = propNav0.getNode("filtered-gsNAV0-deflection", 1);
-var filteredGS1  = propNav1.getNode("filtered-gsNAV1-deflection", 1);
-var nose_link_rot = propGear0.getNode("compression-rotation-deg", 1);
-var left_main_rot = propGear1.getNode("compression-rotation-deg", 1);
-var right_main_rot = propGear2.getNode("compression-rotation-deg", 1);
-
-var init_actions = func {
-    filteredCDI0.setDoubleValue(0.0);
-    filteredCDI1.setDoubleValue(0.0);
-    filteredGS0.setDoubleValue(0.0);
-    filteredGS1.setDoubleValue(0.0);
-
-    # Make sure that init_actions is called when the sim is reset
-    setlistener("sim/signals/reset", init_actions);
-
-    # Request that the update fuction be called next frame
-    settimer(update_actions, 0);
-}
-
-
-var update_actions = func {
-
-#  Note:  R2D and FT2M  are unit conversion factors defined in $FG_ROOT/Nasal/globals.nas
-#         R2D (radians to degrees) FT2M (feet to meters)
-
-##
-#  Compute the scissor link angles due to nose strut compression
-##
-
-    var theta = 0.0;
-
-    # Compute the angle the nose gear scissor rotates due to nose gear strut compression
-
-    H = 0.240626;  # Nose gear oleo strut extended length in m
-    L = 0.194716;  # Nose gear scissor length in m
-    phi = 0.666058;
-    C = dhN_ft.getValue()*FT2M;
-    if (C > 0.0) {
-      theta = scissor_angle(H,C,L,phi)*R2D;
-    }
-
-#  Compute compression induced main gear rotations
-#
-#  constants
-   var R_m = 0.919679;
-   var h0 = 0.63872;
-   var theta0_rad = 0.803068;
-
-#  Right main
-   var delta_h = dhR_ft.getValue()*FT2M;
-   var right_alpha_deg = ( math.acos( (h0 - delta_h)/R_m ) - theta0_rad )*R2D;
-
-
-#  Left main
-   var delta_h = dhL_ft.getValue()*FT2M;
-   var left_alpha_deg = ( math.acos( (h0 - delta_h)/R_m ) - theta0_rad )*R2D;
-
-# Outputs
-    instrumentLightFactor.setDoubleValue(instrumentsNorm.getValue());
-    panelLights.setDoubleValue(instrumentsNorm.getValue());
-
-    filteredCDI0.setDoubleValue( cdi0_lowpass.filter(cdiNAV0.getValue()));
-    filteredCDI1.setDoubleValue(cdi1_lowpass.filter(cdiNAV1.getValue()));
-    filteredGS0.setDoubleValue(gs0_lowpass.filter(gsNAV0.getValue()));
-    filteredGS1.setDoubleValue(gs1_lowpass.filter(gsNAV1.getValue()));
-    nose_link_rot.setDoubleValue(theta);
-    right_main_rot.setDoubleValue(right_alpha_deg);
-    left_main_rot.setDoubleValue(left_alpha_deg);
-
-    settimer(update_actions, 0);
-}
-
-
-var scissor_angle = func(H,C,L,phi) {
-    var a = (H - C)/2/L;
-    # Use 2 iterates of Newton's method and 4th order Taylor series to
-    # approximate theta where sin(phi - theta) = a
-    var theta = phi - 2*a/3 - a/3/(1-a*a/2);
-    return theta;
-}
-
-# Setup listener call to start update loop once the fdm is initialized
-#
-setlistener("sim/signals/fdm-initialized", init_actions);
-
-#
-# Listeners to tie the /consumables/fuels/tank[]/selected to
-# /fdm/jsbsim/propulsion/tank[]/priority
-
-setlistener("consumables/fuel/tank[0]/selected", func(selected) {
-  setprop("/fdm/jsbsim/propulsion/tank[0]/priority", selected.getBoolValue() ? 1 : 0);
-});
-
-setlistener("consumables/fuel/tank[1]/selected", func(selected) {
-  setprop("/fdm/jsbsim/propulsion/tank[1]/priority", selected.getBoolValue() ? 1 : 0);
-});
-
diff --git a/Aircraft/c172p/Nasal/light.nas b/Aircraft/c172p/Nasal/light.nas
index d86541d3b..16f59780f 100644
--- a/Aircraft/c172p/Nasal/light.nas
+++ b/Aircraft/c172p/Nasal/light.nas
@@ -5,4 +5,26 @@ aircraft.light.new("sim/model/c172p/lighting/strobes", [0.015, 1.985], strobe_sw
 
 # beacons ===========================================================
 var beacon_switch = props.globals.getNode("controls/lighting/beacon", 1);
-aircraft.light.new("sim/model/c172p/lighting/beacon-top", [0.10, 0.90], beacon_switch);
\ No newline at end of file
+aircraft.light.new("sim/model/c172p/lighting/beacon-top", [0.10, 0.90], beacon_switch);
+
+# Control both panel and instrument light intensity with one property
+
+var instrumentsNorm = props.globals.getNode("controls/lighting/instruments-norm", 1);
+var instrumentLightFactor = props.globals.getNode("sim/model/material/instruments/factor", 1);
+var panelLights = props.globals.getNode("controls/lighting/panel-norm", 1);
+
+var update_intensity = func {
+
+    instrumentLightFactor.setDoubleValue(instrumentsNorm.getValue());
+    panelLights.setDoubleValue(instrumentsNorm.getValue());
+
+    settimer(update_intensity, 0);
+}
+
+# Setup listener call to start update loop once the fdm is initialized
+#
+setlistener("sim/signals/fdm-initialized", update_intensity);
+
+# Make sure that update_intensity is called when the sim is reset
+setlistener("sim/signals/reset", update_intensity);
+
diff --git a/Aircraft/c172p/Nasal/tanks.nas b/Aircraft/c172p/Nasal/tanks.nas
new file mode 100644
index 000000000..998ef6081
--- /dev/null
+++ b/Aircraft/c172p/Nasal/tanks.nas
@@ -0,0 +1,12 @@
+#
+# Listeners to tie the /consumables/fuels/tank[]/selected to
+# /fdm/jsbsim/propulsion/tank[]/priority
+
+setlistener("consumables/fuel/tank[0]/selected", func(selected) {
+  setprop("/fdm/jsbsim/propulsion/tank[0]/priority", selected.getBoolValue() ? 1 : 0);
+});
+
+setlistener("consumables/fuel/tank[1]/selected", func(selected) {
+  setprop("/fdm/jsbsim/propulsion/tank[1]/priority", selected.getBoolValue() ? 1 : 0);
+});
+
diff --git a/Aircraft/c172p/Systems/NAVandGSfilters.xml b/Aircraft/c172p/Systems/NAVandGSfilters.xml
new file mode 100644
index 000000000..cbb83b0e0
--- /dev/null
+++ b/Aircraft/c172p/Systems/NAVandGSfilters.xml
@@ -0,0 +1,41 @@
+<?xml version = '1.0' encoding = 'UTF-8' ?>
+<PropertyList>
+
+  <filter>
+    <name>CDI0 lowpass</name>
+    <debug>false</debug>
+    <type>exponential</type>
+    <filter-time>2.0</filter-time>
+    <input>instrumentation/nav[0]/heading-needle-deflection</input>
+    <output>instrumentation/nav[0]/filtered-cdiNAV0-deflection</output>
+  </filter>
+
+  <filter>
+    <name>CDI1 lowpass</name>
+    <debug>false</debug>
+    <type>exponential</type>
+    <filter-time>2.0</filter-time>
+    <input>instrumentation/nav[1]/heading-needle-deflection</input>
+    <output>instrumentation/nav[1]/filtered-cdiNAV1-deflection</output>
+  </filter>
+
+  <filter>
+    <name>GS0 lowpass</name>
+    <debug>false</debug>
+    <type>exponential</type>
+    <filter-time>2.0</filter-time>
+    <input>instrumentation/nav[0]/gs-needle-deflection-norm</input>
+    <output>instrumentation/nav[0]/filtered-gsNAV0-deflection</output>
+  </filter>
+
+  <filter>
+    <name>GS1 lowpass</name>
+    <debug>false</debug>
+    <type>exponential</type>
+    <filter-time>2.0</filter-time>
+    <input>instrumentation/nav[1]/gs-needle-deflection-norm</input>
+    <output>instrumentation/nav[1]/filtered-gsNAV1-deflection</output>
+  </filter>
+
+</PropertyList>
+
diff --git a/Aircraft/c172p/c172p-set.xml b/Aircraft/c172p/c172p-set.xml
index 74970a5d4..6974923fc 100644
--- a/Aircraft/c172p/c172p-set.xml
+++ b/Aircraft/c172p/c172p-set.xml
@@ -68,9 +68,17 @@ Started October 23 2001 by John Check, fgpanels@rockfish.net
   </view>
 
   <systems>
+    <autopilot>
+      <name>autopilot helpers</name>
+      <path>Aircraft/Generic/generic-autopilot-helper.xml</path>
+    </autopilot>
     <autopilot>
       <path>Aircraft/c172p/Systems/KAP140.xml</path>
     </autopilot>
+    <autopilot>
+      <name>FiltersOnly</name>
+      <path>Aircraft/c172p/Systems/NAVandGSfilters.xml</path>
+    </autopilot>
     <electrical>
       <!-- null electrical system path here so we can use a nasal based -->
       <!-- model defined later in the nasal section of this file. -->
@@ -169,7 +177,7 @@ Started October 23 2001 by John Check, fgpanels@rockfish.net
       <file>Aircraft/c172p/Nasal/immat.nas</file>
       <file>Aircraft/c172p/Nasal/doors.nas</file>
       <file>Aircraft/c172p/Nasal/light.nas</file>
-      <file>Aircraft/c172p/Nasal/action-sim.nas</file>
+      <file>Aircraft/c172p/Nasal/tanks.nas</file>
       <file>Aircraft/c172p/Nasal/ki266.nas</file>
       <script><![CDATA[
         ki266.new(0);
diff --git a/Aircraft/c172p/initfile.xml b/Aircraft/c172p/initfile.xml
deleted file mode 100644
index f5d6226ce..000000000
--- a/Aircraft/c172p/initfile.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0"?>
-<initialize name="reset00">
-  <ubody unit="FT/SEC"> 3.76751 </ubody> 
-  <vbody unit="FT/SEC"> 149.591 </vbody> 
-  <wbody unit="FT/SEC"> -216.892 </wbody> 
-  <phi unit="DEG"> -1.56812 </phi>
-  <theta unit="DEG"> -0.24805 </theta>
-  <psi unit="DEG"> 3.50617 </psi>
-  <longitude unit="DEG"> 0 </longitude>
-  <latitude unit="DEG"> 0 </latitude>
-  <altitude unit="FT"> 1170.89 </altitude>
-</initialize>
diff --git a/Effects/lightmap.eff b/Effects/lightmap.eff
index d0fa581f9..cc0cd277b 100644
--- a/Effects/lightmap.eff
+++ b/Effects/lightmap.eff
@@ -9,6 +9,7 @@
     <material>
       <color-mode-uniform>1</color-mode-uniform> <!-- DIFFUSE -->
     </material>
+	<condition><use>/sim/rendering/shader-effects</use></condition>
   </parameters>
   <technique n="10">
     <predicate>
@@ -97,6 +98,11 @@
         <name>colorMode</name>
         <type>int</type>
         <value><use>material/color-mode-uniform</use></value>
+      </uniform>
+	  <uniform>
+        <name>condition</name>
+        <type>float</type>
+        <value><use>condition</use></value>
       </uniform>
     </pass>
   </technique>
diff --git a/Effects/reflect.eff b/Effects/reflect.eff
index 09519caae..0f2cde7bc 100644
--- a/Effects/reflect.eff
+++ b/Effects/reflect.eff
@@ -251,7 +251,7 @@ EXAMPLES: You can find examples of both usages in the Hunter and Lightning model
 					<use>texture[8]/wrap-t</use>
 				</wrap-t>
 				<internal-format>
-					<use>texture[0]/internal-format</use>
+					<use>texture[8]/internal-format</use>
 				</internal-format>
 			</texture-unit>
 
diff --git a/Input/Joysticks/Saitek/Aviator.xml b/Input/Joysticks/Saitek/Aviator.xml
index 421b09004..15faa4d26 100644
--- a/Input/Joysticks/Saitek/Aviator.xml
+++ b/Input/Joysticks/Saitek/Aviator.xml
@@ -2,7 +2,7 @@
 <?xml-stylesheet type="text/xsl" href="joystick.xsl"?>
 <!-- Saitek AV8R/Aviator
 
-  Copyright (C) 2007 - 2010  Anders Gidenstam  (anders(at)gidenstam.org)
+  Copyright (C) 2007 - 2011  Anders Gidenstam  (anders(at)gidenstam.org)
   This file is released under the GPL license v2 or later.
 -->
 <PropertyList>
@@ -115,10 +115,10 @@
    <windows>0</windows>
   </number>
   <desc>aileron</desc>
+  <dead-band type="double">0.05</dead-band>
   <binding>
    <command>property-scale</command>
    <property>/controls/flight/aileron</property>
-   <dead-band type="double">0.01</dead-band>
    <offset type="double">0.0</offset>
    <squared type="bool">1</squared>
   </binding>
@@ -133,10 +133,10 @@
    <windows>1</windows>
   </number>
   <desc>elevator</desc>
+  <dead-band type="double">0.05</dead-band>
   <binding>
    <command>property-scale</command>
    <property>/controls/flight/elevator</property>
-   <dead-band type="double">0.01</dead-band>
    <offset type="double">0.0</offset>
    <factor type="double">-1.0</factor>
    <squared type="bool">1</squared>
@@ -152,10 +152,10 @@
    <windows>3</windows>
   </number>
   <desc>rudder</desc>
+  <dead-band type="double">0.05</dead-band>
   <binding>
    <command>property-scale</command>
    <property>/controls/flight/rudder</property>
-   <dead-band type="double">0.01</dead-band>
    <offset type="double">0.0</offset>
    <factor type="double">1.0</factor>
    <squared type="bool">1</squared>
diff --git a/Nasal/aircraft.nas b/Nasal/aircraft.nas
index d79768e6c..f97700dc2 100644
--- a/Nasal/aircraft.nas
+++ b/Nasal/aircraft.nas
@@ -776,16 +776,20 @@ var autotrim = {
 # (see Hawker Seahawk for an example).
 #
 # SYNOPSIS:
-#	aircraft.tyresmoke.new(<gear index>)
-#	<gear index> - the index of the gear to which the tyre smoke is attached
+#	aircraft.tyresmoke.new(gear index [, auto = 0])
+#		gear index - the index of the gear to which the tyre smoke is attached
+#		auto - enable automatic update (recommended). defaults to 0 for backward compatibility.
+#	aircraft.tyresmoke.del()
+#		destructor.
 #	aircraft.tyresmoke.update()
+#		Runs the update. Not required if automatic updates are enabled.
 #
 # EXAMPLE:
 #	var tyresmoke_0 = aircraft.tyresmoke.new(0);
 #	tyresmoke_0.update();
 #
 var tyresmoke = {
-	new: func(number) {
+	new: func(number, auto = 0) {
 		var m = { parents: [tyresmoke] };
 		me.vertical_speed = props.globals.initNode("velocities/vertical-speed-fps");
 		me.speed = props.globals.initNode("velocities/groundspeed-kt");
@@ -798,6 +802,8 @@ var tyresmoke = {
 		m.sprayspeed = gear.initNode("sprayspeed-ms");
 		m.spray = gear.initNode("spray", 0, "BOOL");
 		m.spraydensity = gear.initNode("spray-density", 0, "DOUBLE");
+		m.auto = auto;
+		m.listener = nil;
 
 		if (getprop("sim/flight-model") == "jsb") {
 			var wheel_speed = "fdm/jsbsim/gear/unit[" ~ number ~ "]/wheel-speed-fps";
@@ -809,8 +815,16 @@ var tyresmoke = {
 		}
 
 		m.lp = lowpass.new(2);
+		auto and m.update();
 		return m;
 	},
+	del: func {
+		if (me.listener != nil) {
+			removelistener(me.listener);
+			me.listener = nil;
+		}
+		me.auto = 0;
+	},
 	update: func {
 		var rollspeed = me.get_rollspeed();
 		var vert_speed = me.vertical_speed.getValue();
@@ -829,23 +843,67 @@ var tyresmoke = {
 			me.tyresmoke.setValue(1);
 			me.spray.setValue(0);
 			me.spraydensity.setValue(0);
-
 		} elsif (wow and groundspeed > 5 and rain >= 0.20) {
 			me.tyresmoke.setValue(0);
 			me.spray.setValue(1);
 			me.sprayspeed.setValue(rollspeed * 6);
 			me.spraydensity.setValue(rain * groundspeed);
-
 		} else {
 			me.tyresmoke.setValue(0);
 			me.spray.setValue(0);
 			me.sprayspeed.setValue(0);
 			me.spraydensity.setValue(0);
 		}
+		if (me.auto) {
+			if (wow) {
+				settimer(func me.update(), 0);
+				if (me.listener != nil) {
+					removelistener(me.listener);
+					me.listener = nil;
+				}
+			} elsif (me.listener == nil) {
+				me.listener = setlistener(me.wow, func me._wowchanged_(), 0, 0);
+			}
+		}
+	},
+	_wowchanged_: func() {
+		if (me.wow.getValue()) {
+			me.lp.set(0);
+			me.update();
+		}
 	},
 };
 
+# tyresmoke_system
+# =============================================================================
+# Helper class to contain the tyresmoke objects for all the gears.
+# Will update automatically, nothing else needs to be done by the caller.
+#
+# SYNOPSIS:
+#	aircraft.tyresmoke_system.new(<gear index 1>, <gear index 2>, ...)
+#		<gear index> - the index of the gear to which the tyre smoke is attached
+#	aircraft.tyresmoke_system.del()
+#		destructor
+# EXAMPLE:
+#	var tyresmoke_system = aircraft.tyresmoke_system.new(0, 1, 2, 3, 4);
 
+var tyresmoke_system = {
+	new: func {
+		var m = { parents: [tyresmoke_system] };
+		# preset array to proper size
+		m.gears = [];
+		setsize(m.gears, size(arg));
+		for(var i = size(arg) - 1; i >= 0; i -= 1) {
+			m.gears[i] = tyresmoke.new(arg[i], 1);
+		}
+		return m;
+	},
+	del: func {
+		foreach(var gear; me.gears) {
+			gear.del();
+		}
+	}
+};
 
 # rain
 # =============================================================================
diff --git a/Nasal/fuel.nas b/Nasal/fuel.nas
index 81d37566a..35643fec0 100644
--- a/Nasal/fuel.nas
+++ b/Nasal/fuel.nas
@@ -1,8 +1,6 @@
 # Properties under /consumables/fuel/tank[n]:
-# + level-gal_us    - Current fuel load.  Can be set by user code.
-# + level-lbs       - OUTPUT ONLY property, do not try to set
+# + level-lbs       - Current fuel load.  Can be set by user code.
 # + selected        - boolean indicating tank selection.
-# + density-ppg     - Fuel density, in lbs/gallon.
 # + capacity-gal_us - Tank capacity
 #
 # Properties under /engines/engine[n]:
@@ -42,11 +40,10 @@ var update = func {
 	} else {
 		var fuel_per_tank = consumed_fuel / size(selected_tanks);
 		foreach (var t; selected_tanks) {
-			var ppg = t.getNode("density-ppg").getValue();
-			var lbs = t.getNode("level-gal_us").getValue() * ppg;
+			var lbs = t.getNode("level-lbs").getValue();
 			lbs = lbs - fuel_per_tank;
-			if (lbs < 0) {
-				lbs = 0;
+			t.getNode("level-lbs").setDoubleValue(lbs);
+			if( t.getNode("empty").getBoolValue() ) {
 				# Kill the engines if we're told to, otherwise simply
 				# deselect the tank.
 				if (t.getNode("kill-when-empty", 1).getBoolValue())
@@ -54,27 +51,9 @@ var update = func {
 				else
 					t.getNode("selected").setBoolValue(0);
 			}
-			var gals = lbs / ppg;
-			t.getNode("level-gal_us").setDoubleValue(gals);
-			t.getNode("level-lbs").setDoubleValue(lbs);
 		}
 	}
 
-	# Total fuel properties
-	var lbs = 0;
-	var gals = 0;
-	var cap = 0;
-
-	foreach (var t; tanks) {
-		lbs += t.getNode("level-lbs").getValue();
-		gals += t.getNode("level-gal_us").getValue();
-		cap += t.getNode("capacity-gal_us").getValue();
-	}
-
-	total_lbs.setDoubleValue(lbs);
-	total_gals.setDoubleValue(gals);
-	total_norm.setDoubleValue(gals / cap);
-
 	foreach (var e; engines)
 		e.getNode("out-of-fuel").setBoolValue(out_of_fuel);
 }
@@ -85,22 +64,13 @@ var loop = func {
 	settimer(loop, UPDATE_PERIOD);
 }
 
-
 var tanks = [];
 var engines = [];
 var fuel_freeze = nil;
-var total_gals = nil;
-var total_lbs = nil;
-var total_norm = nil;
-
 
 _setlistener("/sim/signals/fdm-initialized", func {
 	setlistener("/sim/freeze/fuel", func(n) { fuel_freeze = n.getBoolValue() }, 1);
 
-	total_gals = props.globals.getNode("/consumables/fuel/total-fuel-gals", 1);
-	total_lbs = props.globals.getNode("/consumables/fuel/total-fuel-lbs", 1);
-	total_norm = props.globals.getNode("/consumables/fuel/total-fuel-norm", 1);
-
 	engines = props.globals.getNode("engines", 1).getChildren("engine");
 	foreach (var e; engines) {
 		e.getNode("fuel-consumed-lbs", 1).setDoubleValue(0);
@@ -112,10 +82,6 @@ _setlistener("/sim/signals/fdm-initialized", func {
 			continue;           # skip native_fdm.cxx generated zombie tanks
 
 		append(tanks, t);
-		t.initNode("level-gal_us", 0.0);
-		t.initNode("level-lbs", 0.0);
-		t.initNode("capacity-gal_us", 0.01); # not zero (div/zero issue)
-		t.initNode("density-ppg", 6.0);      # gasoline
 		t.initNode("selected", 1, "BOOL");
 	}
 
diff --git a/Shaders/bumpspec.frag b/Shaders/bumpspec.frag
index b708746eb..16f8d161c 100644
--- a/Shaders/bumpspec.frag
+++ b/Shaders/bumpspec.frag
@@ -2,11 +2,11 @@
 // Licence: GPL v2
 // Author: Frederic Bouvier
 
-varying vec4 ecPosition;
+varying float fogCoord;
+
 varying vec3 VNormal;
 varying vec3 VTangent;
 varying vec3 VBinormal;
-varying vec4 constantColor;
 
 uniform sampler2D tex_color;
 uniform sampler2D tex_normal;
@@ -29,7 +29,7 @@ void main (void)
 	vec4 Diffuse  = gl_LightSource[0].diffuse * nDotVP;
 	vec4 Specular = gl_LightSource[0].specular * pf;
 
-	vec4 color = constantColor + Diffuse * gl_FrontMaterial.diffuse;
+	vec4 color = gl_Color + Diffuse * gl_FrontMaterial.diffuse;
 	color *= texture2D(tex_color, gl_TexCoord[0].xy);
 
 	color += Specular * gl_FrontMaterial.specular * ns.a;
@@ -37,7 +37,6 @@ void main (void)
 
 
 	float fogFactor;
-	float fogCoord = ecPosition.z;
 	const float LOG2 = 1.442695;
 	fogFactor = exp2(-gl_Fog.density * gl_Fog.density * fogCoord * fogCoord * LOG2);
 	fogFactor = clamp(fogFactor, 0.0, 1.0);
diff --git a/Shaders/bumpspec.vert b/Shaders/bumpspec.vert
index 4ed1b8a59..d7b7a8974 100644
--- a/Shaders/bumpspec.vert
+++ b/Shaders/bumpspec.vert
@@ -2,23 +2,24 @@
 // Licence: GPL v2
 // Author: Frederic Bouvier
 
-varying vec4 ecPosition;
+varying float fogCoord;
 varying vec3 VNormal;
 varying vec3 VTangent;
 varying vec3 VBinormal;
-varying vec4 constantColor;
 
 attribute vec3 tangent;
 attribute vec3 binormal;
 
 void main (void)
 {
-	ecPosition = gl_ModelViewMatrix * gl_Vertex;
+	vec4 pos = gl_ModelViewMatrix * gl_Vertex;
+        fogCoord = pos.z / pos.w;
+
 	VNormal = normalize(gl_NormalMatrix * gl_Normal);
 	VTangent = normalize(gl_NormalMatrix * tangent);
 	VBinormal = normalize(gl_NormalMatrix * binormal);
-	constantColor = gl_FrontLightModelProduct.sceneColor + gl_LightSource[0].ambient * gl_FrontMaterial.ambient;
-	gl_FrontColor = constantColor;
+
+	gl_FrontColor = gl_FrontLightModelProduct.sceneColor + gl_LightSource[0].ambient * gl_FrontMaterial.ambient;
 	gl_TexCoord[0] = gl_MultiTexCoord0;
 	gl_Position = ftransform();
 }
diff --git a/Shaders/default.frag b/Shaders/default.frag
index 3b01a6676..52afbaf2d 100644
--- a/Shaders/default.frag
+++ b/Shaders/default.frag
@@ -14,7 +14,7 @@ float luminance(vec3 color)
 
 void main()
 {
-    vec3 n, halfV;
+    vec3 n;
     float NdotL, NdotHV, fogFactor;
     vec4 color = gl_Color;
     vec3 lightDir = gl_LightSource[0].position.xyz;
@@ -22,16 +22,16 @@ void main()
     vec4 texel;
     vec4 fragColor;
     vec4 specular = vec4(0.0);
-    n = normalize(normal);
+
     // If gl_Color.a == 0, this is a back-facing polygon and the
     // normal should be reversed.
+    n = (2.0 * gl_Color.a - 1.0) * normal;
+    n = normalize(n);
 
-    n = (2.0 * gl_Color.a - 1.0) * n;
-    NdotL = max(dot(n, lightDir), 0.0);
+    NdotL = dot(n, lightDir);
     if (NdotL > 0.0) {
         color += diffuse_term * NdotL;
-        halfV = halfVector;
-        NdotHV = max(dot(n, halfV), 0.0);
+        NdotHV = max(dot(n, halfVector), 0.0);
         if (gl_FrontMaterial.shininess > 0.0)
             specular.rgb = (gl_FrontMaterial.specular.rgb
                             * gl_LightSource[0].specular.rgb
diff --git a/Shaders/lightmap.frag b/Shaders/lightmap.frag
index 6296c18c0..838a01f03 100644
--- a/Shaders/lightmap.frag
+++ b/Shaders/lightmap.frag
@@ -9,6 +9,9 @@ varying vec4 diffuse_term;
 varying vec3 normal;
 varying float fogCoord;
 
+// The conditional, to enable lightmapping
+uniform float condition;
+
 uniform sampler2D texture;
 uniform sampler2D lightmap_texture;
 
@@ -49,8 +52,10 @@ void main()
     color = clamp(color, 0.0, 1.0);
     texel = texture2D(texture, gl_TexCoord[0].st);
     fragColor = color * texel + specular;
-	vec3 lightmapTexel = texture2D(lightmap_texture, gl_TexCoord[0].st).rgb;
-	fragColor.rgb = max(fragColor.rgb, lightmapTexel * gl_FrontMaterial.diffuse.rgb * texel.rgb);
+	if ( condition >= 1 ) {
+		vec3 lightmapTexel = texture2D(lightmap_texture, gl_TexCoord[0].st).rgb;
+		fragColor.rgb = max(fragColor.rgb, lightmapTexel * gl_FrontMaterial.diffuse.rgb * texel.rgb);
+		}
     fogFactor = exp(-gl_Fog.density * gl_Fog.density * fogCoord * fogCoord);
     gl_FragColor = mix(gl_Fog.color, fragColor, fogFactor);
 }
\ No newline at end of file
diff --git a/Shaders/model-default.frag b/Shaders/model-default.frag
index 5ed50a642..2c94b92d0 100644
--- a/Shaders/model-default.frag
+++ b/Shaders/model-default.frag
@@ -22,11 +22,11 @@ void main()
     vec4 texel;
     vec4 fragColor;
     vec4 specular = vec4(0.0);
-    n = normalize(normal);
     // If gl_Color.a == 0, this is a back-facing polygon and the
     // normal should be reversed.
-    n = (2.0 * gl_Color.a - 1.0) * n;
-    NdotL = max(dot(n, lightDir), 0.0);
+    n = (2.0 * gl_Color.a - 1.0) * normal;
+    n = normalize(n);
+    NdotL = dot(n, lightDir);
     if (NdotL > 0.0) {
         color += diffuse_term * NdotL;
         halfV = normalize(halfVector);
diff --git a/Shaders/reflect-bump-spec.frag b/Shaders/reflect-bump-spec.frag
index 859d21e40..70a6c1a60 100644
--- a/Shaders/reflect-bump-spec.frag
+++ b/Shaders/reflect-bump-spec.frag
@@ -4,19 +4,17 @@
 
 #version 120
 
-varying vec4  rawpos;
-varying vec4  ecPosition;
+varying vec3  rawpos;
 varying vec3  VNormal;
 varying vec3  VTangent;
 varying vec3  VBinormal;
 varying vec3  Normal;
-varying vec4  constantColor;
 varying vec3  vViewVec;
 varying vec3  reflVec;
 
 varying vec4 Diffuse;
-varying vec3 lightDir, halfVector;
-varying float alpha, fogCoord;
+varying float alpha;
+varying float fogCoord;
 
 uniform samplerCube Environment;
 uniform sampler2D Rainbow;
@@ -37,7 +35,12 @@ void main (void)
 {
     vec3 halfV;
     float NdotL, NdotHV;
-    vec4 color = constantColor;
+
+    vec3 lightDir = gl_LightSource[0].position.xyz;
+    vec3 halfVector = gl_LightSource[0].halfVector.xyz;
+
+
+    vec4 color = gl_Color;
     vec4 specular = vec4(0.0);
     vec4 ns = texture2D(NormalTex, gl_TexCoord[0].st);
     vec3 n = ns.rgb * 2.0 - 1.0;
@@ -61,7 +64,6 @@ void main (void)
     vec4 texelcolor = color * texel + specular;
 
     // calculate the fog factor
-    float fogCoord = ecPosition.z;
     const float LOG2 = 1.442695;
     float fogFactor = exp2(-gl_Fog.density * gl_Fog.density * fogCoord * fogCoord * LOG2);
     fogFactor = clamp(fogFactor, 0.0, 1.0);
diff --git a/Shaders/reflect-bump-spec.vert b/Shaders/reflect-bump-spec.vert
index d2b7e9ff2..6eb1a68db 100644
--- a/Shaders/reflect-bump-spec.vert
+++ b/Shaders/reflect-bump-spec.vert
@@ -2,19 +2,17 @@
 // Licence: GPL v2
 // Author: Vivian Meazza.
 
-varying vec4  rawpos;
-varying vec4  ecPosition;
+varying vec3  rawpos;
+varying float fogCoord;
 varying vec3  VNormal;
 varying vec3  VTangent;
 varying vec3  VBinormal;
 varying vec3  Normal;
-varying vec4  constantColor;
 varying vec3 vViewVec;
 varying vec3 reflVec;
 
 varying vec4 Diffuse;
-varying vec3 normal, lightDir, halfVector;
-varying float alpha, fogCoord;
+varying float alpha;
 
 uniform mat4 osg_ViewMatrixInverse;
 
@@ -23,23 +21,23 @@ attribute vec3 binormal;
 
 void main(void)
 {
-    rawpos     = gl_Vertex;
-    ecPosition = gl_ModelViewMatrix * gl_Vertex;
-    vec3 ecPosition3 = vec3(gl_ModelViewMatrix * gl_Vertex) / ecPosition.w;
+    rawpos     = gl_Vertex.xyz / gl_Vertex.w;
+    vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
+    ecPosition.xyz = ecPosition.xyz / ecPosition.w;
+    fogCoord = ecPosition.z;
 
-    vec3 t = normalize(cross(gl_Normal, vec3(1.0,0.0,0.0)));
-    vec3 b = normalize(cross(gl_Normal,t));
     vec3 n = normalize(gl_Normal);
+    vec3 t = cross(gl_Normal, vec3(1.0,0.0,0.0));
+    vec3 b = cross(n,t);
 
     VNormal = normalize(gl_NormalMatrix * gl_Normal);
-	VTangent = normalize(gl_NormalMatrix * tangent);
-	VBinormal = normalize(gl_NormalMatrix * binormal);
+    VTangent = normalize(gl_NormalMatrix * tangent);
+    VBinormal = normalize(gl_NormalMatrix * binormal);
     Normal = normalize(gl_Normal);
 
-    lightDir = normalize(vec3(gl_LightSource[0].position));
-    halfVector = normalize(gl_LightSource[0].halfVector.xyz);
     Diffuse = gl_Color * gl_LightSource[0].diffuse;
     //Diffuse= gl_Color.rgb * max(0.0, dot(normalize(VNormal), gl_LightSource[0].position.xyz));
+
     // Super hack: if diffuse material alpha is less than 1, assume a
     // transparency animation is at work
     if (gl_FrontMaterial.diffuse.a < 1.0)
@@ -47,8 +45,6 @@ void main(void)
     else
         alpha = gl_Color.a;
 
-    fogCoord = abs(ecPosition3.z);
-
     // Vertex in eye coordinates
     vec3 vertVec = ecPosition.xyz;
 
@@ -60,10 +56,8 @@ void main(void)
     vec4 reflect_eye = vec4(reflect(vertVec, VNormal), 0.0);
     reflVec = normalize(gl_ModelViewMatrixInverse * reflect_eye).xyz;
 
-    gl_FrontColor = gl_Color;
-    constantColor = gl_FrontMaterial.emission
-        + gl_Color * (gl_LightModel.ambient + gl_LightSource[0].ambient);
+    gl_FrontColor = gl_FrontMaterial.emission + gl_Color * (gl_LightModel.ambient + gl_LightSource[0].ambient);
 
     gl_Position = ftransform();
     gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
-}
\ No newline at end of file
+}
diff --git a/Shaders/reflect.frag b/Shaders/reflect.frag
index 1f7fb6924..d1424b478 100644
--- a/Shaders/reflect.frag
+++ b/Shaders/reflect.frag
@@ -4,17 +4,15 @@
 
 #version 120
 
-varying vec4  rawpos;
-varying vec4  ecPosition;
+varying vec3  rawpos;
 varying vec3  VNormal;
-varying vec3  Normal;
 varying vec4  constantColor;
 varying vec3  vViewVec;
 varying vec3  reflVec;
 
 varying vec4 Diffuse;
-varying vec3 lightDir, halfVector;
-varying float alpha, fogCoord;
+varying float alpha;
+varying float fogCoord;
 
 uniform samplerCube Environment;
 uniform sampler2D Rainbow;
@@ -36,8 +34,11 @@ void main (void)
     float NdotL, NdotHV;
     vec4 color = constantColor;
     vec4 specular = vec4(0.0);
-    n = VNormal;
-    NdotL = max(0.0, dot(n, lightDir));
+    n = normalize(VNormal);
+    vec3 lightDir = gl_LightSource[0].position.xyz;
+    vec3 halfVector = gl_LightSource[0].halfVector.xyz;
+
+    NdotL = dot(n, lightDir);
 
     // calculate the specular light
     if (NdotL > 0.0) {
@@ -56,7 +57,6 @@ void main (void)
     vec4 texelcolor = color * texel + specular;
 
     // calculate the fog factor
-    float fogCoord = ecPosition.z;
     const float LOG2 = 1.442695;
     float fogFactor = exp2(-gl_Fog.density * gl_Fog.density * fogCoord * fogCoord * LOG2);
     fogFactor = clamp(fogFactor, 0.0, 1.0);
diff --git a/Shaders/reflect.vert b/Shaders/reflect.vert
index ed76cee0f..4c8928120 100644
--- a/Shaders/reflect.vert
+++ b/Shaders/reflect.vert
@@ -2,17 +2,15 @@
 // Licence: GPL v2
 // Author: Vivian Meazza.
 
-varying vec4  rawpos;
-varying vec4  ecPosition;
+varying vec3  rawpos;
 varying vec3  VNormal;
-varying vec3  Normal;
 varying vec4  constantColor;
 varying vec3 vViewVec;
 varying vec3 reflVec;
 
 varying vec4 Diffuse;
-varying vec3 normal, lightDir, halfVector;
-varying float alpha, fogCoord;
+varying float alpha;
+varying float fogCoord;
 
 uniform mat4 osg_ViewMatrixInverse;
 
@@ -20,19 +18,16 @@ uniform mat4 osg_ViewMatrixInverse;
 
 void main(void)
 {
-    rawpos     = gl_Vertex;
-    ecPosition = gl_ModelViewMatrix * gl_Vertex;
-    vec3 ecPosition3 = vec3(gl_ModelViewMatrix * gl_Vertex) / ecPosition.w;
+    rawpos     = gl_Vertex.xyz / gl_Vertex.w;
+    vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
+    ecPosition.xyz = ecPosition.xyz / ecPosition.w;
 
     vec3 t = normalize(cross(gl_Normal, vec3(1.0,0.0,0.0)));
     vec3 b = normalize(cross(gl_Normal,t));
     vec3 n = normalize(gl_Normal);
 
     VNormal = normalize(gl_NormalMatrix * gl_Normal);
-    Normal = normalize(gl_Normal);
 
-    lightDir = normalize(vec3(gl_LightSource[0].position));
-    halfVector = normalize(gl_LightSource[0].halfVector.xyz);
     Diffuse = gl_Color * gl_LightSource[0].diffuse;
     //Diffuse= gl_Color.rgb * max(0.0, dot(normalize(VNormal), gl_LightSource[0].position.xyz));
     // Super hack: if diffuse material alpha is less than 1, assume a
@@ -42,7 +37,7 @@ void main(void)
     else
         alpha = gl_Color.a;
 
-    fogCoord = abs(ecPosition3.z);
+    fogCoord = abs(ecPosition.z);
 
     // Vertex in eye coordinates
     vec3 vertVec = ecPosition.xyz;
@@ -61,4 +56,4 @@ void main(void)
 
     gl_Position = ftransform();
     gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
-}
\ No newline at end of file
+}
diff --git a/Sounds/crash.wav b/Sounds/crash.wav
index 6f9e94cbd..ebdb0c263 100644
Binary files a/Sounds/crash.wav and b/Sounds/crash.wav differ
diff --git a/Sounds/helicopter-skid.wav b/Sounds/helicopter-skid.wav
index 9922bd3fc..ff1c0865c 100644
Binary files a/Sounds/helicopter-skid.wav and b/Sounds/helicopter-skid.wav differ
diff --git a/Sounds/helicopter.wav b/Sounds/helicopter.wav
index 8bd7c0f87..f3ca30958 100644
Binary files a/Sounds/helicopter.wav and b/Sounds/helicopter.wav differ
diff --git a/Sounds/overspeed.wav b/Sounds/overspeed.wav
index c79b27079..95cb70ebd 100644
Binary files a/Sounds/overspeed.wav and b/Sounds/overspeed.wav differ
diff --git a/Sounds/tcas/female/adjust_vertical_speed.wav b/Sounds/tcas/female/adjust_vertical_speed.wav
new file mode 100644
index 000000000..49d61ed87
Binary files /dev/null and b/Sounds/tcas/female/adjust_vertical_speed.wav differ
diff --git a/Sounds/tcas/female/clear.wav b/Sounds/tcas/female/clear.wav
new file mode 100644
index 000000000..a7d8796d2
Binary files /dev/null and b/Sounds/tcas/female/clear.wav differ
diff --git a/Sounds/tcas/female/climb.wav b/Sounds/tcas/female/climb.wav
new file mode 100644
index 000000000..b8aa9b5fc
Binary files /dev/null and b/Sounds/tcas/female/climb.wav differ
diff --git a/Sounds/tcas/female/climb_crossing.wav b/Sounds/tcas/female/climb_crossing.wav
new file mode 100644
index 000000000..c27518a04
Binary files /dev/null and b/Sounds/tcas/female/climb_crossing.wav differ
diff --git a/Sounds/tcas/female/climb_now.wav b/Sounds/tcas/female/climb_now.wav
new file mode 100644
index 000000000..ad3b7d3da
Binary files /dev/null and b/Sounds/tcas/female/climb_now.wav differ
diff --git a/Sounds/tcas/female/descend.wav b/Sounds/tcas/female/descend.wav
new file mode 100644
index 000000000..c85d15fa0
Binary files /dev/null and b/Sounds/tcas/female/descend.wav differ
diff --git a/Sounds/tcas/female/descend_crossing.wav b/Sounds/tcas/female/descend_crossing.wav
new file mode 100644
index 000000000..b9ca51a50
Binary files /dev/null and b/Sounds/tcas/female/descend_crossing.wav differ
diff --git a/Sounds/tcas/female/descend_now.wav b/Sounds/tcas/female/descend_now.wav
new file mode 100644
index 000000000..98758cb59
Binary files /dev/null and b/Sounds/tcas/female/descend_now.wav differ
diff --git a/Sounds/tcas/female/do_not_climb.wav b/Sounds/tcas/female/do_not_climb.wav
new file mode 100644
index 000000000..f29307f1c
Binary files /dev/null and b/Sounds/tcas/female/do_not_climb.wav differ
diff --git a/Sounds/tcas/female/do_not_descend.wav b/Sounds/tcas/female/do_not_descend.wav
new file mode 100644
index 000000000..df0dc1699
Binary files /dev/null and b/Sounds/tcas/female/do_not_descend.wav differ
diff --git a/Sounds/tcas/female/increase_climb.wav b/Sounds/tcas/female/increase_climb.wav
new file mode 100644
index 000000000..1c8c770fe
Binary files /dev/null and b/Sounds/tcas/female/increase_climb.wav differ
diff --git a/Sounds/tcas/female/increase_descent.wav b/Sounds/tcas/female/increase_descent.wav
new file mode 100644
index 000000000..d8bd92db0
Binary files /dev/null and b/Sounds/tcas/female/increase_descent.wav differ
diff --git a/Sounds/tcas/female/maintain_vertical_speed.wav b/Sounds/tcas/female/maintain_vertical_speed.wav
new file mode 100644
index 000000000..7748f14e6
Binary files /dev/null and b/Sounds/tcas/female/maintain_vertical_speed.wav differ
diff --git a/Sounds/tcas/female/monitor_vertical_speed.wav b/Sounds/tcas/female/monitor_vertical_speed.wav
new file mode 100644
index 000000000..e112d4c31
Binary files /dev/null and b/Sounds/tcas/female/monitor_vertical_speed.wav differ
diff --git a/Sounds/tcas/female/test_fail.wav b/Sounds/tcas/female/test_fail.wav
new file mode 100644
index 000000000..4f27c8f86
Binary files /dev/null and b/Sounds/tcas/female/test_fail.wav differ
diff --git a/Sounds/tcas/female/test_ok.wav b/Sounds/tcas/female/test_ok.wav
new file mode 100644
index 000000000..f284ab4f8
Binary files /dev/null and b/Sounds/tcas/female/test_ok.wav differ
diff --git a/Sounds/tcas/female/traffic.wav b/Sounds/tcas/female/traffic.wav
new file mode 100644
index 000000000..c49beab85
Binary files /dev/null and b/Sounds/tcas/female/traffic.wav differ
diff --git a/gui/dialogs/pushback.xml b/gui/dialogs/pushback.xml
index 371588959..d4115df4e 100644
--- a/gui/dialogs/pushback.xml
+++ b/gui/dialogs/pushback.xml
@@ -15,6 +15,7 @@
        pushback_position.setpos(0);
        setprop("/sim/model/pushback/enabled", 0 );
        setprop("/sim/model/pushback/target-speed-fps", 0 );
+       setprop("/sim/model/pushback/force", 0);
     </close>
   </nasal>
 
@@ -89,4 +90,4 @@
 
     </group>
     
-  </group> </PropertyList> 
\ No newline at end of file
+  </group> </PropertyList> 
diff --git a/gui/dialogs/rendering.xml b/gui/dialogs/rendering.xml
index 85ecdc9d9..d266a1be5 100644
--- a/gui/dialogs/rendering.xml
+++ b/gui/dialogs/rendering.xml
@@ -172,17 +172,23 @@
         </binding>
       </checkbox>
 
+	  -->
+
       <checkbox>
         <halign>left</halign>
-        <label>Random objects</label>
+        <label>Random objects (triggers scenery reload)</label>
+        <name>random-objects</name>
         <property>/sim/rendering/random-objects</property>
         <binding>
           <command>dialog-apply</command>
+          <object-name>random-objects</object-name>
+        </binding>
+        <binding>
+          <command>reinit</command>
+          <subsystem>tile-manager</subsystem>
         </binding>
       </checkbox>
 
-	  -->
-
       <checkbox>
         <halign>left</halign>
         <label>Random vegetation</label>
diff --git a/gui/menubar.xml b/gui/menubar.xml
index 0d2cc528f..40fc4d288 100644
--- a/gui/menubar.xml
+++ b/gui/menubar.xml
@@ -605,6 +605,14 @@
 			</binding>
 		</item>
 
+		<item>
+			<label>Reload Scenery</label>
+			<binding>
+				<command>reinit</command>
+				<subsystem>tile-manager</subsystem>
+			</binding>
+		</item>
+
 		<item>
 			<label>Nasal Console</label>
 			<binding>