diff --git a/Models/Instruments/ND/canvas/res/airbus_holdL.svg b/Models/Instruments/ND/canvas/res/airbus_holdL.svg
new file mode 100644
index 00000000..0807b36f
--- /dev/null
+++ b/Models/Instruments/ND/canvas/res/airbus_holdL.svg
@@ -0,0 +1,60 @@
+
+
+
+
diff --git a/Models/Instruments/ND/canvas/res/airbus_holdR.svg b/Models/Instruments/ND/canvas/res/airbus_holdR.svg
new file mode 100644
index 00000000..6c51add3
--- /dev/null
+++ b/Models/Instruments/ND/canvas/res/airbus_holdR.svg
@@ -0,0 +1,62 @@
+
+
+
+
diff --git a/Nasal/Systems/APU.nas b/Nasal/Systems/APU.nas
new file mode 100644
index 00000000..9033032f
--- /dev/null
+++ b/Nasal/Systems/APU.nas
@@ -0,0 +1,67 @@
+# A3XX Auxilliary Power Unit
+# Jonathan Redpath (legoboyvdlp)
+
+# Copyright (c) 2019 Jonathan Redpath (legoboyvdlp)
+
+var APU = {
+ state: 0, # power up, watch, starting, run, cooldown, shutdown
+ nRpm: 0,
+ fuelValve: aircraft.door.new("/controls/apu/fuel-valve", 1),
+ inletFlap: aircraft.door.new("/controls/apu/inlet-flap", 12),
+ listenSignals: 0,
+ start: 0,
+ cancelCheckFlap: 0,
+ new: func() {
+ var a = { parents:[APU] };
+ return a;
+ },
+ setState: func(num) {
+ me.state = num;
+ },
+ powerOn: func() {
+ # apu able to receive emergency stop or start signals
+ me.fuelValve.open();
+ me.inletFlap.open();
+ me.listenSignals = 1;
+ settimer(me.setState(1), 3);
+ },
+ getStartSignal: func() {
+ if (me.listenSignals and me.state < 2 and me.nRpm < 7) {
+ me.start = 1;
+ me.startCheckFlap();
+ } elsif (me.listenSignals) {
+ settimer(me.getStartSignal(), 0);
+ }
+ },
+ startCheckFlap: func() {
+ if (me.inletFlap.getpos() != 1 and me.cancelCheckFlap == 0 and me.state == 1) {
+ settimer(me.startCheckFlap(), 0);
+ } elsif (me.cancelCheckFlap) {
+ me.cancelCheckFlap = 0;
+ } else {
+ me.setState(2);
+ }
+ },
+ getStopSignal: func() {
+ if (me.listenSignals) {
+ me.cancelCheckFlap = 1;
+ me.inletFlap.close();
+ # wait for flap close --> power down relay output
+ }
+ },
+};
+
+var APUController = {
+ _init: 0,
+ APU: nil,
+ init: func() {
+ if (!me._init) {
+ me.APU = APU.new();
+ }
+ },
+ loop: func() {
+ if (me.APU != nil) {
+ APU.update();
+ }
+ },
+};
\ No newline at end of file
diff --git a/Nasal/Systems/pneumatics-old.nas b/Nasal/Systems/pneumatics-old.nas
new file mode 100644
index 00000000..9a88b772
--- /dev/null
+++ b/Nasal/Systems/pneumatics-old.nas
@@ -0,0 +1,61 @@
+# A3XX Pneumatic System
+# Copyright (c) 2019 Jonathan Redpath (legoboyvdlp)
+
+# Local vars
+
+# Main class
+var PNEU = {
+ Fail: {
+ apu: props.globals.getNode("systems/failures/pneumatics/apu-valve");
+ bleed1: props.globals.getNode("systems/failures/pneumatics/bleed-1-valve");
+ bleed2: props.globals.getNode("systems/failures/pneumatics/bleed-2-valve");
+ cabinFans: props.globals.getNode("systems/failures/pneumatics/cabin-fans");
+ hotAir: props.globals.getNode("systems/failures/pneumatics/hot-air");
+ pack1: props.globals.getNode("systems/failures/pneumatics/pack-1-valve");
+ pack2: props.globals.getNode("systems/failures/pneumatics/pack-2-valve");
+ ramAir: props.globals.getNode("systems/failures/pneumatics/ram-air");
+ trimValveCockpit: props.globals.getNode("systems/failures/pneumatics/trim-valve-cockpit");
+ trimValveAft: props.globals.getNode("systems/failures/pneumatics/trim-valve-cabin-aft");
+ trimValveFwd: props.globals.getNode("systems/failures/pneumatics/trim-valve-cabin-fwd");
+ xbleed: props.globals.getNode("systems/failures/pneumatics/x-bleed-valve");
+ }
+ Psi: {
+ },
+ Switch: {
+ apu: props.globals.getNode("controls/pneumatics/switches/apu");
+ bleed1: props.globals.getNode("controls/pneumatics/switches/bleed-1");
+ bleed2: props.globals.getNode("controls/pneumatics/switches/bleed-2");
+ blower: props.globals.getNode("controls/pneumatics/switches/blower");
+ cabinFans: props.globals.getNode("controls/pneumatics/switches/cabin-fans");
+ extract: props.globals.getNode("controls/pneumatics/switches/extract");
+ hotAir: props.globals.getNode("controls/pneumatics/switches/hot-air");
+ pack1: props.globals.getNode("controls/pneumatics/switches/pack-1");
+ pack2: props.globals.getNode("controls/pneumatics/switches/pack-2");
+ packFlow: props.globals.getNode("controls/pneumatics/switches/pack-flow");
+ ramAir: props.globals.getNode("controls/pneumatics/switches/ram-air");
+ tempCockpit: props.globals.getNode("controls/pneumatics/switches/temp-cockpit");
+ tempAft: props.globals.getNode("controls/pneumatics/switches/temp-cabin-aft");
+ tempFwd: props.globals.getNode("controls/pneumatics/switches/temp-cabin-fwd");
+ xbleed: props.globals.getNode("controls/pneumatics/switches/x-bleed");
+ },
+ init: func() {
+ me.resetFail();
+ },
+ resetFail: func() {
+ me.Fail.apu.setBoolValue(0);
+ me.Fail.bleed1.setBoolValue(0);
+ me.Fail.bleed2.setBoolValue(0);
+ me.Fail.cabinFans.setBoolValue(0);
+ me.Fail.hotAir.setBoolValue(0);
+ me.Fail.pack1.setBoolValue(0);
+ me.Fail.pack2.setBoolValue(0);
+ me.Fail.ramAir.setBoolValue(0);
+ me.Fail.trimValveCockpit.setBoolValue(0);
+ me.Fail.trimValveAft.setBoolValue(0);
+ me.Fail.trimValveFwd.setBoolValue(0);
+ me.Fail.xbleed.setBoolValue(0);
+ },
+ loop: func() {
+
+ },
+}
\ No newline at end of file
diff --git a/Sounds/Cockpit/click.wav b/Sounds/Cockpit/click.wav
new file mode 100644
index 00000000..6fbf64a4
Binary files /dev/null and b/Sounds/Cockpit/click.wav differ
diff --git a/Sounds/GPWS/dont-sink.wav b/Sounds/GPWS/dont-sink.wav
new file mode 100644
index 00000000..8bd30e8a
Binary files /dev/null and b/Sounds/GPWS/dont-sink.wav differ
diff --git a/Sounds/GPWS/glideslope.wav b/Sounds/GPWS/glideslope.wav
new file mode 100644
index 00000000..32db115d
Binary files /dev/null and b/Sounds/GPWS/glideslope.wav differ
diff --git a/Sounds/GPWS/pull-up.wav b/Sounds/GPWS/pull-up.wav
new file mode 100644
index 00000000..7f1ea4ad
Binary files /dev/null and b/Sounds/GPWS/pull-up.wav differ
diff --git a/Sounds/GPWS/sink-rate.wav b/Sounds/GPWS/sink-rate.wav
new file mode 100644
index 00000000..bb5e80a4
Binary files /dev/null and b/Sounds/GPWS/sink-rate.wav differ
diff --git a/Sounds/GPWS/terrain.wav b/Sounds/GPWS/terrain.wav
new file mode 100644
index 00000000..89e7bdd0
Binary files /dev/null and b/Sounds/GPWS/terrain.wav differ
diff --git a/Sounds/GPWS/too-low-flaps.wav b/Sounds/GPWS/too-low-flaps.wav
new file mode 100644
index 00000000..f7027fe9
Binary files /dev/null and b/Sounds/GPWS/too-low-flaps.wav differ
diff --git a/Sounds/GPWS/too-low-gear.wav b/Sounds/GPWS/too-low-gear.wav
new file mode 100644
index 00000000..8dbde954
Binary files /dev/null and b/Sounds/GPWS/too-low-gear.wav differ
diff --git a/Sounds/GPWS/too-low-terrain.wav b/Sounds/GPWS/too-low-terrain.wav
new file mode 100644
index 00000000..f3bb14fb
Binary files /dev/null and b/Sounds/GPWS/too-low-terrain.wav differ
diff --git a/Sounds/SASA/A320_cabin.wav b/Sounds/SASA/A320_cabin.wav
new file mode 100644
index 00000000..b57f9c92
Binary files /dev/null and b/Sounds/SASA/A320_cabin.wav differ
diff --git a/Sounds/SASA/CFM56B/cockpit/A320_cockpit_starter.wav b/Sounds/SASA/CFM56B/cockpit/A320_cockpit_starter.wav
new file mode 100644
index 00000000..ce5638c5
Binary files /dev/null and b/Sounds/SASA/CFM56B/cockpit/A320_cockpit_starter.wav differ
diff --git a/Sounds/SASA/CFM56B/cockpit/A320_cockpit_startup.wav b/Sounds/SASA/CFM56B/cockpit/A320_cockpit_startup.wav
new file mode 100644
index 00000000..9f389be0
Binary files /dev/null and b/Sounds/SASA/CFM56B/cockpit/A320_cockpit_startup.wav differ
diff --git a/Sounds/SASA/CFM56B/external/cfm-windrush.wav b/Sounds/SASA/CFM56B/external/cfm-windrush.wav
new file mode 100644
index 00000000..a43406f7
Binary files /dev/null and b/Sounds/SASA/CFM56B/external/cfm-windrush.wav differ
diff --git a/Sounds/SASA/CFM56B/external/x320_cfm_starter.wav b/Sounds/SASA/CFM56B/external/x320_cfm_starter.wav
new file mode 100644
index 00000000..b38a3f05
Binary files /dev/null and b/Sounds/SASA/CFM56B/external/x320_cfm_starter.wav differ
diff --git a/Sounds/SASA/CFM56B/external/x320_cfm_startup.wav b/Sounds/SASA/CFM56B/external/x320_cfm_startup.wav
new file mode 100644
index 00000000..772deb1e
Binary files /dev/null and b/Sounds/SASA/CFM56B/external/x320_cfm_startup.wav differ
diff --git a/Sounds/SASA/CFM56B/external/xstart2_rear.wav b/Sounds/SASA/CFM56B/external/xstart2_rear.wav
new file mode 100644
index 00000000..51585003
Binary files /dev/null and b/Sounds/SASA/CFM56B/external/xstart2_rear.wav differ
diff --git a/Sounds/SASA/CFM56B/wingaft/320_start2_2.wav b/Sounds/SASA/CFM56B/wingaft/320_start2_2.wav
new file mode 100644
index 00000000..9f188cc4
Binary files /dev/null and b/Sounds/SASA/CFM56B/wingaft/320_start2_2.wav differ
diff --git a/Sounds/SASA/CFM56B/wingaft/340_start1_2.wav b/Sounds/SASA/CFM56B/wingaft/340_start1_2.wav
new file mode 100644
index 00000000..48b4db6d
Binary files /dev/null and b/Sounds/SASA/CFM56B/wingaft/340_start1_2.wav differ
diff --git a/Sounds/SASA/CFM56B/wingfwd/320_start2_2.wav b/Sounds/SASA/CFM56B/wingfwd/320_start2_2.wav
new file mode 100644
index 00000000..9f188cc4
Binary files /dev/null and b/Sounds/SASA/CFM56B/wingfwd/320_start2_2.wav differ
diff --git a/Sounds/SASA/CFM56B/wingfwd/340_start1_2.wav b/Sounds/SASA/CFM56B/wingfwd/340_start1_2.wav
new file mode 100644
index 00000000..48b4db6d
Binary files /dev/null and b/Sounds/SASA/CFM56B/wingfwd/340_start1_2.wav differ
diff --git a/Sounds/SASA/Touch-Nose.wav b/Sounds/SASA/Touch-Nose.wav
new file mode 100644
index 00000000..c4c0bd49
Binary files /dev/null and b/Sounds/SASA/Touch-Nose.wav differ
diff --git a/Sounds/SASA/V2500/external/v2500-idleClose.wav b/Sounds/SASA/V2500/external/v2500-idleClose.wav
new file mode 100644
index 00000000..aebdc755
Binary files /dev/null and b/Sounds/SASA/V2500/external/v2500-idleClose.wav differ
diff --git a/Sounds/SASA/V2500/external/v2500-idleDist.wav b/Sounds/SASA/V2500/external/v2500-idleDist.wav
new file mode 100644
index 00000000..f6a19063
Binary files /dev/null and b/Sounds/SASA/V2500/external/v2500-idleDist.wav differ