← Back to team overview

kubuntu-council team mailing list archive

[Merge] ~waveform/ubuntu-manual-tests:noble-tests into ubuntu-manual-tests:main

 

Dave Jones has proposed merging ~waveform/ubuntu-manual-tests:noble-tests into ubuntu-manual-tests:main.

Commit message:
Add bluetooth and power LED checks to Pi server test-cases, and bluetooth checks to the Pi desktop test-cases; also tidies up a couple of references (like launching settings)

Requested reviews:
  Ubuntu Testcase Admins (ubuntu-testcase)

For more details, see:
https://code.launchpad.net/~waveform/ubuntu-manual-tests/+git/ubuntu-manual-tests/+merge/464108
-- 
Your team Ubuntu Testcase Admins is requested to review the proposed merge of ~waveform/ubuntu-manual-tests:noble-tests into ubuntu-manual-tests:main.
diff --git a/definitions/pi_desktop_cases.xml b/definitions/pi_desktop_cases.xml
index a6a3824..cdd878b 100644
--- a/definitions/pi_desktop_cases.xml
+++ b/definitions/pi_desktop_cases.xml
@@ -24,6 +24,14 @@
 
   <ut:define name="post-install"></ut:define>
 
+  <ut:test id="power-led">
+    <dt>Watch the power LED</dt>
+      <dd>
+        Ensure it turns out at boot time, and stays lit as the kernel starts
+        (when the rainbow screen disappears)
+      </dd>
+  </ut:test>
+
   <ut:test id="startup-splash">
     <dt>Watch the boot screen</dt>
     <dd>Check that the Ubuntu logo, and spinner appear during boot time</dd>
@@ -115,7 +123,7 @@
 
   <ut:test id="ram-free">
     <dt>
-      Click the power icon at the top right of the screen, select Settings from
+      Launch Settings from
       the menu that appears, then "About" in the left panel of the window that
       appears
     </dt>
@@ -155,16 +163,18 @@
     <dt>
       Configure wifi via Network Manager
       <ul>
-        <li>Click the power icon at the top right of the screen</li>
-        <li>Select the WiFi entry from the menu and Select Network under that</li>
-        <li>Select your local WiFi network from the scan list</li>
+        <li>Launch settings</li>
+        <li>Select the WiFi entry from the menu</li>
+        <li>Select your local WiFi network from the visible networks list</li>
         <li>Enter the password for your local WiFi network when prompted</li>
         <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
           addr</code></li>
         <li>Check that a valid IP address is recorded on the <ut:var
           name="intf" /> interface</li>
+        <li>Disconnect ethernet, if any is plugged in</li>
         <li>Check <code>ping google.com</code> successfully pings a few times
           (<tt>Ctrl+C</tt> to cancel)</li>
+        <li>Reconnect ethernet, if it was connected before</li>
       </ul>
     </dt>
     <dd>
@@ -173,6 +183,28 @@
     </dd>
   </ut:test>
 
+  <ut:test id="bluetooth">
+    <dt>
+      Configure bluetooth and pair a device
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the Bluetooth entry from the menu (you must be on this page
+          for the Pi to be &quot;discoverable&quot;)</li>
+        <li>On another Bluetooth device (e.g. an Android phone) make sure it
+          is &quot;discoverable&quot; (e.g. on Android go into Bluetooth
+          settings)</li>
+        <li>Ensure the other device shows up in the &quot;Devices&quot; list
+          on the Bluetooth settings page, then select it</li>
+        <li>Confirm the pincode on both devices</li>
+        <li>Ensure the other device now shows as anything other that &quot;Not
+          Set Up&quot; in the &quot;Devices&quot; list</li>
+        </ul>
+      </dt>
+      <dd>
+        The Bluetooth interface can scan for, and pair with, another device
+      </dd>
+  </ut:test>
+
   <ut:test id="www-video">
     <dt>
       Start Firefox and play a YouTube video
@@ -199,6 +231,8 @@
         <li>Start a terminal session</li>
         <li>Run <code>wget https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4</code></li>
         <li>Once the download has completed, run <code>totem big_buck_bunny_720p_surround.mp4</code></li>
+        <li>The utility may prompt to install codecs; accept the recommendation
+          and install whatever codecs are required</li>
       </ul>
     </dt>
     <dd>
@@ -221,6 +255,7 @@
 
   <ut:case id="1745_RaspberryPi 4 4GB Desktop">
     <ut:define name="model">Raspberry Pi 4 4GB</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="startup-splash" />
     <ut:include ref="startup-sound" />
     <ut:include ref="startup-timezone" />
@@ -232,6 +267,7 @@
     <ut:incldue ref="dual-monitor" />
     <ut:include ref="ethernet"><ut:define name="intf">eth0</ut:define></ut:include>
     <ut:include ref="wifi"><ut:define name="intf">wlan0</ut:define></ut:include>
+    <ut:include ref="bluetooth" />
     <ut:include ref="www-video" />
     <ut:include ref="local-video" />
     <ut:include ref="lock-screen" />
@@ -239,6 +275,7 @@
 
   <ut:case id="1746_RaspberryPi 4 8GB Desktop">
     <ut:define name="model">Raspberry Pi 4 8GB</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="startup-splash" />
     <ut:include ref="startup-sound" />
     <ut:include ref="startup-timezone" />
@@ -250,6 +287,7 @@
     <ut:incldue ref="dual-monitor" />
     <ut:include ref="ethernet"><ut:define name="intf">eth0</ut:define></ut:include>
     <ut:include ref="wifi"><ut:define name="intf">wlan0</ut:define></ut:include>
+    <ut:include ref="bluetooth" />
     <ut:include ref="www-video" />
     <ut:include ref="local-video" />
     <ut:include ref="lock-screen" />
@@ -257,6 +295,7 @@
 
   <ut:case id="1747_RaspberryPi 400 Desktop">
     <ut:define name="model">Raspberry Pi 400</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="startup-splash" />
     <ut:include ref="startup-sound" />
     <ut:include ref="startup-timezone" />
@@ -268,6 +307,7 @@
     <ut:incldue ref="dual-monitor" />
     <ut:include ref="ethernet"><ut:define name="intf">eth0</ut:define></ut:include>
     <ut:include ref="wifi"><ut:define name="intf">wlan0</ut:define></ut:include>
+    <ut:include ref="bluetooth" />
     <ut:include ref="www-video" />
     <ut:include ref="local-video" />
     <ut:include ref="lock-screen" />
@@ -280,6 +320,7 @@
       (1st) partition and uncomment the <code>#dtoverlay=dwc2,dr_mode=host</code>
       line to ensure the USB ports on the IO board operate correctly</p>
     </ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="startup-splash" />
     <ut:include ref="startup-sound" />
     <ut:include ref="startup-timezone" />
@@ -291,6 +332,7 @@
     <ut:incldue ref="dual-monitor" />
     <ut:include ref="ethernet"><ut:define name="intf">eth0</ut:define></ut:include>
     <ut:include ref="wifi"><ut:define name="intf">wlan0</ut:define></ut:include>
+    <ut:include ref="bluetooth" />
     <ut:include ref="www-video" />
     <ut:include ref="local-video" />
     <ut:include ref="lock-screen" />
@@ -303,6 +345,7 @@
       (1st) partition and uncomment the <code>#dtoverlay=dwc2,dr_mode=host</code>
       line to ensure the USB ports on the IO board operate correctly</p>
     </ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="startup-splash" />
     <ut:include ref="startup-sound" />
     <ut:include ref="startup-timezone" />
@@ -314,6 +357,7 @@
     <ut:incldue ref="dual-monitor" />
     <ut:include ref="ethernet"><ut:define name="intf">eth0</ut:define></ut:include>
     <ut:include ref="wifi"><ut:define name="intf">wlan0</ut:define></ut:include>
+    <ut:include ref="bluetooth" />
     <ut:include ref="www-video" />
     <ut:include ref="local-video" />
     <ut:include ref="lock-screen" />
@@ -326,6 +370,7 @@
       (1st) partition and uncomment the <code>#dtoverlay=dwc2,dr_mode=host</code>
       line to ensure the USB ports on the IO board operate correctly</p>
     </ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="startup-splash" />
     <ut:include ref="startup-sound" />
     <ut:include ref="startup-timezone" />
@@ -337,6 +382,7 @@
     <ut:incldue ref="dual-monitor" />
     <ut:include ref="ethernet"><ut:define name="intf">eth0</ut:define></ut:include>
     <ut:include ref="wifi"><ut:define name="intf">wlan0</ut:define></ut:include>
+    <ut:include ref="bluetooth" />
     <ut:include ref="www-video" />
     <ut:include ref="local-video" />
     <ut:include ref="lock-screen" />
@@ -344,6 +390,7 @@
 
   <ut:case id="1791_RaspberryPi 5 4GB Desktop">
     <ut:define name="model">Raspberry Pi 5 4GB</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="startup-splash" />
     <ut:include ref="startup-sound" />
     <ut:include ref="startup-timezone" />
@@ -355,6 +402,7 @@
     <ut:incldue ref="dual-monitor" />
     <ut:include ref="ethernet"><ut:define name="intf">eth0</ut:define></ut:include>
     <ut:include ref="wifi"><ut:define name="intf">wlan0</ut:define></ut:include>
+    <ut:include ref="bluetooth" />
     <ut:include ref="www-video" />
     <ut:include ref="local-video" />
     <ut:include ref="lock-screen" />
@@ -362,6 +410,7 @@
 
   <ut:case id="1792_RaspberryPi 5 8GB Desktop">
     <ut:define name="model">Raspberry Pi 5 8GB</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="startup-splash" />
     <ut:include ref="startup-sound" />
     <ut:include ref="startup-timezone" />
@@ -373,6 +422,7 @@
     <ut:incldue ref="dual-monitor" />
     <ut:include ref="ethernet"><ut:define name="intf">eth0</ut:define></ut:include>
     <ut:include ref="wifi"><ut:define name="intf">wlan0</ut:define></ut:include>
+    <ut:include ref="bluetooth" />
     <ut:include ref="www-video" />
     <ut:include ref="local-video" />
     <ut:include ref="lock-screen" />
diff --git a/definitions/pi_server_cases.xml b/definitions/pi_server_cases.xml
index c7cb6b6..94cc3ca 100644
--- a/definitions/pi_server_cases.xml
+++ b/definitions/pi_server_cases.xml
@@ -23,6 +23,17 @@
   </ut:template>
 
   <ut:define name="post-install"></ut:define>
+  <ut:define name="actpwr"></ut:define>
+
+  <ut:test id="power-led">
+    <dt>
+      After powering on the machine, look at the power LED
+    </dt>
+    <dd>
+      The power LED illuminates and stays illuminated while the kernel continues
+      to boot. <ut:var name="actpwr" />
+    </dd>
+  </ut:test>
 
   <ut:test id="flash-kernel">
     <dt>
@@ -155,6 +166,34 @@
     </dd>
   </ut:test>
 
+  <ut:test id="bluetooth">
+    <dt>
+      Configure bluetooth, scan for, and pair, a device
+      <ul>
+        <li>Run <code>sudo bluetoothctl</code></li>
+        <li>Check bluetoothctl prints <code>Agent registered</code></li>
+        <li>Check the MAC address looks "real" (not some obviously blank
+          value like AA:AA:AA:AA:AA:AA)</li>
+        <li>Run <code>scan on</code></li>
+        <li>Make some other Bluetooth device visible for pairing (e.g. go into
+          Bluetooth settings on your Android phone)</li>
+        <li>Verify the other Bluetooth device appears in console output</li>
+          <li>Run <code>pair XX:XX:XX:XX:XX:XX</code>
+          where XX:XX:XX:XX:XX:XX is the other device's MAC address, as it
+          appears in scan output
+        </li>
+        <li>Verify the passcode on both devices</li>
+        <li>Check output includes "Pairing successful"</li>
+        <li>Disable scanning with <code>scan off</code></li>
+        <li>Exit tool with <code>quit</code></li>
+      </ul>
+    </dt>
+    <dd>
+      The Bluetooth interface should have a valid MAC address (not
+      AA:AA:AA:AA:AA:AA), can see and pair with another Bluetooth device.
+    </dd>
+  </ut:test>
+
   <ut:test id="audio">
     <dt>
       With <ut:var name="device" />, and an available MP3 file:
@@ -184,6 +223,7 @@
 
   <ut:case id="1711_RaspberryPi 4 2GB Post-install">
     <ut:define name="model">Raspberry Pi 4 2GB</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="flash-kernel" />
     <ut:include ref="reboot" />
     <ut:include ref="shutdown" />
@@ -211,6 +251,7 @@
 
   <ut:case id="1719_RaspberryPi 4 4GB Post-install">
     <ut:define name="model">Raspberry Pi 4 4GB</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="flash-kernel" />
     <ut:include ref="reboot" />
     <ut:include ref="shutdown" />
@@ -238,6 +279,7 @@
 
   <ut:case id="1720_RaspberryPi 4 8GB Post-install">
     <ut:define name="model">Raspberry Pi 4 8GB</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="flash-kernel" />
     <ut:include ref="reboot" />
     <ut:include ref="shutdown" />
@@ -265,6 +307,7 @@
 
   <ut:case id="1721_RaspberryPi 3B+ Post-install">
     <ut:define name="model">Raspberry Pi 3B+</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="flash-kernel" />
     <ut:include ref="reboot" />
     <ut:include ref="shutdown" />
@@ -285,6 +328,7 @@
 
   <ut:case id="1722_RaspberryPi 3B Post-install">
     <ut:define name="model">Raspberry Pi 3B</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="flash-kernel" />
     <ut:include ref="reboot" />
     <ut:include ref="shutdown" />
@@ -305,6 +349,7 @@
 
   <ut:case id="1723_RaspberryPi 3A+ Post-install">
     <ut:define name="model">Raspberry Pi 3A+</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="flash-kernel" />
     <ut:include ref="reboot" />
     <ut:include ref="shutdown" />
@@ -324,6 +369,7 @@
 
   <ut:case id="1724_RaspberryPi 2 Post-install">
     <ut:define name="model">Raspberry Pi 2</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="flash-kernel" />
     <ut:include ref="reboot" />
     <ut:include ref="shutdown" />
@@ -371,6 +417,7 @@
 
   <ut:case id="1740_RaspberryPi 400 Post-install">
     <ut:define name="model">Raspberry Pi 400</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="flash-kernel" />
     <ut:include ref="reboot" />
     <ut:include ref="shutdown" />
@@ -470,6 +517,12 @@
 
   <ut:case id="1752_RaspberryPi Zero 2 Post-install">
     <ut:define name="model">Raspberry Pi Zero 2</ut:define>
+    <ut:include ref="power-led">
+      <ut:define name="actpwr">
+        On the Pi Zero 2W, the LED may blink off periodically to show disk
+        activity, but should otherwise remain lit.
+      </ut:define>
+    </ut:include>
     <ut:include ref="flash-kernel" />
     <ut:include ref="reboot" />
     <ut:include ref="shutdown" />
@@ -485,6 +538,7 @@
 
   <ut:case id="1793_RaspberryPi 5 4GB Post-install">
     <ut:define name="model">Raspberry Pi 5 4GB</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="flash-kernel" />
     <ut:include ref="reboot" />
     <ut:include ref="shutdown" />
@@ -508,6 +562,7 @@
 
   <ut:case id="1794_RaspberryPi 5 8GB Post-install">
     <ut:define name="model">Raspberry Pi 5 8GB</ut:define>
+    <ut:include ref="power-led" />
     <ut:include ref="flash-kernel" />
     <ut:include ref="reboot" />
     <ut:include ref="shutdown" />
diff --git a/testcases/1711_RaspberryPi 4 2GB Post-install b/testcases/1711_RaspberryPi 4 2GB Post-install
new file mode 100644
index 0000000..536cb28
--- /dev/null
+++ b/testcases/1711_RaspberryPi 4 2GB Post-install
@@ -0,0 +1,229 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 4 2GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>
+      After powering on the machine, look at the power LED
+    </dt>
+    <dd>
+      The power LED illuminates and stays illuminated while the kernel continues
+      to boot. 
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi 4 2GB. It should be in the region of 1.6-1.8GB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB2 (black) ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB3 (blue) ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI0 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI0 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI0 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI1 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI1 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI1 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With a pair of headphones with a 3.5mm jack, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the headphone jack:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the headphone jack (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via netplan
+      <ul>
+        <li>Place the following in <code>/etc/netplan/wifi.yaml</code>
+        (substituting the SSID and password as necessary):</li>
+        <li><pre>
+      network:
+        version: 2
+          wifis:
+            wlan0:
+              dhcp4: true
+              access-points:
+                my-ssid-here:
+                  password: my-password-here</pre>
+        </li>
+        <li>Run <code>sudo netplan apply</code></li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1719_RaspberryPi 4 4GB Post-install b/testcases/1719_RaspberryPi 4 4GB Post-install
new file mode 100644
index 0000000..09684c9
--- /dev/null
+++ b/testcases/1719_RaspberryPi 4 4GB Post-install
@@ -0,0 +1,229 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 4 4GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>
+      After powering on the machine, look at the power LED
+    </dt>
+    <dd>
+      The power LED illuminates and stays illuminated while the kernel continues
+      to boot. 
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi 4 4GB. It should be in the region of 3.6-3.8GB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB2 (black) ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB3 (blue) ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI0 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI0 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI0 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI1 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI1 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI1 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With a pair of headphones with a 3.5mm jack, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the headphone jack:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the headphone jack (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via netplan
+      <ul>
+        <li>Place the following in <code>/etc/netplan/wifi.yaml</code>
+        (substituting the SSID and password as necessary):</li>
+        <li><pre>
+      network:
+        version: 2
+          wifis:
+            wlan0:
+              dhcp4: true
+              access-points:
+                my-ssid-here:
+                  password: my-password-here</pre>
+        </li>
+        <li>Run <code>sudo netplan apply</code></li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1720_RaspberryPi 4 8GB Post-install b/testcases/1720_RaspberryPi 4 8GB Post-install
new file mode 100644
index 0000000..d21815d
--- /dev/null
+++ b/testcases/1720_RaspberryPi 4 8GB Post-install
@@ -0,0 +1,229 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 4 8GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>
+      After powering on the machine, look at the power LED
+    </dt>
+    <dd>
+      The power LED illuminates and stays illuminated while the kernel continues
+      to boot. 
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi 4 8GB. It should be in the region of 7.6-7.8GB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB2 (black) ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB3 (blue) ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI0 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI0 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI0 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI1 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI1 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI1 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With a pair of headphones with a 3.5mm jack, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the headphone jack:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the headphone jack (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via netplan
+      <ul>
+        <li>Place the following in <code>/etc/netplan/wifi.yaml</code>
+        (substituting the SSID and password as necessary):</li>
+        <li><pre>
+      network:
+        version: 2
+          wifis:
+            wlan0:
+              dhcp4: true
+              access-points:
+                my-ssid-here:
+                  password: my-password-here</pre>
+        </li>
+        <li>Run <code>sudo netplan apply</code></li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1721_RaspberryPi 3B+ Post-install b/testcases/1721_RaspberryPi 3B+ Post-install
new file mode 100644
index 0000000..36a90a5
--- /dev/null
+++ b/testcases/1721_RaspberryPi 3B+ Post-install
@@ -0,0 +1,193 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 3B+.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>
+      After powering on the machine, look at the power LED
+    </dt>
+    <dd>
+      The power LED illuminates and stays illuminated while the kernel continues
+      to boot. 
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi 3B+. It should be in the region of 800-1000MB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB2 ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With a pair of headphones with a 3.5mm jack, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the headphone jack:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the headphone jack (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via netplan
+      <ul>
+        <li>Place the following in <code>/etc/netplan/wifi.yaml</code>
+        (substituting the SSID and password as necessary):</li>
+        <li><pre>
+      network:
+        version: 2
+          wifis:
+            wlan0:
+              dhcp4: true
+              access-points:
+                my-ssid-here:
+                  password: my-password-here</pre>
+        </li>
+        <li>Run <code>sudo netplan apply</code></li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1722_RaspberryPi 3B Post-install b/testcases/1722_RaspberryPi 3B Post-install
new file mode 100644
index 0000000..54525b3
--- /dev/null
+++ b/testcases/1722_RaspberryPi 3B Post-install
@@ -0,0 +1,193 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 3B.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>
+      After powering on the machine, look at the power LED
+    </dt>
+    <dd>
+      The power LED illuminates and stays illuminated while the kernel continues
+      to boot. 
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi 3B. It should be in the region of 800-1000MB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB2 ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With a pair of headphones with a 3.5mm jack, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the headphone jack:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the headphone jack (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via netplan
+      <ul>
+        <li>Place the following in <code>/etc/netplan/wifi.yaml</code>
+        (substituting the SSID and password as necessary):</li>
+        <li><pre>
+      network:
+        version: 2
+          wifis:
+            wlan0:
+              dhcp4: true
+              access-points:
+                my-ssid-here:
+                  password: my-password-here</pre>
+        </li>
+        <li>Run <code>sudo netplan apply</code></li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1723_RaspberryPi 3A+ Post-install b/testcases/1723_RaspberryPi 3A+ Post-install
new file mode 100644
index 0000000..71a6a95
--- /dev/null
+++ b/testcases/1723_RaspberryPi 3A+ Post-install
@@ -0,0 +1,178 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 3A+.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>
+      After powering on the machine, look at the power LED
+    </dt>
+    <dd>
+      The power LED illuminates and stays illuminated while the kernel continues
+      to boot. 
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi 3A+. It should be in the region of 300-500MB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB2 ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With a pair of headphones with a 3.5mm jack, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the headphone jack:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the headphone jack (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      Configure wifi via netplan
+      <ul>
+        <li>Place the following in <code>/etc/netplan/wifi.yaml</code>
+        (substituting the SSID and password as necessary):</li>
+        <li><pre>
+      network:
+        version: 2
+          wifis:
+            wlan0:
+              dhcp4: true
+              access-points:
+                my-ssid-here:
+                  password: my-password-here</pre>
+        </li>
+        <li>Run <code>sudo netplan apply</code></li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1724_RaspberryPi 2 Post-install b/testcases/1724_RaspberryPi 2 Post-install
new file mode 100644
index 0000000..d929308
--- /dev/null
+++ b/testcases/1724_RaspberryPi 2 Post-install
@@ -0,0 +1,164 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 2.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>
+      After powering on the machine, look at the power LED
+    </dt>
+    <dd>
+      The power LED illuminates and stays illuminated while the kernel continues
+      to boot. 
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi 2. It should be in the region of 800-1000MB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB2 ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With a pair of headphones with a 3.5mm jack, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the headphone jack:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the headphone jack (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1726_RaspberryPi CM3+ Post-install b/testcases/1726_RaspberryPi CM3+ Post-install
new file mode 100644
index 0000000..4778a1c
--- /dev/null
+++ b/testcases/1726_RaspberryPi CM3+ Post-install
@@ -0,0 +1,114 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi Compute Module 3+.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi Compute Module 3+. It should be in the region of 800-1000MB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB2 ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1727_RaspberryPi CM3+ Lite Post-install b/testcases/1727_RaspberryPi CM3+ Lite Post-install
new file mode 100644
index 0000000..647afc5
--- /dev/null
+++ b/testcases/1727_RaspberryPi CM3+ Lite Post-install
@@ -0,0 +1,114 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi Compute Module 3+ Lite.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi Compute Module 3+ Lite. It should be in the region of 800-1000MB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB2 ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1740_RaspberryPi 400 Post-install b/testcases/1740_RaspberryPi 400 Post-install
new file mode 100644
index 0000000..9f3005a
--- /dev/null
+++ b/testcases/1740_RaspberryPi 400 Post-install
@@ -0,0 +1,187 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 400.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>
+      After powering on the machine, look at the power LED
+    </dt>
+    <dd>
+      The power LED illuminates and stays illuminated while the kernel continues
+      to boot. 
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi 400. It should be in the region of 3.6-3.8GB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI0 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI0 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI0 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI1 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI1 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI1 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via netplan
+      <ul>
+        <li>Place the following in <code>/etc/netplan/wifi.yaml</code>
+        (substituting the SSID and password as necessary):</li>
+        <li><pre>
+      network:
+        version: 2
+          wifis:
+            wlan0:
+              dhcp4: true
+              access-points:
+                my-ssid-here:
+                  password: my-password-here</pre>
+        </li>
+        <li>Run <code>sudo netplan apply</code></li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1741_RaspberryPi CM4 2GB Post-install b/testcases/1741_RaspberryPi CM4 2GB Post-install
new file mode 100644
index 0000000..b5ac85d
--- /dev/null
+++ b/testcases/1741_RaspberryPi CM4 2GB Post-install
@@ -0,0 +1,182 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    <p>This test case is to be carried out on a Raspberry Pi Compute Module 4 2GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    
+      <p>Before booting your CM4 with the new image, edit config.txt on the boot
+      (1st) partition and uncomment the <code>#dtoverlay=dwc2,dr_mode=host</code>
+      line to ensure the USB ports on the IO board operate correctly</p>
+    
+    <dl>
+      
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi Compute Module 4 2GB. It should be in the region of 1.6-1.8GB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI0 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI0 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI0 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI1 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI1 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI1 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via netplan
+      <ul>
+        <li>Place the following in <code>/etc/netplan/wifi.yaml</code>
+        (substituting the SSID and password as necessary):</li>
+        <li><pre>
+      network:
+        version: 2
+          wifis:
+            wlan0:
+              dhcp4: true
+              access-points:
+                my-ssid-here:
+                  password: my-password-here</pre>
+        </li>
+        <li>Run <code>sudo netplan apply</code></li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1742_RaspberryPi CM4 4GB Post-install b/testcases/1742_RaspberryPi CM4 4GB Post-install
new file mode 100644
index 0000000..4b7756d
--- /dev/null
+++ b/testcases/1742_RaspberryPi CM4 4GB Post-install
@@ -0,0 +1,182 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    <p>This test case is to be carried out on a Raspberry Pi Compute Module 4 4GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    
+      <p>Before booting your CM4 with the new image, edit config.txt on the boot
+      (1st) partition and uncomment the <code>#dtoverlay=dwc2,dr_mode=host</code>
+      line to ensure the USB ports on the IO board operate correctly</p>
+    
+    <dl>
+      
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi Compute Module 4 4GB. It should be in the region of 3.6-3.8GB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI0 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI0 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI0 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI1 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI1 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI1 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via netplan
+      <ul>
+        <li>Place the following in <code>/etc/netplan/wifi.yaml</code>
+        (substituting the SSID and password as necessary):</li>
+        <li><pre>
+      network:
+        version: 2
+          wifis:
+            wlan0:
+              dhcp4: true
+              access-points:
+                my-ssid-here:
+                  password: my-password-here</pre>
+        </li>
+        <li>Run <code>sudo netplan apply</code></li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1745_RaspberryPi 4 4GB Desktop b/testcases/1745_RaspberryPi 4 4GB Desktop
new file mode 100644
index 0000000..7495e01
--- /dev/null
+++ b/testcases/1745_RaspberryPi 4 4GB Desktop
@@ -0,0 +1,198 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_desktop_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 4 4GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>Watch the power LED</dt>
+      <dd>
+        Ensure it turns out at boot time, and stays lit as the kernel starts
+        (when the rainbow screen disappears)
+      </dd>
+  
+    
+    <dt>Watch the boot screen</dt>
+    <dd>Check that the Ubuntu logo, and spinner appear during boot time</dd>
+  
+    
+    <dt>
+      Ensure you have speakers on your monitor or headphones plugged into it
+    </dt>
+    <dd>
+      Check that the Ubuntu start up sound plays through the monitor's audio
+      output before the initial System Configuration appears
+    </dd>
+  
+    
+    <dt>Select your timezone, and click on the Continue button</dt>
+    <dd>The 'Who are you?' screen appears</dd>
+  
+    
+    <dt>
+      Input your initial user details and password
+      <em>admin</em> can not be used - it is a dedicated Linux User
+    </dt>
+    <dd>
+      Name, username and password are accepted. Login options and home folder
+      encryption choices shown
+    </dd>
+    <dd>Continue button becomes available</dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Restart..." from that
+      menu, and confirm "Restart" in the dialog that appears
+    </dt> <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Power Off..." from
+      that menu, and confirm "Power Off" in the dialog that appears
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Launch Settings from
+      the menu that appears, then "About" in the left panel of the window that
+      appears
+    </dt>
+    <dd>
+      Reported "Memory" is consistent with a Raspberry Pi 4 4GB.
+      It should be in the region of 3.6-3.8GB.
+    </dd>
+  
+    <ns0:incldue ref="dual-monitor"></ns0:incldue>
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via Network Manager
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the WiFi entry from the menu</li>
+        <li>Select your local WiFi network from the visible networks list</li>
+        <li>Enter the password for your local WiFi network when prompted</li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Disconnect ethernet, if any is plugged in</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+        <li>Reconnect ethernet, if it was connected before</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure bluetooth and pair a device
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the Bluetooth entry from the menu (you must be on this page
+          for the Pi to be "discoverable")</li>
+        <li>On another Bluetooth device (e.g. an Android phone) make sure it
+          is "discoverable" (e.g. on Android go into Bluetooth
+          settings)</li>
+        <li>Ensure the other device shows up in the "Devices" list
+          on the Bluetooth settings page, then select it</li>
+        <li>Confirm the pincode on both devices</li>
+        <li>Ensure the other device now shows as anything other that "Not
+          Set Up" in the "Devices" list</li>
+        </ul>
+      </dt>
+      <dd>
+        The Bluetooth interface can scan for, and pair with, another device
+      </dd>
+  
+    
+    <dt>
+      Start Firefox and play a YouTube video
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Click on the Firefox icon on the left of the screen</li>
+        <li>Navigate to <a href="https://youtube.com";>YouTube</a></li>
+        <li>Select a video (with audio!) to play</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Download and play BigBuckBunny in the built-in video player
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Start a terminal session</li>
+        <li>Run <code>wget https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4</code></li>
+        <li>Once the download has completed, run <code>totem big_buck_bunny_720p_surround.mp4</code></li>
+        <li>The utility may prompt to install codecs; accept the recommendation
+          and install whatever codecs are required</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Press <tt>Super+L</tt> and wait for the lock screen to appear, then
+      fade, then for the monitor to suspend. Move the mouse to wake up the
+      monitor, then enter your password to unlock the desktop.
+    </dt>
+    <dd>
+      Ensure the monitor suspends correctly, that it awakens again correctly,
+      and that the desktop unlocks successfully (without the system hanging).
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1746_RaspberryPi 4 8GB Desktop b/testcases/1746_RaspberryPi 4 8GB Desktop
new file mode 100644
index 0000000..82ab0f3
--- /dev/null
+++ b/testcases/1746_RaspberryPi 4 8GB Desktop
@@ -0,0 +1,198 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_desktop_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 4 8GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>Watch the power LED</dt>
+      <dd>
+        Ensure it turns out at boot time, and stays lit as the kernel starts
+        (when the rainbow screen disappears)
+      </dd>
+  
+    
+    <dt>Watch the boot screen</dt>
+    <dd>Check that the Ubuntu logo, and spinner appear during boot time</dd>
+  
+    
+    <dt>
+      Ensure you have speakers on your monitor or headphones plugged into it
+    </dt>
+    <dd>
+      Check that the Ubuntu start up sound plays through the monitor's audio
+      output before the initial System Configuration appears
+    </dd>
+  
+    
+    <dt>Select your timezone, and click on the Continue button</dt>
+    <dd>The 'Who are you?' screen appears</dd>
+  
+    
+    <dt>
+      Input your initial user details and password
+      <em>admin</em> can not be used - it is a dedicated Linux User
+    </dt>
+    <dd>
+      Name, username and password are accepted. Login options and home folder
+      encryption choices shown
+    </dd>
+    <dd>Continue button becomes available</dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Restart..." from that
+      menu, and confirm "Restart" in the dialog that appears
+    </dt> <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Power Off..." from
+      that menu, and confirm "Power Off" in the dialog that appears
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Launch Settings from
+      the menu that appears, then "About" in the left panel of the window that
+      appears
+    </dt>
+    <dd>
+      Reported "Memory" is consistent with a Raspberry Pi 4 8GB.
+      It should be in the region of 7.6-7.8GB.
+    </dd>
+  
+    <ns0:incldue ref="dual-monitor"></ns0:incldue>
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via Network Manager
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the WiFi entry from the menu</li>
+        <li>Select your local WiFi network from the visible networks list</li>
+        <li>Enter the password for your local WiFi network when prompted</li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Disconnect ethernet, if any is plugged in</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+        <li>Reconnect ethernet, if it was connected before</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure bluetooth and pair a device
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the Bluetooth entry from the menu (you must be on this page
+          for the Pi to be "discoverable")</li>
+        <li>On another Bluetooth device (e.g. an Android phone) make sure it
+          is "discoverable" (e.g. on Android go into Bluetooth
+          settings)</li>
+        <li>Ensure the other device shows up in the "Devices" list
+          on the Bluetooth settings page, then select it</li>
+        <li>Confirm the pincode on both devices</li>
+        <li>Ensure the other device now shows as anything other that "Not
+          Set Up" in the "Devices" list</li>
+        </ul>
+      </dt>
+      <dd>
+        The Bluetooth interface can scan for, and pair with, another device
+      </dd>
+  
+    
+    <dt>
+      Start Firefox and play a YouTube video
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Click on the Firefox icon on the left of the screen</li>
+        <li>Navigate to <a href="https://youtube.com";>YouTube</a></li>
+        <li>Select a video (with audio!) to play</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Download and play BigBuckBunny in the built-in video player
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Start a terminal session</li>
+        <li>Run <code>wget https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4</code></li>
+        <li>Once the download has completed, run <code>totem big_buck_bunny_720p_surround.mp4</code></li>
+        <li>The utility may prompt to install codecs; accept the recommendation
+          and install whatever codecs are required</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Press <tt>Super+L</tt> and wait for the lock screen to appear, then
+      fade, then for the monitor to suspend. Move the mouse to wake up the
+      monitor, then enter your password to unlock the desktop.
+    </dt>
+    <dd>
+      Ensure the monitor suspends correctly, that it awakens again correctly,
+      and that the desktop unlocks successfully (without the system hanging).
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1747_RaspberryPi 400 Desktop b/testcases/1747_RaspberryPi 400 Desktop
new file mode 100644
index 0000000..1d70b80
--- /dev/null
+++ b/testcases/1747_RaspberryPi 400 Desktop
@@ -0,0 +1,198 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_desktop_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 400.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>Watch the power LED</dt>
+      <dd>
+        Ensure it turns out at boot time, and stays lit as the kernel starts
+        (when the rainbow screen disappears)
+      </dd>
+  
+    
+    <dt>Watch the boot screen</dt>
+    <dd>Check that the Ubuntu logo, and spinner appear during boot time</dd>
+  
+    
+    <dt>
+      Ensure you have speakers on your monitor or headphones plugged into it
+    </dt>
+    <dd>
+      Check that the Ubuntu start up sound plays through the monitor's audio
+      output before the initial System Configuration appears
+    </dd>
+  
+    
+    <dt>Select your timezone, and click on the Continue button</dt>
+    <dd>The 'Who are you?' screen appears</dd>
+  
+    
+    <dt>
+      Input your initial user details and password
+      <em>admin</em> can not be used - it is a dedicated Linux User
+    </dt>
+    <dd>
+      Name, username and password are accepted. Login options and home folder
+      encryption choices shown
+    </dd>
+    <dd>Continue button becomes available</dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Restart..." from that
+      menu, and confirm "Restart" in the dialog that appears
+    </dt> <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Power Off..." from
+      that menu, and confirm "Power Off" in the dialog that appears
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Launch Settings from
+      the menu that appears, then "About" in the left panel of the window that
+      appears
+    </dt>
+    <dd>
+      Reported "Memory" is consistent with a Raspberry Pi 400.
+      It should be in the region of 3.6-3.8GB.
+    </dd>
+  
+    <ns0:incldue ref="dual-monitor"></ns0:incldue>
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via Network Manager
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the WiFi entry from the menu</li>
+        <li>Select your local WiFi network from the visible networks list</li>
+        <li>Enter the password for your local WiFi network when prompted</li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Disconnect ethernet, if any is plugged in</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+        <li>Reconnect ethernet, if it was connected before</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure bluetooth and pair a device
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the Bluetooth entry from the menu (you must be on this page
+          for the Pi to be "discoverable")</li>
+        <li>On another Bluetooth device (e.g. an Android phone) make sure it
+          is "discoverable" (e.g. on Android go into Bluetooth
+          settings)</li>
+        <li>Ensure the other device shows up in the "Devices" list
+          on the Bluetooth settings page, then select it</li>
+        <li>Confirm the pincode on both devices</li>
+        <li>Ensure the other device now shows as anything other that "Not
+          Set Up" in the "Devices" list</li>
+        </ul>
+      </dt>
+      <dd>
+        The Bluetooth interface can scan for, and pair with, another device
+      </dd>
+  
+    
+    <dt>
+      Start Firefox and play a YouTube video
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Click on the Firefox icon on the left of the screen</li>
+        <li>Navigate to <a href="https://youtube.com";>YouTube</a></li>
+        <li>Select a video (with audio!) to play</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Download and play BigBuckBunny in the built-in video player
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Start a terminal session</li>
+        <li>Run <code>wget https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4</code></li>
+        <li>Once the download has completed, run <code>totem big_buck_bunny_720p_surround.mp4</code></li>
+        <li>The utility may prompt to install codecs; accept the recommendation
+          and install whatever codecs are required</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Press <tt>Super+L</tt> and wait for the lock screen to appear, then
+      fade, then for the monitor to suspend. Move the mouse to wake up the
+      monitor, then enter your password to unlock the desktop.
+    </dt>
+    <dd>
+      Ensure the monitor suspends correctly, that it awakens again correctly,
+      and that the desktop unlocks successfully (without the system hanging).
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1748_RaspberryPi CM4 2GB Desktop b/testcases/1748_RaspberryPi CM4 2GB Desktop
new file mode 100644
index 0000000..9b2b69e
--- /dev/null
+++ b/testcases/1748_RaspberryPi CM4 2GB Desktop
@@ -0,0 +1,202 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_desktop_cases.xml
+-->
+
+    <p>This test case is to be carried out on a Raspberry Pi Compute Module 4 2GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    
+      <p>Before booting your CM4 with the new image, edit config.txt on the boot
+      (1st) partition and uncomment the <code>#dtoverlay=dwc2,dr_mode=host</code>
+      line to ensure the USB ports on the IO board operate correctly</p>
+    
+    <dl>
+      
+    
+    <dt>Watch the power LED</dt>
+      <dd>
+        Ensure it turns out at boot time, and stays lit as the kernel starts
+        (when the rainbow screen disappears)
+      </dd>
+  
+    
+    <dt>Watch the boot screen</dt>
+    <dd>Check that the Ubuntu logo, and spinner appear during boot time</dd>
+  
+    
+    <dt>
+      Ensure you have speakers on your monitor or headphones plugged into it
+    </dt>
+    <dd>
+      Check that the Ubuntu start up sound plays through the monitor's audio
+      output before the initial System Configuration appears
+    </dd>
+  
+    
+    <dt>Select your timezone, and click on the Continue button</dt>
+    <dd>The 'Who are you?' screen appears</dd>
+  
+    
+    <dt>
+      Input your initial user details and password
+      <em>admin</em> can not be used - it is a dedicated Linux User
+    </dt>
+    <dd>
+      Name, username and password are accepted. Login options and home folder
+      encryption choices shown
+    </dd>
+    <dd>Continue button becomes available</dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Restart..." from that
+      menu, and confirm "Restart" in the dialog that appears
+    </dt> <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Power Off..." from
+      that menu, and confirm "Power Off" in the dialog that appears
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Launch Settings from
+      the menu that appears, then "About" in the left panel of the window that
+      appears
+    </dt>
+    <dd>
+      Reported "Memory" is consistent with a Raspberry Pi Compute Module 4 2GB.
+      It should be in the region of 1.6-1.8GB.
+    </dd>
+  
+    <ns0:incldue ref="dual-monitor"></ns0:incldue>
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via Network Manager
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the WiFi entry from the menu</li>
+        <li>Select your local WiFi network from the visible networks list</li>
+        <li>Enter the password for your local WiFi network when prompted</li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Disconnect ethernet, if any is plugged in</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+        <li>Reconnect ethernet, if it was connected before</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure bluetooth and pair a device
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the Bluetooth entry from the menu (you must be on this page
+          for the Pi to be "discoverable")</li>
+        <li>On another Bluetooth device (e.g. an Android phone) make sure it
+          is "discoverable" (e.g. on Android go into Bluetooth
+          settings)</li>
+        <li>Ensure the other device shows up in the "Devices" list
+          on the Bluetooth settings page, then select it</li>
+        <li>Confirm the pincode on both devices</li>
+        <li>Ensure the other device now shows as anything other that "Not
+          Set Up" in the "Devices" list</li>
+        </ul>
+      </dt>
+      <dd>
+        The Bluetooth interface can scan for, and pair with, another device
+      </dd>
+  
+    
+    <dt>
+      Start Firefox and play a YouTube video
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Click on the Firefox icon on the left of the screen</li>
+        <li>Navigate to <a href="https://youtube.com";>YouTube</a></li>
+        <li>Select a video (with audio!) to play</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Download and play BigBuckBunny in the built-in video player
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Start a terminal session</li>
+        <li>Run <code>wget https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4</code></li>
+        <li>Once the download has completed, run <code>totem big_buck_bunny_720p_surround.mp4</code></li>
+        <li>The utility may prompt to install codecs; accept the recommendation
+          and install whatever codecs are required</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Press <tt>Super+L</tt> and wait for the lock screen to appear, then
+      fade, then for the monitor to suspend. Move the mouse to wake up the
+      monitor, then enter your password to unlock the desktop.
+    </dt>
+    <dd>
+      Ensure the monitor suspends correctly, that it awakens again correctly,
+      and that the desktop unlocks successfully (without the system hanging).
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1749_RaspberryPi CM4 4GB Desktop b/testcases/1749_RaspberryPi CM4 4GB Desktop
new file mode 100644
index 0000000..1d06149
--- /dev/null
+++ b/testcases/1749_RaspberryPi CM4 4GB Desktop
@@ -0,0 +1,202 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_desktop_cases.xml
+-->
+
+    <p>This test case is to be carried out on a Raspberry Pi Compute Module 4 4GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    
+      <p>Before booting your CM4 with the new image, edit config.txt on the boot
+      (1st) partition and uncomment the <code>#dtoverlay=dwc2,dr_mode=host</code>
+      line to ensure the USB ports on the IO board operate correctly</p>
+    
+    <dl>
+      
+    
+    <dt>Watch the power LED</dt>
+      <dd>
+        Ensure it turns out at boot time, and stays lit as the kernel starts
+        (when the rainbow screen disappears)
+      </dd>
+  
+    
+    <dt>Watch the boot screen</dt>
+    <dd>Check that the Ubuntu logo, and spinner appear during boot time</dd>
+  
+    
+    <dt>
+      Ensure you have speakers on your monitor or headphones plugged into it
+    </dt>
+    <dd>
+      Check that the Ubuntu start up sound plays through the monitor's audio
+      output before the initial System Configuration appears
+    </dd>
+  
+    
+    <dt>Select your timezone, and click on the Continue button</dt>
+    <dd>The 'Who are you?' screen appears</dd>
+  
+    
+    <dt>
+      Input your initial user details and password
+      <em>admin</em> can not be used - it is a dedicated Linux User
+    </dt>
+    <dd>
+      Name, username and password are accepted. Login options and home folder
+      encryption choices shown
+    </dd>
+    <dd>Continue button becomes available</dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Restart..." from that
+      menu, and confirm "Restart" in the dialog that appears
+    </dt> <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Power Off..." from
+      that menu, and confirm "Power Off" in the dialog that appears
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Launch Settings from
+      the menu that appears, then "About" in the left panel of the window that
+      appears
+    </dt>
+    <dd>
+      Reported "Memory" is consistent with a Raspberry Pi Compute Module 4 4GB.
+      It should be in the region of 3.6-3.8GB.
+    </dd>
+  
+    <ns0:incldue ref="dual-monitor"></ns0:incldue>
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via Network Manager
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the WiFi entry from the menu</li>
+        <li>Select your local WiFi network from the visible networks list</li>
+        <li>Enter the password for your local WiFi network when prompted</li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Disconnect ethernet, if any is plugged in</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+        <li>Reconnect ethernet, if it was connected before</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure bluetooth and pair a device
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the Bluetooth entry from the menu (you must be on this page
+          for the Pi to be "discoverable")</li>
+        <li>On another Bluetooth device (e.g. an Android phone) make sure it
+          is "discoverable" (e.g. on Android go into Bluetooth
+          settings)</li>
+        <li>Ensure the other device shows up in the "Devices" list
+          on the Bluetooth settings page, then select it</li>
+        <li>Confirm the pincode on both devices</li>
+        <li>Ensure the other device now shows as anything other that "Not
+          Set Up" in the "Devices" list</li>
+        </ul>
+      </dt>
+      <dd>
+        The Bluetooth interface can scan for, and pair with, another device
+      </dd>
+  
+    
+    <dt>
+      Start Firefox and play a YouTube video
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Click on the Firefox icon on the left of the screen</li>
+        <li>Navigate to <a href="https://youtube.com";>YouTube</a></li>
+        <li>Select a video (with audio!) to play</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Download and play BigBuckBunny in the built-in video player
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Start a terminal session</li>
+        <li>Run <code>wget https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4</code></li>
+        <li>Once the download has completed, run <code>totem big_buck_bunny_720p_surround.mp4</code></li>
+        <li>The utility may prompt to install codecs; accept the recommendation
+          and install whatever codecs are required</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Press <tt>Super+L</tt> and wait for the lock screen to appear, then
+      fade, then for the monitor to suspend. Move the mouse to wake up the
+      monitor, then enter your password to unlock the desktop.
+    </dt>
+    <dd>
+      Ensure the monitor suspends correctly, that it awakens again correctly,
+      and that the desktop unlocks successfully (without the system hanging).
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1750_RaspberryPi CM4 8GB Desktop b/testcases/1750_RaspberryPi CM4 8GB Desktop
new file mode 100644
index 0000000..d43f40c
--- /dev/null
+++ b/testcases/1750_RaspberryPi CM4 8GB Desktop
@@ -0,0 +1,202 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_desktop_cases.xml
+-->
+
+    <p>This test case is to be carried out on a Raspberry Pi Compute Module 4 8GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    
+      <p>Before booting your CM4 with the new image, edit config.txt on the boot
+      (1st) partition and uncomment the <code>#dtoverlay=dwc2,dr_mode=host</code>
+      line to ensure the USB ports on the IO board operate correctly</p>
+    
+    <dl>
+      
+    
+    <dt>Watch the power LED</dt>
+      <dd>
+        Ensure it turns out at boot time, and stays lit as the kernel starts
+        (when the rainbow screen disappears)
+      </dd>
+  
+    
+    <dt>Watch the boot screen</dt>
+    <dd>Check that the Ubuntu logo, and spinner appear during boot time</dd>
+  
+    
+    <dt>
+      Ensure you have speakers on your monitor or headphones plugged into it
+    </dt>
+    <dd>
+      Check that the Ubuntu start up sound plays through the monitor's audio
+      output before the initial System Configuration appears
+    </dd>
+  
+    
+    <dt>Select your timezone, and click on the Continue button</dt>
+    <dd>The 'Who are you?' screen appears</dd>
+  
+    
+    <dt>
+      Input your initial user details and password
+      <em>admin</em> can not be used - it is a dedicated Linux User
+    </dt>
+    <dd>
+      Name, username and password are accepted. Login options and home folder
+      encryption choices shown
+    </dd>
+    <dd>Continue button becomes available</dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Restart..." from that
+      menu, and confirm "Restart" in the dialog that appears
+    </dt> <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Power Off..." from
+      that menu, and confirm "Power Off" in the dialog that appears
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Launch Settings from
+      the menu that appears, then "About" in the left panel of the window that
+      appears
+    </dt>
+    <dd>
+      Reported "Memory" is consistent with a Raspberry Pi Compute Module 4 8GB.
+      It should be in the region of 7.6-7.8GB.
+    </dd>
+  
+    <ns0:incldue ref="dual-monitor"></ns0:incldue>
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via Network Manager
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the WiFi entry from the menu</li>
+        <li>Select your local WiFi network from the visible networks list</li>
+        <li>Enter the password for your local WiFi network when prompted</li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Disconnect ethernet, if any is plugged in</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+        <li>Reconnect ethernet, if it was connected before</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure bluetooth and pair a device
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the Bluetooth entry from the menu (you must be on this page
+          for the Pi to be "discoverable")</li>
+        <li>On another Bluetooth device (e.g. an Android phone) make sure it
+          is "discoverable" (e.g. on Android go into Bluetooth
+          settings)</li>
+        <li>Ensure the other device shows up in the "Devices" list
+          on the Bluetooth settings page, then select it</li>
+        <li>Confirm the pincode on both devices</li>
+        <li>Ensure the other device now shows as anything other that "Not
+          Set Up" in the "Devices" list</li>
+        </ul>
+      </dt>
+      <dd>
+        The Bluetooth interface can scan for, and pair with, another device
+      </dd>
+  
+    
+    <dt>
+      Start Firefox and play a YouTube video
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Click on the Firefox icon on the left of the screen</li>
+        <li>Navigate to <a href="https://youtube.com";>YouTube</a></li>
+        <li>Select a video (with audio!) to play</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Download and play BigBuckBunny in the built-in video player
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Start a terminal session</li>
+        <li>Run <code>wget https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4</code></li>
+        <li>Once the download has completed, run <code>totem big_buck_bunny_720p_surround.mp4</code></li>
+        <li>The utility may prompt to install codecs; accept the recommendation
+          and install whatever codecs are required</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Press <tt>Super+L</tt> and wait for the lock screen to appear, then
+      fade, then for the monitor to suspend. Move the mouse to wake up the
+      monitor, then enter your password to unlock the desktop.
+    </dt>
+    <dd>
+      Ensure the monitor suspends correctly, that it awakens again correctly,
+      and that the desktop unlocks successfully (without the system hanging).
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1752_RaspberryPi Zero 2 Post-install b/testcases/1752_RaspberryPi Zero 2 Post-install
new file mode 100644
index 0000000..301278c
--- /dev/null
+++ b/testcases/1752_RaspberryPi Zero 2 Post-install
@@ -0,0 +1,148 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi Zero 2.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>
+      After powering on the machine, look at the power LED
+    </dt>
+    <dd>
+      The power LED illuminates and stays illuminated while the kernel continues
+      to boot. 
+        On the Pi Zero 2W, the LED may blink off periodically to show disk
+        activity, but should otherwise remain lit.
+      
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi Zero 2. It should be in the region of 300-500MB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI0 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI0 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI0 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      Configure wifi via netplan
+      <ul>
+        <li>Place the following in <code>/etc/netplan/wifi.yaml</code>
+        (substituting the SSID and password as necessary):</li>
+        <li><pre>
+      network:
+        version: 2
+          wifis:
+            wlan0:
+              dhcp4: true
+              access-points:
+                my-ssid-here:
+                  password: my-password-here</pre>
+        </li>
+        <li>Run <code>sudo netplan apply</code></li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1777_RaspberryPi CM4 8GB Post-install b/testcases/1777_RaspberryPi CM4 8GB Post-install
new file mode 100644
index 0000000..92c8d86
--- /dev/null
+++ b/testcases/1777_RaspberryPi CM4 8GB Post-install
@@ -0,0 +1,182 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    <p>This test case is to be carried out on a Raspberry Pi Compute Module 4 8GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    
+      <p>Before booting your CM4 with the new image, edit config.txt on the boot
+      (1st) partition and uncomment the <code>#dtoverlay=dwc2,dr_mode=host</code>
+      line to ensure the USB ports on the IO board operate correctly</p>
+    
+    <dl>
+      
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi Compute Module 4 8GB. It should be in the region of 7.6-7.8GB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI0 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI0 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI0 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI1 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI1 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI1 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via netplan
+      <ul>
+        <li>Place the following in <code>/etc/netplan/wifi.yaml</code>
+        (substituting the SSID and password as necessary):</li>
+        <li><pre>
+      network:
+        version: 2
+          wifis:
+            wlan0:
+              dhcp4: true
+              access-points:
+                my-ssid-here:
+                  password: my-password-here</pre>
+        </li>
+        <li>Run <code>sudo netplan apply</code></li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1791_RaspberryPi 5 4GB Desktop b/testcases/1791_RaspberryPi 5 4GB Desktop
new file mode 100644
index 0000000..5f8783b
--- /dev/null
+++ b/testcases/1791_RaspberryPi 5 4GB Desktop
@@ -0,0 +1,198 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_desktop_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 5 4GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>Watch the power LED</dt>
+      <dd>
+        Ensure it turns out at boot time, and stays lit as the kernel starts
+        (when the rainbow screen disappears)
+      </dd>
+  
+    
+    <dt>Watch the boot screen</dt>
+    <dd>Check that the Ubuntu logo, and spinner appear during boot time</dd>
+  
+    
+    <dt>
+      Ensure you have speakers on your monitor or headphones plugged into it
+    </dt>
+    <dd>
+      Check that the Ubuntu start up sound plays through the monitor's audio
+      output before the initial System Configuration appears
+    </dd>
+  
+    
+    <dt>Select your timezone, and click on the Continue button</dt>
+    <dd>The 'Who are you?' screen appears</dd>
+  
+    
+    <dt>
+      Input your initial user details and password
+      <em>admin</em> can not be used - it is a dedicated Linux User
+    </dt>
+    <dd>
+      Name, username and password are accepted. Login options and home folder
+      encryption choices shown
+    </dd>
+    <dd>Continue button becomes available</dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Restart..." from that
+      menu, and confirm "Restart" in the dialog that appears
+    </dt> <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Power Off..." from
+      that menu, and confirm "Power Off" in the dialog that appears
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Launch Settings from
+      the menu that appears, then "About" in the left panel of the window that
+      appears
+    </dt>
+    <dd>
+      Reported "Memory" is consistent with a Raspberry Pi 5 4GB.
+      It should be in the region of 3.6-3.8GB.
+    </dd>
+  
+    <ns0:incldue ref="dual-monitor"></ns0:incldue>
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via Network Manager
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the WiFi entry from the menu</li>
+        <li>Select your local WiFi network from the visible networks list</li>
+        <li>Enter the password for your local WiFi network when prompted</li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Disconnect ethernet, if any is plugged in</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+        <li>Reconnect ethernet, if it was connected before</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure bluetooth and pair a device
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the Bluetooth entry from the menu (you must be on this page
+          for the Pi to be "discoverable")</li>
+        <li>On another Bluetooth device (e.g. an Android phone) make sure it
+          is "discoverable" (e.g. on Android go into Bluetooth
+          settings)</li>
+        <li>Ensure the other device shows up in the "Devices" list
+          on the Bluetooth settings page, then select it</li>
+        <li>Confirm the pincode on both devices</li>
+        <li>Ensure the other device now shows as anything other that "Not
+          Set Up" in the "Devices" list</li>
+        </ul>
+      </dt>
+      <dd>
+        The Bluetooth interface can scan for, and pair with, another device
+      </dd>
+  
+    
+    <dt>
+      Start Firefox and play a YouTube video
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Click on the Firefox icon on the left of the screen</li>
+        <li>Navigate to <a href="https://youtube.com";>YouTube</a></li>
+        <li>Select a video (with audio!) to play</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Download and play BigBuckBunny in the built-in video player
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Start a terminal session</li>
+        <li>Run <code>wget https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4</code></li>
+        <li>Once the download has completed, run <code>totem big_buck_bunny_720p_surround.mp4</code></li>
+        <li>The utility may prompt to install codecs; accept the recommendation
+          and install whatever codecs are required</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Press <tt>Super+L</tt> and wait for the lock screen to appear, then
+      fade, then for the monitor to suspend. Move the mouse to wake up the
+      monitor, then enter your password to unlock the desktop.
+    </dt>
+    <dd>
+      Ensure the monitor suspends correctly, that it awakens again correctly,
+      and that the desktop unlocks successfully (without the system hanging).
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1792_RaspberryPi 5 8GB Desktop b/testcases/1792_RaspberryPi 5 8GB Desktop
new file mode 100644
index 0000000..6c08e63
--- /dev/null
+++ b/testcases/1792_RaspberryPi 5 8GB Desktop
@@ -0,0 +1,198 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_desktop_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 5 8GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>Watch the power LED</dt>
+      <dd>
+        Ensure it turns out at boot time, and stays lit as the kernel starts
+        (when the rainbow screen disappears)
+      </dd>
+  
+    
+    <dt>Watch the boot screen</dt>
+    <dd>Check that the Ubuntu logo, and spinner appear during boot time</dd>
+  
+    
+    <dt>
+      Ensure you have speakers on your monitor or headphones plugged into it
+    </dt>
+    <dd>
+      Check that the Ubuntu start up sound plays through the monitor's audio
+      output before the initial System Configuration appears
+    </dd>
+  
+    
+    <dt>Select your timezone, and click on the Continue button</dt>
+    <dd>The 'Who are you?' screen appears</dd>
+  
+    
+    <dt>
+      Input your initial user details and password
+      <em>admin</em> can not be used - it is a dedicated Linux User
+    </dt>
+    <dd>
+      Name, username and password are accepted. Login options and home folder
+      encryption choices shown
+    </dd>
+    <dd>Continue button becomes available</dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Restart..." from that
+      menu, and confirm "Restart" in the dialog that appears
+    </dt> <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Click the power icon at the top right of the screen, and expand the "Power
+      Off / Log Out" entry in the menu that appears, then "Power Off..." from
+      that menu, and confirm "Power Off" in the dialog that appears
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Launch Settings from
+      the menu that appears, then "About" in the left panel of the window that
+      appears
+    </dt>
+    <dd>
+      Reported "Memory" is consistent with a Raspberry Pi 5 8GB.
+      It should be in the region of 7.6-7.8GB.
+    </dd>
+  
+    <ns0:incldue ref="dual-monitor"></ns0:incldue>
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via Network Manager
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the WiFi entry from the menu</li>
+        <li>Select your local WiFi network from the visible networks list</li>
+        <li>Enter the password for your local WiFi network when prompted</li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Disconnect ethernet, if any is plugged in</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+        <li>Reconnect ethernet, if it was connected before</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure bluetooth and pair a device
+      <ul>
+        <li>Launch settings</li>
+        <li>Select the Bluetooth entry from the menu (you must be on this page
+          for the Pi to be "discoverable")</li>
+        <li>On another Bluetooth device (e.g. an Android phone) make sure it
+          is "discoverable" (e.g. on Android go into Bluetooth
+          settings)</li>
+        <li>Ensure the other device shows up in the "Devices" list
+          on the Bluetooth settings page, then select it</li>
+        <li>Confirm the pincode on both devices</li>
+        <li>Ensure the other device now shows as anything other that "Not
+          Set Up" in the "Devices" list</li>
+        </ul>
+      </dt>
+      <dd>
+        The Bluetooth interface can scan for, and pair with, another device
+      </dd>
+  
+    
+    <dt>
+      Start Firefox and play a YouTube video
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Click on the Firefox icon on the left of the screen</li>
+        <li>Navigate to <a href="https://youtube.com";>YouTube</a></li>
+        <li>Select a video (with audio!) to play</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Download and play BigBuckBunny in the built-in video player
+      <ul>
+        <li>Ensure you have functioning speakers / a headset plugged into your
+          monitor</li>
+        <li>Start a terminal session</li>
+        <li>Run <code>wget https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4</code></li>
+        <li>Once the download has completed, run <code>totem big_buck_bunny_720p_surround.mp4</code></li>
+        <li>The utility may prompt to install codecs; accept the recommendation
+          and install whatever codecs are required</li>
+      </ul>
+    </dt>
+    <dd>
+      Check the video plays smoothly, and that audio is output through the
+      monitor, or speakers / headset plugged into the monitor
+    </dd>
+  
+    
+    <dt>
+      Press <tt>Super+L</tt> and wait for the lock screen to appear, then
+      fade, then for the monitor to suspend. Move the mouse to wake up the
+      monitor, then enter your password to unlock the desktop.
+    </dt>
+    <dd>
+      Ensure the monitor suspends correctly, that it awakens again correctly,
+      and that the desktop unlocks successfully (without the system hanging).
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1793_RaspberryPi 5 4GB Post-install b/testcases/1793_RaspberryPi 5 4GB Post-install
new file mode 100644
index 0000000..7baf157
--- /dev/null
+++ b/testcases/1793_RaspberryPi 5 4GB Post-install
@@ -0,0 +1,203 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 5 4GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>
+      After powering on the machine, look at the power LED
+    </dt>
+    <dd>
+      The power LED illuminates and stays illuminated while the kernel continues
+      to boot. 
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi 5 4GB. It should be in the region of 3.6-3.8GB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB2 (black) ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB3 (blue) ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI0 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI0 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI0 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI1 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI1 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI1 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via netplan
+      <ul>
+        <li>Place the following in <code>/etc/netplan/wifi.yaml</code>
+        (substituting the SSID and password as necessary):</li>
+        <li><pre>
+      network:
+        version: 2
+          wifis:
+            wlan0:
+              dhcp4: true
+              access-points:
+                my-ssid-here:
+                  password: my-password-here</pre>
+        </li>
+        <li>Run <code>sudo netplan apply</code></li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file
diff --git a/testcases/1794_RaspberryPi 5 8GB Post-install b/testcases/1794_RaspberryPi 5 8GB Post-install
new file mode 100644
index 0000000..f981da6
--- /dev/null
+++ b/testcases/1794_RaspberryPi 5 8GB Post-install
@@ -0,0 +1,203 @@
+<!-- Please do not edit this file directly; it was generated with the
+     tools/test_case_gen script using the following configuration as input:
+     definitions/pi_server_cases.xml
+-->
+
+    
+    <p>This test case is to be carried out on a Raspberry Pi 5 8GB.</p>
+    <p>Follow the installation steps at <a href="https://ubuntu.com/download/iot/installation-media";>
+      IoT installation media</a>
+    </p>
+    <dl>
+      
+    
+    <dt>
+      After powering on the machine, look at the power LED
+    </dt>
+    <dd>
+      The power LED illuminates and stays illuminated while the kernel continues
+      to boot. 
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo flash-kernel</code>
+    </dt>
+    <dd>
+      Exit code is clean (0) and no error messages are reported
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo reboot</code>
+    </dt>
+    <dd>
+      System reboots successfully to a login prompt
+    </dd>
+  
+    
+    <dt>
+      Run <code>sudo shutdown -h now</code>
+    </dt>
+    <dd>
+      System shuts down in a reasonable time (less than a minute)
+    </dd>
+  
+    
+    <dt>
+      Check output of <code>free -h</code>
+    </dt>
+    <dd>
+      Reported "Mem" under "total" is consistent with a
+      Raspberry Pi 5 8GB. It should be in the region of 7.6-7.8GB.
+    </dd>
+  
+    
+    <dt>
+      Perform a large (300-600MB) file copy to USB storage
+      <ul>
+        <li>Generate a large (500MB) file: <code>dd if=/dev/urandom of=rubbish
+          bs=1M count=500</code></li>
+        <li>Insert a USB stick (appropriately sized) into a spare USB port</li>
+        <li>Make a mount directory: <code>sudo mkdir /mnt/stick</code></li>
+        <li>Mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (modify mount-point as necessary; check <code>sudo dmesg</code>
+          output if unsure)</li>
+        <li>Copy the file: <code>sudo cp rubbish /mnt/stick/</code></li>
+        <li>Unmount the stick: <code>sudo umount /mnt/stick</code></li>
+        <li>Remove the stick from the USB port</li>
+        <li>Re-insert the stick into the USB port</li>
+        <li>Re-mount the stick: <code>sudo mount /dev/sda1 /mnt/stick</code>
+          (again, adjust mount-point as necessary)</li>
+        <li>Compare the copied file to that on the stick: <code>cmp rubbish
+          /mnt/stick/rubbish</code></li>
+      </ul>
+    </dt>
+    <dd>
+      <code>cmp</code> returns 0 and outputs nothing indicating the files are
+      identical
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB2 (black) ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      Connect a USB keyboard to one of the USB3 (blue) ports
+    </dt>
+    <dd>
+      Verify that keys typed on the keyboard appear on the console
+    </dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI0 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI0 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI0 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      With an HDMI monitor that supports audio plugged into
+      the HDMI1 output, and an available MP3 file:
+      <ul>
+        <li>Install mpg321 and amixer with <code>sudo apt install mpg321
+          alsa-utils</code></li>
+        <li>Find the correct hardware output for the HDMI1 port:
+          <code>cat /proc/asound/cards</code> and note the number at the start
+          of the line for the HDMI1 port (usually 0 and possibly
+          1 for any connected monitor(s), and 1 or possibly 2 for the headphone
+          jack)</li>
+        <li>Attempt to play your MP3 file with: <code>mpg321 -o alsa -a
+          hw:<em>num</em>,0 <em>music.mp3</em></code> substituting
+          <em>num</em> for the number found during the previous step, and
+          <em>music.mp3</em> for your choice of MP3 file, e.g. <code>mpg321 -o
+          alsa -a hw:0,0 "Jeff Wayne - War of the
+          Worlds.mp3"</code></li>
+        <li>Use <tt>Ctrl+C</tt> to end playback early, if you wish</li>
+        <li>If you cannot hear anything, first check that the mixer's volume is
+          not set too low; run <code>alsamixer</code>, and adjust the volume
+          (<tt>J</tt> for down, <tt>K</tt> for up) before exiting
+          (<tt>Esc</tt>) and retrying playback</li>
+      </ul>
+    </dt>
+    <dd>Audio can be heard through the device</dd>
+  
+    
+    <dt>
+      Check auto-configuration of ethernet
+      <ul>
+        <li>Run <code>ip addr</code></li>
+        <li>Check that a valid IP address is recorded on the eth0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "eth0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+    
+    <dt>
+      Configure wifi via netplan
+      <ul>
+        <li>Place the following in <code>/etc/netplan/wifi.yaml</code>
+        (substituting the SSID and password as necessary):</li>
+        <li><pre>
+      network:
+        version: 2
+          wifis:
+            wlan0:
+              dhcp4: true
+              access-points:
+                my-ssid-here:
+                  password: my-password-here</pre>
+        </li>
+        <li>Run <code>sudo netplan apply</code></li>
+        <li>Wait a few seconds (to allow DHCP to complete), then run <code>ip
+          addr</code></li>
+        <li>Check that a valid IP address is recorded on the wlan0 interface</li>
+        <li>Check <code>ping google.com</code> successfully pings a few times
+          (<tt>Ctrl+C</tt> to cancel)</li>
+      </ul>
+    </dt>
+    <dd>
+      The "wlan0" interface should have a DHCP
+      assigned IP address and you should be able to ping google.com
+    </dd>
+  
+  
+    </dl>
+    <p>If <strong>all</strong> actions produce the expected results listed,
+      please <a href="results#add_result">submit</a> a 'passed' result.</p>
+    <p>If <strong>any</strong> action fails, or produces an unexpected result,
+      please <a href="results#add_result">submit</a> a 'failed' result and <a href="../../buginstructions">file a bug</a>. Please be sure to include
+      the bug number when you <a href="results#add_result">submit</a> your
+      result.</p>
+  
\ No newline at end of file

Follow ups