> ## Documentation Index
> Fetch the complete documentation index at: https://docs.canadava.com/llms.txt
> Use this file to discover all available pages before exploring further.

# A320 Series Checklist

> Complete vACA A320-family normal and abnormal checklists with ECAM flows, call-outs, and emergency memory items

export const CockpitChecklist = ({sections = [], title, printLogoSrc = "/logo/light.svg", printNotice = "For flight-simulation training only - not for real-world aviation use."}) => {
  const allItems = sections.flatMap((s, si) => (s.items || []).map((_, ii) => `${si}-${ii}`));
  const [checked, setChecked] = useState({});
  const [isFullscreen, setIsFullscreen] = useState(false);
  const fullscreenRootRef = useRef(null);
  const dialogRef = useRef(null);
  const printRef = useRef(null);
  const printCloneRef = useRef(null);
  const toggle = key => setChecked(prev => ({
    ...prev,
    [key]: !prev[key]
  }));
  const reset = () => setChecked({});
  const openFullscreen = () => setIsFullscreen(true);
  const closeFullscreen = () => setIsFullscreen(false);
  const removePrintClone = () => {
    if (typeof document !== "undefined") {
      document.body.classList.remove("cockpit-printing");
    }
    const clone = printCloneRef.current;
    if (clone && clone.parentNode) {
      clone.parentNode.removeChild(clone);
    }
    printCloneRef.current = null;
  };
  const printChecklist = () => {
    if (typeof window === "undefined" || typeof document === "undefined") return;
    const source = printRef.current;
    if (!source) return;
    removePrintClone();
    const clone = source.cloneNode(true);
    clone.setAttribute("data-print-active", "true");
    printCloneRef.current = clone;
    document.body.appendChild(clone);
    document.body.classList.add("cockpit-printing");
    window.addEventListener("afterprint", removePrintClone, {
      once: true
    });
    window.requestAnimationFrame(() => {
      window.print();
    });
  };
  const doneCount = Object.values(checked).filter(Boolean).length;
  const totalCount = allItems.length;
  useEffect(() => {
    const dialog = dialogRef.current;
    if (!dialog) return;
    if (isFullscreen) {
      if (!dialog.open) dialog.showModal();
      const prevOverflow = document.body.style.overflow;
      document.body.style.overflow = "hidden";
      return () => {
        document.body.style.overflow = prevOverflow;
      };
    }
    if (dialog.open) dialog.close();
  }, [isFullscreen]);
  useEffect(() => {
    if (!isFullscreen) return;
    if (typeof window === "undefined") return;
    const root = fullscreenRootRef.current;
    if (!root) return;
    const MIN_SCALE = 0.7;
    const MAX_SCALE = 1;
    const MIN_LEADER_PX = 24;
    const GAP_PX = 16;
    const SAFETY_PX = 2;
    const measure = () => {
      root.style.setProperty("--cockpit-fs-font-scale", "1");
      void root.offsetWidth;
      const items = root.querySelectorAll(".cockpit-item");
      let worst = 1;
      items.forEach(item => {
        const label = item.querySelector(".cockpit-item-label");
        const value = item.querySelector(".cockpit-item-value");
        if (!label || !value) return;
        const cs = window.getComputedStyle(item);
        const padL = parseFloat(cs.paddingLeft) || 0;
        const padR = parseFloat(cs.paddingRight) || 0;
        const available = item.clientWidth - padL - padR;
        const needed = label.scrollWidth + value.scrollWidth + MIN_LEADER_PX + GAP_PX + SAFETY_PX;
        if (needed > available && available > 0) {
          const ratio = available / needed;
          if (ratio < worst) worst = ratio;
        }
      });
      const next = Math.max(MIN_SCALE, Math.min(MAX_SCALE, worst));
      root.style.setProperty("--cockpit-fs-font-scale", String(next));
    };
    measure();
    let raf = 0;
    const ro = new ResizeObserver(() => {
      cancelAnimationFrame(raf);
      raf = requestAnimationFrame(measure);
    });
    ro.observe(root);
    const dialog = dialogRef.current;
    if (dialog) ro.observe(dialog);
    return () => {
      cancelAnimationFrame(raf);
      ro.disconnect();
    };
  }, [isFullscreen, sections]);
  useEffect(() => removePrintClone, []);
  const renderChart = (variant, rootRef) => <div ref={rootRef} className={`cockpit-checklist${variant === "fullscreen" ? " fullscreen" : ""}`}>
      <div className="cockpit-checklist-header">
        {title && <span className="cockpit-checklist-title">{title}</span>}
        <div className="cockpit-checklist-meta">
          <span className="cockpit-checklist-count">
            {doneCount}/{totalCount}
          </span>
          {doneCount > 0 && <button type="button" className="cockpit-checklist-btn" onClick={reset}>
              Reset
            </button>}
          <button type="button" className="cockpit-checklist-btn" onClick={printChecklist}>
            Print
          </button>
          {variant === "fullscreen" ? <button type="button" className="cockpit-checklist-btn" onClick={closeFullscreen} aria-label="Exit fullscreen">
              Close ✕
            </button> : <button type="button" className="cockpit-checklist-btn" onClick={openFullscreen} aria-label="Open fullscreen">
              Fullscreen ⤢
            </button>}
        </div>
      </div>

      <div className="cockpit-checklist-scroll">
        <div className="cockpit-checklist-grid">
          {sections.map((section, si) => <div key={si} className="cockpit-section">
              <div className="cockpit-section-header">
                <span className="cockpit-section-title">{section.title}</span>
                {section.subtitle && <span className="cockpit-section-subtitle">
                    {section.subtitle}
                  </span>}
              </div>
              <div className="cockpit-section-items">
                {(section.items || []).map((item, ii) => {
    const key = `${si}-${ii}`;
    const isChecked = !!checked[key];
    return <button key={key} type="button" className={`cockpit-item${isChecked ? " checked" : ""}${item.strong ? " strong" : ""}`} onClick={() => toggle(key)}>
                      <span className="cockpit-item-label">{item.label}</span>
                      <span className="cockpit-item-leader" aria-hidden="true" />
                      <span className="cockpit-item-value">{item.value}</span>
                    </button>;
  })}
              </div>
            </div>)}
        </div>
      </div>
    </div>;
  const renderPrintLayout = () => <div ref={printRef} className="cockpit-print-root" data-print-active="false" aria-hidden="true">
      <article className="cockpit-print-sheet">
        <header className="cockpit-print-header">
          <img className="cockpit-print-logo" src={printLogoSrc} alt="vACA" />
          <div className="cockpit-print-heading">
            {title && <h1>{title}</h1>}
            {printNotice && <div className="cockpit-print-notice">{printNotice}</div>}
          </div>
        </header>

        <div className="cockpit-print-grid">
          {sections.map((section, si) => <section key={si} className="cockpit-print-section">
              <div className="cockpit-print-section-header">
                <span className="cockpit-print-section-title">
                  {section.title}
                </span>
                {section.subtitle && <span className="cockpit-print-section-subtitle">
                    {section.subtitle}
                  </span>}
              </div>
              <div className="cockpit-print-section-items">
                {(section.items || []).map((item, ii) => <div key={`${si}-${ii}`} className={`cockpit-print-item${item.strong ? " strong" : ""}`}>
                    <span className="cockpit-print-item-label">
                      {item.label}
                    </span>
                    <span className="cockpit-print-item-leader" aria-hidden="true" />
                    <span className="cockpit-print-item-value">
                      {item.value}
                    </span>
                  </div>)}
              </div>
            </section>)}
        </div>
      </article>
    </div>;
  return <>
      {renderChart("inline")}
      {renderPrintLayout()}
      <dialog ref={dialogRef} className="cockpit-fullscreen-backdrop" onClick={e => {
    if (e.target === e.currentTarget) closeFullscreen();
  }} onCancel={closeFullscreen} onClose={closeFullscreen}>
        {isFullscreen && renderChart("fullscreen", fullscreenRootRef)}
      </dialog>
    </>;
};

<div className="cover-image-frame">
  <Frame caption="Image source: Air Canada">
    <img src="https://mintcdn.com/virtualaircanada/iQJB1gDJzxYoDw5J/images/aops/fleet/a-320.png?fit=max&auto=format&n=iQJB1gDJzxYoDw5J&q=85&s=8bae4d49a1cdeb32bc82a38e4f309381" alt="Airbus A320" noZoom className="cover-image" width="800" height="460" data-path="images/aops/fleet/a-320.png" />
  </Frame>
</div>

# Airbus A320‑Series

**Comprehensive Normal & Abnormal Checklist ASOP**

<Info>For flight‑simulation training only – NOT for real‑world aviation use.</Info>

**Version 1.2 - 23 May 2026**

***

## Legend

* **PF** – Pilot Flying  **PM** – Pilot Monitoring
* *Italic* – Call‑outs  **Bold** – Memory item/trigger
* (A) – Airbus automatic call/alert  (M) – Manoeuvre

***

## Normal Operations Checklists

<CockpitChecklist
  title="A320 Normal Operations"
  sections={[
{
  title: "Power-Up & Acceptance",
  items: [
    { label: "Parking Brakes", value: "SET", strong: true },
    { label: "Chocks / GPU", value: "AS REQD" },
    { label: "Batteries 1 & 2", value: "AUTO (>25.5 V)" },
    { label: "External Power", value: "ON (IF AVAIL)" },
    { label: "RAT & OVRD", value: "GUARDED" },
    { label: "ADIRS (3)", value: "NAV - ALIGN (~10 MIN)", strong: true },
    { label: "FMGC INIT", value: "COMPLETED", strong: true },
    { label: "Oxygen Crew", value: "PRESS & FLOW" },
    { label: "Gear Pins / Covers", value: "REMOVED & STOWED" },
  ],
},
{
  title: "Preliminary Cockpit",
  items: [
    { label: "CVR", value: "TEST & ERASE", strong: true },
    { label: "Escape Ropes", value: "PRESENT BOTH SIDES", strong: true },
    { label: "ECAM Recall", value: "CLEAR (PRESS CLR 30 S)", strong: true },
    { label: "ELT", value: "ARMED", strong: true },
  ],
},
{
  title: "Cockpit Prep",
  subtitle: "Flows",
  items: [
    { label: "Overhead - Aft - Pedestal - MIP", value: "COMPLETE FLOW", strong: true },
    { label: "Fuel Pumps", value: "ON (QTY > MIN TO TRIP)" },
    { label: "Hydraulic PTU", value: "TEST (OFF THEN AUTO)" },
    { label: "Probes & Window Heat", value: "AUTO" },
    { label: "ACP Volumes", value: "SET 12 O'CLOCK" },
  ],
},
{
  title: "Cockpit Prep",
  subtitle: "Checklist (PM)",
  items: [
    { label: "Cockpit Prep Checklist", value: "PM INITIATES" },
    { label: "Gear Pins & Covers", value: "REMOVED" },
    { label: "ADIRS", value: "ALIGNED" },
    { label: "Fuel Qty", value: "___ KG, BALANCED" },
    { label: "Take-Off Briefing", value: "COMPLETED" },
    { label: "Checklist", value: "COMPLETE" },
  ],
},
{
  title: "Before Start",
  items: [
    { label: "Beacon", value: "ON" },
    { label: "Doors", value: "CLOSED & ARMED" },
    { label: "Thrust Levers", value: "IDLE" },
    { label: "Windows", value: "CLOSED" },
    { label: "Parking Brake", value: "SET" },
    { label: "Pushback CLR", value: "RECEIVED" },
  ],
},
{
  title: "Engine Start",
  subtitle: "Automatic (ENG 1 First)",
  items: [
    { label: "APU Bleed", value: "ON (PRESS > 25 PSI)" },
    { label: "Yellow Hyd Accumulator", value: "VERIFY PRESSURE (PARKING BRAKE)" },
    { label: "Mode Selector", value: "ENG MODE SEL - IGN/START" },
    { label: "Engine 1 (Left) First", value: "ENG 1 MASTER - ON", strong: true },
    { label: "Monitor", value: "N2 RISING, OIL P, EGT RISE <20 S" },
    { label: "Engine 2 (Right)", value: "ENG 2 MASTER - ON (AFTER ENG 1 STABLE)", strong: true },
    { label: "Complete", value: "BOTH AVAIL - MODE SEL NORM" },
  ],
},
{
  title: "After Start",
  subtitle: "Flows",
  items: [
    { label: "Anti-Ice", value: "AS REQD" },
    { label: "APU Bleed", value: "OFF (KEEP ON IF ENG ANTI-ICE)", strong: true },
    { label: "Ground Spoilers", value: "ARMED" },
    { label: "Rudder Trim", value: "ZERO" },
    { label: "Pitch Trim", value: "SET PER FMS T/O VALUE" },
    { label: "Flaps", value: "T/O CONFIG (1+F, 2 OR 3)" },
    { label: "Flight Controls", value: "FULL, FREE & NEUTRAL (M)" },
    { label: "ECAM Status", value: "CHECKED" },
  ],
},
{
  title: "After Start",
  subtitle: "Checklist (PM)",
  items: [
    { label: "After-Start Checklist", value: "PM INITIATES" },
    { label: "Anti-Ice", value: "____" },
    { label: "Rudder Trim", value: "ZERO" },
    { label: "Flaps", value: "__ / ____" },
    { label: "Pitch Trim", value: "__° UP" },
    { label: "Report", value: "RECEIVED" },
  ],
},
{
  title: "Taxi",
  items: [
    { label: "Brake Check (1st Movement)", value: "PRESSURE DROP CHECKED" },
    { label: "Flight Controls", value: "VERIFY CHECKED VIA ECAM F/CTL PAGE" },
    { label: "Taxi Speed Straight", value: "≤ 30 KT (REDUCE IN TURNS)" },
    { label: "Turns", value: "≤ 10 KT" },
    { label: "Single-Engine Taxi", value: "TAXI-IN ONLY, AFTER ENG COOL-DOWN" },
  ],
},
{
  title: "Before Take-Off",
  subtitle: "Up to the Line",
  items: [
    { label: "ECAM Status", value: "CHECKED" },
    { label: "Flight Controls", value: "CHECKED (IF NOT DONE)" },
    { label: "FMA", value: "MAN FLEX/TOGA | SRS | RWY (NAV BLUE)" },
    { label: "Flaps Setting", value: "CONFIRMED (1+F, 2 OR 3)" },
    { label: "V1 / VR / V2 & FLEX", value: "ANNOUNCED" },
    { label: "Trim", value: "RE-CHECK" },
    { label: "Cabin", value: "SECURE" },
  ],
},
{
  title: "Before Take-Off",
  subtitle: "Below the Line",
  items: [
    { label: "TCAS", value: "TA/RA" },
    { label: "PACK 1 & 2", value: "AS BRIEFED (DEFAULT ON; OFF IF PERF-LIMITED)" },
    { label: "Strobes / RWY Turnoff / Nose Light", value: "ON / T.O." },
    { label: "Brake Temp", value: "CHECK ≤ 300 °C" },
    { label: "T.O. CONFIG", value: "TEST - NO ECAM WARNING" },
    { label: "Completion Call", value: "CABIN READY, BTL COMPLETE" },
  ],
},
{
  title: "T.O. Roll & Initial Climb",
  subtitle: "Call-Out Memory",
  items: [
    { label: "Thrust Set", value: "PF \"FLEX SET\" OR \"TOGA SET\"" },
    { label: "Airspeed Alive (~50 KT)", value: "PM \"AIRSPEED ALIVE\"" },
    { label: "PM \"100 KNOTS\"", value: "PF \"CHECKED\"" },
    { label: "PM \"V1\" (A optional)", value: "PF (HANDS OFF REVERSER GUARDS)" },
    { label: "PM \"ROTATE\"", value: "PF ROTATE TO ~15° TGT (SRS BAR)" },
    { label: "PM \"POSITIVE CLIMB\"", value: "PF \"GEAR UP\"" },
  ],
},
{
  title: "After Take-Off / Climb",
  items: [
    { label: "THR RED ALT", value: "LVR CLB - SET CLIMB THRUST", strong: true },
    { label: "ACC ALT", value: "SRS DROPS, ACCELERATE & RETRACT FLAPS" },
    { label: "F-Speed", value: "FLAPS 1" },
    { label: "S-Speed", value: "FLAPS UP, GREEN DOT" },
    { label: "At TRANS ALT (CLIMB)", value: "ALTIMETER STD - SET BOTH" },
    { label: "10 000 FT", value: "\"10 000 - LANDING LIGHTS OFF\" (AS APPLICABLE)" },
  ],
},
{
  title: "Cruise (Hourly)",
  items: [
    { label: "Fuel Check", value: "FOB VS FPL (±300 KG)" },
    { label: "Systems", value: "ECAM MEMO GREEN" },
    { label: "Waypoint Sequence", value: "NEXT & ETA COMPARE" },
  ],
},
{
  title: "Descent Preparation",
  items: [
    { label: "ATIS / STAR", value: "RECEIVED & INSERTED" },
    { label: "Approach Briefing", value: "COMPLETED" },
    { label: "PERF APPR Page", value: "QNH, TEMP, WIND, MDA/DA, TRANS LVL" },
    { label: "Minimums", value: "SET ON BARO/RADIO REF" },
    { label: "ECAM STATUS", value: "REVIEWED" },
  ],
},
{
  title: "Approach",
  items: [
    { label: "At TRANS LVL (DESCENT)", value: "ALTIMETER QNH - SET BOTH" },
    { label: "Minimums", value: "__ FT (DH/MDA)" },
    { label: "Approach Briefing", value: "CONFIRMED" },
    { label: "Seat Belts", value: "ON" },
    { label: "ENG MODE SEL", value: "IGN (IF ICING / HEAVY RAIN)" },
    { label: "Cabin Crew", value: "ADVISED" },
  ],
},
{
  title: "Landing",
  items: [
    { label: "Final Approach Config", value: "GEAR DOWN, CONF FULL (OR 3), SPLR ARM" },
    { label: "1 000 FT (IMC)", value: "PM \"STABILIZED\" OR \"GO AROUND\"" },
    { label: "500 FT (VMC)", value: "PM \"STABILIZED\" - FINAL SCAN" },
    { label: "(A) \"FIFTY, FORTY, THIRTY, TWENTY, TEN\"", value: "PF FLARE & ALIGN" },
    { label: "(A) \"RETARD\" AT 20 FT (10 FT AUTOLAND)", value: "PF THRUST LEVERS - IDLE", strong: true },
    { label: "Touchdown", value: "REVERSERS - AS BRIEFED" },
  ],
},
{
  title: "After Landing",
  items: [
    { label: "Spoilers", value: "DISARM" },
    { label: "Flaps", value: "RETRACT" },
    { label: "APU", value: "START (IF REQ)" },
    { label: "Radar & PWS", value: "OFF" },
    { label: "TCAS", value: "STBY" },
    { label: "Completion Call", value: "AFTER-LANDING COMPLETE" },
  ],
},
{
  title: "Shutdown",
  items: [
    { label: "Parking Brake", value: "SET", strong: true },
    { label: "ENG Mode", value: "NORM" },
    { label: "ENG Master 1 & 2", value: "OFF" },
    { label: "Seat Belts", value: "OFF" },
    { label: "Beacon", value: "OFF" },
    { label: "HYD PTU", value: "OFF" },
    { label: "Fuel Pumps", value: "OFF" },
  ],
},
{
  title: "Securing the Aircraft",
  items: [
    { label: "ADIRS", value: "OFF (IF >3 H)" },
    { label: "EXT PWR", value: "OFF / GPU CONNECTED" },
    { label: "Oxy Masks", value: "STOWED" },
    { label: "Post-Flight Report", value: "SENT", strong: true },
  ],
},
]}
/>

### Cautions & Notes

<Warning>
  **Aborted Start** - ENG MASTER OFF, ENG MODE to CRANK, dry crank 30 s then 30 s rest before re-attempt.
</Warning>

<Note>
  **Taxi** - Brake check at first movement: *"Brakes checked, pressure normal"*.
</Note>

<Note>
  **Landing** - Reverse to idle at 70 kt, stowed by taxi speed. Autobrake disconnects automatically when crew applies manual braking.
</Note>

<Note>
  **ENG 1 First Start** - Current Airbus SOP (effective 2025) starts ENG 1 first, then ENG 2. This aligns with single-engine taxi-out flow and lets PM perform the start independently while PF focuses on taxi. Verify Yellow hydraulic accumulator pressure (parking brake) before pushback - Yellow is normally pressurised by ENG 2 EDP, so the accumulator must hold until ENG 2 is started.
</Note>

***

## Abnormal / Memory Items (Extract)

### ENGINE FIRE or SEVERE DAMAGE (In-Flight)

| Step | Action                                                                                       |
| ---- | -------------------------------------------------------------------------------------------- |
| 1    | **Thrust lever (affected)** -> IDLE                                                          |
| 2    | **ENG MASTER (affected)** -> OFF                                                             |
| 3    | **ENG FIRE pushbutton (affected)** -> PUSH (isolates fuel, electrical, hydraulic, pneumatic) |
| 4    | Wait 10 s, then **AGENT 1** -> DISCH (if FIRE light still on)                                |
| 5    | If FIRE persists after 30 s -> **AGENT 2** -> DISCH                                          |
| 6    | ATC notify, ECAM actions, divert                                                             |

### EMERGENCY DESCENT

| Item               | Action                                         |
| ------------------ | ---------------------------------------------- |
| **Crew OXY masks** | USE / 100 %                                    |
| Crew Communication | ESTABLISHED                                    |
| SIGNS              | ON                                             |
| ATC                | NOTIFY ("MAYDAY EMER DESCENT")                 |
| ALT Selector       | 10 000 ft or MEA / MORA (whichever is higher)  |
| Heading / Track    | TURN AS REQD                                   |
| Speed Brakes       | FULL                                           |
| **Speed**          | M.78 / 320 kt (NOT to exceed MMO/VMO 0.82/350) |
| Engines            | IDLE                                           |
| Transponder        | 7700                                           |

*(Reference QRH for full procedure.)*

***

## Quick-Reference Speeds (A320-CEO)

All Airbus characteristic speeds are weight-dependent and computed by the FMGC; the values below describe what each speed represents, not a fixed number.

| Speed     | Meaning                                                                            |
| --------- | ---------------------------------------------------------------------------------- |
| Green Dot | Engine-out best L/D in clean config (FMGC-computed, typically \~200-220 kt at MLW) |
| S         | Minimum slat-retraction speed in CONF 1 (\~1.22-1.25 Vs of clean)                  |
| F         | Minimum flap-retraction speed in CONF 2/3 (\~1.18-1.22 Vs of CONF 1+F)             |
| VLS       | Lowest selectable speed (1.13 Vs in landing config)                                |
| VAPP      | VLS + wind correction (typically +5 to +15 kt)                                     |
| VFE       | Maximum flap-extended speed for current config (PFD upper amber band)              |

***

### Revision History

| Rev | Date        | Note                                                                                                                   | Author    |
| --- | ----------- | ---------------------------------------------------------------------------------------------------------------------- | --------- |
| 1.0 | 14 May 2025 | Initial checklist issue                                                                                                | ACVA Team |
| 1.1 | 23 May 2026 | Accuracy pass: 100 kt callout, FMA modes, RETARD callout, THR RED vs ACC ALT, characteristic speeds, ENG FIRE sequence | ACVA Team |
| 1.2 | 23 May 2026 | Engine start order updated to ENG 1 first per current Airbus SOP (aligns with single-engine taxi-out flow)             | ACVA Team |
