<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.moodle.org/dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Abgreeve</id>
	<title>MoodleDocs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.moodle.org/dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Abgreeve"/>
	<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/Special:Contributions/Abgreeve"/>
	<updated>2026-05-09T11:33:22Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_3.9.15_release_notes&amp;diff=62405</id>
		<title>Moodle 3.9.15 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_3.9.15_release_notes&amp;diff=62405"/>
		<updated>2022-05-20T07:00:57Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Copy of template for this version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Releases]] &amp;gt; Moodle 3.9.15 release notes&lt;br /&gt;
&lt;br /&gt;
Release date: Not yet released&lt;br /&gt;
&lt;br /&gt;
Here is [https://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=project+%3D+mdl+AND+resolution+%3D+fixed+AND+fixVersion+in+%28%223.9.15%22%29+ORDER+BY+priority+DESC&amp;amp;runQuery=true&amp;amp;clear=true the full list of fixed issues in 3.9.15].&lt;br /&gt;
&lt;br /&gt;
==General fixes and improvements==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Items to be added soon...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Security fixes==&lt;br /&gt;
&lt;br /&gt;
A number of security related issues were resolved. Details of these issues will be released after a period of approximately one week to allow system administrators to safely update to the latest version.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Moodle 3.9.14 release notes]]&lt;br /&gt;
&lt;br /&gt;
[[Category:DevDocs Migration]]&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Moodle 3.9]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Notes de version de Moodle 3.9]]&lt;br /&gt;
[[es:Notas de Moodle 3.9]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_3.11.8_release_notes&amp;diff=62404</id>
		<title>Moodle 3.11.8 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_3.11.8_release_notes&amp;diff=62404"/>
		<updated>2022-05-20T06:58:35Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Copy of template for this version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Releases]] &amp;gt; Moodle 3.11.8 release notes&lt;br /&gt;
&lt;br /&gt;
Release date: Not yet released&lt;br /&gt;
&lt;br /&gt;
Here is [https://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=project+%3D+mdl+AND+resolution+%3D+fixed+AND+fixVersion+in+%28%223.11.8%22%29+ORDER+BY+priority+DESC&amp;amp;runQuery=true&amp;amp;clear=true the full list of fixed issues in 3.11.8].&lt;br /&gt;
&lt;br /&gt;
==General fixes and improvements==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Items to be added soon...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Security fixes==&lt;br /&gt;
&lt;br /&gt;
A number of security related issues were resolved. Details of these issues will be released after a period of approximately one week to allow system administrators to safely update to the latest version.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Moodle 3.11.7 release notes]]&lt;br /&gt;
&lt;br /&gt;
[[Category:DevDocs Migration]]&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Moodle 3.11]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Notes de version de Moodle 3.11]]&lt;br /&gt;
[[es:Notas de Moodle 3.11]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0.2_release_notes&amp;diff=62403</id>
		<title>Moodle 4.0.2 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0.2_release_notes&amp;diff=62403"/>
		<updated>2022-05-20T06:54:39Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Copy of template for this version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Releases]] &amp;gt; Moodle 4.0.2 release notes&lt;br /&gt;
&lt;br /&gt;
Release date: Not yet released&lt;br /&gt;
&lt;br /&gt;
Here is [https://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=project+%3D+mdl+AND+resolution+%3D+fixed+AND+fixVersion+in+%28%224.0.2%22%29+ORDER+BY+priority+DESC&amp;amp;runQuery=true&amp;amp;clear=true the full list of fixed issues in 4.0.2].&lt;br /&gt;
&lt;br /&gt;
==General fixes and improvements==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Items to be added soon...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Security fixes==&lt;br /&gt;
&lt;br /&gt;
A number of security related issues were resolved. Details of these issues will be released after a period of approximately one week to allow system administrators to safely update to the latest version.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Moodle 4.0.1 release notes]]&lt;br /&gt;
&lt;br /&gt;
[[Category:DevDocs Migration]]&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Moodle 4.0]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Notes de version de Moodle 4.0]]&lt;br /&gt;
[[es:Notas de Moodle 4.0]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.1_release_notes&amp;diff=62402</id>
		<title>Moodle 4.1 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.1_release_notes&amp;diff=62402"/>
		<updated>2022-05-20T06:48:04Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Copy of template for this version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Releases]] &amp;gt; Moodle 4.1 release notes&lt;br /&gt;
&lt;br /&gt;
Release date: Not yet released&lt;br /&gt;
&lt;br /&gt;
Here is [https://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=project+%3D+mdl+AND+resolution+%3D+fixed+AND+fixVersion+in+%28%224.1%22%29+ORDER+BY+priority+DESC&amp;amp;runQuery=true&amp;amp;clear=true the full list of fixed issues in 4.1].&lt;br /&gt;
&lt;br /&gt;
==Server requirements==&lt;br /&gt;
&lt;br /&gt;
===Database requirements===&lt;br /&gt;
&lt;br /&gt;
==Client requirements==&lt;br /&gt;
&lt;br /&gt;
===Browser support===&lt;br /&gt;
Moodle is compatible with any standards compliant web browser. We regularly test Moodle with the following browsers:&lt;br /&gt;
&lt;br /&gt;
Desktop:&lt;br /&gt;
&lt;br /&gt;
* Chrome&lt;br /&gt;
* Firefox&lt;br /&gt;
* Safari&lt;br /&gt;
* Edge&lt;br /&gt;
&lt;br /&gt;
Note: Moodle 4.0 does NOT support Internet Explorer 11.&lt;br /&gt;
&lt;br /&gt;
Safari 7 and below has known compatibility issues with Moodle 4.0.&lt;br /&gt;
&lt;br /&gt;
Mobile:&lt;br /&gt;
&lt;br /&gt;
* MobileSafari&lt;br /&gt;
* Google Chrome&lt;br /&gt;
&lt;br /&gt;
For the best experience and optimum security, we recommend that you keep your browser up to date. &lt;br /&gt;
&lt;br /&gt;
==Major features==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Items to be added soon...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Other highlights==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Items to be added soon...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==For admins==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Items to be added soon...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==For developers==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Items to be added soon...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Security issues==&lt;br /&gt;
&lt;br /&gt;
A number of security related issues were resolved. Details of these issues will be released after a period of approximately one week to allow system administrators to safely update to the latest version.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Moodle 4.0 release notes]]&lt;br /&gt;
&lt;br /&gt;
[[Category:DevDocs Migration]]&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Moodle 4.1]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Notes de version de Moodle 4.1]]&lt;br /&gt;
[[es:Notas de Moodle 4.1]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=62366</id>
		<title>Releases</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=62366"/>
		<updated>2022-05-09T01:47:55Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* Moodle 3.10 support end */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all official releases of Moodle, grouped by branch in reverse chronological order.&lt;br /&gt;
==Version support==&lt;br /&gt;
From Moodle 2.6 onwards, the end of support, both general and security, happens the second Monday of May and November, observing the 12, 18... month periods, no matter if the major release date was moved or not.&lt;br /&gt;
&lt;br /&gt;
The most recent [https://en.wikipedia.org/wiki/Long-term_support long-term support release (LTS)] version is Moodle 3.9.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Version&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Release status&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Initial release&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:rgba(0, 0, 0, 0.05);&amp;quot; | General support ends&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Security support ends&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.9 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 15 June 2020&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 10 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 November 2023 (ext 6M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.11&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 17 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 14 Nov 2022 (ext 6M)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 Nov 2023 (ext 12M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |4.0&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |19 April 2022&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |8 May 2023&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |13 November 2023&lt;br /&gt;
|-&lt;br /&gt;
|4.1 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stable&lt;br /&gt;
|November 2022&lt;br /&gt;
|November 2023&lt;br /&gt;
|November 2025&lt;br /&gt;
|}&lt;br /&gt;
[[Image:401_release_graph.png|alt=Release graph]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Release graph key:&amp;lt;/b&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Currently supported stable releases.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | Current release of versions still receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Future point releases receiving bug fixes, as well as security updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#316d5e; color:white; adding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Future point releases receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#686566; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Previously released versions containing bug fixes, as well as security updates. Updating to a currently supported version is recommended.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#282828; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Previously released versions containing security updates only. Updating to a currently supported version is recommended.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==General release calendar==&lt;br /&gt;
These are the target dates for releases. These dates may vary slightly due to unforeseen circumstances.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Release type&lt;br /&gt;
!Frequency&lt;br /&gt;
!Months&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Major_release_cycles|Major]] (eg. 3.x)&lt;br /&gt;
|6 monthly&lt;br /&gt;
|Second Monday of May and November&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Stable_maintenance_cycles|Minor]] (Point) (eg. 3.x.y)&lt;br /&gt;
| 2 monthly&lt;br /&gt;
|Second Monday of July, September, November, March and May.&lt;br /&gt;
Third Monday of January.&lt;br /&gt;
|}&lt;br /&gt;
All releases are preceded by a one week warning. Upcoming release dates can be found in the [https://www.google.com/calendar/ical/moodle.com_p4c2oe7hsb77ltaro5qtihb5d4%40group.calendar.google.com/public/basic.ics Moodle development calendar] (Note, this is an iCAL link that will try to add the dates to your personal calendar. If you just want to browse the dates online, use [https://calendar.google.com/calendar/embed?src=moodle.com_p4c2oe7hsb77ltaro5qtihb5d4@group.calendar.google.com&amp;amp;pli=1 this link].).&lt;br /&gt;
&lt;br /&gt;
==Moodle 4.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 4.0&lt;br /&gt;
|19 April 2022&lt;br /&gt;
|2022041900&lt;br /&gt;
|[[Moodle 4.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/400/en/Upgrading Upgrading to 4.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 4.0.1&lt;br /&gt;
|9 May 2022&lt;br /&gt;
|2022041901&lt;br /&gt;
|[[Moodle 4.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 4.0.x will end 8 May 2023 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 4.0.x will end 13 November 2023 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.11==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11&lt;br /&gt;
|17 May 2021&lt;br /&gt;
|2021051700&lt;br /&gt;
|[[Moodle 3.11 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/311/en/Upgrading Upgrading to 3.11]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.1&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2021051701&lt;br /&gt;
|[[Moodle 3.11.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.2&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2021051702&lt;br /&gt;
|[[Moodle 3.11.2 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.3&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2021051703&lt;br /&gt;
|[[Moodle 3.11.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.4&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2021051704&lt;br /&gt;
|[[Moodle 3.11.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.5&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2021051705&lt;br /&gt;
|[[Moodle 3.11.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.6&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2021051706&lt;br /&gt;
|[[Moodle 3.11.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.7&lt;br /&gt;
|9 May 2022&lt;br /&gt;
|2021051707&lt;br /&gt;
|[[Moodle 3.11.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).&lt;br /&gt;
 Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.10==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020110900&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 3.10 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/310/en/Upgrading Upgrading to 3.10]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.1&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020110901&lt;br /&gt;
| [[Moodle 3.10.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.2&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020110902&lt;br /&gt;
|[[Moodle 3.10.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.3&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020110903&lt;br /&gt;
|[[Moodle 3.10.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.4&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020110904&lt;br /&gt;
|[[Moodle 3.10.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.5&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020110905&lt;br /&gt;
|[[Moodle 3.10.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.6&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020110906&lt;br /&gt;
|[[Moodle 3.10.6 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.7&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020110907&lt;br /&gt;
|[[Moodle 3.10.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.8&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2020110908&lt;br /&gt;
|[[Moodle 3.10.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.9&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2020110909&lt;br /&gt;
|[[Moodle 3.10.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.10&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2020110910&lt;br /&gt;
|[[Moodle 3.10.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.11&lt;br /&gt;
|9 May 2022&lt;br /&gt;
|2020110911&lt;br /&gt;
|[[Moodle 3.10.11 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.10.x ended 8 November 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.9 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9&lt;br /&gt;
|15 June 2020&lt;br /&gt;
|2020061500&lt;br /&gt;
|[[Moodle 3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/39/en/Upgrading Upgrading to 3.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.1&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2020061501&lt;br /&gt;
|[[Moodle 3.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.2&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2020061502&lt;br /&gt;
| [[Moodle 3.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.3&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020061503&lt;br /&gt;
| [[Moodle 3.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.4&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020061504&lt;br /&gt;
|[[Moodle 3.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.5&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020061505&lt;br /&gt;
|[[Moodle 3.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.6&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020061506&lt;br /&gt;
|[[Moodle 3.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.7&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020061507&lt;br /&gt;
|[[Moodle 3.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.8&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020061508&lt;br /&gt;
|[[Moodle 3.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.9&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020061509&lt;br /&gt;
|[[Moodle 3.9.9 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.10&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020061510&lt;br /&gt;
|[[Moodle 3.9.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.11&lt;br /&gt;
| 8 November 2021&lt;br /&gt;
|2020061511&lt;br /&gt;
|[[Moodle 3.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.12&lt;br /&gt;
| 17 January 2022&lt;br /&gt;
|2020061512&lt;br /&gt;
|[[Moodle 3.9.12 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.13&lt;br /&gt;
| 14 March 2022&lt;br /&gt;
|2020061513&lt;br /&gt;
|[[Moodle 3.9.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.14&lt;br /&gt;
| 9 May 2022&lt;br /&gt;
|2020061514&lt;br /&gt;
|[[Moodle 3.9.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.9.x ended 10 May 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.9.x will end 13 Nov 2023 (36 months plus 6 months extension).&lt;br /&gt;
==Moodle 3.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8&lt;br /&gt;
|18 November 2019&lt;br /&gt;
|2019111800&lt;br /&gt;
|[[Moodle 3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/38/en/Upgrading Upgrading to 3.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.1&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019111801&lt;br /&gt;
|[[Moodle 3.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.2&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019111802&lt;br /&gt;
|[[Moodle 3.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.3&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019111803&lt;br /&gt;
|[[Moodle 3.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.4&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019111804&lt;br /&gt;
|[[Moodle 3.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.5&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019111805&lt;br /&gt;
| [[Moodle 3.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.6&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019111806&lt;br /&gt;
| [[Moodle 3.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.7&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2019111807&lt;br /&gt;
|[[Moodle 3.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.8&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2019111808&lt;br /&gt;
|[[Moodle 3.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.9&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2019111809&lt;br /&gt;
|[[Moodle 3.8.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.8.x ended 9 November 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.8.x ended 10 May 2021 (18 months).&lt;br /&gt;
==Moodle 3.7==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7&lt;br /&gt;
|20 May 2019&lt;br /&gt;
|2019052000&lt;br /&gt;
|[[Moodle 3.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/37/en/Upgrading Upgrading to 3.7]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.1&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2019052001&lt;br /&gt;
|[[Moodle 3.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.2&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2019052002&lt;br /&gt;
|[[Moodle 3.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.3&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2019052003&lt;br /&gt;
| [[Moodle 3.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.4&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019052004&lt;br /&gt;
|[[Moodle 3.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.5&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019052005&lt;br /&gt;
|[[Moodle 3.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.6&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019052006&lt;br /&gt;
|[[Moodle 3.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.7&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019052007&lt;br /&gt;
|[[Moodle 3.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.8&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019052008&lt;br /&gt;
| [[Moodle 3.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.9&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019052009&lt;br /&gt;
|[[Moodle 3.7.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.7.x ended 11 May 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.7.x ended 9 November 2020 (18 months).&lt;br /&gt;
==Moodle 3.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6&lt;br /&gt;
| 3 December 2018&lt;br /&gt;
|2018120300&lt;br /&gt;
|[[Moodle 3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/36/en/Upgrading Upgrading to 3.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.1&lt;br /&gt;
|5 December 2018&lt;br /&gt;
|2018120301&lt;br /&gt;
| [[Moodle 3.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6.2&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018120302&lt;br /&gt;
|[[Moodle 3.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.3&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018120303&lt;br /&gt;
|[[Moodle 3.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.4&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018120304&lt;br /&gt;
|[[Moodle 3.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.5&lt;br /&gt;
|8th July 2019&lt;br /&gt;
|2018120305&lt;br /&gt;
|[[Moodle 3.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.6&lt;br /&gt;
|9th September 2019&lt;br /&gt;
|2018120306&lt;br /&gt;
|[[Moodle 3.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.7&lt;br /&gt;
| 11th November 2019&lt;br /&gt;
|2018120307&lt;br /&gt;
|[[Moodle 3.6.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.8&lt;br /&gt;
|13th January 2020&lt;br /&gt;
|2018120308&lt;br /&gt;
|[[Moodle 3.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.9&lt;br /&gt;
|9th March 2020&lt;br /&gt;
|2018120309&lt;br /&gt;
| [[Moodle 3.6.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.10&lt;br /&gt;
|11th May 2020&lt;br /&gt;
|2018120310&lt;br /&gt;
|[[Moodle 3.6.10 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.6.x ended 11 November 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.6.x ended 11 May 2020 (18 months).&lt;br /&gt;
==Moodle 3.5 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2018051700&lt;br /&gt;
|[[Moodle 3.5 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/35/en/Upgrading Upgrading to 3.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.1&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2018051701&lt;br /&gt;
|[[Moodle 3.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.2&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2018051702&lt;br /&gt;
|[[Moodle 3.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.3&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2018051703&lt;br /&gt;
| [[Moodle 3.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.4&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018051704&lt;br /&gt;
|[[Moodle 3.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.5&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018051705&lt;br /&gt;
|[[Moodle 3.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.6&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018051706&lt;br /&gt;
|[[Moodle 3.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.7&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2018051707&lt;br /&gt;
|[[Moodle 3.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.8&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2018051708&lt;br /&gt;
|[[Moodle 3.5.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.9&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2018051709&lt;br /&gt;
|[[Moodle 3.5.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.10&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2018051710&lt;br /&gt;
| [[Moodle 3.5.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.11&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2018051711&lt;br /&gt;
|[[Moodle 3.5.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.12&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2018051712&lt;br /&gt;
| [[Moodle 3.5.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.13&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2018051713&lt;br /&gt;
|[[Moodle 3.5.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.14&lt;br /&gt;
| 14 September 2020&lt;br /&gt;
|2018051714&lt;br /&gt;
|[[Moodle 3.5.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.15&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2018051715&lt;br /&gt;
|[[Moodle 3.5.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.16&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2018051716&lt;br /&gt;
| [[Moodle 3.5.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.17&lt;br /&gt;
|8 March 2021&lt;br /&gt;
| 2018051717&lt;br /&gt;
|[[Moodle 3.5.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.18&lt;br /&gt;
| 10 May 2021&lt;br /&gt;
| 2018051718&lt;br /&gt;
|[[Moodle 3.5.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.5.x ended May 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.5.x ended 10 May 2021 (36 months).&lt;br /&gt;
==Moodle 3.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017111300&lt;br /&gt;
|[[Moodle 3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/34/en/Upgrading Upgrading to 3.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.1&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017111301&lt;br /&gt;
|[[Moodle 3.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.2&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017111302&lt;br /&gt;
|[[Moodle 3.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.3&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017111303&lt;br /&gt;
|[[Moodle 3.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.4&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017111304&lt;br /&gt;
|[[Moodle 3.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.5&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017111305&lt;br /&gt;
|[[Moodle 3.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.6&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017111306&lt;br /&gt;
| [[Moodle 3.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.7&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2017111307&lt;br /&gt;
|[[Moodle 3.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.8&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2017111308&lt;br /&gt;
|[[Moodle 3.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.9&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2017111309&lt;br /&gt;
| [[Moodle 3.4.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.4.x ended 12 November 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.4.x ended 13 May 2019 (18 months).&lt;br /&gt;
==Moodle 3.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3&lt;br /&gt;
|15 May 2017&lt;br /&gt;
|2017051500&lt;br /&gt;
|[[Moodle 3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/33/en/Upgrading Upgrading to 3.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.1&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2017051501&lt;br /&gt;
|[[Moodle 3.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.2&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2017051502&lt;br /&gt;
|[[Moodle 3.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.3&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017051503&lt;br /&gt;
| [[Moodle 3.3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.4&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017051504&lt;br /&gt;
|[[Moodle 3.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.5&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017051505&lt;br /&gt;
|[[Moodle 3.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.6&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017051506&lt;br /&gt;
|[[Moodle 3.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.7&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017051507&lt;br /&gt;
|[[Moodle 3.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.8&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017051508&lt;br /&gt;
|[[Moodle 3.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.9&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017051509&lt;br /&gt;
|[[Moodle 3.3.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.3.x ended 17 May 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.3.x ended 12 November 2018 (18 months).&lt;br /&gt;
==Moodle 3.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2&lt;br /&gt;
| 5 December 2016&lt;br /&gt;
|2016120500&lt;br /&gt;
|[[Moodle 3.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/32/en/Upgrading Upgrading to 3.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.1&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016120501&lt;br /&gt;
|[[Moodle 3.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.2&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016120502&lt;br /&gt;
|[[Moodle 3.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.3&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016120503&lt;br /&gt;
|[[Moodle 3.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.4&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016120504&lt;br /&gt;
|[[Moodle 3.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.5&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016120505&lt;br /&gt;
|[[Moodle 3.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.6&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016120506&lt;br /&gt;
| [[Moodle 3.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.7&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016120507&lt;br /&gt;
|[[Moodle 3.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.8&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016120508&lt;br /&gt;
|[[Moodle 3.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.9&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016120509&lt;br /&gt;
| [[Moodle 3.2.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.2.x ended 13 November 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.2.x ended 17 May 2018 (18 months).&lt;br /&gt;
==Moodle 3.1 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1&lt;br /&gt;
|23 May 2016&lt;br /&gt;
|2016052300&lt;br /&gt;
|[[Moodle 3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/31/en/Upgrading Upgrading to 3.1]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.1&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2016052301&lt;br /&gt;
|[[Moodle 3.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.2&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2016052302&lt;br /&gt;
|[[Moodle 3.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.3&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2016052303&lt;br /&gt;
|[[Moodle 3.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.4&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016052304&lt;br /&gt;
|[[Moodle 3.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.5&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016052305&lt;br /&gt;
|[[Moodle 3.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.6&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016052306&lt;br /&gt;
|[[Moodle 3.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.7&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016052307&lt;br /&gt;
|[[Moodle 3.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.8&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016052308&lt;br /&gt;
|[[Moodle 3.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.9&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016052309&lt;br /&gt;
|[[Moodle 3.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.10&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016052310&lt;br /&gt;
|[[Moodle 3.1.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.11&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016052311&lt;br /&gt;
|[[Moodle 3.1.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.12&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016052312&lt;br /&gt;
|[[Moodle 3.1.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.13&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2016052313&lt;br /&gt;
|[[Moodle 3.1.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.14&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2016052314&lt;br /&gt;
|[[Moodle 3.1.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.15&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2016052315&lt;br /&gt;
|[[Moodle 3.1.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.16&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2016052316&lt;br /&gt;
|[[Moodle 3.1.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.17&lt;br /&gt;
|11 March 2019&lt;br /&gt;
| 2016052317&lt;br /&gt;
|[[Moodle 3.1.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.18&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2016052318&lt;br /&gt;
|[[Moodle 3.1.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.1.x ended 8 May 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.1.x ended 13 May 2019 (36 months).&lt;br /&gt;
==Moodle 3.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0&lt;br /&gt;
|16 November 2015&lt;br /&gt;
|2015111600&lt;br /&gt;
|[[Moodle 3.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/30/en/Upgrading Upgrading to 3.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.1&lt;br /&gt;
|21 December 2015&lt;br /&gt;
|2015111601&lt;br /&gt;
| [[Moodle 3.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.2&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015111602&lt;br /&gt;
|[[Moodle 3.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.3&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015111603&lt;br /&gt;
|[[Moodle 3.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.4&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015111604&lt;br /&gt;
|[[Moodle 3.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.5&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015111605&lt;br /&gt;
|[[Moodle 3.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.6&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015111606&lt;br /&gt;
|[[Moodle 3.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.7&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015111607&lt;br /&gt;
|[[Moodle 3.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.8&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2015111608&lt;br /&gt;
|[[Moodle 3.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.9&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2015111609&lt;br /&gt;
|[[Moodle 3.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.10&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2015111610&lt;br /&gt;
|[[Moodle 3.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.0.x ended 14 November 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.0.x ended 8 May 2017 (18 months).&lt;br /&gt;
==Moodle 2.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9&lt;br /&gt;
| 11 May 2015&lt;br /&gt;
|2015051100&lt;br /&gt;
|[[Moodle 2.9 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/29/en/Upgrading_to_Moodle_2.9 Upgrading to 2.9]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.1&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2015051101&lt;br /&gt;
|[[Moodle 2.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.2&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2015051102&lt;br /&gt;
| [[Moodle 2.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.3&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2015051103&lt;br /&gt;
| [[Moodle 2.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.4&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015051104&lt;br /&gt;
|[[Moodle 2.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.5&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015051105&lt;br /&gt;
|[[Moodle 2.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.6&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015051106&lt;br /&gt;
|[[Moodle 2.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.7&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015051107&lt;br /&gt;
|[[Moodle 2.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.8&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015051108&lt;br /&gt;
|[[Moodle 2.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.9&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015051109&lt;br /&gt;
|[[Moodle 2.9.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.9.x ended 9 May 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.9.x ended 14 November 2016 (18 months).&lt;br /&gt;
==Moodle 2.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014111000&lt;br /&gt;
| [[Moodle 2.8 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/28/en/Upgrading_to_Moodle_2.8 Upgrading to 2.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.1&lt;br /&gt;
|13 November 2014&lt;br /&gt;
|2014111001&lt;br /&gt;
| [[Moodle 2.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.2&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014111002&lt;br /&gt;
| [[Moodle 2.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.3&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014111003&lt;br /&gt;
|[[Moodle 2.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.4&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014111004&lt;br /&gt;
|[[Moodle 2.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.5&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014111005&lt;br /&gt;
|[[Moodle 2.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.6&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014111006&lt;br /&gt;
|[[Moodle 2.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.7&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014111007&lt;br /&gt;
|[[Moodle 2.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.8&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2014111008&lt;br /&gt;
| [[Moodle 2.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.9&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014111009&lt;br /&gt;
|[[Moodle 2.8.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.10&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014111010&lt;br /&gt;
|[[Moodle 2.8.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.11&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014111011&lt;br /&gt;
|[[Moodle 2.8.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.12&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014111012&lt;br /&gt;
| [[Moodle 2.8.12 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.8.x ended 9 November 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.8.x ended 9 May 2016 (18 months).&lt;br /&gt;
==Moodle 2.7 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7&lt;br /&gt;
| 12 May 2014&lt;br /&gt;
|2014051200&lt;br /&gt;
|[[Moodle 2.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/27/en/Upgrading_to_Moodle_2.7 Upgrading to 2.7]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.1&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2014051201&lt;br /&gt;
|[[Moodle 2.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.2&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2014051202&lt;br /&gt;
|[[Moodle 2.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.3&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014051203&lt;br /&gt;
| [[Moodle 2.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.4&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014051204&lt;br /&gt;
| [[Moodle 2.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.5&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014051205&lt;br /&gt;
|[[Moodle 2.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.6&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014051206&lt;br /&gt;
|[[Moodle 2.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.7&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014051207&lt;br /&gt;
|[[Moodle 2.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.8&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014051208&lt;br /&gt;
|[[Moodle 2.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.9&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014051209&lt;br /&gt;
|[[Moodle 2.7.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.10&lt;br /&gt;
| 14 September 2015&lt;br /&gt;
|2014051210&lt;br /&gt;
|[[Moodle 2.7.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.11&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014051211&lt;br /&gt;
|[[Moodle 2.7.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.12&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014051212&lt;br /&gt;
|[[Moodle 2.7.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.13&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014051213&lt;br /&gt;
|[[Moodle 2.7.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.14&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014051214&lt;br /&gt;
| [[Moodle 2.7.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.15&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2014051215&lt;br /&gt;
|[[Moodle 2.7.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.16&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2014051216&lt;br /&gt;
|[[Moodle 2.7.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.17&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2014051217&lt;br /&gt;
|[[Moodle 2.7.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.18&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2014051218&lt;br /&gt;
|[[Moodle 2.7.18 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.19&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2014051219&lt;br /&gt;
|[[Moodle 2.7.19 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.20&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2014051220&lt;br /&gt;
| [[Moodle 2.7.20 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.7.x ended 11 May 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.7.x ended 8 May 2017 (36 months).&lt;br /&gt;
==Moodle 2.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6&lt;br /&gt;
|18 November 2013&lt;br /&gt;
|2013111800&lt;br /&gt;
|[[Moodle 2.6 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/26/en/Upgrading_to_Moodle_2.6 Upgrading to 2.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.1&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013111801&lt;br /&gt;
| [[Moodle 2.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.2&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013111802&lt;br /&gt;
|[[Moodle 2.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.3&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013111803&lt;br /&gt;
|[[Moodle 2.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.4&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013111804&lt;br /&gt;
|[[Moodle 2.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.5&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013111805&lt;br /&gt;
|[[Moodle 2.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.6&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2013111806&lt;br /&gt;
|[[Moodle 2.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.7&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2013111807&lt;br /&gt;
|[[Moodle 2.6.7 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.8&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2013111808&lt;br /&gt;
|[[Moodle 2.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.9&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2013111809&lt;br /&gt;
|[[Moodle 2.6.9 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.10&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2013111810&lt;br /&gt;
| [[Moodle 2.6.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.11&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2013111811&lt;br /&gt;
|[[Moodle 2.6.11 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.6.x ended 10 November 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.6.x ended 11 May 2015 (18 months).&lt;br /&gt;
==Moodle 2.5==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5&lt;br /&gt;
| 14 May 2013&lt;br /&gt;
|2013051400&lt;br /&gt;
|[[Moodle 2.5 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/25/en/Upgrading_to_Moodle_2.5 Upgrading to 2.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.1&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2013051401&lt;br /&gt;
|[[Moodle 2.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.2&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2013051402&lt;br /&gt;
|[[Moodle 2.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.3&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2013051403&lt;br /&gt;
|[[Moodle 2.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.4&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013051404&lt;br /&gt;
| [[Moodle 2.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.5&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013051405&lt;br /&gt;
|[[Moodle 2.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.6&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013051406&lt;br /&gt;
|[[Moodle 2.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.7&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013051407&lt;br /&gt;
|[[Moodle 2.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.8&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013051408&lt;br /&gt;
|[[Moodle 2.5.8 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.9&lt;br /&gt;
| 10 November 2014&lt;br /&gt;
|2013051409&lt;br /&gt;
|[[Moodle 2.5.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.5.x ended May 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.5.x ended 10 November 2014 (18 months).&lt;br /&gt;
==Moodle 2.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4&lt;br /&gt;
|3 December 2012&lt;br /&gt;
|2012120300&lt;br /&gt;
|[[Moodle 2.4 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/24/en/Upgrading_to_Moodle_2.4 Upgrading to 2.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.1&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012120301&lt;br /&gt;
|[[Moodle 2.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.2&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012120302&lt;br /&gt;
|[[Moodle 2.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.3&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012120303&lt;br /&gt;
|[[Moodle 2.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.4&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012120304&lt;br /&gt;
|[[Moodle 2.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.5&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012120305&lt;br /&gt;
|[[Moodle 2.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.6&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012120306&lt;br /&gt;
|[[Moodle 2.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.7&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012120307&lt;br /&gt;
| [[Moodle 2.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.8&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012120308&lt;br /&gt;
|[[Moodle 2.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.9&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2012120309&lt;br /&gt;
|[[Moodle 2.4.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.10&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2012120310&lt;br /&gt;
| [[Moodle 2.4.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.11&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2012120311&lt;br /&gt;
|[[Moodle 2.4.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.4.x ended December 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.4.x ended June 2014 (18 months).&lt;br /&gt;
==Moodle 2.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3&lt;br /&gt;
|25 June 2012&lt;br /&gt;
|2012062500&lt;br /&gt;
|[[Moodle 2.3 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/23/en/Upgrading_to_Moodle_2.3 Upgrading to 2.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.1&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2012062501&lt;br /&gt;
|[[Moodle 2.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.2&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2012062502&lt;br /&gt;
|[[Moodle 2.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.3&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2012062503&lt;br /&gt;
|[[Moodle 2.3.3 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.4&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012062504&lt;br /&gt;
|[[Moodle 2.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.5&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012062505&lt;br /&gt;
|[[Moodle 2.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.6&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012062506&lt;br /&gt;
|[[Moodle 2.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.7&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012062507&lt;br /&gt;
|[[Moodle 2.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.8&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012062508&lt;br /&gt;
|[[Moodle 2.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.9&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012062509&lt;br /&gt;
|[[Moodle 2.3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.10&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012062510&lt;br /&gt;
|[[Moodle 2.3.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.11&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012062511&lt;br /&gt;
|[[Moodle 2.3.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.3.x ended June 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.3.x ended December 2013 (18 months).&lt;br /&gt;
==Moodle 2.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2&lt;br /&gt;
|5 December 2011&lt;br /&gt;
|2011120500&lt;br /&gt;
|[[Moodle 2.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/22/en/Upgrading_to_Moodle_2.2 Upgrading to 2.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.1&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011120501&lt;br /&gt;
|[[Moodle 2.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.2&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011120502&lt;br /&gt;
|[[Moodle 2.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.3&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011120503&lt;br /&gt;
|[[Moodle 2.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.4&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011120504&lt;br /&gt;
|[[Moodle 2.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.5&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011120505&lt;br /&gt;
|[[Moodle 2.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.6&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011120506&lt;br /&gt;
| [[Moodle 2.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.7&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011120507&lt;br /&gt;
|[[Moodle 2.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.8&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2011120508&lt;br /&gt;
|[[Moodle 2.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.9&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2011120509&lt;br /&gt;
|[[Moodle 2.2.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.10&lt;br /&gt;
|14 May 2013&lt;br /&gt;
| 2011120510&lt;br /&gt;
|[[Moodle 2.2.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.11&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2011120511&lt;br /&gt;
|[[Moodle 2.2.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.2.x ended December 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.2.x ended June 2013 (18 months).&lt;br /&gt;
==Moodle 2.1==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1&lt;br /&gt;
| 1 July 2011&lt;br /&gt;
|2011070100&lt;br /&gt;
|[[Moodle 2.1 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/21/en/Upgrading_to_Moodle_2.1 Upgrading to 2.1]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.1&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011070101&lt;br /&gt;
| [[Moodle 2.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.2&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011070102&lt;br /&gt;
|[[Moodle 2.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.3&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011070103&lt;br /&gt;
|[[Moodle 2.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.4&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011070104&lt;br /&gt;
|[[Moodle 2.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.5&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011070105&lt;br /&gt;
|[[Moodle 2.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.6&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011070106&lt;br /&gt;
|[[Moodle 2.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.7&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011070107&lt;br /&gt;
|[[Moodle 2.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.8&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011070108&lt;br /&gt;
|[[Moodle 2.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.9&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011070109&lt;br /&gt;
|[[Moodle 2.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.10&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011070110&lt;br /&gt;
|[[Moodle 2.1.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.1.x ended June 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.1.x ended December 2012 (18 months).&lt;br /&gt;
==Moodle 2.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0&lt;br /&gt;
|24 November 2010&lt;br /&gt;
|2010112400&lt;br /&gt;
| [[Moodle 2.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/20/en/Upgrading_to_Moodle_2.0 Upgrading to 2.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.1&lt;br /&gt;
|25 December 2010&lt;br /&gt;
|2010122500&lt;br /&gt;
|[[Moodle 2.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.2&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2011022100&lt;br /&gt;
|[[Moodle 2.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.3&lt;br /&gt;
|5 May 2011&lt;br /&gt;
|2011033003&lt;br /&gt;
|[[Moodle 2.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.4&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011033004&lt;br /&gt;
| [[Moodle 2.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.5&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011033005&lt;br /&gt;
|[[Moodle 2.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.6&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011033006&lt;br /&gt;
|[[Moodle 2.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.7&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011033007&lt;br /&gt;
|[[Moodle 2.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.8&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011033008&lt;br /&gt;
|[[Moodle 2.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.9&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011033009&lt;br /&gt;
|[[Moodle 2.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.10&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011033010&lt;br /&gt;
|[[Moodle 2.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.0.x ended December 2011 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.0.x ended June 2012 (18 months).&lt;br /&gt;
==Moodle 1.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9&lt;br /&gt;
|3 March 2008&lt;br /&gt;
|2007101509&lt;br /&gt;
|[[Moodle 1.9 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/19/en/Upgrading_to_Moodle_1.9 Upgrading to 1.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.1&lt;br /&gt;
|15 May 2008&lt;br /&gt;
| 2007101512&lt;br /&gt;
|[[Moodle 1.9.1 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.2&lt;br /&gt;
|11 July 2008&lt;br /&gt;
|2007101520&lt;br /&gt;
|[[Moodle 1.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.3&lt;br /&gt;
|15 October 2008&lt;br /&gt;
|2007101530&lt;br /&gt;
|[[Moodle 1.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.4&lt;br /&gt;
|28 January 2009&lt;br /&gt;
|2007101540&lt;br /&gt;
|[[Moodle 1.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.5&lt;br /&gt;
|13 May 2009&lt;br /&gt;
|2007101550&lt;br /&gt;
|[[Moodle 1.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.6&lt;br /&gt;
|21 October 2009&lt;br /&gt;
|2007101560&lt;br /&gt;
|[[Moodle 1.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.7&lt;br /&gt;
|25 November 2009&lt;br /&gt;
|2007101570&lt;br /&gt;
|[[Moodle 1.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.8&lt;br /&gt;
|25 March 2010&lt;br /&gt;
|2007101580.00&lt;br /&gt;
|[[Moodle 1.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.9&lt;br /&gt;
| 8 June 2010&lt;br /&gt;
| 2007101590.00&lt;br /&gt;
| [[Moodle 1.9.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.10&lt;br /&gt;
|25 October 2010&lt;br /&gt;
|2007101591.00&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.10 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.11&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2007101591.02&lt;br /&gt;
|[[Moodle 1.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.12&lt;br /&gt;
|10 May 2011&lt;br /&gt;
|2007101591.03&lt;br /&gt;
|[[Moodle 1.9.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.13&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2007101591.04&lt;br /&gt;
|[[Moodle 1.9.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.14&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2007101591.06&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.15&lt;br /&gt;
|28 November 2011&lt;br /&gt;
| 2007101591.07&lt;br /&gt;
| [[Moodle 1.9.15 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.16&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2007101591.10&lt;br /&gt;
|[[Moodle 1.9.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.17&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2007101591.12&lt;br /&gt;
|[[Moodle 1.9.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.18&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2007101591.16&lt;br /&gt;
|[[Moodle 1.9.18 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.19&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2007101592.00&lt;br /&gt;
|[[Moodle 1.9.19 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 1.9.x has ended June 2011 (3.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.x by Moodle HQ ended June 2012 (4.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.19+ branch by [http://catalyst.net.nz Catalyst IT] ended [http://moodle.org/mod/forum/discuss.php?d=199706 Dec 2013] (6 years).&lt;br /&gt;
==Moodle 1.8 ==&lt;br /&gt;
*[[Moodle 1.8 release notes|Moodle 1.8]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.8.1 release notes|Moodle 1.8.1]] - 14 June 2007&lt;br /&gt;
*[[Moodle 1.8.2 release notes|Moodle 1.8.2]] - 8 July 2007&lt;br /&gt;
*[[Moodle 1.8.3 release notes|Moodle 1.8.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.8.4 release notes|Moodle 1.8.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.8.5 release notes|Moodle 1.8.5]] - 8 April 2008&lt;br /&gt;
*[[Moodle 1.8.6 release notes|Moodle 1.8.6]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.8.7 release notes|Moodle 1.8.7]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.8.8 release notes|Moodle 1.8.8]] - 28 January 2009&lt;br /&gt;
*[[Moodle 1.8.9 release notes|Moodle 1.8.9]] - 15 May 2009&lt;br /&gt;
*[[Moodle 1.8.10 release notes|Moodle 1.8.10]] - 26 October 2009&lt;br /&gt;
*[[Moodle 1.8.11 release notes|Moodle 1.8.11]] - 25 November 2009&lt;br /&gt;
*[[Moodle 1.8.12 release notes|Moodle 1.8.12]] - 27 March 2010&lt;br /&gt;
*[[Moodle 1.8.13 release notes|Moodle 1.8.13]] - 8 June 2010&lt;br /&gt;
*[[Moodle 1.8.14 release notes|Moodle 1.8.14]] - 3 December 2010&lt;br /&gt;
*Support has ended&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.7==&lt;br /&gt;
*[[Moodle 1.7 release notes|Moodle 1.7]] - 7 November 2006&lt;br /&gt;
*[[Moodle 1.7.1 release notes|Moodle 1.7.1]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.7.2 release notes|Moodle 1.7.2]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.7.3 release notes|Moodle 1.7.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.7.4 release notes|Moodle 1.7.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.7.5 release notes|Moodle 1.7.5]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.7.6 release notes|Moodle 1.7.6]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.7.7 release notes|Moodle 1.7.7]] - 28 January 2009&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.6==&lt;br /&gt;
*[[Moodle 1.6 release notes|Moodle 1.6]] - 20 June 2006&lt;br /&gt;
*[[Moodle 1.6.1 release notes|Moodle 1.6.1]] - 20 July 2006&lt;br /&gt;
*[[Moodle 1.6.2 release notes|Moodle 1.6.2]] - 12 September 2006&lt;br /&gt;
*[[Moodle 1.6.3 release notes|Moodle 1.6.3]] - 10 October 2006&lt;br /&gt;
*[[Moodle 1.6.4 release notes|Moodle 1.6.4]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.6.5 release notes|Moodle 1.6.5]] - 30 March 2007&lt;br /&gt;
*Moodle 1.6.6 - 11 January 2008&lt;br /&gt;
*Moodle 1.6.7 - 11 July 2008&lt;br /&gt;
*[[Moodle 1.6.8 release notes|Moodle 1.6.8]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.6.9 release notes|Moodle 1.6.9]] - 28 January 2009&lt;br /&gt;
* Support has ended&lt;br /&gt;
==Moodle 1.5==&lt;br /&gt;
*[[Moodle 1.5 release notes|Moodle 1.5]] - 5 June 2005&lt;br /&gt;
*[[Moodle 1.5.1 release notes|Moodle 1.5.1]] - 8 July 2005&lt;br /&gt;
*[[Moodle 1.5.2 release notes|Moodle 1.5.2]] - 16 July 2005&lt;br /&gt;
*[[Moodle 1.5.3 release notes|Moodle 1.5.3]] - 11 November 2005&lt;br /&gt;
*[[Moodle 1.5.4 release notes|Moodle 1.5.4]] - 21 May 2006&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.4==&lt;br /&gt;
*Moodle 1.4 - 31 August 2004&lt;br /&gt;
*Moodle 1.4.1 - 12 September 2004&lt;br /&gt;
*Moodle 1.4.2 - 5 November 2004&lt;br /&gt;
*Moodle 1.4.3 - 21 December 2004&lt;br /&gt;
*Moodle 1.4.4 - 7 March 2005&lt;br /&gt;
*[[Moodle 1.4.5 release notes|Moodle 1.4.5]] - 7 May 2005&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.3==&lt;br /&gt;
*Moodle 1.3 - 25 May 2004&lt;br /&gt;
* Moodle 1.3.1 - 4 June 2004&lt;br /&gt;
*Moodle 1.3.2 - 9 July 2004&lt;br /&gt;
*Moodle 1.3.3 - 16 July 2004&lt;br /&gt;
* Moodle 1.3.4 - 11 August 2004&lt;br /&gt;
*Moodle 1.3.5 - 9 September 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.2==&lt;br /&gt;
*Moodle 1.2 - 20 March 2004&lt;br /&gt;
*Moodle 1.2.1 - 25 March 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.1==&lt;br /&gt;
*Moodle 1.1 - 29 August 2003&lt;br /&gt;
*Moodle 1.1.1 - 11 September 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
== Moodle 1.0==&lt;br /&gt;
*Moodle 1.0 - 20 August 2002&lt;br /&gt;
*Moodle 1.0.1 - 26 August 2002&lt;br /&gt;
*Moodle 1.0.2 - 2 September 2002&lt;br /&gt;
*Moodle 1.0.3 - 5 September 2002&lt;br /&gt;
*Moodle 1.0.4 - 10 September 2002&lt;br /&gt;
*Moodle 1.0.5 - 27 September 2002&lt;br /&gt;
* Moodle 1.0.6 - 26 October 2002&lt;br /&gt;
::1.0.6.1 - 6 November 2002&lt;br /&gt;
::1.0.6.2 - 11 November 2002&lt;br /&gt;
::1.0.6.3 - 14 November 2002&lt;br /&gt;
::1.0.6.4 - 25 November 2002&lt;br /&gt;
*Moodle 1.0.7 - 9 December 2002&lt;br /&gt;
*Moodle 1.0.8 - 7 January 2003&lt;br /&gt;
*Moodle 1.0.9 - 30 May 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Roadmap]] - future versions&lt;br /&gt;
*[[Moodle versions]] - an explanation of how our versions work plus version numbers for each release (for $plugin-&amp;gt;requires)&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Core development]]&lt;br /&gt;
[[fr:Historique des versions]]&lt;br /&gt;
[[es:dev/Historia de las versiones]]&lt;br /&gt;
[[de:Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=62365</id>
		<title>Releases</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=62365"/>
		<updated>2022-05-09T01:47:11Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* Moodle 3.10 table padding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all official releases of Moodle, grouped by branch in reverse chronological order.&lt;br /&gt;
==Version support==&lt;br /&gt;
From Moodle 2.6 onwards, the end of support, both general and security, happens the second Monday of May and November, observing the 12, 18... month periods, no matter if the major release date was moved or not.&lt;br /&gt;
&lt;br /&gt;
The most recent [https://en.wikipedia.org/wiki/Long-term_support long-term support release (LTS)] version is Moodle 3.9.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Version&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Release status&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Initial release&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:rgba(0, 0, 0, 0.05);&amp;quot; | General support ends&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Security support ends&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.9 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 15 June 2020&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 10 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 November 2023 (ext 6M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.11&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 17 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 14 Nov 2022 (ext 6M)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 Nov 2023 (ext 12M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |4.0&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |19 April 2022&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |8 May 2023&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |13 November 2023&lt;br /&gt;
|-&lt;br /&gt;
|4.1 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stable&lt;br /&gt;
|November 2022&lt;br /&gt;
|November 2023&lt;br /&gt;
|November 2025&lt;br /&gt;
|}&lt;br /&gt;
[[Image:401_release_graph.png|alt=Release graph]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Release graph key:&amp;lt;/b&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Currently supported stable releases.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | Current release of versions still receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Future point releases receiving bug fixes, as well as security updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#316d5e; color:white; adding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Future point releases receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#686566; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Previously released versions containing bug fixes, as well as security updates. Updating to a currently supported version is recommended.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#282828; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Previously released versions containing security updates only. Updating to a currently supported version is recommended.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==General release calendar==&lt;br /&gt;
These are the target dates for releases. These dates may vary slightly due to unforeseen circumstances.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Release type&lt;br /&gt;
!Frequency&lt;br /&gt;
!Months&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Major_release_cycles|Major]] (eg. 3.x)&lt;br /&gt;
|6 monthly&lt;br /&gt;
|Second Monday of May and November&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Stable_maintenance_cycles|Minor]] (Point) (eg. 3.x.y)&lt;br /&gt;
| 2 monthly&lt;br /&gt;
|Second Monday of July, September, November, March and May.&lt;br /&gt;
Third Monday of January.&lt;br /&gt;
|}&lt;br /&gt;
All releases are preceded by a one week warning. Upcoming release dates can be found in the [https://www.google.com/calendar/ical/moodle.com_p4c2oe7hsb77ltaro5qtihb5d4%40group.calendar.google.com/public/basic.ics Moodle development calendar] (Note, this is an iCAL link that will try to add the dates to your personal calendar. If you just want to browse the dates online, use [https://calendar.google.com/calendar/embed?src=moodle.com_p4c2oe7hsb77ltaro5qtihb5d4@group.calendar.google.com&amp;amp;pli=1 this link].).&lt;br /&gt;
&lt;br /&gt;
==Moodle 4.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 4.0&lt;br /&gt;
|19 April 2022&lt;br /&gt;
|2022041900&lt;br /&gt;
|[[Moodle 4.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/400/en/Upgrading Upgrading to 4.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 4.0.1&lt;br /&gt;
|9 May 2022&lt;br /&gt;
|2022041901&lt;br /&gt;
|[[Moodle 4.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 4.0.x will end 8 May 2023 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 4.0.x will end 13 November 2023 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.11==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11&lt;br /&gt;
|17 May 2021&lt;br /&gt;
|2021051700&lt;br /&gt;
|[[Moodle 3.11 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/311/en/Upgrading Upgrading to 3.11]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.1&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2021051701&lt;br /&gt;
|[[Moodle 3.11.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.2&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2021051702&lt;br /&gt;
|[[Moodle 3.11.2 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.3&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2021051703&lt;br /&gt;
|[[Moodle 3.11.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.4&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2021051704&lt;br /&gt;
|[[Moodle 3.11.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.5&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2021051705&lt;br /&gt;
|[[Moodle 3.11.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.6&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2021051706&lt;br /&gt;
|[[Moodle 3.11.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.7&lt;br /&gt;
|9 May 2022&lt;br /&gt;
|2021051707&lt;br /&gt;
|[[Moodle 3.11.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).&lt;br /&gt;
 Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.10==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020110900&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 3.10 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/310/en/Upgrading Upgrading to 3.10]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.1&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020110901&lt;br /&gt;
| [[Moodle 3.10.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.2&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020110902&lt;br /&gt;
|[[Moodle 3.10.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.3&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020110903&lt;br /&gt;
|[[Moodle 3.10.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.4&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020110904&lt;br /&gt;
|[[Moodle 3.10.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.5&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020110905&lt;br /&gt;
|[[Moodle 3.10.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.6&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020110906&lt;br /&gt;
|[[Moodle 3.10.6 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.7&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020110907&lt;br /&gt;
|[[Moodle 3.10.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.8&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2020110908&lt;br /&gt;
|[[Moodle 3.10.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.9&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2020110909&lt;br /&gt;
|[[Moodle 3.10.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.10&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2020110910&lt;br /&gt;
|[[Moodle 3.10.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.11&lt;br /&gt;
|9 May 2022&lt;br /&gt;
|2020110911&lt;br /&gt;
|[[Moodle 3.10.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.10.x ended 8 November 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.9 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9&lt;br /&gt;
|15 June 2020&lt;br /&gt;
|2020061500&lt;br /&gt;
|[[Moodle 3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/39/en/Upgrading Upgrading to 3.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.1&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2020061501&lt;br /&gt;
|[[Moodle 3.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.2&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2020061502&lt;br /&gt;
| [[Moodle 3.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.3&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020061503&lt;br /&gt;
| [[Moodle 3.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.4&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020061504&lt;br /&gt;
|[[Moodle 3.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.5&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020061505&lt;br /&gt;
|[[Moodle 3.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.6&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020061506&lt;br /&gt;
|[[Moodle 3.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.7&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020061507&lt;br /&gt;
|[[Moodle 3.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.8&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020061508&lt;br /&gt;
|[[Moodle 3.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.9&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020061509&lt;br /&gt;
|[[Moodle 3.9.9 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.10&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020061510&lt;br /&gt;
|[[Moodle 3.9.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.11&lt;br /&gt;
| 8 November 2021&lt;br /&gt;
|2020061511&lt;br /&gt;
|[[Moodle 3.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.12&lt;br /&gt;
| 17 January 2022&lt;br /&gt;
|2020061512&lt;br /&gt;
|[[Moodle 3.9.12 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.13&lt;br /&gt;
| 14 March 2022&lt;br /&gt;
|2020061513&lt;br /&gt;
|[[Moodle 3.9.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.14&lt;br /&gt;
| 9 May 2022&lt;br /&gt;
|2020061514&lt;br /&gt;
|[[Moodle 3.9.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.9.x ended 10 May 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.9.x will end 13 Nov 2023 (36 months plus 6 months extension).&lt;br /&gt;
==Moodle 3.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8&lt;br /&gt;
|18 November 2019&lt;br /&gt;
|2019111800&lt;br /&gt;
|[[Moodle 3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/38/en/Upgrading Upgrading to 3.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.1&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019111801&lt;br /&gt;
|[[Moodle 3.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.2&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019111802&lt;br /&gt;
|[[Moodle 3.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.3&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019111803&lt;br /&gt;
|[[Moodle 3.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.4&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019111804&lt;br /&gt;
|[[Moodle 3.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.5&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019111805&lt;br /&gt;
| [[Moodle 3.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.6&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019111806&lt;br /&gt;
| [[Moodle 3.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.7&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2019111807&lt;br /&gt;
|[[Moodle 3.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.8&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2019111808&lt;br /&gt;
|[[Moodle 3.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.9&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2019111809&lt;br /&gt;
|[[Moodle 3.8.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.8.x ended 9 November 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.8.x ended 10 May 2021 (18 months).&lt;br /&gt;
==Moodle 3.7==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7&lt;br /&gt;
|20 May 2019&lt;br /&gt;
|2019052000&lt;br /&gt;
|[[Moodle 3.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/37/en/Upgrading Upgrading to 3.7]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.1&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2019052001&lt;br /&gt;
|[[Moodle 3.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.2&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2019052002&lt;br /&gt;
|[[Moodle 3.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.3&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2019052003&lt;br /&gt;
| [[Moodle 3.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.4&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019052004&lt;br /&gt;
|[[Moodle 3.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.5&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019052005&lt;br /&gt;
|[[Moodle 3.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.6&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019052006&lt;br /&gt;
|[[Moodle 3.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.7&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019052007&lt;br /&gt;
|[[Moodle 3.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.8&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019052008&lt;br /&gt;
| [[Moodle 3.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.9&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019052009&lt;br /&gt;
|[[Moodle 3.7.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.7.x ended 11 May 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.7.x ended 9 November 2020 (18 months).&lt;br /&gt;
==Moodle 3.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6&lt;br /&gt;
| 3 December 2018&lt;br /&gt;
|2018120300&lt;br /&gt;
|[[Moodle 3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/36/en/Upgrading Upgrading to 3.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.1&lt;br /&gt;
|5 December 2018&lt;br /&gt;
|2018120301&lt;br /&gt;
| [[Moodle 3.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6.2&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018120302&lt;br /&gt;
|[[Moodle 3.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.3&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018120303&lt;br /&gt;
|[[Moodle 3.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.4&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018120304&lt;br /&gt;
|[[Moodle 3.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.5&lt;br /&gt;
|8th July 2019&lt;br /&gt;
|2018120305&lt;br /&gt;
|[[Moodle 3.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.6&lt;br /&gt;
|9th September 2019&lt;br /&gt;
|2018120306&lt;br /&gt;
|[[Moodle 3.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.7&lt;br /&gt;
| 11th November 2019&lt;br /&gt;
|2018120307&lt;br /&gt;
|[[Moodle 3.6.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.8&lt;br /&gt;
|13th January 2020&lt;br /&gt;
|2018120308&lt;br /&gt;
|[[Moodle 3.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.9&lt;br /&gt;
|9th March 2020&lt;br /&gt;
|2018120309&lt;br /&gt;
| [[Moodle 3.6.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.10&lt;br /&gt;
|11th May 2020&lt;br /&gt;
|2018120310&lt;br /&gt;
|[[Moodle 3.6.10 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.6.x ended 11 November 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.6.x ended 11 May 2020 (18 months).&lt;br /&gt;
==Moodle 3.5 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2018051700&lt;br /&gt;
|[[Moodle 3.5 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/35/en/Upgrading Upgrading to 3.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.1&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2018051701&lt;br /&gt;
|[[Moodle 3.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.2&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2018051702&lt;br /&gt;
|[[Moodle 3.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.3&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2018051703&lt;br /&gt;
| [[Moodle 3.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.4&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018051704&lt;br /&gt;
|[[Moodle 3.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.5&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018051705&lt;br /&gt;
|[[Moodle 3.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.6&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018051706&lt;br /&gt;
|[[Moodle 3.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.7&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2018051707&lt;br /&gt;
|[[Moodle 3.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.8&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2018051708&lt;br /&gt;
|[[Moodle 3.5.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.9&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2018051709&lt;br /&gt;
|[[Moodle 3.5.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.10&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2018051710&lt;br /&gt;
| [[Moodle 3.5.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.11&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2018051711&lt;br /&gt;
|[[Moodle 3.5.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.12&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2018051712&lt;br /&gt;
| [[Moodle 3.5.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.13&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2018051713&lt;br /&gt;
|[[Moodle 3.5.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.14&lt;br /&gt;
| 14 September 2020&lt;br /&gt;
|2018051714&lt;br /&gt;
|[[Moodle 3.5.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.15&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2018051715&lt;br /&gt;
|[[Moodle 3.5.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.16&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2018051716&lt;br /&gt;
| [[Moodle 3.5.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.17&lt;br /&gt;
|8 March 2021&lt;br /&gt;
| 2018051717&lt;br /&gt;
|[[Moodle 3.5.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.18&lt;br /&gt;
| 10 May 2021&lt;br /&gt;
| 2018051718&lt;br /&gt;
|[[Moodle 3.5.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.5.x ended May 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.5.x ended 10 May 2021 (36 months).&lt;br /&gt;
==Moodle 3.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017111300&lt;br /&gt;
|[[Moodle 3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/34/en/Upgrading Upgrading to 3.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.1&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017111301&lt;br /&gt;
|[[Moodle 3.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.2&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017111302&lt;br /&gt;
|[[Moodle 3.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.3&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017111303&lt;br /&gt;
|[[Moodle 3.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.4&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017111304&lt;br /&gt;
|[[Moodle 3.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.5&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017111305&lt;br /&gt;
|[[Moodle 3.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.6&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017111306&lt;br /&gt;
| [[Moodle 3.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.7&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2017111307&lt;br /&gt;
|[[Moodle 3.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.8&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2017111308&lt;br /&gt;
|[[Moodle 3.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.9&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2017111309&lt;br /&gt;
| [[Moodle 3.4.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.4.x ended 12 November 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.4.x ended 13 May 2019 (18 months).&lt;br /&gt;
==Moodle 3.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3&lt;br /&gt;
|15 May 2017&lt;br /&gt;
|2017051500&lt;br /&gt;
|[[Moodle 3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/33/en/Upgrading Upgrading to 3.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.1&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2017051501&lt;br /&gt;
|[[Moodle 3.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.2&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2017051502&lt;br /&gt;
|[[Moodle 3.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.3&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017051503&lt;br /&gt;
| [[Moodle 3.3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.4&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017051504&lt;br /&gt;
|[[Moodle 3.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.5&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017051505&lt;br /&gt;
|[[Moodle 3.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.6&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017051506&lt;br /&gt;
|[[Moodle 3.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.7&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017051507&lt;br /&gt;
|[[Moodle 3.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.8&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017051508&lt;br /&gt;
|[[Moodle 3.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.9&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017051509&lt;br /&gt;
|[[Moodle 3.3.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.3.x ended 17 May 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.3.x ended 12 November 2018 (18 months).&lt;br /&gt;
==Moodle 3.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2&lt;br /&gt;
| 5 December 2016&lt;br /&gt;
|2016120500&lt;br /&gt;
|[[Moodle 3.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/32/en/Upgrading Upgrading to 3.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.1&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016120501&lt;br /&gt;
|[[Moodle 3.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.2&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016120502&lt;br /&gt;
|[[Moodle 3.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.3&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016120503&lt;br /&gt;
|[[Moodle 3.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.4&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016120504&lt;br /&gt;
|[[Moodle 3.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.5&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016120505&lt;br /&gt;
|[[Moodle 3.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.6&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016120506&lt;br /&gt;
| [[Moodle 3.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.7&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016120507&lt;br /&gt;
|[[Moodle 3.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.8&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016120508&lt;br /&gt;
|[[Moodle 3.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.9&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016120509&lt;br /&gt;
| [[Moodle 3.2.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.2.x ended 13 November 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.2.x ended 17 May 2018 (18 months).&lt;br /&gt;
==Moodle 3.1 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1&lt;br /&gt;
|23 May 2016&lt;br /&gt;
|2016052300&lt;br /&gt;
|[[Moodle 3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/31/en/Upgrading Upgrading to 3.1]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.1&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2016052301&lt;br /&gt;
|[[Moodle 3.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.2&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2016052302&lt;br /&gt;
|[[Moodle 3.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.3&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2016052303&lt;br /&gt;
|[[Moodle 3.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.4&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016052304&lt;br /&gt;
|[[Moodle 3.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.5&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016052305&lt;br /&gt;
|[[Moodle 3.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.6&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016052306&lt;br /&gt;
|[[Moodle 3.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.7&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016052307&lt;br /&gt;
|[[Moodle 3.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.8&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016052308&lt;br /&gt;
|[[Moodle 3.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.9&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016052309&lt;br /&gt;
|[[Moodle 3.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.10&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016052310&lt;br /&gt;
|[[Moodle 3.1.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.11&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016052311&lt;br /&gt;
|[[Moodle 3.1.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.12&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016052312&lt;br /&gt;
|[[Moodle 3.1.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.13&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2016052313&lt;br /&gt;
|[[Moodle 3.1.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.14&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2016052314&lt;br /&gt;
|[[Moodle 3.1.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.15&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2016052315&lt;br /&gt;
|[[Moodle 3.1.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.16&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2016052316&lt;br /&gt;
|[[Moodle 3.1.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.17&lt;br /&gt;
|11 March 2019&lt;br /&gt;
| 2016052317&lt;br /&gt;
|[[Moodle 3.1.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.18&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2016052318&lt;br /&gt;
|[[Moodle 3.1.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.1.x ended 8 May 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.1.x ended 13 May 2019 (36 months).&lt;br /&gt;
==Moodle 3.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0&lt;br /&gt;
|16 November 2015&lt;br /&gt;
|2015111600&lt;br /&gt;
|[[Moodle 3.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/30/en/Upgrading Upgrading to 3.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.1&lt;br /&gt;
|21 December 2015&lt;br /&gt;
|2015111601&lt;br /&gt;
| [[Moodle 3.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.2&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015111602&lt;br /&gt;
|[[Moodle 3.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.3&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015111603&lt;br /&gt;
|[[Moodle 3.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.4&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015111604&lt;br /&gt;
|[[Moodle 3.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.5&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015111605&lt;br /&gt;
|[[Moodle 3.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.6&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015111606&lt;br /&gt;
|[[Moodle 3.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.7&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015111607&lt;br /&gt;
|[[Moodle 3.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.8&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2015111608&lt;br /&gt;
|[[Moodle 3.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.9&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2015111609&lt;br /&gt;
|[[Moodle 3.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.10&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2015111610&lt;br /&gt;
|[[Moodle 3.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.0.x ended 14 November 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.0.x ended 8 May 2017 (18 months).&lt;br /&gt;
==Moodle 2.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9&lt;br /&gt;
| 11 May 2015&lt;br /&gt;
|2015051100&lt;br /&gt;
|[[Moodle 2.9 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/29/en/Upgrading_to_Moodle_2.9 Upgrading to 2.9]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.1&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2015051101&lt;br /&gt;
|[[Moodle 2.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.2&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2015051102&lt;br /&gt;
| [[Moodle 2.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.3&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2015051103&lt;br /&gt;
| [[Moodle 2.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.4&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015051104&lt;br /&gt;
|[[Moodle 2.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.5&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015051105&lt;br /&gt;
|[[Moodle 2.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.6&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015051106&lt;br /&gt;
|[[Moodle 2.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.7&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015051107&lt;br /&gt;
|[[Moodle 2.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.8&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015051108&lt;br /&gt;
|[[Moodle 2.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.9&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015051109&lt;br /&gt;
|[[Moodle 2.9.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.9.x ended 9 May 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.9.x ended 14 November 2016 (18 months).&lt;br /&gt;
==Moodle 2.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014111000&lt;br /&gt;
| [[Moodle 2.8 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/28/en/Upgrading_to_Moodle_2.8 Upgrading to 2.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.1&lt;br /&gt;
|13 November 2014&lt;br /&gt;
|2014111001&lt;br /&gt;
| [[Moodle 2.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.2&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014111002&lt;br /&gt;
| [[Moodle 2.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.3&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014111003&lt;br /&gt;
|[[Moodle 2.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.4&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014111004&lt;br /&gt;
|[[Moodle 2.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.5&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014111005&lt;br /&gt;
|[[Moodle 2.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.6&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014111006&lt;br /&gt;
|[[Moodle 2.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.7&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014111007&lt;br /&gt;
|[[Moodle 2.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.8&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2014111008&lt;br /&gt;
| [[Moodle 2.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.9&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014111009&lt;br /&gt;
|[[Moodle 2.8.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.10&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014111010&lt;br /&gt;
|[[Moodle 2.8.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.11&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014111011&lt;br /&gt;
|[[Moodle 2.8.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.12&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014111012&lt;br /&gt;
| [[Moodle 2.8.12 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.8.x ended 9 November 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.8.x ended 9 May 2016 (18 months).&lt;br /&gt;
==Moodle 2.7 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7&lt;br /&gt;
| 12 May 2014&lt;br /&gt;
|2014051200&lt;br /&gt;
|[[Moodle 2.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/27/en/Upgrading_to_Moodle_2.7 Upgrading to 2.7]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.1&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2014051201&lt;br /&gt;
|[[Moodle 2.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.2&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2014051202&lt;br /&gt;
|[[Moodle 2.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.3&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014051203&lt;br /&gt;
| [[Moodle 2.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.4&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014051204&lt;br /&gt;
| [[Moodle 2.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.5&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014051205&lt;br /&gt;
|[[Moodle 2.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.6&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014051206&lt;br /&gt;
|[[Moodle 2.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.7&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014051207&lt;br /&gt;
|[[Moodle 2.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.8&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014051208&lt;br /&gt;
|[[Moodle 2.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.9&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014051209&lt;br /&gt;
|[[Moodle 2.7.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.10&lt;br /&gt;
| 14 September 2015&lt;br /&gt;
|2014051210&lt;br /&gt;
|[[Moodle 2.7.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.11&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014051211&lt;br /&gt;
|[[Moodle 2.7.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.12&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014051212&lt;br /&gt;
|[[Moodle 2.7.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.13&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014051213&lt;br /&gt;
|[[Moodle 2.7.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.14&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014051214&lt;br /&gt;
| [[Moodle 2.7.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.15&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2014051215&lt;br /&gt;
|[[Moodle 2.7.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.16&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2014051216&lt;br /&gt;
|[[Moodle 2.7.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.17&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2014051217&lt;br /&gt;
|[[Moodle 2.7.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.18&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2014051218&lt;br /&gt;
|[[Moodle 2.7.18 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.19&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2014051219&lt;br /&gt;
|[[Moodle 2.7.19 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.20&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2014051220&lt;br /&gt;
| [[Moodle 2.7.20 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.7.x ended 11 May 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.7.x ended 8 May 2017 (36 months).&lt;br /&gt;
==Moodle 2.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6&lt;br /&gt;
|18 November 2013&lt;br /&gt;
|2013111800&lt;br /&gt;
|[[Moodle 2.6 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/26/en/Upgrading_to_Moodle_2.6 Upgrading to 2.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.1&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013111801&lt;br /&gt;
| [[Moodle 2.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.2&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013111802&lt;br /&gt;
|[[Moodle 2.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.3&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013111803&lt;br /&gt;
|[[Moodle 2.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.4&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013111804&lt;br /&gt;
|[[Moodle 2.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.5&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013111805&lt;br /&gt;
|[[Moodle 2.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.6&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2013111806&lt;br /&gt;
|[[Moodle 2.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.7&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2013111807&lt;br /&gt;
|[[Moodle 2.6.7 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.8&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2013111808&lt;br /&gt;
|[[Moodle 2.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.9&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2013111809&lt;br /&gt;
|[[Moodle 2.6.9 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.10&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2013111810&lt;br /&gt;
| [[Moodle 2.6.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.11&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2013111811&lt;br /&gt;
|[[Moodle 2.6.11 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.6.x ended 10 November 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.6.x ended 11 May 2015 (18 months).&lt;br /&gt;
==Moodle 2.5==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5&lt;br /&gt;
| 14 May 2013&lt;br /&gt;
|2013051400&lt;br /&gt;
|[[Moodle 2.5 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/25/en/Upgrading_to_Moodle_2.5 Upgrading to 2.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.1&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2013051401&lt;br /&gt;
|[[Moodle 2.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.2&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2013051402&lt;br /&gt;
|[[Moodle 2.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.3&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2013051403&lt;br /&gt;
|[[Moodle 2.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.4&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013051404&lt;br /&gt;
| [[Moodle 2.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.5&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013051405&lt;br /&gt;
|[[Moodle 2.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.6&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013051406&lt;br /&gt;
|[[Moodle 2.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.7&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013051407&lt;br /&gt;
|[[Moodle 2.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.8&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013051408&lt;br /&gt;
|[[Moodle 2.5.8 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.9&lt;br /&gt;
| 10 November 2014&lt;br /&gt;
|2013051409&lt;br /&gt;
|[[Moodle 2.5.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.5.x ended May 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.5.x ended 10 November 2014 (18 months).&lt;br /&gt;
==Moodle 2.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4&lt;br /&gt;
|3 December 2012&lt;br /&gt;
|2012120300&lt;br /&gt;
|[[Moodle 2.4 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/24/en/Upgrading_to_Moodle_2.4 Upgrading to 2.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.1&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012120301&lt;br /&gt;
|[[Moodle 2.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.2&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012120302&lt;br /&gt;
|[[Moodle 2.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.3&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012120303&lt;br /&gt;
|[[Moodle 2.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.4&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012120304&lt;br /&gt;
|[[Moodle 2.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.5&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012120305&lt;br /&gt;
|[[Moodle 2.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.6&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012120306&lt;br /&gt;
|[[Moodle 2.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.7&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012120307&lt;br /&gt;
| [[Moodle 2.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.8&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012120308&lt;br /&gt;
|[[Moodle 2.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.9&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2012120309&lt;br /&gt;
|[[Moodle 2.4.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.10&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2012120310&lt;br /&gt;
| [[Moodle 2.4.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.11&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2012120311&lt;br /&gt;
|[[Moodle 2.4.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.4.x ended December 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.4.x ended June 2014 (18 months).&lt;br /&gt;
==Moodle 2.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3&lt;br /&gt;
|25 June 2012&lt;br /&gt;
|2012062500&lt;br /&gt;
|[[Moodle 2.3 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/23/en/Upgrading_to_Moodle_2.3 Upgrading to 2.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.1&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2012062501&lt;br /&gt;
|[[Moodle 2.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.2&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2012062502&lt;br /&gt;
|[[Moodle 2.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.3&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2012062503&lt;br /&gt;
|[[Moodle 2.3.3 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.4&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012062504&lt;br /&gt;
|[[Moodle 2.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.5&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012062505&lt;br /&gt;
|[[Moodle 2.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.6&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012062506&lt;br /&gt;
|[[Moodle 2.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.7&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012062507&lt;br /&gt;
|[[Moodle 2.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.8&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012062508&lt;br /&gt;
|[[Moodle 2.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.9&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012062509&lt;br /&gt;
|[[Moodle 2.3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.10&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012062510&lt;br /&gt;
|[[Moodle 2.3.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.11&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012062511&lt;br /&gt;
|[[Moodle 2.3.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.3.x ended June 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.3.x ended December 2013 (18 months).&lt;br /&gt;
==Moodle 2.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2&lt;br /&gt;
|5 December 2011&lt;br /&gt;
|2011120500&lt;br /&gt;
|[[Moodle 2.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/22/en/Upgrading_to_Moodle_2.2 Upgrading to 2.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.1&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011120501&lt;br /&gt;
|[[Moodle 2.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.2&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011120502&lt;br /&gt;
|[[Moodle 2.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.3&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011120503&lt;br /&gt;
|[[Moodle 2.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.4&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011120504&lt;br /&gt;
|[[Moodle 2.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.5&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011120505&lt;br /&gt;
|[[Moodle 2.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.6&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011120506&lt;br /&gt;
| [[Moodle 2.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.7&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011120507&lt;br /&gt;
|[[Moodle 2.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.8&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2011120508&lt;br /&gt;
|[[Moodle 2.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.9&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2011120509&lt;br /&gt;
|[[Moodle 2.2.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.10&lt;br /&gt;
|14 May 2013&lt;br /&gt;
| 2011120510&lt;br /&gt;
|[[Moodle 2.2.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.11&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2011120511&lt;br /&gt;
|[[Moodle 2.2.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.2.x ended December 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.2.x ended June 2013 (18 months).&lt;br /&gt;
==Moodle 2.1==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1&lt;br /&gt;
| 1 July 2011&lt;br /&gt;
|2011070100&lt;br /&gt;
|[[Moodle 2.1 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/21/en/Upgrading_to_Moodle_2.1 Upgrading to 2.1]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.1&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011070101&lt;br /&gt;
| [[Moodle 2.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.2&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011070102&lt;br /&gt;
|[[Moodle 2.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.3&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011070103&lt;br /&gt;
|[[Moodle 2.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.4&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011070104&lt;br /&gt;
|[[Moodle 2.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.5&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011070105&lt;br /&gt;
|[[Moodle 2.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.6&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011070106&lt;br /&gt;
|[[Moodle 2.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.7&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011070107&lt;br /&gt;
|[[Moodle 2.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.8&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011070108&lt;br /&gt;
|[[Moodle 2.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.9&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011070109&lt;br /&gt;
|[[Moodle 2.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.10&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011070110&lt;br /&gt;
|[[Moodle 2.1.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.1.x ended June 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.1.x ended December 2012 (18 months).&lt;br /&gt;
==Moodle 2.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0&lt;br /&gt;
|24 November 2010&lt;br /&gt;
|2010112400&lt;br /&gt;
| [[Moodle 2.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/20/en/Upgrading_to_Moodle_2.0 Upgrading to 2.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.1&lt;br /&gt;
|25 December 2010&lt;br /&gt;
|2010122500&lt;br /&gt;
|[[Moodle 2.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.2&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2011022100&lt;br /&gt;
|[[Moodle 2.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.3&lt;br /&gt;
|5 May 2011&lt;br /&gt;
|2011033003&lt;br /&gt;
|[[Moodle 2.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.4&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011033004&lt;br /&gt;
| [[Moodle 2.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.5&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011033005&lt;br /&gt;
|[[Moodle 2.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.6&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011033006&lt;br /&gt;
|[[Moodle 2.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.7&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011033007&lt;br /&gt;
|[[Moodle 2.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.8&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011033008&lt;br /&gt;
|[[Moodle 2.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.9&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011033009&lt;br /&gt;
|[[Moodle 2.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.10&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011033010&lt;br /&gt;
|[[Moodle 2.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.0.x ended December 2011 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.0.x ended June 2012 (18 months).&lt;br /&gt;
==Moodle 1.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9&lt;br /&gt;
|3 March 2008&lt;br /&gt;
|2007101509&lt;br /&gt;
|[[Moodle 1.9 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/19/en/Upgrading_to_Moodle_1.9 Upgrading to 1.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.1&lt;br /&gt;
|15 May 2008&lt;br /&gt;
| 2007101512&lt;br /&gt;
|[[Moodle 1.9.1 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.2&lt;br /&gt;
|11 July 2008&lt;br /&gt;
|2007101520&lt;br /&gt;
|[[Moodle 1.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.3&lt;br /&gt;
|15 October 2008&lt;br /&gt;
|2007101530&lt;br /&gt;
|[[Moodle 1.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.4&lt;br /&gt;
|28 January 2009&lt;br /&gt;
|2007101540&lt;br /&gt;
|[[Moodle 1.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.5&lt;br /&gt;
|13 May 2009&lt;br /&gt;
|2007101550&lt;br /&gt;
|[[Moodle 1.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.6&lt;br /&gt;
|21 October 2009&lt;br /&gt;
|2007101560&lt;br /&gt;
|[[Moodle 1.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.7&lt;br /&gt;
|25 November 2009&lt;br /&gt;
|2007101570&lt;br /&gt;
|[[Moodle 1.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.8&lt;br /&gt;
|25 March 2010&lt;br /&gt;
|2007101580.00&lt;br /&gt;
|[[Moodle 1.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.9&lt;br /&gt;
| 8 June 2010&lt;br /&gt;
| 2007101590.00&lt;br /&gt;
| [[Moodle 1.9.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.10&lt;br /&gt;
|25 October 2010&lt;br /&gt;
|2007101591.00&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.10 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.11&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2007101591.02&lt;br /&gt;
|[[Moodle 1.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.12&lt;br /&gt;
|10 May 2011&lt;br /&gt;
|2007101591.03&lt;br /&gt;
|[[Moodle 1.9.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.13&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2007101591.04&lt;br /&gt;
|[[Moodle 1.9.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.14&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2007101591.06&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.15&lt;br /&gt;
|28 November 2011&lt;br /&gt;
| 2007101591.07&lt;br /&gt;
| [[Moodle 1.9.15 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.16&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2007101591.10&lt;br /&gt;
|[[Moodle 1.9.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.17&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2007101591.12&lt;br /&gt;
|[[Moodle 1.9.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.18&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2007101591.16&lt;br /&gt;
|[[Moodle 1.9.18 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.19&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2007101592.00&lt;br /&gt;
|[[Moodle 1.9.19 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 1.9.x has ended June 2011 (3.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.x by Moodle HQ ended June 2012 (4.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.19+ branch by [http://catalyst.net.nz Catalyst IT] ended [http://moodle.org/mod/forum/discuss.php?d=199706 Dec 2013] (6 years).&lt;br /&gt;
==Moodle 1.8 ==&lt;br /&gt;
*[[Moodle 1.8 release notes|Moodle 1.8]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.8.1 release notes|Moodle 1.8.1]] - 14 June 2007&lt;br /&gt;
*[[Moodle 1.8.2 release notes|Moodle 1.8.2]] - 8 July 2007&lt;br /&gt;
*[[Moodle 1.8.3 release notes|Moodle 1.8.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.8.4 release notes|Moodle 1.8.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.8.5 release notes|Moodle 1.8.5]] - 8 April 2008&lt;br /&gt;
*[[Moodle 1.8.6 release notes|Moodle 1.8.6]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.8.7 release notes|Moodle 1.8.7]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.8.8 release notes|Moodle 1.8.8]] - 28 January 2009&lt;br /&gt;
*[[Moodle 1.8.9 release notes|Moodle 1.8.9]] - 15 May 2009&lt;br /&gt;
*[[Moodle 1.8.10 release notes|Moodle 1.8.10]] - 26 October 2009&lt;br /&gt;
*[[Moodle 1.8.11 release notes|Moodle 1.8.11]] - 25 November 2009&lt;br /&gt;
*[[Moodle 1.8.12 release notes|Moodle 1.8.12]] - 27 March 2010&lt;br /&gt;
*[[Moodle 1.8.13 release notes|Moodle 1.8.13]] - 8 June 2010&lt;br /&gt;
*[[Moodle 1.8.14 release notes|Moodle 1.8.14]] - 3 December 2010&lt;br /&gt;
*Support has ended&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.7==&lt;br /&gt;
*[[Moodle 1.7 release notes|Moodle 1.7]] - 7 November 2006&lt;br /&gt;
*[[Moodle 1.7.1 release notes|Moodle 1.7.1]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.7.2 release notes|Moodle 1.7.2]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.7.3 release notes|Moodle 1.7.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.7.4 release notes|Moodle 1.7.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.7.5 release notes|Moodle 1.7.5]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.7.6 release notes|Moodle 1.7.6]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.7.7 release notes|Moodle 1.7.7]] - 28 January 2009&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.6==&lt;br /&gt;
*[[Moodle 1.6 release notes|Moodle 1.6]] - 20 June 2006&lt;br /&gt;
*[[Moodle 1.6.1 release notes|Moodle 1.6.1]] - 20 July 2006&lt;br /&gt;
*[[Moodle 1.6.2 release notes|Moodle 1.6.2]] - 12 September 2006&lt;br /&gt;
*[[Moodle 1.6.3 release notes|Moodle 1.6.3]] - 10 October 2006&lt;br /&gt;
*[[Moodle 1.6.4 release notes|Moodle 1.6.4]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.6.5 release notes|Moodle 1.6.5]] - 30 March 2007&lt;br /&gt;
*Moodle 1.6.6 - 11 January 2008&lt;br /&gt;
*Moodle 1.6.7 - 11 July 2008&lt;br /&gt;
*[[Moodle 1.6.8 release notes|Moodle 1.6.8]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.6.9 release notes|Moodle 1.6.9]] - 28 January 2009&lt;br /&gt;
* Support has ended&lt;br /&gt;
==Moodle 1.5==&lt;br /&gt;
*[[Moodle 1.5 release notes|Moodle 1.5]] - 5 June 2005&lt;br /&gt;
*[[Moodle 1.5.1 release notes|Moodle 1.5.1]] - 8 July 2005&lt;br /&gt;
*[[Moodle 1.5.2 release notes|Moodle 1.5.2]] - 16 July 2005&lt;br /&gt;
*[[Moodle 1.5.3 release notes|Moodle 1.5.3]] - 11 November 2005&lt;br /&gt;
*[[Moodle 1.5.4 release notes|Moodle 1.5.4]] - 21 May 2006&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.4==&lt;br /&gt;
*Moodle 1.4 - 31 August 2004&lt;br /&gt;
*Moodle 1.4.1 - 12 September 2004&lt;br /&gt;
*Moodle 1.4.2 - 5 November 2004&lt;br /&gt;
*Moodle 1.4.3 - 21 December 2004&lt;br /&gt;
*Moodle 1.4.4 - 7 March 2005&lt;br /&gt;
*[[Moodle 1.4.5 release notes|Moodle 1.4.5]] - 7 May 2005&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.3==&lt;br /&gt;
*Moodle 1.3 - 25 May 2004&lt;br /&gt;
* Moodle 1.3.1 - 4 June 2004&lt;br /&gt;
*Moodle 1.3.2 - 9 July 2004&lt;br /&gt;
*Moodle 1.3.3 - 16 July 2004&lt;br /&gt;
* Moodle 1.3.4 - 11 August 2004&lt;br /&gt;
*Moodle 1.3.5 - 9 September 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.2==&lt;br /&gt;
*Moodle 1.2 - 20 March 2004&lt;br /&gt;
*Moodle 1.2.1 - 25 March 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.1==&lt;br /&gt;
*Moodle 1.1 - 29 August 2003&lt;br /&gt;
*Moodle 1.1.1 - 11 September 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
== Moodle 1.0==&lt;br /&gt;
*Moodle 1.0 - 20 August 2002&lt;br /&gt;
*Moodle 1.0.1 - 26 August 2002&lt;br /&gt;
*Moodle 1.0.2 - 2 September 2002&lt;br /&gt;
*Moodle 1.0.3 - 5 September 2002&lt;br /&gt;
*Moodle 1.0.4 - 10 September 2002&lt;br /&gt;
*Moodle 1.0.5 - 27 September 2002&lt;br /&gt;
* Moodle 1.0.6 - 26 October 2002&lt;br /&gt;
::1.0.6.1 - 6 November 2002&lt;br /&gt;
::1.0.6.2 - 11 November 2002&lt;br /&gt;
::1.0.6.3 - 14 November 2002&lt;br /&gt;
::1.0.6.4 - 25 November 2002&lt;br /&gt;
*Moodle 1.0.7 - 9 December 2002&lt;br /&gt;
*Moodle 1.0.8 - 7 January 2003&lt;br /&gt;
*Moodle 1.0.9 - 30 May 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Roadmap]] - future versions&lt;br /&gt;
*[[Moodle versions]] - an explanation of how our versions work plus version numbers for each release (for $plugin-&amp;gt;requires)&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Core development]]&lt;br /&gt;
[[fr:Historique des versions]]&lt;br /&gt;
[[es:dev/Historia de las versiones]]&lt;br /&gt;
[[de:Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=62364</id>
		<title>Releases</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=62364"/>
		<updated>2022-05-09T01:46:19Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* Moodle 3.11 table padding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all official releases of Moodle, grouped by branch in reverse chronological order.&lt;br /&gt;
==Version support==&lt;br /&gt;
From Moodle 2.6 onwards, the end of support, both general and security, happens the second Monday of May and November, observing the 12, 18... month periods, no matter if the major release date was moved or not.&lt;br /&gt;
&lt;br /&gt;
The most recent [https://en.wikipedia.org/wiki/Long-term_support long-term support release (LTS)] version is Moodle 3.9.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Version&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Release status&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Initial release&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:rgba(0, 0, 0, 0.05);&amp;quot; | General support ends&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Security support ends&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.9 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 15 June 2020&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 10 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 November 2023 (ext 6M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.11&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 17 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 14 Nov 2022 (ext 6M)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 Nov 2023 (ext 12M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |4.0&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |19 April 2022&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |8 May 2023&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |13 November 2023&lt;br /&gt;
|-&lt;br /&gt;
|4.1 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stable&lt;br /&gt;
|November 2022&lt;br /&gt;
|November 2023&lt;br /&gt;
|November 2025&lt;br /&gt;
|}&lt;br /&gt;
[[Image:401_release_graph.png|alt=Release graph]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Release graph key:&amp;lt;/b&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Currently supported stable releases.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | Current release of versions still receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Future point releases receiving bug fixes, as well as security updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#316d5e; color:white; adding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Future point releases receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#686566; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Previously released versions containing bug fixes, as well as security updates. Updating to a currently supported version is recommended.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#282828; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Previously released versions containing security updates only. Updating to a currently supported version is recommended.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==General release calendar==&lt;br /&gt;
These are the target dates for releases. These dates may vary slightly due to unforeseen circumstances.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Release type&lt;br /&gt;
!Frequency&lt;br /&gt;
!Months&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Major_release_cycles|Major]] (eg. 3.x)&lt;br /&gt;
|6 monthly&lt;br /&gt;
|Second Monday of May and November&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Stable_maintenance_cycles|Minor]] (Point) (eg. 3.x.y)&lt;br /&gt;
| 2 monthly&lt;br /&gt;
|Second Monday of July, September, November, March and May.&lt;br /&gt;
Third Monday of January.&lt;br /&gt;
|}&lt;br /&gt;
All releases are preceded by a one week warning. Upcoming release dates can be found in the [https://www.google.com/calendar/ical/moodle.com_p4c2oe7hsb77ltaro5qtihb5d4%40group.calendar.google.com/public/basic.ics Moodle development calendar] (Note, this is an iCAL link that will try to add the dates to your personal calendar. If you just want to browse the dates online, use [https://calendar.google.com/calendar/embed?src=moodle.com_p4c2oe7hsb77ltaro5qtihb5d4@group.calendar.google.com&amp;amp;pli=1 this link].).&lt;br /&gt;
&lt;br /&gt;
==Moodle 4.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 4.0&lt;br /&gt;
|19 April 2022&lt;br /&gt;
|2022041900&lt;br /&gt;
|[[Moodle 4.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/400/en/Upgrading Upgrading to 4.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 4.0.1&lt;br /&gt;
|9 May 2022&lt;br /&gt;
|2022041901&lt;br /&gt;
|[[Moodle 4.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 4.0.x will end 8 May 2023 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 4.0.x will end 13 November 2023 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.11==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11&lt;br /&gt;
|17 May 2021&lt;br /&gt;
|2021051700&lt;br /&gt;
|[[Moodle 3.11 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/311/en/Upgrading Upgrading to 3.11]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.1&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2021051701&lt;br /&gt;
|[[Moodle 3.11.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.2&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2021051702&lt;br /&gt;
|[[Moodle 3.11.2 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.3&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2021051703&lt;br /&gt;
|[[Moodle 3.11.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.4&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2021051704&lt;br /&gt;
|[[Moodle 3.11.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.5&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2021051705&lt;br /&gt;
|[[Moodle 3.11.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.6&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2021051706&lt;br /&gt;
|[[Moodle 3.11.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.7&lt;br /&gt;
|9 May 2022&lt;br /&gt;
|2021051707&lt;br /&gt;
|[[Moodle 3.11.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).&lt;br /&gt;
 Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.10==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020110900&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 3.10 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/310/en/Upgrading Upgrading to 3.10]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.1&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020110901&lt;br /&gt;
| [[Moodle 3.10.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.2&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020110902&lt;br /&gt;
|[[Moodle 3.10.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.3&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020110903&lt;br /&gt;
|[[Moodle 3.10.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.4&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020110904&lt;br /&gt;
|[[Moodle 3.10.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.5&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020110905&lt;br /&gt;
|[[Moodle 3.10.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.6&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020110906&lt;br /&gt;
|[[Moodle 3.10.6 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.7&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020110907&lt;br /&gt;
|[[Moodle 3.10.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.8&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2020110908&lt;br /&gt;
|[[Moodle 3.10.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.9&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2020110909&lt;br /&gt;
|[[Moodle 3.10.9 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.10&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2020110910&lt;br /&gt;
|[[Moodle 3.10.10 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.11&lt;br /&gt;
|9 May 2022&lt;br /&gt;
|2020110911&lt;br /&gt;
|[[Moodle 3.10.11 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.10.x ended 8 November 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).&lt;br /&gt;
==Moodle 3.9 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9&lt;br /&gt;
|15 June 2020&lt;br /&gt;
|2020061500&lt;br /&gt;
|[[Moodle 3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/39/en/Upgrading Upgrading to 3.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.1&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2020061501&lt;br /&gt;
|[[Moodle 3.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.2&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2020061502&lt;br /&gt;
| [[Moodle 3.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.3&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020061503&lt;br /&gt;
| [[Moodle 3.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.4&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020061504&lt;br /&gt;
|[[Moodle 3.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.5&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020061505&lt;br /&gt;
|[[Moodle 3.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.6&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020061506&lt;br /&gt;
|[[Moodle 3.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.7&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020061507&lt;br /&gt;
|[[Moodle 3.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.8&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020061508&lt;br /&gt;
|[[Moodle 3.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.9&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020061509&lt;br /&gt;
|[[Moodle 3.9.9 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.10&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020061510&lt;br /&gt;
|[[Moodle 3.9.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.11&lt;br /&gt;
| 8 November 2021&lt;br /&gt;
|2020061511&lt;br /&gt;
|[[Moodle 3.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.12&lt;br /&gt;
| 17 January 2022&lt;br /&gt;
|2020061512&lt;br /&gt;
|[[Moodle 3.9.12 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.13&lt;br /&gt;
| 14 March 2022&lt;br /&gt;
|2020061513&lt;br /&gt;
|[[Moodle 3.9.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.14&lt;br /&gt;
| 9 May 2022&lt;br /&gt;
|2020061514&lt;br /&gt;
|[[Moodle 3.9.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.9.x ended 10 May 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.9.x will end 13 Nov 2023 (36 months plus 6 months extension).&lt;br /&gt;
==Moodle 3.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8&lt;br /&gt;
|18 November 2019&lt;br /&gt;
|2019111800&lt;br /&gt;
|[[Moodle 3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/38/en/Upgrading Upgrading to 3.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.1&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019111801&lt;br /&gt;
|[[Moodle 3.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.2&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019111802&lt;br /&gt;
|[[Moodle 3.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.3&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019111803&lt;br /&gt;
|[[Moodle 3.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.4&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019111804&lt;br /&gt;
|[[Moodle 3.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.5&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019111805&lt;br /&gt;
| [[Moodle 3.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.6&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019111806&lt;br /&gt;
| [[Moodle 3.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.7&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2019111807&lt;br /&gt;
|[[Moodle 3.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.8&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2019111808&lt;br /&gt;
|[[Moodle 3.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.9&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2019111809&lt;br /&gt;
|[[Moodle 3.8.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.8.x ended 9 November 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.8.x ended 10 May 2021 (18 months).&lt;br /&gt;
==Moodle 3.7==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7&lt;br /&gt;
|20 May 2019&lt;br /&gt;
|2019052000&lt;br /&gt;
|[[Moodle 3.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/37/en/Upgrading Upgrading to 3.7]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.1&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2019052001&lt;br /&gt;
|[[Moodle 3.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.2&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2019052002&lt;br /&gt;
|[[Moodle 3.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.3&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2019052003&lt;br /&gt;
| [[Moodle 3.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.4&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019052004&lt;br /&gt;
|[[Moodle 3.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.5&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019052005&lt;br /&gt;
|[[Moodle 3.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.6&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019052006&lt;br /&gt;
|[[Moodle 3.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.7&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019052007&lt;br /&gt;
|[[Moodle 3.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.8&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019052008&lt;br /&gt;
| [[Moodle 3.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.9&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019052009&lt;br /&gt;
|[[Moodle 3.7.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.7.x ended 11 May 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.7.x ended 9 November 2020 (18 months).&lt;br /&gt;
==Moodle 3.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6&lt;br /&gt;
| 3 December 2018&lt;br /&gt;
|2018120300&lt;br /&gt;
|[[Moodle 3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/36/en/Upgrading Upgrading to 3.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.1&lt;br /&gt;
|5 December 2018&lt;br /&gt;
|2018120301&lt;br /&gt;
| [[Moodle 3.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6.2&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018120302&lt;br /&gt;
|[[Moodle 3.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.3&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018120303&lt;br /&gt;
|[[Moodle 3.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.4&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018120304&lt;br /&gt;
|[[Moodle 3.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.5&lt;br /&gt;
|8th July 2019&lt;br /&gt;
|2018120305&lt;br /&gt;
|[[Moodle 3.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.6&lt;br /&gt;
|9th September 2019&lt;br /&gt;
|2018120306&lt;br /&gt;
|[[Moodle 3.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.7&lt;br /&gt;
| 11th November 2019&lt;br /&gt;
|2018120307&lt;br /&gt;
|[[Moodle 3.6.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.8&lt;br /&gt;
|13th January 2020&lt;br /&gt;
|2018120308&lt;br /&gt;
|[[Moodle 3.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.9&lt;br /&gt;
|9th March 2020&lt;br /&gt;
|2018120309&lt;br /&gt;
| [[Moodle 3.6.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.10&lt;br /&gt;
|11th May 2020&lt;br /&gt;
|2018120310&lt;br /&gt;
|[[Moodle 3.6.10 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.6.x ended 11 November 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.6.x ended 11 May 2020 (18 months).&lt;br /&gt;
==Moodle 3.5 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2018051700&lt;br /&gt;
|[[Moodle 3.5 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/35/en/Upgrading Upgrading to 3.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.1&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2018051701&lt;br /&gt;
|[[Moodle 3.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.2&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2018051702&lt;br /&gt;
|[[Moodle 3.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.3&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2018051703&lt;br /&gt;
| [[Moodle 3.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.4&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018051704&lt;br /&gt;
|[[Moodle 3.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.5&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018051705&lt;br /&gt;
|[[Moodle 3.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.6&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018051706&lt;br /&gt;
|[[Moodle 3.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.7&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2018051707&lt;br /&gt;
|[[Moodle 3.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.8&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2018051708&lt;br /&gt;
|[[Moodle 3.5.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.9&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2018051709&lt;br /&gt;
|[[Moodle 3.5.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.10&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2018051710&lt;br /&gt;
| [[Moodle 3.5.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.11&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2018051711&lt;br /&gt;
|[[Moodle 3.5.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.12&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2018051712&lt;br /&gt;
| [[Moodle 3.5.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.13&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2018051713&lt;br /&gt;
|[[Moodle 3.5.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.14&lt;br /&gt;
| 14 September 2020&lt;br /&gt;
|2018051714&lt;br /&gt;
|[[Moodle 3.5.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.15&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2018051715&lt;br /&gt;
|[[Moodle 3.5.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.16&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2018051716&lt;br /&gt;
| [[Moodle 3.5.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.17&lt;br /&gt;
|8 March 2021&lt;br /&gt;
| 2018051717&lt;br /&gt;
|[[Moodle 3.5.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.18&lt;br /&gt;
| 10 May 2021&lt;br /&gt;
| 2018051718&lt;br /&gt;
|[[Moodle 3.5.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.5.x ended May 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.5.x ended 10 May 2021 (36 months).&lt;br /&gt;
==Moodle 3.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017111300&lt;br /&gt;
|[[Moodle 3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/34/en/Upgrading Upgrading to 3.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.1&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017111301&lt;br /&gt;
|[[Moodle 3.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.2&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017111302&lt;br /&gt;
|[[Moodle 3.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.3&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017111303&lt;br /&gt;
|[[Moodle 3.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.4&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017111304&lt;br /&gt;
|[[Moodle 3.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.5&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017111305&lt;br /&gt;
|[[Moodle 3.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.6&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017111306&lt;br /&gt;
| [[Moodle 3.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.7&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2017111307&lt;br /&gt;
|[[Moodle 3.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.8&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2017111308&lt;br /&gt;
|[[Moodle 3.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.9&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2017111309&lt;br /&gt;
| [[Moodle 3.4.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.4.x ended 12 November 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.4.x ended 13 May 2019 (18 months).&lt;br /&gt;
==Moodle 3.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3&lt;br /&gt;
|15 May 2017&lt;br /&gt;
|2017051500&lt;br /&gt;
|[[Moodle 3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/33/en/Upgrading Upgrading to 3.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.1&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2017051501&lt;br /&gt;
|[[Moodle 3.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.2&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2017051502&lt;br /&gt;
|[[Moodle 3.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.3&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017051503&lt;br /&gt;
| [[Moodle 3.3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.4&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017051504&lt;br /&gt;
|[[Moodle 3.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.5&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017051505&lt;br /&gt;
|[[Moodle 3.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.6&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017051506&lt;br /&gt;
|[[Moodle 3.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.7&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017051507&lt;br /&gt;
|[[Moodle 3.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.8&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017051508&lt;br /&gt;
|[[Moodle 3.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.9&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017051509&lt;br /&gt;
|[[Moodle 3.3.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.3.x ended 17 May 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.3.x ended 12 November 2018 (18 months).&lt;br /&gt;
==Moodle 3.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2&lt;br /&gt;
| 5 December 2016&lt;br /&gt;
|2016120500&lt;br /&gt;
|[[Moodle 3.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/32/en/Upgrading Upgrading to 3.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.1&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016120501&lt;br /&gt;
|[[Moodle 3.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.2&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016120502&lt;br /&gt;
|[[Moodle 3.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.3&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016120503&lt;br /&gt;
|[[Moodle 3.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.4&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016120504&lt;br /&gt;
|[[Moodle 3.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.5&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016120505&lt;br /&gt;
|[[Moodle 3.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.6&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016120506&lt;br /&gt;
| [[Moodle 3.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.7&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016120507&lt;br /&gt;
|[[Moodle 3.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.8&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016120508&lt;br /&gt;
|[[Moodle 3.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.9&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016120509&lt;br /&gt;
| [[Moodle 3.2.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.2.x ended 13 November 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.2.x ended 17 May 2018 (18 months).&lt;br /&gt;
==Moodle 3.1 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1&lt;br /&gt;
|23 May 2016&lt;br /&gt;
|2016052300&lt;br /&gt;
|[[Moodle 3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/31/en/Upgrading Upgrading to 3.1]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.1&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2016052301&lt;br /&gt;
|[[Moodle 3.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.2&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2016052302&lt;br /&gt;
|[[Moodle 3.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.3&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2016052303&lt;br /&gt;
|[[Moodle 3.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.4&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016052304&lt;br /&gt;
|[[Moodle 3.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.5&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016052305&lt;br /&gt;
|[[Moodle 3.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.6&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016052306&lt;br /&gt;
|[[Moodle 3.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.7&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016052307&lt;br /&gt;
|[[Moodle 3.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.8&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016052308&lt;br /&gt;
|[[Moodle 3.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.9&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016052309&lt;br /&gt;
|[[Moodle 3.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.10&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016052310&lt;br /&gt;
|[[Moodle 3.1.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.11&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016052311&lt;br /&gt;
|[[Moodle 3.1.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.12&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016052312&lt;br /&gt;
|[[Moodle 3.1.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.13&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2016052313&lt;br /&gt;
|[[Moodle 3.1.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.14&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2016052314&lt;br /&gt;
|[[Moodle 3.1.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.15&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2016052315&lt;br /&gt;
|[[Moodle 3.1.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.16&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2016052316&lt;br /&gt;
|[[Moodle 3.1.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.17&lt;br /&gt;
|11 March 2019&lt;br /&gt;
| 2016052317&lt;br /&gt;
|[[Moodle 3.1.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.18&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2016052318&lt;br /&gt;
|[[Moodle 3.1.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.1.x ended 8 May 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.1.x ended 13 May 2019 (36 months).&lt;br /&gt;
==Moodle 3.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0&lt;br /&gt;
|16 November 2015&lt;br /&gt;
|2015111600&lt;br /&gt;
|[[Moodle 3.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/30/en/Upgrading Upgrading to 3.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.1&lt;br /&gt;
|21 December 2015&lt;br /&gt;
|2015111601&lt;br /&gt;
| [[Moodle 3.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.2&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015111602&lt;br /&gt;
|[[Moodle 3.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.3&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015111603&lt;br /&gt;
|[[Moodle 3.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.4&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015111604&lt;br /&gt;
|[[Moodle 3.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.5&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015111605&lt;br /&gt;
|[[Moodle 3.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.6&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015111606&lt;br /&gt;
|[[Moodle 3.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.7&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015111607&lt;br /&gt;
|[[Moodle 3.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.8&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2015111608&lt;br /&gt;
|[[Moodle 3.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.9&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2015111609&lt;br /&gt;
|[[Moodle 3.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.10&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2015111610&lt;br /&gt;
|[[Moodle 3.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.0.x ended 14 November 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.0.x ended 8 May 2017 (18 months).&lt;br /&gt;
==Moodle 2.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9&lt;br /&gt;
| 11 May 2015&lt;br /&gt;
|2015051100&lt;br /&gt;
|[[Moodle 2.9 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/29/en/Upgrading_to_Moodle_2.9 Upgrading to 2.9]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.1&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2015051101&lt;br /&gt;
|[[Moodle 2.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.2&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2015051102&lt;br /&gt;
| [[Moodle 2.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.3&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2015051103&lt;br /&gt;
| [[Moodle 2.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.4&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015051104&lt;br /&gt;
|[[Moodle 2.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.5&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015051105&lt;br /&gt;
|[[Moodle 2.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.6&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015051106&lt;br /&gt;
|[[Moodle 2.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.7&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015051107&lt;br /&gt;
|[[Moodle 2.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.8&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015051108&lt;br /&gt;
|[[Moodle 2.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.9&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015051109&lt;br /&gt;
|[[Moodle 2.9.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.9.x ended 9 May 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.9.x ended 14 November 2016 (18 months).&lt;br /&gt;
==Moodle 2.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014111000&lt;br /&gt;
| [[Moodle 2.8 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/28/en/Upgrading_to_Moodle_2.8 Upgrading to 2.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.1&lt;br /&gt;
|13 November 2014&lt;br /&gt;
|2014111001&lt;br /&gt;
| [[Moodle 2.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.2&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014111002&lt;br /&gt;
| [[Moodle 2.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.3&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014111003&lt;br /&gt;
|[[Moodle 2.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.4&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014111004&lt;br /&gt;
|[[Moodle 2.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.5&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014111005&lt;br /&gt;
|[[Moodle 2.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.6&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014111006&lt;br /&gt;
|[[Moodle 2.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.7&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014111007&lt;br /&gt;
|[[Moodle 2.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.8&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2014111008&lt;br /&gt;
| [[Moodle 2.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.9&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014111009&lt;br /&gt;
|[[Moodle 2.8.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.10&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014111010&lt;br /&gt;
|[[Moodle 2.8.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.11&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014111011&lt;br /&gt;
|[[Moodle 2.8.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.12&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014111012&lt;br /&gt;
| [[Moodle 2.8.12 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.8.x ended 9 November 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.8.x ended 9 May 2016 (18 months).&lt;br /&gt;
==Moodle 2.7 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7&lt;br /&gt;
| 12 May 2014&lt;br /&gt;
|2014051200&lt;br /&gt;
|[[Moodle 2.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/27/en/Upgrading_to_Moodle_2.7 Upgrading to 2.7]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.1&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2014051201&lt;br /&gt;
|[[Moodle 2.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.2&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2014051202&lt;br /&gt;
|[[Moodle 2.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.3&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014051203&lt;br /&gt;
| [[Moodle 2.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.4&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014051204&lt;br /&gt;
| [[Moodle 2.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.5&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014051205&lt;br /&gt;
|[[Moodle 2.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.6&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014051206&lt;br /&gt;
|[[Moodle 2.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.7&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014051207&lt;br /&gt;
|[[Moodle 2.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.8&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014051208&lt;br /&gt;
|[[Moodle 2.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.9&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014051209&lt;br /&gt;
|[[Moodle 2.7.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.10&lt;br /&gt;
| 14 September 2015&lt;br /&gt;
|2014051210&lt;br /&gt;
|[[Moodle 2.7.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.11&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014051211&lt;br /&gt;
|[[Moodle 2.7.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.12&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014051212&lt;br /&gt;
|[[Moodle 2.7.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.13&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014051213&lt;br /&gt;
|[[Moodle 2.7.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.14&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014051214&lt;br /&gt;
| [[Moodle 2.7.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.15&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2014051215&lt;br /&gt;
|[[Moodle 2.7.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.16&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2014051216&lt;br /&gt;
|[[Moodle 2.7.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.17&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2014051217&lt;br /&gt;
|[[Moodle 2.7.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.18&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2014051218&lt;br /&gt;
|[[Moodle 2.7.18 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.19&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2014051219&lt;br /&gt;
|[[Moodle 2.7.19 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.20&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2014051220&lt;br /&gt;
| [[Moodle 2.7.20 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.7.x ended 11 May 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.7.x ended 8 May 2017 (36 months).&lt;br /&gt;
==Moodle 2.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6&lt;br /&gt;
|18 November 2013&lt;br /&gt;
|2013111800&lt;br /&gt;
|[[Moodle 2.6 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/26/en/Upgrading_to_Moodle_2.6 Upgrading to 2.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.1&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013111801&lt;br /&gt;
| [[Moodle 2.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.2&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013111802&lt;br /&gt;
|[[Moodle 2.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.3&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013111803&lt;br /&gt;
|[[Moodle 2.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.4&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013111804&lt;br /&gt;
|[[Moodle 2.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.5&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013111805&lt;br /&gt;
|[[Moodle 2.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.6&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2013111806&lt;br /&gt;
|[[Moodle 2.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.7&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2013111807&lt;br /&gt;
|[[Moodle 2.6.7 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.8&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2013111808&lt;br /&gt;
|[[Moodle 2.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.9&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2013111809&lt;br /&gt;
|[[Moodle 2.6.9 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.10&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2013111810&lt;br /&gt;
| [[Moodle 2.6.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.11&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2013111811&lt;br /&gt;
|[[Moodle 2.6.11 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.6.x ended 10 November 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.6.x ended 11 May 2015 (18 months).&lt;br /&gt;
==Moodle 2.5==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5&lt;br /&gt;
| 14 May 2013&lt;br /&gt;
|2013051400&lt;br /&gt;
|[[Moodle 2.5 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/25/en/Upgrading_to_Moodle_2.5 Upgrading to 2.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.1&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2013051401&lt;br /&gt;
|[[Moodle 2.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.2&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2013051402&lt;br /&gt;
|[[Moodle 2.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.3&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2013051403&lt;br /&gt;
|[[Moodle 2.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.4&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013051404&lt;br /&gt;
| [[Moodle 2.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.5&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013051405&lt;br /&gt;
|[[Moodle 2.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.6&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013051406&lt;br /&gt;
|[[Moodle 2.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.7&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013051407&lt;br /&gt;
|[[Moodle 2.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.8&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013051408&lt;br /&gt;
|[[Moodle 2.5.8 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.9&lt;br /&gt;
| 10 November 2014&lt;br /&gt;
|2013051409&lt;br /&gt;
|[[Moodle 2.5.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.5.x ended May 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.5.x ended 10 November 2014 (18 months).&lt;br /&gt;
==Moodle 2.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4&lt;br /&gt;
|3 December 2012&lt;br /&gt;
|2012120300&lt;br /&gt;
|[[Moodle 2.4 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/24/en/Upgrading_to_Moodle_2.4 Upgrading to 2.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.1&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012120301&lt;br /&gt;
|[[Moodle 2.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.2&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012120302&lt;br /&gt;
|[[Moodle 2.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.3&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012120303&lt;br /&gt;
|[[Moodle 2.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.4&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012120304&lt;br /&gt;
|[[Moodle 2.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.5&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012120305&lt;br /&gt;
|[[Moodle 2.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.6&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012120306&lt;br /&gt;
|[[Moodle 2.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.7&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012120307&lt;br /&gt;
| [[Moodle 2.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.8&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012120308&lt;br /&gt;
|[[Moodle 2.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.9&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2012120309&lt;br /&gt;
|[[Moodle 2.4.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.10&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2012120310&lt;br /&gt;
| [[Moodle 2.4.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.11&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2012120311&lt;br /&gt;
|[[Moodle 2.4.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.4.x ended December 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.4.x ended June 2014 (18 months).&lt;br /&gt;
==Moodle 2.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3&lt;br /&gt;
|25 June 2012&lt;br /&gt;
|2012062500&lt;br /&gt;
|[[Moodle 2.3 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/23/en/Upgrading_to_Moodle_2.3 Upgrading to 2.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.1&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2012062501&lt;br /&gt;
|[[Moodle 2.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.2&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2012062502&lt;br /&gt;
|[[Moodle 2.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.3&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2012062503&lt;br /&gt;
|[[Moodle 2.3.3 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.4&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012062504&lt;br /&gt;
|[[Moodle 2.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.5&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012062505&lt;br /&gt;
|[[Moodle 2.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.6&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012062506&lt;br /&gt;
|[[Moodle 2.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.7&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012062507&lt;br /&gt;
|[[Moodle 2.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.8&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012062508&lt;br /&gt;
|[[Moodle 2.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.9&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012062509&lt;br /&gt;
|[[Moodle 2.3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.10&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012062510&lt;br /&gt;
|[[Moodle 2.3.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.11&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012062511&lt;br /&gt;
|[[Moodle 2.3.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.3.x ended June 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.3.x ended December 2013 (18 months).&lt;br /&gt;
==Moodle 2.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2&lt;br /&gt;
|5 December 2011&lt;br /&gt;
|2011120500&lt;br /&gt;
|[[Moodle 2.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/22/en/Upgrading_to_Moodle_2.2 Upgrading to 2.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.1&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011120501&lt;br /&gt;
|[[Moodle 2.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.2&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011120502&lt;br /&gt;
|[[Moodle 2.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.3&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011120503&lt;br /&gt;
|[[Moodle 2.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.4&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011120504&lt;br /&gt;
|[[Moodle 2.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.5&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011120505&lt;br /&gt;
|[[Moodle 2.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.6&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011120506&lt;br /&gt;
| [[Moodle 2.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.7&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011120507&lt;br /&gt;
|[[Moodle 2.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.8&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2011120508&lt;br /&gt;
|[[Moodle 2.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.9&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2011120509&lt;br /&gt;
|[[Moodle 2.2.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.10&lt;br /&gt;
|14 May 2013&lt;br /&gt;
| 2011120510&lt;br /&gt;
|[[Moodle 2.2.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.11&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2011120511&lt;br /&gt;
|[[Moodle 2.2.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.2.x ended December 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.2.x ended June 2013 (18 months).&lt;br /&gt;
==Moodle 2.1==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1&lt;br /&gt;
| 1 July 2011&lt;br /&gt;
|2011070100&lt;br /&gt;
|[[Moodle 2.1 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/21/en/Upgrading_to_Moodle_2.1 Upgrading to 2.1]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.1&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011070101&lt;br /&gt;
| [[Moodle 2.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.2&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011070102&lt;br /&gt;
|[[Moodle 2.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.3&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011070103&lt;br /&gt;
|[[Moodle 2.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.4&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011070104&lt;br /&gt;
|[[Moodle 2.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.5&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011070105&lt;br /&gt;
|[[Moodle 2.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.6&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011070106&lt;br /&gt;
|[[Moodle 2.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.7&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011070107&lt;br /&gt;
|[[Moodle 2.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.8&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011070108&lt;br /&gt;
|[[Moodle 2.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.9&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011070109&lt;br /&gt;
|[[Moodle 2.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.10&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011070110&lt;br /&gt;
|[[Moodle 2.1.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.1.x ended June 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.1.x ended December 2012 (18 months).&lt;br /&gt;
==Moodle 2.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0&lt;br /&gt;
|24 November 2010&lt;br /&gt;
|2010112400&lt;br /&gt;
| [[Moodle 2.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/20/en/Upgrading_to_Moodle_2.0 Upgrading to 2.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.1&lt;br /&gt;
|25 December 2010&lt;br /&gt;
|2010122500&lt;br /&gt;
|[[Moodle 2.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.2&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2011022100&lt;br /&gt;
|[[Moodle 2.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.3&lt;br /&gt;
|5 May 2011&lt;br /&gt;
|2011033003&lt;br /&gt;
|[[Moodle 2.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.4&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011033004&lt;br /&gt;
| [[Moodle 2.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.5&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011033005&lt;br /&gt;
|[[Moodle 2.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.6&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011033006&lt;br /&gt;
|[[Moodle 2.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.7&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011033007&lt;br /&gt;
|[[Moodle 2.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.8&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011033008&lt;br /&gt;
|[[Moodle 2.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.9&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011033009&lt;br /&gt;
|[[Moodle 2.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.10&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011033010&lt;br /&gt;
|[[Moodle 2.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.0.x ended December 2011 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.0.x ended June 2012 (18 months).&lt;br /&gt;
==Moodle 1.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9&lt;br /&gt;
|3 March 2008&lt;br /&gt;
|2007101509&lt;br /&gt;
|[[Moodle 1.9 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/19/en/Upgrading_to_Moodle_1.9 Upgrading to 1.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.1&lt;br /&gt;
|15 May 2008&lt;br /&gt;
| 2007101512&lt;br /&gt;
|[[Moodle 1.9.1 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.2&lt;br /&gt;
|11 July 2008&lt;br /&gt;
|2007101520&lt;br /&gt;
|[[Moodle 1.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.3&lt;br /&gt;
|15 October 2008&lt;br /&gt;
|2007101530&lt;br /&gt;
|[[Moodle 1.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.4&lt;br /&gt;
|28 January 2009&lt;br /&gt;
|2007101540&lt;br /&gt;
|[[Moodle 1.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.5&lt;br /&gt;
|13 May 2009&lt;br /&gt;
|2007101550&lt;br /&gt;
|[[Moodle 1.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.6&lt;br /&gt;
|21 October 2009&lt;br /&gt;
|2007101560&lt;br /&gt;
|[[Moodle 1.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.7&lt;br /&gt;
|25 November 2009&lt;br /&gt;
|2007101570&lt;br /&gt;
|[[Moodle 1.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.8&lt;br /&gt;
|25 March 2010&lt;br /&gt;
|2007101580.00&lt;br /&gt;
|[[Moodle 1.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.9&lt;br /&gt;
| 8 June 2010&lt;br /&gt;
| 2007101590.00&lt;br /&gt;
| [[Moodle 1.9.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.10&lt;br /&gt;
|25 October 2010&lt;br /&gt;
|2007101591.00&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.10 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.11&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2007101591.02&lt;br /&gt;
|[[Moodle 1.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.12&lt;br /&gt;
|10 May 2011&lt;br /&gt;
|2007101591.03&lt;br /&gt;
|[[Moodle 1.9.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.13&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2007101591.04&lt;br /&gt;
|[[Moodle 1.9.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.14&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2007101591.06&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.15&lt;br /&gt;
|28 November 2011&lt;br /&gt;
| 2007101591.07&lt;br /&gt;
| [[Moodle 1.9.15 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.16&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2007101591.10&lt;br /&gt;
|[[Moodle 1.9.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.17&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2007101591.12&lt;br /&gt;
|[[Moodle 1.9.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.18&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2007101591.16&lt;br /&gt;
|[[Moodle 1.9.18 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.19&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2007101592.00&lt;br /&gt;
|[[Moodle 1.9.19 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 1.9.x has ended June 2011 (3.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.x by Moodle HQ ended June 2012 (4.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.19+ branch by [http://catalyst.net.nz Catalyst IT] ended [http://moodle.org/mod/forum/discuss.php?d=199706 Dec 2013] (6 years).&lt;br /&gt;
==Moodle 1.8 ==&lt;br /&gt;
*[[Moodle 1.8 release notes|Moodle 1.8]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.8.1 release notes|Moodle 1.8.1]] - 14 June 2007&lt;br /&gt;
*[[Moodle 1.8.2 release notes|Moodle 1.8.2]] - 8 July 2007&lt;br /&gt;
*[[Moodle 1.8.3 release notes|Moodle 1.8.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.8.4 release notes|Moodle 1.8.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.8.5 release notes|Moodle 1.8.5]] - 8 April 2008&lt;br /&gt;
*[[Moodle 1.8.6 release notes|Moodle 1.8.6]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.8.7 release notes|Moodle 1.8.7]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.8.8 release notes|Moodle 1.8.8]] - 28 January 2009&lt;br /&gt;
*[[Moodle 1.8.9 release notes|Moodle 1.8.9]] - 15 May 2009&lt;br /&gt;
*[[Moodle 1.8.10 release notes|Moodle 1.8.10]] - 26 October 2009&lt;br /&gt;
*[[Moodle 1.8.11 release notes|Moodle 1.8.11]] - 25 November 2009&lt;br /&gt;
*[[Moodle 1.8.12 release notes|Moodle 1.8.12]] - 27 March 2010&lt;br /&gt;
*[[Moodle 1.8.13 release notes|Moodle 1.8.13]] - 8 June 2010&lt;br /&gt;
*[[Moodle 1.8.14 release notes|Moodle 1.8.14]] - 3 December 2010&lt;br /&gt;
*Support has ended&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.7==&lt;br /&gt;
*[[Moodle 1.7 release notes|Moodle 1.7]] - 7 November 2006&lt;br /&gt;
*[[Moodle 1.7.1 release notes|Moodle 1.7.1]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.7.2 release notes|Moodle 1.7.2]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.7.3 release notes|Moodle 1.7.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.7.4 release notes|Moodle 1.7.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.7.5 release notes|Moodle 1.7.5]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.7.6 release notes|Moodle 1.7.6]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.7.7 release notes|Moodle 1.7.7]] - 28 January 2009&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.6==&lt;br /&gt;
*[[Moodle 1.6 release notes|Moodle 1.6]] - 20 June 2006&lt;br /&gt;
*[[Moodle 1.6.1 release notes|Moodle 1.6.1]] - 20 July 2006&lt;br /&gt;
*[[Moodle 1.6.2 release notes|Moodle 1.6.2]] - 12 September 2006&lt;br /&gt;
*[[Moodle 1.6.3 release notes|Moodle 1.6.3]] - 10 October 2006&lt;br /&gt;
*[[Moodle 1.6.4 release notes|Moodle 1.6.4]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.6.5 release notes|Moodle 1.6.5]] - 30 March 2007&lt;br /&gt;
*Moodle 1.6.6 - 11 January 2008&lt;br /&gt;
*Moodle 1.6.7 - 11 July 2008&lt;br /&gt;
*[[Moodle 1.6.8 release notes|Moodle 1.6.8]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.6.9 release notes|Moodle 1.6.9]] - 28 January 2009&lt;br /&gt;
* Support has ended&lt;br /&gt;
==Moodle 1.5==&lt;br /&gt;
*[[Moodle 1.5 release notes|Moodle 1.5]] - 5 June 2005&lt;br /&gt;
*[[Moodle 1.5.1 release notes|Moodle 1.5.1]] - 8 July 2005&lt;br /&gt;
*[[Moodle 1.5.2 release notes|Moodle 1.5.2]] - 16 July 2005&lt;br /&gt;
*[[Moodle 1.5.3 release notes|Moodle 1.5.3]] - 11 November 2005&lt;br /&gt;
*[[Moodle 1.5.4 release notes|Moodle 1.5.4]] - 21 May 2006&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.4==&lt;br /&gt;
*Moodle 1.4 - 31 August 2004&lt;br /&gt;
*Moodle 1.4.1 - 12 September 2004&lt;br /&gt;
*Moodle 1.4.2 - 5 November 2004&lt;br /&gt;
*Moodle 1.4.3 - 21 December 2004&lt;br /&gt;
*Moodle 1.4.4 - 7 March 2005&lt;br /&gt;
*[[Moodle 1.4.5 release notes|Moodle 1.4.5]] - 7 May 2005&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.3==&lt;br /&gt;
*Moodle 1.3 - 25 May 2004&lt;br /&gt;
* Moodle 1.3.1 - 4 June 2004&lt;br /&gt;
*Moodle 1.3.2 - 9 July 2004&lt;br /&gt;
*Moodle 1.3.3 - 16 July 2004&lt;br /&gt;
* Moodle 1.3.4 - 11 August 2004&lt;br /&gt;
*Moodle 1.3.5 - 9 September 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.2==&lt;br /&gt;
*Moodle 1.2 - 20 March 2004&lt;br /&gt;
*Moodle 1.2.1 - 25 March 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.1==&lt;br /&gt;
*Moodle 1.1 - 29 August 2003&lt;br /&gt;
*Moodle 1.1.1 - 11 September 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
== Moodle 1.0==&lt;br /&gt;
*Moodle 1.0 - 20 August 2002&lt;br /&gt;
*Moodle 1.0.1 - 26 August 2002&lt;br /&gt;
*Moodle 1.0.2 - 2 September 2002&lt;br /&gt;
*Moodle 1.0.3 - 5 September 2002&lt;br /&gt;
*Moodle 1.0.4 - 10 September 2002&lt;br /&gt;
*Moodle 1.0.5 - 27 September 2002&lt;br /&gt;
* Moodle 1.0.6 - 26 October 2002&lt;br /&gt;
::1.0.6.1 - 6 November 2002&lt;br /&gt;
::1.0.6.2 - 11 November 2002&lt;br /&gt;
::1.0.6.3 - 14 November 2002&lt;br /&gt;
::1.0.6.4 - 25 November 2002&lt;br /&gt;
*Moodle 1.0.7 - 9 December 2002&lt;br /&gt;
*Moodle 1.0.8 - 7 January 2003&lt;br /&gt;
*Moodle 1.0.9 - 30 May 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Roadmap]] - future versions&lt;br /&gt;
*[[Moodle versions]] - an explanation of how our versions work plus version numbers for each release (for $plugin-&amp;gt;requires)&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Core development]]&lt;br /&gt;
[[fr:Historique des versions]]&lt;br /&gt;
[[es:dev/Historia de las versiones]]&lt;br /&gt;
[[de:Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=62363</id>
		<title>Releases</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=62363"/>
		<updated>2022-05-09T01:45:20Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Update of minor versions.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all official releases of Moodle, grouped by branch in reverse chronological order.&lt;br /&gt;
==Version support==&lt;br /&gt;
From Moodle 2.6 onwards, the end of support, both general and security, happens the second Monday of May and November, observing the 12, 18... month periods, no matter if the major release date was moved or not.&lt;br /&gt;
&lt;br /&gt;
The most recent [https://en.wikipedia.org/wiki/Long-term_support long-term support release (LTS)] version is Moodle 3.9.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Version&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Release status&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Initial release&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:rgba(0, 0, 0, 0.05);&amp;quot; | General support ends&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Security support ends&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.9 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 15 June 2020&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 10 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 November 2023 (ext 6M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.11&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 17 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 14 Nov 2022 (ext 6M)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 Nov 2023 (ext 12M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |4.0&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |19 April 2022&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |8 May 2023&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |13 November 2023&lt;br /&gt;
|-&lt;br /&gt;
|4.1 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stable&lt;br /&gt;
|November 2022&lt;br /&gt;
|November 2023&lt;br /&gt;
|November 2025&lt;br /&gt;
|}&lt;br /&gt;
[[Image:401_release_graph.png|alt=Release graph]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Release graph key:&amp;lt;/b&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Currently supported stable releases.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | Current release of versions still receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Future point releases receiving bug fixes, as well as security updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#316d5e; color:white; adding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Future point releases receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#686566; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Previously released versions containing bug fixes, as well as security updates. Updating to a currently supported version is recommended.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#282828; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Previously released versions containing security updates only. Updating to a currently supported version is recommended.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==General release calendar==&lt;br /&gt;
These are the target dates for releases. These dates may vary slightly due to unforeseen circumstances.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Release type&lt;br /&gt;
!Frequency&lt;br /&gt;
!Months&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Major_release_cycles|Major]] (eg. 3.x)&lt;br /&gt;
|6 monthly&lt;br /&gt;
|Second Monday of May and November&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Stable_maintenance_cycles|Minor]] (Point) (eg. 3.x.y)&lt;br /&gt;
| 2 monthly&lt;br /&gt;
|Second Monday of July, September, November, March and May.&lt;br /&gt;
Third Monday of January.&lt;br /&gt;
|}&lt;br /&gt;
All releases are preceded by a one week warning. Upcoming release dates can be found in the [https://www.google.com/calendar/ical/moodle.com_p4c2oe7hsb77ltaro5qtihb5d4%40group.calendar.google.com/public/basic.ics Moodle development calendar] (Note, this is an iCAL link that will try to add the dates to your personal calendar. If you just want to browse the dates online, use [https://calendar.google.com/calendar/embed?src=moodle.com_p4c2oe7hsb77ltaro5qtihb5d4@group.calendar.google.com&amp;amp;pli=1 this link].).&lt;br /&gt;
&lt;br /&gt;
==Moodle 4.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 4.0&lt;br /&gt;
|19 April 2022&lt;br /&gt;
|2022041900&lt;br /&gt;
|[[Moodle 4.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/400/en/Upgrading Upgrading to 4.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 4.0.1&lt;br /&gt;
|9 May 2022&lt;br /&gt;
|2022041901&lt;br /&gt;
|[[Moodle 4.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 4.0.x will end 8 May 2023 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 4.0.x will end 13 November 2023 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.11==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11&lt;br /&gt;
|17 May 2021&lt;br /&gt;
|2021051700&lt;br /&gt;
|[[Moodle 3.11 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/311/en/Upgrading Upgrading to 3.11]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.1&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2021051701&lt;br /&gt;
|[[Moodle 3.11.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.2&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2021051702&lt;br /&gt;
|[[Moodle 3.11.2 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.3&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2021051703&lt;br /&gt;
|[[Moodle 3.11.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.4&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2021051704&lt;br /&gt;
|[[Moodle 3.11.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.5&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2021051705&lt;br /&gt;
|[[Moodle 3.11.5 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.6&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2021051706&lt;br /&gt;
|[[Moodle 3.11.6 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.7&lt;br /&gt;
|9 May 2022&lt;br /&gt;
|2021051707&lt;br /&gt;
|[[Moodle 3.11.7 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).&lt;br /&gt;
 Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).&lt;br /&gt;
==Moodle 3.10==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020110900&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 3.10 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/310/en/Upgrading Upgrading to 3.10]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.1&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020110901&lt;br /&gt;
| [[Moodle 3.10.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.2&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020110902&lt;br /&gt;
|[[Moodle 3.10.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.3&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020110903&lt;br /&gt;
|[[Moodle 3.10.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.4&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020110904&lt;br /&gt;
|[[Moodle 3.10.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.5&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020110905&lt;br /&gt;
|[[Moodle 3.10.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.6&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020110906&lt;br /&gt;
|[[Moodle 3.10.6 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.7&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020110907&lt;br /&gt;
|[[Moodle 3.10.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.8&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2020110908&lt;br /&gt;
|[[Moodle 3.10.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.9&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2020110909&lt;br /&gt;
|[[Moodle 3.10.9 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.10&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2020110910&lt;br /&gt;
|[[Moodle 3.10.10 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.11&lt;br /&gt;
|9 May 2022&lt;br /&gt;
|2020110911&lt;br /&gt;
|[[Moodle 3.10.11 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.10.x ended 8 November 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).&lt;br /&gt;
==Moodle 3.9 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9&lt;br /&gt;
|15 June 2020&lt;br /&gt;
|2020061500&lt;br /&gt;
|[[Moodle 3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/39/en/Upgrading Upgrading to 3.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.1&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2020061501&lt;br /&gt;
|[[Moodle 3.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.2&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2020061502&lt;br /&gt;
| [[Moodle 3.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.3&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020061503&lt;br /&gt;
| [[Moodle 3.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.4&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020061504&lt;br /&gt;
|[[Moodle 3.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.5&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020061505&lt;br /&gt;
|[[Moodle 3.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.6&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020061506&lt;br /&gt;
|[[Moodle 3.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.7&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020061507&lt;br /&gt;
|[[Moodle 3.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.8&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020061508&lt;br /&gt;
|[[Moodle 3.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.9&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020061509&lt;br /&gt;
|[[Moodle 3.9.9 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.10&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020061510&lt;br /&gt;
|[[Moodle 3.9.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.11&lt;br /&gt;
| 8 November 2021&lt;br /&gt;
|2020061511&lt;br /&gt;
|[[Moodle 3.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.12&lt;br /&gt;
| 17 January 2022&lt;br /&gt;
|2020061512&lt;br /&gt;
|[[Moodle 3.9.12 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.13&lt;br /&gt;
| 14 March 2022&lt;br /&gt;
|2020061513&lt;br /&gt;
|[[Moodle 3.9.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.14&lt;br /&gt;
| 9 May 2022&lt;br /&gt;
|2020061514&lt;br /&gt;
|[[Moodle 3.9.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.9.x ended 10 May 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.9.x will end 13 Nov 2023 (36 months plus 6 months extension).&lt;br /&gt;
==Moodle 3.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8&lt;br /&gt;
|18 November 2019&lt;br /&gt;
|2019111800&lt;br /&gt;
|[[Moodle 3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/38/en/Upgrading Upgrading to 3.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.1&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019111801&lt;br /&gt;
|[[Moodle 3.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.2&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019111802&lt;br /&gt;
|[[Moodle 3.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.3&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019111803&lt;br /&gt;
|[[Moodle 3.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.4&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019111804&lt;br /&gt;
|[[Moodle 3.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.5&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019111805&lt;br /&gt;
| [[Moodle 3.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.6&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019111806&lt;br /&gt;
| [[Moodle 3.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.7&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2019111807&lt;br /&gt;
|[[Moodle 3.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.8&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2019111808&lt;br /&gt;
|[[Moodle 3.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.9&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2019111809&lt;br /&gt;
|[[Moodle 3.8.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.8.x ended 9 November 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.8.x ended 10 May 2021 (18 months).&lt;br /&gt;
==Moodle 3.7==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7&lt;br /&gt;
|20 May 2019&lt;br /&gt;
|2019052000&lt;br /&gt;
|[[Moodle 3.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/37/en/Upgrading Upgrading to 3.7]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.1&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2019052001&lt;br /&gt;
|[[Moodle 3.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.2&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2019052002&lt;br /&gt;
|[[Moodle 3.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.3&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2019052003&lt;br /&gt;
| [[Moodle 3.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.4&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019052004&lt;br /&gt;
|[[Moodle 3.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.5&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019052005&lt;br /&gt;
|[[Moodle 3.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.6&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019052006&lt;br /&gt;
|[[Moodle 3.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.7&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019052007&lt;br /&gt;
|[[Moodle 3.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.8&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019052008&lt;br /&gt;
| [[Moodle 3.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.9&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019052009&lt;br /&gt;
|[[Moodle 3.7.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.7.x ended 11 May 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.7.x ended 9 November 2020 (18 months).&lt;br /&gt;
==Moodle 3.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6&lt;br /&gt;
| 3 December 2018&lt;br /&gt;
|2018120300&lt;br /&gt;
|[[Moodle 3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/36/en/Upgrading Upgrading to 3.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.1&lt;br /&gt;
|5 December 2018&lt;br /&gt;
|2018120301&lt;br /&gt;
| [[Moodle 3.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6.2&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018120302&lt;br /&gt;
|[[Moodle 3.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.3&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018120303&lt;br /&gt;
|[[Moodle 3.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.4&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018120304&lt;br /&gt;
|[[Moodle 3.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.5&lt;br /&gt;
|8th July 2019&lt;br /&gt;
|2018120305&lt;br /&gt;
|[[Moodle 3.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.6&lt;br /&gt;
|9th September 2019&lt;br /&gt;
|2018120306&lt;br /&gt;
|[[Moodle 3.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.7&lt;br /&gt;
| 11th November 2019&lt;br /&gt;
|2018120307&lt;br /&gt;
|[[Moodle 3.6.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.8&lt;br /&gt;
|13th January 2020&lt;br /&gt;
|2018120308&lt;br /&gt;
|[[Moodle 3.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.9&lt;br /&gt;
|9th March 2020&lt;br /&gt;
|2018120309&lt;br /&gt;
| [[Moodle 3.6.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.10&lt;br /&gt;
|11th May 2020&lt;br /&gt;
|2018120310&lt;br /&gt;
|[[Moodle 3.6.10 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.6.x ended 11 November 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.6.x ended 11 May 2020 (18 months).&lt;br /&gt;
==Moodle 3.5 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2018051700&lt;br /&gt;
|[[Moodle 3.5 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/35/en/Upgrading Upgrading to 3.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.1&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2018051701&lt;br /&gt;
|[[Moodle 3.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.2&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2018051702&lt;br /&gt;
|[[Moodle 3.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.3&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2018051703&lt;br /&gt;
| [[Moodle 3.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.4&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018051704&lt;br /&gt;
|[[Moodle 3.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.5&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018051705&lt;br /&gt;
|[[Moodle 3.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.6&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018051706&lt;br /&gt;
|[[Moodle 3.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.7&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2018051707&lt;br /&gt;
|[[Moodle 3.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.8&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2018051708&lt;br /&gt;
|[[Moodle 3.5.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.9&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2018051709&lt;br /&gt;
|[[Moodle 3.5.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.10&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2018051710&lt;br /&gt;
| [[Moodle 3.5.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.11&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2018051711&lt;br /&gt;
|[[Moodle 3.5.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.12&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2018051712&lt;br /&gt;
| [[Moodle 3.5.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.13&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2018051713&lt;br /&gt;
|[[Moodle 3.5.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.14&lt;br /&gt;
| 14 September 2020&lt;br /&gt;
|2018051714&lt;br /&gt;
|[[Moodle 3.5.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.15&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2018051715&lt;br /&gt;
|[[Moodle 3.5.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.16&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2018051716&lt;br /&gt;
| [[Moodle 3.5.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.17&lt;br /&gt;
|8 March 2021&lt;br /&gt;
| 2018051717&lt;br /&gt;
|[[Moodle 3.5.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.18&lt;br /&gt;
| 10 May 2021&lt;br /&gt;
| 2018051718&lt;br /&gt;
|[[Moodle 3.5.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.5.x ended May 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.5.x ended 10 May 2021 (36 months).&lt;br /&gt;
==Moodle 3.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017111300&lt;br /&gt;
|[[Moodle 3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/34/en/Upgrading Upgrading to 3.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.1&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017111301&lt;br /&gt;
|[[Moodle 3.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.2&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017111302&lt;br /&gt;
|[[Moodle 3.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.3&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017111303&lt;br /&gt;
|[[Moodle 3.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.4&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017111304&lt;br /&gt;
|[[Moodle 3.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.5&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017111305&lt;br /&gt;
|[[Moodle 3.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.6&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017111306&lt;br /&gt;
| [[Moodle 3.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.7&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2017111307&lt;br /&gt;
|[[Moodle 3.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.8&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2017111308&lt;br /&gt;
|[[Moodle 3.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.9&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2017111309&lt;br /&gt;
| [[Moodle 3.4.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.4.x ended 12 November 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.4.x ended 13 May 2019 (18 months).&lt;br /&gt;
==Moodle 3.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3&lt;br /&gt;
|15 May 2017&lt;br /&gt;
|2017051500&lt;br /&gt;
|[[Moodle 3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/33/en/Upgrading Upgrading to 3.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.1&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2017051501&lt;br /&gt;
|[[Moodle 3.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.2&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2017051502&lt;br /&gt;
|[[Moodle 3.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.3&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017051503&lt;br /&gt;
| [[Moodle 3.3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.4&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017051504&lt;br /&gt;
|[[Moodle 3.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.5&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017051505&lt;br /&gt;
|[[Moodle 3.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.6&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017051506&lt;br /&gt;
|[[Moodle 3.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.7&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017051507&lt;br /&gt;
|[[Moodle 3.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.8&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017051508&lt;br /&gt;
|[[Moodle 3.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.9&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017051509&lt;br /&gt;
|[[Moodle 3.3.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.3.x ended 17 May 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.3.x ended 12 November 2018 (18 months).&lt;br /&gt;
==Moodle 3.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2&lt;br /&gt;
| 5 December 2016&lt;br /&gt;
|2016120500&lt;br /&gt;
|[[Moodle 3.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/32/en/Upgrading Upgrading to 3.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.1&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016120501&lt;br /&gt;
|[[Moodle 3.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.2&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016120502&lt;br /&gt;
|[[Moodle 3.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.3&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016120503&lt;br /&gt;
|[[Moodle 3.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.4&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016120504&lt;br /&gt;
|[[Moodle 3.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.5&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016120505&lt;br /&gt;
|[[Moodle 3.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.6&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016120506&lt;br /&gt;
| [[Moodle 3.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.7&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016120507&lt;br /&gt;
|[[Moodle 3.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.8&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016120508&lt;br /&gt;
|[[Moodle 3.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.9&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016120509&lt;br /&gt;
| [[Moodle 3.2.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.2.x ended 13 November 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.2.x ended 17 May 2018 (18 months).&lt;br /&gt;
==Moodle 3.1 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1&lt;br /&gt;
|23 May 2016&lt;br /&gt;
|2016052300&lt;br /&gt;
|[[Moodle 3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/31/en/Upgrading Upgrading to 3.1]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.1&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2016052301&lt;br /&gt;
|[[Moodle 3.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.2&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2016052302&lt;br /&gt;
|[[Moodle 3.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.3&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2016052303&lt;br /&gt;
|[[Moodle 3.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.4&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016052304&lt;br /&gt;
|[[Moodle 3.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.5&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016052305&lt;br /&gt;
|[[Moodle 3.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.6&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016052306&lt;br /&gt;
|[[Moodle 3.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.7&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016052307&lt;br /&gt;
|[[Moodle 3.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.8&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016052308&lt;br /&gt;
|[[Moodle 3.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.9&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016052309&lt;br /&gt;
|[[Moodle 3.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.10&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016052310&lt;br /&gt;
|[[Moodle 3.1.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.11&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016052311&lt;br /&gt;
|[[Moodle 3.1.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.12&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016052312&lt;br /&gt;
|[[Moodle 3.1.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.13&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2016052313&lt;br /&gt;
|[[Moodle 3.1.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.14&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2016052314&lt;br /&gt;
|[[Moodle 3.1.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.15&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2016052315&lt;br /&gt;
|[[Moodle 3.1.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.16&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2016052316&lt;br /&gt;
|[[Moodle 3.1.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.17&lt;br /&gt;
|11 March 2019&lt;br /&gt;
| 2016052317&lt;br /&gt;
|[[Moodle 3.1.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.18&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2016052318&lt;br /&gt;
|[[Moodle 3.1.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.1.x ended 8 May 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.1.x ended 13 May 2019 (36 months).&lt;br /&gt;
==Moodle 3.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0&lt;br /&gt;
|16 November 2015&lt;br /&gt;
|2015111600&lt;br /&gt;
|[[Moodle 3.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/30/en/Upgrading Upgrading to 3.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.1&lt;br /&gt;
|21 December 2015&lt;br /&gt;
|2015111601&lt;br /&gt;
| [[Moodle 3.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.2&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015111602&lt;br /&gt;
|[[Moodle 3.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.3&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015111603&lt;br /&gt;
|[[Moodle 3.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.4&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015111604&lt;br /&gt;
|[[Moodle 3.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.5&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015111605&lt;br /&gt;
|[[Moodle 3.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.6&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015111606&lt;br /&gt;
|[[Moodle 3.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.7&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015111607&lt;br /&gt;
|[[Moodle 3.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.8&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2015111608&lt;br /&gt;
|[[Moodle 3.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.9&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2015111609&lt;br /&gt;
|[[Moodle 3.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.10&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2015111610&lt;br /&gt;
|[[Moodle 3.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.0.x ended 14 November 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.0.x ended 8 May 2017 (18 months).&lt;br /&gt;
==Moodle 2.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9&lt;br /&gt;
| 11 May 2015&lt;br /&gt;
|2015051100&lt;br /&gt;
|[[Moodle 2.9 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/29/en/Upgrading_to_Moodle_2.9 Upgrading to 2.9]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.1&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2015051101&lt;br /&gt;
|[[Moodle 2.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.2&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2015051102&lt;br /&gt;
| [[Moodle 2.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.3&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2015051103&lt;br /&gt;
| [[Moodle 2.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.4&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015051104&lt;br /&gt;
|[[Moodle 2.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.5&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015051105&lt;br /&gt;
|[[Moodle 2.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.6&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015051106&lt;br /&gt;
|[[Moodle 2.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.7&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015051107&lt;br /&gt;
|[[Moodle 2.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.8&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015051108&lt;br /&gt;
|[[Moodle 2.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.9&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015051109&lt;br /&gt;
|[[Moodle 2.9.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.9.x ended 9 May 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.9.x ended 14 November 2016 (18 months).&lt;br /&gt;
==Moodle 2.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014111000&lt;br /&gt;
| [[Moodle 2.8 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/28/en/Upgrading_to_Moodle_2.8 Upgrading to 2.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.1&lt;br /&gt;
|13 November 2014&lt;br /&gt;
|2014111001&lt;br /&gt;
| [[Moodle 2.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.2&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014111002&lt;br /&gt;
| [[Moodle 2.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.3&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014111003&lt;br /&gt;
|[[Moodle 2.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.4&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014111004&lt;br /&gt;
|[[Moodle 2.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.5&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014111005&lt;br /&gt;
|[[Moodle 2.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.6&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014111006&lt;br /&gt;
|[[Moodle 2.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.7&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014111007&lt;br /&gt;
|[[Moodle 2.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.8&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2014111008&lt;br /&gt;
| [[Moodle 2.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.9&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014111009&lt;br /&gt;
|[[Moodle 2.8.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.10&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014111010&lt;br /&gt;
|[[Moodle 2.8.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.11&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014111011&lt;br /&gt;
|[[Moodle 2.8.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.12&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014111012&lt;br /&gt;
| [[Moodle 2.8.12 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.8.x ended 9 November 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.8.x ended 9 May 2016 (18 months).&lt;br /&gt;
==Moodle 2.7 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7&lt;br /&gt;
| 12 May 2014&lt;br /&gt;
|2014051200&lt;br /&gt;
|[[Moodle 2.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/27/en/Upgrading_to_Moodle_2.7 Upgrading to 2.7]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.1&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2014051201&lt;br /&gt;
|[[Moodle 2.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.2&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2014051202&lt;br /&gt;
|[[Moodle 2.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.3&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014051203&lt;br /&gt;
| [[Moodle 2.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.4&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014051204&lt;br /&gt;
| [[Moodle 2.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.5&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014051205&lt;br /&gt;
|[[Moodle 2.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.6&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014051206&lt;br /&gt;
|[[Moodle 2.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.7&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014051207&lt;br /&gt;
|[[Moodle 2.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.8&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014051208&lt;br /&gt;
|[[Moodle 2.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.9&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014051209&lt;br /&gt;
|[[Moodle 2.7.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.10&lt;br /&gt;
| 14 September 2015&lt;br /&gt;
|2014051210&lt;br /&gt;
|[[Moodle 2.7.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.11&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014051211&lt;br /&gt;
|[[Moodle 2.7.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.12&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014051212&lt;br /&gt;
|[[Moodle 2.7.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.13&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014051213&lt;br /&gt;
|[[Moodle 2.7.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.14&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014051214&lt;br /&gt;
| [[Moodle 2.7.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.15&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2014051215&lt;br /&gt;
|[[Moodle 2.7.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.16&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2014051216&lt;br /&gt;
|[[Moodle 2.7.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.17&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2014051217&lt;br /&gt;
|[[Moodle 2.7.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.18&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2014051218&lt;br /&gt;
|[[Moodle 2.7.18 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.19&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2014051219&lt;br /&gt;
|[[Moodle 2.7.19 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.20&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2014051220&lt;br /&gt;
| [[Moodle 2.7.20 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.7.x ended 11 May 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.7.x ended 8 May 2017 (36 months).&lt;br /&gt;
==Moodle 2.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6&lt;br /&gt;
|18 November 2013&lt;br /&gt;
|2013111800&lt;br /&gt;
|[[Moodle 2.6 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/26/en/Upgrading_to_Moodle_2.6 Upgrading to 2.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.1&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013111801&lt;br /&gt;
| [[Moodle 2.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.2&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013111802&lt;br /&gt;
|[[Moodle 2.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.3&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013111803&lt;br /&gt;
|[[Moodle 2.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.4&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013111804&lt;br /&gt;
|[[Moodle 2.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.5&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013111805&lt;br /&gt;
|[[Moodle 2.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.6&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2013111806&lt;br /&gt;
|[[Moodle 2.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.7&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2013111807&lt;br /&gt;
|[[Moodle 2.6.7 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.8&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2013111808&lt;br /&gt;
|[[Moodle 2.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.9&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2013111809&lt;br /&gt;
|[[Moodle 2.6.9 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.10&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2013111810&lt;br /&gt;
| [[Moodle 2.6.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.11&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2013111811&lt;br /&gt;
|[[Moodle 2.6.11 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.6.x ended 10 November 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.6.x ended 11 May 2015 (18 months).&lt;br /&gt;
==Moodle 2.5==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5&lt;br /&gt;
| 14 May 2013&lt;br /&gt;
|2013051400&lt;br /&gt;
|[[Moodle 2.5 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/25/en/Upgrading_to_Moodle_2.5 Upgrading to 2.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.1&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2013051401&lt;br /&gt;
|[[Moodle 2.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.2&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2013051402&lt;br /&gt;
|[[Moodle 2.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.3&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2013051403&lt;br /&gt;
|[[Moodle 2.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.4&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013051404&lt;br /&gt;
| [[Moodle 2.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.5&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013051405&lt;br /&gt;
|[[Moodle 2.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.6&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013051406&lt;br /&gt;
|[[Moodle 2.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.7&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013051407&lt;br /&gt;
|[[Moodle 2.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.8&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013051408&lt;br /&gt;
|[[Moodle 2.5.8 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.9&lt;br /&gt;
| 10 November 2014&lt;br /&gt;
|2013051409&lt;br /&gt;
|[[Moodle 2.5.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.5.x ended May 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.5.x ended 10 November 2014 (18 months).&lt;br /&gt;
==Moodle 2.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4&lt;br /&gt;
|3 December 2012&lt;br /&gt;
|2012120300&lt;br /&gt;
|[[Moodle 2.4 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/24/en/Upgrading_to_Moodle_2.4 Upgrading to 2.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.1&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012120301&lt;br /&gt;
|[[Moodle 2.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.2&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012120302&lt;br /&gt;
|[[Moodle 2.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.3&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012120303&lt;br /&gt;
|[[Moodle 2.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.4&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012120304&lt;br /&gt;
|[[Moodle 2.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.5&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012120305&lt;br /&gt;
|[[Moodle 2.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.6&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012120306&lt;br /&gt;
|[[Moodle 2.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.7&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012120307&lt;br /&gt;
| [[Moodle 2.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.8&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012120308&lt;br /&gt;
|[[Moodle 2.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.9&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2012120309&lt;br /&gt;
|[[Moodle 2.4.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.10&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2012120310&lt;br /&gt;
| [[Moodle 2.4.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.11&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2012120311&lt;br /&gt;
|[[Moodle 2.4.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.4.x ended December 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.4.x ended June 2014 (18 months).&lt;br /&gt;
==Moodle 2.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3&lt;br /&gt;
|25 June 2012&lt;br /&gt;
|2012062500&lt;br /&gt;
|[[Moodle 2.3 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/23/en/Upgrading_to_Moodle_2.3 Upgrading to 2.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.1&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2012062501&lt;br /&gt;
|[[Moodle 2.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.2&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2012062502&lt;br /&gt;
|[[Moodle 2.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.3&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2012062503&lt;br /&gt;
|[[Moodle 2.3.3 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.4&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012062504&lt;br /&gt;
|[[Moodle 2.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.5&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012062505&lt;br /&gt;
|[[Moodle 2.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.6&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012062506&lt;br /&gt;
|[[Moodle 2.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.7&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012062507&lt;br /&gt;
|[[Moodle 2.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.8&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012062508&lt;br /&gt;
|[[Moodle 2.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.9&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012062509&lt;br /&gt;
|[[Moodle 2.3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.10&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012062510&lt;br /&gt;
|[[Moodle 2.3.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.11&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012062511&lt;br /&gt;
|[[Moodle 2.3.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.3.x ended June 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.3.x ended December 2013 (18 months).&lt;br /&gt;
==Moodle 2.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2&lt;br /&gt;
|5 December 2011&lt;br /&gt;
|2011120500&lt;br /&gt;
|[[Moodle 2.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/22/en/Upgrading_to_Moodle_2.2 Upgrading to 2.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.1&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011120501&lt;br /&gt;
|[[Moodle 2.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.2&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011120502&lt;br /&gt;
|[[Moodle 2.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.3&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011120503&lt;br /&gt;
|[[Moodle 2.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.4&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011120504&lt;br /&gt;
|[[Moodle 2.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.5&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011120505&lt;br /&gt;
|[[Moodle 2.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.6&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011120506&lt;br /&gt;
| [[Moodle 2.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.7&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011120507&lt;br /&gt;
|[[Moodle 2.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.8&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2011120508&lt;br /&gt;
|[[Moodle 2.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.9&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2011120509&lt;br /&gt;
|[[Moodle 2.2.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.10&lt;br /&gt;
|14 May 2013&lt;br /&gt;
| 2011120510&lt;br /&gt;
|[[Moodle 2.2.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.11&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2011120511&lt;br /&gt;
|[[Moodle 2.2.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.2.x ended December 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.2.x ended June 2013 (18 months).&lt;br /&gt;
==Moodle 2.1==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1&lt;br /&gt;
| 1 July 2011&lt;br /&gt;
|2011070100&lt;br /&gt;
|[[Moodle 2.1 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/21/en/Upgrading_to_Moodle_2.1 Upgrading to 2.1]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.1&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011070101&lt;br /&gt;
| [[Moodle 2.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.2&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011070102&lt;br /&gt;
|[[Moodle 2.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.3&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011070103&lt;br /&gt;
|[[Moodle 2.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.4&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011070104&lt;br /&gt;
|[[Moodle 2.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.5&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011070105&lt;br /&gt;
|[[Moodle 2.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.6&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011070106&lt;br /&gt;
|[[Moodle 2.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.7&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011070107&lt;br /&gt;
|[[Moodle 2.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.8&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011070108&lt;br /&gt;
|[[Moodle 2.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.9&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011070109&lt;br /&gt;
|[[Moodle 2.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.10&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011070110&lt;br /&gt;
|[[Moodle 2.1.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.1.x ended June 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.1.x ended December 2012 (18 months).&lt;br /&gt;
==Moodle 2.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0&lt;br /&gt;
|24 November 2010&lt;br /&gt;
|2010112400&lt;br /&gt;
| [[Moodle 2.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/20/en/Upgrading_to_Moodle_2.0 Upgrading to 2.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.1&lt;br /&gt;
|25 December 2010&lt;br /&gt;
|2010122500&lt;br /&gt;
|[[Moodle 2.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.2&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2011022100&lt;br /&gt;
|[[Moodle 2.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.3&lt;br /&gt;
|5 May 2011&lt;br /&gt;
|2011033003&lt;br /&gt;
|[[Moodle 2.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.4&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011033004&lt;br /&gt;
| [[Moodle 2.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.5&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011033005&lt;br /&gt;
|[[Moodle 2.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.6&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011033006&lt;br /&gt;
|[[Moodle 2.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.7&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011033007&lt;br /&gt;
|[[Moodle 2.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.8&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011033008&lt;br /&gt;
|[[Moodle 2.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.9&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011033009&lt;br /&gt;
|[[Moodle 2.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.10&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011033010&lt;br /&gt;
|[[Moodle 2.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.0.x ended December 2011 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.0.x ended June 2012 (18 months).&lt;br /&gt;
==Moodle 1.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9&lt;br /&gt;
|3 March 2008&lt;br /&gt;
|2007101509&lt;br /&gt;
|[[Moodle 1.9 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/19/en/Upgrading_to_Moodle_1.9 Upgrading to 1.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.1&lt;br /&gt;
|15 May 2008&lt;br /&gt;
| 2007101512&lt;br /&gt;
|[[Moodle 1.9.1 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.2&lt;br /&gt;
|11 July 2008&lt;br /&gt;
|2007101520&lt;br /&gt;
|[[Moodle 1.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.3&lt;br /&gt;
|15 October 2008&lt;br /&gt;
|2007101530&lt;br /&gt;
|[[Moodle 1.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.4&lt;br /&gt;
|28 January 2009&lt;br /&gt;
|2007101540&lt;br /&gt;
|[[Moodle 1.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.5&lt;br /&gt;
|13 May 2009&lt;br /&gt;
|2007101550&lt;br /&gt;
|[[Moodle 1.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.6&lt;br /&gt;
|21 October 2009&lt;br /&gt;
|2007101560&lt;br /&gt;
|[[Moodle 1.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.7&lt;br /&gt;
|25 November 2009&lt;br /&gt;
|2007101570&lt;br /&gt;
|[[Moodle 1.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.8&lt;br /&gt;
|25 March 2010&lt;br /&gt;
|2007101580.00&lt;br /&gt;
|[[Moodle 1.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.9&lt;br /&gt;
| 8 June 2010&lt;br /&gt;
| 2007101590.00&lt;br /&gt;
| [[Moodle 1.9.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.10&lt;br /&gt;
|25 October 2010&lt;br /&gt;
|2007101591.00&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.10 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.11&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2007101591.02&lt;br /&gt;
|[[Moodle 1.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.12&lt;br /&gt;
|10 May 2011&lt;br /&gt;
|2007101591.03&lt;br /&gt;
|[[Moodle 1.9.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.13&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2007101591.04&lt;br /&gt;
|[[Moodle 1.9.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.14&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2007101591.06&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.15&lt;br /&gt;
|28 November 2011&lt;br /&gt;
| 2007101591.07&lt;br /&gt;
| [[Moodle 1.9.15 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.16&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2007101591.10&lt;br /&gt;
|[[Moodle 1.9.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.17&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2007101591.12&lt;br /&gt;
|[[Moodle 1.9.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.18&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2007101591.16&lt;br /&gt;
|[[Moodle 1.9.18 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.19&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2007101592.00&lt;br /&gt;
|[[Moodle 1.9.19 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 1.9.x has ended June 2011 (3.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.x by Moodle HQ ended June 2012 (4.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.19+ branch by [http://catalyst.net.nz Catalyst IT] ended [http://moodle.org/mod/forum/discuss.php?d=199706 Dec 2013] (6 years).&lt;br /&gt;
==Moodle 1.8 ==&lt;br /&gt;
*[[Moodle 1.8 release notes|Moodle 1.8]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.8.1 release notes|Moodle 1.8.1]] - 14 June 2007&lt;br /&gt;
*[[Moodle 1.8.2 release notes|Moodle 1.8.2]] - 8 July 2007&lt;br /&gt;
*[[Moodle 1.8.3 release notes|Moodle 1.8.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.8.4 release notes|Moodle 1.8.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.8.5 release notes|Moodle 1.8.5]] - 8 April 2008&lt;br /&gt;
*[[Moodle 1.8.6 release notes|Moodle 1.8.6]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.8.7 release notes|Moodle 1.8.7]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.8.8 release notes|Moodle 1.8.8]] - 28 January 2009&lt;br /&gt;
*[[Moodle 1.8.9 release notes|Moodle 1.8.9]] - 15 May 2009&lt;br /&gt;
*[[Moodle 1.8.10 release notes|Moodle 1.8.10]] - 26 October 2009&lt;br /&gt;
*[[Moodle 1.8.11 release notes|Moodle 1.8.11]] - 25 November 2009&lt;br /&gt;
*[[Moodle 1.8.12 release notes|Moodle 1.8.12]] - 27 March 2010&lt;br /&gt;
*[[Moodle 1.8.13 release notes|Moodle 1.8.13]] - 8 June 2010&lt;br /&gt;
*[[Moodle 1.8.14 release notes|Moodle 1.8.14]] - 3 December 2010&lt;br /&gt;
*Support has ended&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.7==&lt;br /&gt;
*[[Moodle 1.7 release notes|Moodle 1.7]] - 7 November 2006&lt;br /&gt;
*[[Moodle 1.7.1 release notes|Moodle 1.7.1]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.7.2 release notes|Moodle 1.7.2]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.7.3 release notes|Moodle 1.7.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.7.4 release notes|Moodle 1.7.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.7.5 release notes|Moodle 1.7.5]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.7.6 release notes|Moodle 1.7.6]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.7.7 release notes|Moodle 1.7.7]] - 28 January 2009&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.6==&lt;br /&gt;
*[[Moodle 1.6 release notes|Moodle 1.6]] - 20 June 2006&lt;br /&gt;
*[[Moodle 1.6.1 release notes|Moodle 1.6.1]] - 20 July 2006&lt;br /&gt;
*[[Moodle 1.6.2 release notes|Moodle 1.6.2]] - 12 September 2006&lt;br /&gt;
*[[Moodle 1.6.3 release notes|Moodle 1.6.3]] - 10 October 2006&lt;br /&gt;
*[[Moodle 1.6.4 release notes|Moodle 1.6.4]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.6.5 release notes|Moodle 1.6.5]] - 30 March 2007&lt;br /&gt;
*Moodle 1.6.6 - 11 January 2008&lt;br /&gt;
*Moodle 1.6.7 - 11 July 2008&lt;br /&gt;
*[[Moodle 1.6.8 release notes|Moodle 1.6.8]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.6.9 release notes|Moodle 1.6.9]] - 28 January 2009&lt;br /&gt;
* Support has ended&lt;br /&gt;
==Moodle 1.5==&lt;br /&gt;
*[[Moodle 1.5 release notes|Moodle 1.5]] - 5 June 2005&lt;br /&gt;
*[[Moodle 1.5.1 release notes|Moodle 1.5.1]] - 8 July 2005&lt;br /&gt;
*[[Moodle 1.5.2 release notes|Moodle 1.5.2]] - 16 July 2005&lt;br /&gt;
*[[Moodle 1.5.3 release notes|Moodle 1.5.3]] - 11 November 2005&lt;br /&gt;
*[[Moodle 1.5.4 release notes|Moodle 1.5.4]] - 21 May 2006&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.4==&lt;br /&gt;
*Moodle 1.4 - 31 August 2004&lt;br /&gt;
*Moodle 1.4.1 - 12 September 2004&lt;br /&gt;
*Moodle 1.4.2 - 5 November 2004&lt;br /&gt;
*Moodle 1.4.3 - 21 December 2004&lt;br /&gt;
*Moodle 1.4.4 - 7 March 2005&lt;br /&gt;
*[[Moodle 1.4.5 release notes|Moodle 1.4.5]] - 7 May 2005&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.3==&lt;br /&gt;
*Moodle 1.3 - 25 May 2004&lt;br /&gt;
* Moodle 1.3.1 - 4 June 2004&lt;br /&gt;
*Moodle 1.3.2 - 9 July 2004&lt;br /&gt;
*Moodle 1.3.3 - 16 July 2004&lt;br /&gt;
* Moodle 1.3.4 - 11 August 2004&lt;br /&gt;
*Moodle 1.3.5 - 9 September 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.2==&lt;br /&gt;
*Moodle 1.2 - 20 March 2004&lt;br /&gt;
*Moodle 1.2.1 - 25 March 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.1==&lt;br /&gt;
*Moodle 1.1 - 29 August 2003&lt;br /&gt;
*Moodle 1.1.1 - 11 September 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
== Moodle 1.0==&lt;br /&gt;
*Moodle 1.0 - 20 August 2002&lt;br /&gt;
*Moodle 1.0.1 - 26 August 2002&lt;br /&gt;
*Moodle 1.0.2 - 2 September 2002&lt;br /&gt;
*Moodle 1.0.3 - 5 September 2002&lt;br /&gt;
*Moodle 1.0.4 - 10 September 2002&lt;br /&gt;
*Moodle 1.0.5 - 27 September 2002&lt;br /&gt;
* Moodle 1.0.6 - 26 October 2002&lt;br /&gt;
::1.0.6.1 - 6 November 2002&lt;br /&gt;
::1.0.6.2 - 11 November 2002&lt;br /&gt;
::1.0.6.3 - 14 November 2002&lt;br /&gt;
::1.0.6.4 - 25 November 2002&lt;br /&gt;
*Moodle 1.0.7 - 9 December 2002&lt;br /&gt;
*Moodle 1.0.8 - 7 January 2003&lt;br /&gt;
*Moodle 1.0.9 - 30 May 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Roadmap]] - future versions&lt;br /&gt;
*[[Moodle versions]] - an explanation of how our versions work plus version numbers for each release (for $plugin-&amp;gt;requires)&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Core development]]&lt;br /&gt;
[[fr:Historique des versions]]&lt;br /&gt;
[[es:dev/Historia de las versiones]]&lt;br /&gt;
[[de:Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=62362</id>
		<title>Releases</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=62362"/>
		<updated>2022-05-09T01:31:21Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* Version support - release of 4.0.1 and other minors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all official releases of Moodle, grouped by branch in reverse chronological order.&lt;br /&gt;
==Version support==&lt;br /&gt;
From Moodle 2.6 onwards, the end of support, both general and security, happens the second Monday of May and November, observing the 12, 18... month periods, no matter if the major release date was moved or not.&lt;br /&gt;
&lt;br /&gt;
The most recent [https://en.wikipedia.org/wiki/Long-term_support long-term support release (LTS)] version is Moodle 3.9.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Version&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Release status&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Initial release&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:rgba(0, 0, 0, 0.05);&amp;quot; | General support ends&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Security support ends&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.9 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 15 June 2020&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 10 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 November 2023 (ext 6M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.11&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 17 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 14 Nov 2022 (ext 6M)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 Nov 2023 (ext 12M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |4.0&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |19 April 2022&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |8 May 2023&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |13 November 2023&lt;br /&gt;
|-&lt;br /&gt;
|4.1 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stable&lt;br /&gt;
|November 2022&lt;br /&gt;
|November 2023&lt;br /&gt;
|November 2025&lt;br /&gt;
|}&lt;br /&gt;
[[Image:401_release_graph.png|alt=Release graph]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Release graph key:&amp;lt;/b&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Currently supported stable releases.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | Current release of versions still receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Future point releases receiving bug fixes, as well as security updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#316d5e; color:white; adding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Future point releases receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#686566; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Previously released versions containing bug fixes, as well as security updates. Updating to a currently supported version is recommended.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#282828; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Previously released versions containing security updates only. Updating to a currently supported version is recommended.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==General release calendar==&lt;br /&gt;
These are the target dates for releases. These dates may vary slightly due to unforeseen circumstances.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Release type&lt;br /&gt;
!Frequency&lt;br /&gt;
!Months&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Major_release_cycles|Major]] (eg. 3.x)&lt;br /&gt;
|6 monthly&lt;br /&gt;
|Second Monday of May and November&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Stable_maintenance_cycles|Minor]] (Point) (eg. 3.x.y)&lt;br /&gt;
| 2 monthly&lt;br /&gt;
|Second Monday of July, September, November, March and May.&lt;br /&gt;
Third Monday of January.&lt;br /&gt;
|}&lt;br /&gt;
All releases are preceded by a one week warning. Upcoming release dates can be found in the [https://www.google.com/calendar/ical/moodle.com_p4c2oe7hsb77ltaro5qtihb5d4%40group.calendar.google.com/public/basic.ics Moodle development calendar] (Note, this is an iCAL link that will try to add the dates to your personal calendar. If you just want to browse the dates online, use [https://calendar.google.com/calendar/embed?src=moodle.com_p4c2oe7hsb77ltaro5qtihb5d4@group.calendar.google.com&amp;amp;pli=1 this link].).&lt;br /&gt;
&lt;br /&gt;
==Moodle 4.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 4.0&lt;br /&gt;
|19 April 2022&lt;br /&gt;
|2022041900&lt;br /&gt;
|[[Moodle 4.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/400/en/Upgrading Upgrading to 4.0]&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 4.0.x will end 8 May 2023 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 4.0.x will end 13 November 2023 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.11==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11&lt;br /&gt;
|17 May 2021&lt;br /&gt;
|2021051700&lt;br /&gt;
|[[Moodle 3.11 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/311/en/Upgrading Upgrading to 3.11]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.1&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2021051701&lt;br /&gt;
|[[Moodle 3.11.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.2&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2021051702&lt;br /&gt;
|[[Moodle 3.11.2 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.3&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2021051703&lt;br /&gt;
|[[Moodle 3.11.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.4&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2021051704&lt;br /&gt;
|[[Moodle 3.11.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.5&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2021051705&lt;br /&gt;
|[[Moodle 3.11.5 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.6&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2021051706&lt;br /&gt;
|[[Moodle 3.11.6 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).&lt;br /&gt;
 Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).&lt;br /&gt;
==Moodle 3.10==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020110900&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 3.10 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/310/en/Upgrading Upgrading to 3.10]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.1&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020110901&lt;br /&gt;
| [[Moodle 3.10.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.2&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020110902&lt;br /&gt;
|[[Moodle 3.10.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.3&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020110903&lt;br /&gt;
|[[Moodle 3.10.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.4&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020110904&lt;br /&gt;
|[[Moodle 3.10.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.5&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020110905&lt;br /&gt;
|[[Moodle 3.10.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.6&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020110906&lt;br /&gt;
|[[Moodle 3.10.6 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.7&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020110907&lt;br /&gt;
|[[Moodle 3.10.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.8&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2020110908&lt;br /&gt;
|[[Moodle 3.10.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.9&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2020110909&lt;br /&gt;
|[[Moodle 3.10.9 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.10&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2020110910&lt;br /&gt;
|[[Moodle 3.10.10 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.10.x ended 8 November 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).&lt;br /&gt;
==Moodle 3.9 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9&lt;br /&gt;
|15 June 2020&lt;br /&gt;
|2020061500&lt;br /&gt;
|[[Moodle 3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/39/en/Upgrading Upgrading to 3.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.1&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2020061501&lt;br /&gt;
|[[Moodle 3.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.2&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2020061502&lt;br /&gt;
| [[Moodle 3.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.3&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020061503&lt;br /&gt;
| [[Moodle 3.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.4&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020061504&lt;br /&gt;
|[[Moodle 3.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.5&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020061505&lt;br /&gt;
|[[Moodle 3.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.6&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020061506&lt;br /&gt;
|[[Moodle 3.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.7&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020061507&lt;br /&gt;
|[[Moodle 3.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.8&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020061508&lt;br /&gt;
|[[Moodle 3.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.9&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020061509&lt;br /&gt;
|[[Moodle 3.9.9 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.10&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020061510&lt;br /&gt;
|[[Moodle 3.9.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.11&lt;br /&gt;
| 8 November 2021&lt;br /&gt;
|2020061511&lt;br /&gt;
|[[Moodle 3.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.12&lt;br /&gt;
| 17 January 2022&lt;br /&gt;
|2020061512&lt;br /&gt;
|[[Moodle 3.9.12 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.13&lt;br /&gt;
| 14 March 2022&lt;br /&gt;
|2020061513&lt;br /&gt;
|[[Moodle 3.9.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.9.x ended 10 May 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.9.x will end 13 Nov 2023 (36 months plus 6 months extension).&lt;br /&gt;
==Moodle 3.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8&lt;br /&gt;
|18 November 2019&lt;br /&gt;
|2019111800&lt;br /&gt;
|[[Moodle 3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/38/en/Upgrading Upgrading to 3.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.1&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019111801&lt;br /&gt;
|[[Moodle 3.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.2&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019111802&lt;br /&gt;
|[[Moodle 3.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.3&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019111803&lt;br /&gt;
|[[Moodle 3.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.4&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019111804&lt;br /&gt;
|[[Moodle 3.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.5&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019111805&lt;br /&gt;
| [[Moodle 3.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.6&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019111806&lt;br /&gt;
| [[Moodle 3.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.7&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2019111807&lt;br /&gt;
|[[Moodle 3.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.8&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2019111808&lt;br /&gt;
|[[Moodle 3.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.9&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2019111809&lt;br /&gt;
|[[Moodle 3.8.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.8.x ended 9 November 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.8.x ended 10 May 2021 (18 months).&lt;br /&gt;
==Moodle 3.7==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7&lt;br /&gt;
|20 May 2019&lt;br /&gt;
|2019052000&lt;br /&gt;
|[[Moodle 3.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/37/en/Upgrading Upgrading to 3.7]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.1&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2019052001&lt;br /&gt;
|[[Moodle 3.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.2&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2019052002&lt;br /&gt;
|[[Moodle 3.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.3&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2019052003&lt;br /&gt;
| [[Moodle 3.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.4&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019052004&lt;br /&gt;
|[[Moodle 3.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.5&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019052005&lt;br /&gt;
|[[Moodle 3.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.6&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019052006&lt;br /&gt;
|[[Moodle 3.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.7&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019052007&lt;br /&gt;
|[[Moodle 3.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.8&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019052008&lt;br /&gt;
| [[Moodle 3.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.9&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019052009&lt;br /&gt;
|[[Moodle 3.7.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.7.x ended 11 May 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.7.x ended 9 November 2020 (18 months).&lt;br /&gt;
==Moodle 3.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6&lt;br /&gt;
| 3 December 2018&lt;br /&gt;
|2018120300&lt;br /&gt;
|[[Moodle 3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/36/en/Upgrading Upgrading to 3.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.1&lt;br /&gt;
|5 December 2018&lt;br /&gt;
|2018120301&lt;br /&gt;
| [[Moodle 3.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6.2&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018120302&lt;br /&gt;
|[[Moodle 3.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.3&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018120303&lt;br /&gt;
|[[Moodle 3.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.4&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018120304&lt;br /&gt;
|[[Moodle 3.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.5&lt;br /&gt;
|8th July 2019&lt;br /&gt;
|2018120305&lt;br /&gt;
|[[Moodle 3.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.6&lt;br /&gt;
|9th September 2019&lt;br /&gt;
|2018120306&lt;br /&gt;
|[[Moodle 3.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.7&lt;br /&gt;
| 11th November 2019&lt;br /&gt;
|2018120307&lt;br /&gt;
|[[Moodle 3.6.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.8&lt;br /&gt;
|13th January 2020&lt;br /&gt;
|2018120308&lt;br /&gt;
|[[Moodle 3.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.9&lt;br /&gt;
|9th March 2020&lt;br /&gt;
|2018120309&lt;br /&gt;
| [[Moodle 3.6.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.10&lt;br /&gt;
|11th May 2020&lt;br /&gt;
|2018120310&lt;br /&gt;
|[[Moodle 3.6.10 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.6.x ended 11 November 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.6.x ended 11 May 2020 (18 months).&lt;br /&gt;
==Moodle 3.5 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2018051700&lt;br /&gt;
|[[Moodle 3.5 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/35/en/Upgrading Upgrading to 3.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.1&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2018051701&lt;br /&gt;
|[[Moodle 3.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.2&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2018051702&lt;br /&gt;
|[[Moodle 3.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.3&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2018051703&lt;br /&gt;
| [[Moodle 3.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.4&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018051704&lt;br /&gt;
|[[Moodle 3.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.5&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018051705&lt;br /&gt;
|[[Moodle 3.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.6&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018051706&lt;br /&gt;
|[[Moodle 3.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.7&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2018051707&lt;br /&gt;
|[[Moodle 3.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.8&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2018051708&lt;br /&gt;
|[[Moodle 3.5.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.9&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2018051709&lt;br /&gt;
|[[Moodle 3.5.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.10&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2018051710&lt;br /&gt;
| [[Moodle 3.5.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.11&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2018051711&lt;br /&gt;
|[[Moodle 3.5.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.12&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2018051712&lt;br /&gt;
| [[Moodle 3.5.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.13&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2018051713&lt;br /&gt;
|[[Moodle 3.5.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.14&lt;br /&gt;
| 14 September 2020&lt;br /&gt;
|2018051714&lt;br /&gt;
|[[Moodle 3.5.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.15&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2018051715&lt;br /&gt;
|[[Moodle 3.5.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.16&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2018051716&lt;br /&gt;
| [[Moodle 3.5.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.17&lt;br /&gt;
|8 March 2021&lt;br /&gt;
| 2018051717&lt;br /&gt;
|[[Moodle 3.5.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.18&lt;br /&gt;
| 10 May 2021&lt;br /&gt;
| 2018051718&lt;br /&gt;
|[[Moodle 3.5.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.5.x ended May 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.5.x ended 10 May 2021 (36 months).&lt;br /&gt;
==Moodle 3.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017111300&lt;br /&gt;
|[[Moodle 3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/34/en/Upgrading Upgrading to 3.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.1&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017111301&lt;br /&gt;
|[[Moodle 3.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.2&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017111302&lt;br /&gt;
|[[Moodle 3.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.3&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017111303&lt;br /&gt;
|[[Moodle 3.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.4&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017111304&lt;br /&gt;
|[[Moodle 3.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.5&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017111305&lt;br /&gt;
|[[Moodle 3.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.6&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017111306&lt;br /&gt;
| [[Moodle 3.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.7&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2017111307&lt;br /&gt;
|[[Moodle 3.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.8&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2017111308&lt;br /&gt;
|[[Moodle 3.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.9&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2017111309&lt;br /&gt;
| [[Moodle 3.4.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.4.x ended 12 November 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.4.x ended 13 May 2019 (18 months).&lt;br /&gt;
==Moodle 3.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3&lt;br /&gt;
|15 May 2017&lt;br /&gt;
|2017051500&lt;br /&gt;
|[[Moodle 3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/33/en/Upgrading Upgrading to 3.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.1&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2017051501&lt;br /&gt;
|[[Moodle 3.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.2&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2017051502&lt;br /&gt;
|[[Moodle 3.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.3&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017051503&lt;br /&gt;
| [[Moodle 3.3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.4&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017051504&lt;br /&gt;
|[[Moodle 3.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.5&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017051505&lt;br /&gt;
|[[Moodle 3.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.6&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017051506&lt;br /&gt;
|[[Moodle 3.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.7&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017051507&lt;br /&gt;
|[[Moodle 3.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.8&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017051508&lt;br /&gt;
|[[Moodle 3.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.9&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017051509&lt;br /&gt;
|[[Moodle 3.3.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.3.x ended 17 May 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.3.x ended 12 November 2018 (18 months).&lt;br /&gt;
==Moodle 3.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2&lt;br /&gt;
| 5 December 2016&lt;br /&gt;
|2016120500&lt;br /&gt;
|[[Moodle 3.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/32/en/Upgrading Upgrading to 3.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.1&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016120501&lt;br /&gt;
|[[Moodle 3.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.2&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016120502&lt;br /&gt;
|[[Moodle 3.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.3&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016120503&lt;br /&gt;
|[[Moodle 3.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.4&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016120504&lt;br /&gt;
|[[Moodle 3.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.5&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016120505&lt;br /&gt;
|[[Moodle 3.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.6&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016120506&lt;br /&gt;
| [[Moodle 3.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.7&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016120507&lt;br /&gt;
|[[Moodle 3.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.8&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016120508&lt;br /&gt;
|[[Moodle 3.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.9&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016120509&lt;br /&gt;
| [[Moodle 3.2.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.2.x ended 13 November 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.2.x ended 17 May 2018 (18 months).&lt;br /&gt;
==Moodle 3.1 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1&lt;br /&gt;
|23 May 2016&lt;br /&gt;
|2016052300&lt;br /&gt;
|[[Moodle 3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/31/en/Upgrading Upgrading to 3.1]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.1&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2016052301&lt;br /&gt;
|[[Moodle 3.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.2&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2016052302&lt;br /&gt;
|[[Moodle 3.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.3&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2016052303&lt;br /&gt;
|[[Moodle 3.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.4&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016052304&lt;br /&gt;
|[[Moodle 3.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.5&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016052305&lt;br /&gt;
|[[Moodle 3.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.6&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016052306&lt;br /&gt;
|[[Moodle 3.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.7&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016052307&lt;br /&gt;
|[[Moodle 3.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.8&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016052308&lt;br /&gt;
|[[Moodle 3.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.9&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016052309&lt;br /&gt;
|[[Moodle 3.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.10&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016052310&lt;br /&gt;
|[[Moodle 3.1.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.11&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016052311&lt;br /&gt;
|[[Moodle 3.1.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.12&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016052312&lt;br /&gt;
|[[Moodle 3.1.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.13&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2016052313&lt;br /&gt;
|[[Moodle 3.1.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.14&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2016052314&lt;br /&gt;
|[[Moodle 3.1.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.15&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2016052315&lt;br /&gt;
|[[Moodle 3.1.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.16&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2016052316&lt;br /&gt;
|[[Moodle 3.1.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.17&lt;br /&gt;
|11 March 2019&lt;br /&gt;
| 2016052317&lt;br /&gt;
|[[Moodle 3.1.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.18&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2016052318&lt;br /&gt;
|[[Moodle 3.1.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.1.x ended 8 May 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.1.x ended 13 May 2019 (36 months).&lt;br /&gt;
==Moodle 3.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0&lt;br /&gt;
|16 November 2015&lt;br /&gt;
|2015111600&lt;br /&gt;
|[[Moodle 3.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/30/en/Upgrading Upgrading to 3.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.1&lt;br /&gt;
|21 December 2015&lt;br /&gt;
|2015111601&lt;br /&gt;
| [[Moodle 3.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.2&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015111602&lt;br /&gt;
|[[Moodle 3.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.3&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015111603&lt;br /&gt;
|[[Moodle 3.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.4&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015111604&lt;br /&gt;
|[[Moodle 3.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.5&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015111605&lt;br /&gt;
|[[Moodle 3.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.6&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015111606&lt;br /&gt;
|[[Moodle 3.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.7&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015111607&lt;br /&gt;
|[[Moodle 3.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.8&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2015111608&lt;br /&gt;
|[[Moodle 3.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.9&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2015111609&lt;br /&gt;
|[[Moodle 3.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.10&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2015111610&lt;br /&gt;
|[[Moodle 3.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.0.x ended 14 November 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.0.x ended 8 May 2017 (18 months).&lt;br /&gt;
==Moodle 2.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9&lt;br /&gt;
| 11 May 2015&lt;br /&gt;
|2015051100&lt;br /&gt;
|[[Moodle 2.9 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/29/en/Upgrading_to_Moodle_2.9 Upgrading to 2.9]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.1&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2015051101&lt;br /&gt;
|[[Moodle 2.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.2&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2015051102&lt;br /&gt;
| [[Moodle 2.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.3&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2015051103&lt;br /&gt;
| [[Moodle 2.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.4&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015051104&lt;br /&gt;
|[[Moodle 2.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.5&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015051105&lt;br /&gt;
|[[Moodle 2.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.6&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015051106&lt;br /&gt;
|[[Moodle 2.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.7&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015051107&lt;br /&gt;
|[[Moodle 2.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.8&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015051108&lt;br /&gt;
|[[Moodle 2.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.9&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015051109&lt;br /&gt;
|[[Moodle 2.9.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.9.x ended 9 May 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.9.x ended 14 November 2016 (18 months).&lt;br /&gt;
==Moodle 2.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014111000&lt;br /&gt;
| [[Moodle 2.8 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/28/en/Upgrading_to_Moodle_2.8 Upgrading to 2.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.1&lt;br /&gt;
|13 November 2014&lt;br /&gt;
|2014111001&lt;br /&gt;
| [[Moodle 2.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.2&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014111002&lt;br /&gt;
| [[Moodle 2.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.3&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014111003&lt;br /&gt;
|[[Moodle 2.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.4&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014111004&lt;br /&gt;
|[[Moodle 2.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.5&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014111005&lt;br /&gt;
|[[Moodle 2.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.6&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014111006&lt;br /&gt;
|[[Moodle 2.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.7&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014111007&lt;br /&gt;
|[[Moodle 2.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.8&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2014111008&lt;br /&gt;
| [[Moodle 2.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.9&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014111009&lt;br /&gt;
|[[Moodle 2.8.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.10&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014111010&lt;br /&gt;
|[[Moodle 2.8.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.11&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014111011&lt;br /&gt;
|[[Moodle 2.8.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.12&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014111012&lt;br /&gt;
| [[Moodle 2.8.12 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.8.x ended 9 November 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.8.x ended 9 May 2016 (18 months).&lt;br /&gt;
==Moodle 2.7 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7&lt;br /&gt;
| 12 May 2014&lt;br /&gt;
|2014051200&lt;br /&gt;
|[[Moodle 2.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/27/en/Upgrading_to_Moodle_2.7 Upgrading to 2.7]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.1&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2014051201&lt;br /&gt;
|[[Moodle 2.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.2&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2014051202&lt;br /&gt;
|[[Moodle 2.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.3&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014051203&lt;br /&gt;
| [[Moodle 2.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.4&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014051204&lt;br /&gt;
| [[Moodle 2.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.5&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014051205&lt;br /&gt;
|[[Moodle 2.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.6&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014051206&lt;br /&gt;
|[[Moodle 2.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.7&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014051207&lt;br /&gt;
|[[Moodle 2.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.8&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014051208&lt;br /&gt;
|[[Moodle 2.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.9&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014051209&lt;br /&gt;
|[[Moodle 2.7.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.10&lt;br /&gt;
| 14 September 2015&lt;br /&gt;
|2014051210&lt;br /&gt;
|[[Moodle 2.7.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.11&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014051211&lt;br /&gt;
|[[Moodle 2.7.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.12&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014051212&lt;br /&gt;
|[[Moodle 2.7.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.13&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014051213&lt;br /&gt;
|[[Moodle 2.7.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.14&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014051214&lt;br /&gt;
| [[Moodle 2.7.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.15&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2014051215&lt;br /&gt;
|[[Moodle 2.7.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.16&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2014051216&lt;br /&gt;
|[[Moodle 2.7.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.17&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2014051217&lt;br /&gt;
|[[Moodle 2.7.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.18&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2014051218&lt;br /&gt;
|[[Moodle 2.7.18 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.19&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2014051219&lt;br /&gt;
|[[Moodle 2.7.19 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.20&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2014051220&lt;br /&gt;
| [[Moodle 2.7.20 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.7.x ended 11 May 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.7.x ended 8 May 2017 (36 months).&lt;br /&gt;
==Moodle 2.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6&lt;br /&gt;
|18 November 2013&lt;br /&gt;
|2013111800&lt;br /&gt;
|[[Moodle 2.6 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/26/en/Upgrading_to_Moodle_2.6 Upgrading to 2.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.1&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013111801&lt;br /&gt;
| [[Moodle 2.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.2&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013111802&lt;br /&gt;
|[[Moodle 2.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.3&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013111803&lt;br /&gt;
|[[Moodle 2.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.4&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013111804&lt;br /&gt;
|[[Moodle 2.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.5&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013111805&lt;br /&gt;
|[[Moodle 2.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.6&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2013111806&lt;br /&gt;
|[[Moodle 2.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.7&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2013111807&lt;br /&gt;
|[[Moodle 2.6.7 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.8&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2013111808&lt;br /&gt;
|[[Moodle 2.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.9&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2013111809&lt;br /&gt;
|[[Moodle 2.6.9 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.10&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2013111810&lt;br /&gt;
| [[Moodle 2.6.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.11&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2013111811&lt;br /&gt;
|[[Moodle 2.6.11 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.6.x ended 10 November 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.6.x ended 11 May 2015 (18 months).&lt;br /&gt;
==Moodle 2.5==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5&lt;br /&gt;
| 14 May 2013&lt;br /&gt;
|2013051400&lt;br /&gt;
|[[Moodle 2.5 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/25/en/Upgrading_to_Moodle_2.5 Upgrading to 2.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.1&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2013051401&lt;br /&gt;
|[[Moodle 2.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.2&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2013051402&lt;br /&gt;
|[[Moodle 2.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.3&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2013051403&lt;br /&gt;
|[[Moodle 2.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.4&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013051404&lt;br /&gt;
| [[Moodle 2.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.5&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013051405&lt;br /&gt;
|[[Moodle 2.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.6&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013051406&lt;br /&gt;
|[[Moodle 2.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.7&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013051407&lt;br /&gt;
|[[Moodle 2.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.8&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013051408&lt;br /&gt;
|[[Moodle 2.5.8 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.9&lt;br /&gt;
| 10 November 2014&lt;br /&gt;
|2013051409&lt;br /&gt;
|[[Moodle 2.5.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.5.x ended May 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.5.x ended 10 November 2014 (18 months).&lt;br /&gt;
==Moodle 2.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4&lt;br /&gt;
|3 December 2012&lt;br /&gt;
|2012120300&lt;br /&gt;
|[[Moodle 2.4 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/24/en/Upgrading_to_Moodle_2.4 Upgrading to 2.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.1&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012120301&lt;br /&gt;
|[[Moodle 2.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.2&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012120302&lt;br /&gt;
|[[Moodle 2.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.3&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012120303&lt;br /&gt;
|[[Moodle 2.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.4&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012120304&lt;br /&gt;
|[[Moodle 2.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.5&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012120305&lt;br /&gt;
|[[Moodle 2.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.6&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012120306&lt;br /&gt;
|[[Moodle 2.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.7&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012120307&lt;br /&gt;
| [[Moodle 2.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.8&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012120308&lt;br /&gt;
|[[Moodle 2.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.9&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2012120309&lt;br /&gt;
|[[Moodle 2.4.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.10&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2012120310&lt;br /&gt;
| [[Moodle 2.4.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.11&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2012120311&lt;br /&gt;
|[[Moodle 2.4.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.4.x ended December 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.4.x ended June 2014 (18 months).&lt;br /&gt;
==Moodle 2.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3&lt;br /&gt;
|25 June 2012&lt;br /&gt;
|2012062500&lt;br /&gt;
|[[Moodle 2.3 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/23/en/Upgrading_to_Moodle_2.3 Upgrading to 2.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.1&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2012062501&lt;br /&gt;
|[[Moodle 2.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.2&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2012062502&lt;br /&gt;
|[[Moodle 2.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.3&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2012062503&lt;br /&gt;
|[[Moodle 2.3.3 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.4&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012062504&lt;br /&gt;
|[[Moodle 2.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.5&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012062505&lt;br /&gt;
|[[Moodle 2.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.6&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012062506&lt;br /&gt;
|[[Moodle 2.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.7&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012062507&lt;br /&gt;
|[[Moodle 2.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.8&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012062508&lt;br /&gt;
|[[Moodle 2.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.9&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012062509&lt;br /&gt;
|[[Moodle 2.3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.10&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012062510&lt;br /&gt;
|[[Moodle 2.3.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.11&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012062511&lt;br /&gt;
|[[Moodle 2.3.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.3.x ended June 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.3.x ended December 2013 (18 months).&lt;br /&gt;
==Moodle 2.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2&lt;br /&gt;
|5 December 2011&lt;br /&gt;
|2011120500&lt;br /&gt;
|[[Moodle 2.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/22/en/Upgrading_to_Moodle_2.2 Upgrading to 2.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.1&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011120501&lt;br /&gt;
|[[Moodle 2.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.2&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011120502&lt;br /&gt;
|[[Moodle 2.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.3&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011120503&lt;br /&gt;
|[[Moodle 2.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.4&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011120504&lt;br /&gt;
|[[Moodle 2.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.5&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011120505&lt;br /&gt;
|[[Moodle 2.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.6&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011120506&lt;br /&gt;
| [[Moodle 2.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.7&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011120507&lt;br /&gt;
|[[Moodle 2.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.8&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2011120508&lt;br /&gt;
|[[Moodle 2.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.9&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2011120509&lt;br /&gt;
|[[Moodle 2.2.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.10&lt;br /&gt;
|14 May 2013&lt;br /&gt;
| 2011120510&lt;br /&gt;
|[[Moodle 2.2.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.11&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2011120511&lt;br /&gt;
|[[Moodle 2.2.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.2.x ended December 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.2.x ended June 2013 (18 months).&lt;br /&gt;
==Moodle 2.1==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1&lt;br /&gt;
| 1 July 2011&lt;br /&gt;
|2011070100&lt;br /&gt;
|[[Moodle 2.1 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/21/en/Upgrading_to_Moodle_2.1 Upgrading to 2.1]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.1&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011070101&lt;br /&gt;
| [[Moodle 2.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.2&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011070102&lt;br /&gt;
|[[Moodle 2.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.3&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011070103&lt;br /&gt;
|[[Moodle 2.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.4&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011070104&lt;br /&gt;
|[[Moodle 2.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.5&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011070105&lt;br /&gt;
|[[Moodle 2.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.6&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011070106&lt;br /&gt;
|[[Moodle 2.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.7&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011070107&lt;br /&gt;
|[[Moodle 2.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.8&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011070108&lt;br /&gt;
|[[Moodle 2.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.9&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011070109&lt;br /&gt;
|[[Moodle 2.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.10&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011070110&lt;br /&gt;
|[[Moodle 2.1.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.1.x ended June 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.1.x ended December 2012 (18 months).&lt;br /&gt;
==Moodle 2.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0&lt;br /&gt;
|24 November 2010&lt;br /&gt;
|2010112400&lt;br /&gt;
| [[Moodle 2.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/20/en/Upgrading_to_Moodle_2.0 Upgrading to 2.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.1&lt;br /&gt;
|25 December 2010&lt;br /&gt;
|2010122500&lt;br /&gt;
|[[Moodle 2.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.2&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2011022100&lt;br /&gt;
|[[Moodle 2.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.3&lt;br /&gt;
|5 May 2011&lt;br /&gt;
|2011033003&lt;br /&gt;
|[[Moodle 2.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.4&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011033004&lt;br /&gt;
| [[Moodle 2.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.5&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011033005&lt;br /&gt;
|[[Moodle 2.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.6&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011033006&lt;br /&gt;
|[[Moodle 2.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.7&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011033007&lt;br /&gt;
|[[Moodle 2.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.8&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011033008&lt;br /&gt;
|[[Moodle 2.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.9&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011033009&lt;br /&gt;
|[[Moodle 2.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.10&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011033010&lt;br /&gt;
|[[Moodle 2.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.0.x ended December 2011 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.0.x ended June 2012 (18 months).&lt;br /&gt;
==Moodle 1.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9&lt;br /&gt;
|3 March 2008&lt;br /&gt;
|2007101509&lt;br /&gt;
|[[Moodle 1.9 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/19/en/Upgrading_to_Moodle_1.9 Upgrading to 1.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.1&lt;br /&gt;
|15 May 2008&lt;br /&gt;
| 2007101512&lt;br /&gt;
|[[Moodle 1.9.1 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.2&lt;br /&gt;
|11 July 2008&lt;br /&gt;
|2007101520&lt;br /&gt;
|[[Moodle 1.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.3&lt;br /&gt;
|15 October 2008&lt;br /&gt;
|2007101530&lt;br /&gt;
|[[Moodle 1.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.4&lt;br /&gt;
|28 January 2009&lt;br /&gt;
|2007101540&lt;br /&gt;
|[[Moodle 1.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.5&lt;br /&gt;
|13 May 2009&lt;br /&gt;
|2007101550&lt;br /&gt;
|[[Moodle 1.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.6&lt;br /&gt;
|21 October 2009&lt;br /&gt;
|2007101560&lt;br /&gt;
|[[Moodle 1.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.7&lt;br /&gt;
|25 November 2009&lt;br /&gt;
|2007101570&lt;br /&gt;
|[[Moodle 1.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.8&lt;br /&gt;
|25 March 2010&lt;br /&gt;
|2007101580.00&lt;br /&gt;
|[[Moodle 1.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.9&lt;br /&gt;
| 8 June 2010&lt;br /&gt;
| 2007101590.00&lt;br /&gt;
| [[Moodle 1.9.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.10&lt;br /&gt;
|25 October 2010&lt;br /&gt;
|2007101591.00&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.10 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.11&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2007101591.02&lt;br /&gt;
|[[Moodle 1.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.12&lt;br /&gt;
|10 May 2011&lt;br /&gt;
|2007101591.03&lt;br /&gt;
|[[Moodle 1.9.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.13&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2007101591.04&lt;br /&gt;
|[[Moodle 1.9.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.14&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2007101591.06&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.15&lt;br /&gt;
|28 November 2011&lt;br /&gt;
| 2007101591.07&lt;br /&gt;
| [[Moodle 1.9.15 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.16&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2007101591.10&lt;br /&gt;
|[[Moodle 1.9.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.17&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2007101591.12&lt;br /&gt;
|[[Moodle 1.9.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.18&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2007101591.16&lt;br /&gt;
|[[Moodle 1.9.18 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.19&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2007101592.00&lt;br /&gt;
|[[Moodle 1.9.19 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 1.9.x has ended June 2011 (3.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.x by Moodle HQ ended June 2012 (4.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.19+ branch by [http://catalyst.net.nz Catalyst IT] ended [http://moodle.org/mod/forum/discuss.php?d=199706 Dec 2013] (6 years).&lt;br /&gt;
==Moodle 1.8 ==&lt;br /&gt;
*[[Moodle 1.8 release notes|Moodle 1.8]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.8.1 release notes|Moodle 1.8.1]] - 14 June 2007&lt;br /&gt;
*[[Moodle 1.8.2 release notes|Moodle 1.8.2]] - 8 July 2007&lt;br /&gt;
*[[Moodle 1.8.3 release notes|Moodle 1.8.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.8.4 release notes|Moodle 1.8.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.8.5 release notes|Moodle 1.8.5]] - 8 April 2008&lt;br /&gt;
*[[Moodle 1.8.6 release notes|Moodle 1.8.6]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.8.7 release notes|Moodle 1.8.7]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.8.8 release notes|Moodle 1.8.8]] - 28 January 2009&lt;br /&gt;
*[[Moodle 1.8.9 release notes|Moodle 1.8.9]] - 15 May 2009&lt;br /&gt;
*[[Moodle 1.8.10 release notes|Moodle 1.8.10]] - 26 October 2009&lt;br /&gt;
*[[Moodle 1.8.11 release notes|Moodle 1.8.11]] - 25 November 2009&lt;br /&gt;
*[[Moodle 1.8.12 release notes|Moodle 1.8.12]] - 27 March 2010&lt;br /&gt;
*[[Moodle 1.8.13 release notes|Moodle 1.8.13]] - 8 June 2010&lt;br /&gt;
*[[Moodle 1.8.14 release notes|Moodle 1.8.14]] - 3 December 2010&lt;br /&gt;
*Support has ended&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.7==&lt;br /&gt;
*[[Moodle 1.7 release notes|Moodle 1.7]] - 7 November 2006&lt;br /&gt;
*[[Moodle 1.7.1 release notes|Moodle 1.7.1]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.7.2 release notes|Moodle 1.7.2]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.7.3 release notes|Moodle 1.7.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.7.4 release notes|Moodle 1.7.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.7.5 release notes|Moodle 1.7.5]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.7.6 release notes|Moodle 1.7.6]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.7.7 release notes|Moodle 1.7.7]] - 28 January 2009&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.6==&lt;br /&gt;
*[[Moodle 1.6 release notes|Moodle 1.6]] - 20 June 2006&lt;br /&gt;
*[[Moodle 1.6.1 release notes|Moodle 1.6.1]] - 20 July 2006&lt;br /&gt;
*[[Moodle 1.6.2 release notes|Moodle 1.6.2]] - 12 September 2006&lt;br /&gt;
*[[Moodle 1.6.3 release notes|Moodle 1.6.3]] - 10 October 2006&lt;br /&gt;
*[[Moodle 1.6.4 release notes|Moodle 1.6.4]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.6.5 release notes|Moodle 1.6.5]] - 30 March 2007&lt;br /&gt;
*Moodle 1.6.6 - 11 January 2008&lt;br /&gt;
*Moodle 1.6.7 - 11 July 2008&lt;br /&gt;
*[[Moodle 1.6.8 release notes|Moodle 1.6.8]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.6.9 release notes|Moodle 1.6.9]] - 28 January 2009&lt;br /&gt;
* Support has ended&lt;br /&gt;
==Moodle 1.5==&lt;br /&gt;
*[[Moodle 1.5 release notes|Moodle 1.5]] - 5 June 2005&lt;br /&gt;
*[[Moodle 1.5.1 release notes|Moodle 1.5.1]] - 8 July 2005&lt;br /&gt;
*[[Moodle 1.5.2 release notes|Moodle 1.5.2]] - 16 July 2005&lt;br /&gt;
*[[Moodle 1.5.3 release notes|Moodle 1.5.3]] - 11 November 2005&lt;br /&gt;
*[[Moodle 1.5.4 release notes|Moodle 1.5.4]] - 21 May 2006&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.4==&lt;br /&gt;
*Moodle 1.4 - 31 August 2004&lt;br /&gt;
*Moodle 1.4.1 - 12 September 2004&lt;br /&gt;
*Moodle 1.4.2 - 5 November 2004&lt;br /&gt;
*Moodle 1.4.3 - 21 December 2004&lt;br /&gt;
*Moodle 1.4.4 - 7 March 2005&lt;br /&gt;
*[[Moodle 1.4.5 release notes|Moodle 1.4.5]] - 7 May 2005&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.3==&lt;br /&gt;
*Moodle 1.3 - 25 May 2004&lt;br /&gt;
* Moodle 1.3.1 - 4 June 2004&lt;br /&gt;
*Moodle 1.3.2 - 9 July 2004&lt;br /&gt;
*Moodle 1.3.3 - 16 July 2004&lt;br /&gt;
* Moodle 1.3.4 - 11 August 2004&lt;br /&gt;
*Moodle 1.3.5 - 9 September 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.2==&lt;br /&gt;
*Moodle 1.2 - 20 March 2004&lt;br /&gt;
*Moodle 1.2.1 - 25 March 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.1==&lt;br /&gt;
*Moodle 1.1 - 29 August 2003&lt;br /&gt;
*Moodle 1.1.1 - 11 September 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
== Moodle 1.0==&lt;br /&gt;
*Moodle 1.0 - 20 August 2002&lt;br /&gt;
*Moodle 1.0.1 - 26 August 2002&lt;br /&gt;
*Moodle 1.0.2 - 2 September 2002&lt;br /&gt;
*Moodle 1.0.3 - 5 September 2002&lt;br /&gt;
*Moodle 1.0.4 - 10 September 2002&lt;br /&gt;
*Moodle 1.0.5 - 27 September 2002&lt;br /&gt;
* Moodle 1.0.6 - 26 October 2002&lt;br /&gt;
::1.0.6.1 - 6 November 2002&lt;br /&gt;
::1.0.6.2 - 11 November 2002&lt;br /&gt;
::1.0.6.3 - 14 November 2002&lt;br /&gt;
::1.0.6.4 - 25 November 2002&lt;br /&gt;
*Moodle 1.0.7 - 9 December 2002&lt;br /&gt;
*Moodle 1.0.8 - 7 January 2003&lt;br /&gt;
*Moodle 1.0.9 - 30 May 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Roadmap]] - future versions&lt;br /&gt;
*[[Moodle versions]] - an explanation of how our versions work plus version numbers for each release (for $plugin-&amp;gt;requires)&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Core development]]&lt;br /&gt;
[[fr:Historique des versions]]&lt;br /&gt;
[[es:dev/Historia de las versiones]]&lt;br /&gt;
[[de:Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=File:401_release_graph.png&amp;diff=62361</id>
		<title>File:401 release graph.png</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=File:401_release_graph.png&amp;diff=62361"/>
		<updated>2022-05-09T01:27:26Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: A graph that shows the 4.0.1 release. Details about this can be found in a table.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
A graph that shows the 4.0.1 release. Details about this can be found in a table.&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Setting_up_Sublime2&amp;diff=62113</id>
		<title>Setting up Sublime2</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Setting_up_Sublime2&amp;diff=62113"/>
		<updated>2022-04-28T03:17:09Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Marking this document as obsolete&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{obsolete}}&lt;br /&gt;
&lt;br /&gt;
According Wikipedia &#039;&#039;Sublime Text is a cross-platform text and source code editor, with a Python API. The chrome was inspired by Vim. Its functionality is also extendable with sublime-packages; Sublime Text is not open source software nor free software, but some of the extending packages have free-software licenses and are community-built and maintained.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sublime Settings ==&lt;br /&gt;
&lt;br /&gt;
For Moodle Development:&lt;br /&gt;
&lt;br /&gt;
Preferences -&amp;gt; Settings (default or user)&lt;br /&gt;
&lt;br /&gt;
Tab size and spaces:&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;tab_size&amp;quot;: 4,&lt;br /&gt;
    &lt;br /&gt;
    // Set to true to insert spaces when tab is pressed&lt;br /&gt;
    &amp;quot;translate_tabs_to_spaces&amp;quot;: true,&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;rulers&amp;quot;:&lt;br /&gt;
    [&lt;br /&gt;
        132&lt;br /&gt;
    ],&lt;br /&gt;
&lt;br /&gt;
== Sublime plugins for PHP and Moodle Development ==&lt;br /&gt;
&lt;br /&gt;
For installing new plugins in Sublime2, the best way is to use the Sublime Package Control, see [http://wbond.net/sublime_packages/package_control/installation installation instructions]&lt;br /&gt;
&lt;br /&gt;
=== SublimeMoodle ===&lt;br /&gt;
&lt;br /&gt;
By [https://moodle.org/user/view.php?id=1451616&amp;amp;course=5 Frédéric Massart]&lt;br /&gt;
&lt;br /&gt;
* Auto completion for functions, classes and constants.&lt;br /&gt;
* Helper to write testing instructions (Command palette &amp;gt; Moodle: Write testing instructions)&lt;br /&gt;
* Open a tracker issue based on user input (Command palette &amp;gt; Moodle: Open a tracker issue)&lt;br /&gt;
* Open a tracker issue based on text selection or current branch (Command palette &amp;gt; Moodle: Resolve and open tracker issue)&lt;br /&gt;
&lt;br /&gt;
You need to install it manually or add a new Package Control repository&lt;br /&gt;
&lt;br /&gt;
https://github.com/FMCorz/SublimeMoodle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Trailing Spaces ===&lt;br /&gt;
&lt;br /&gt;
A Sublime Text 2 and 3 plugin that allows you to highlight trailing spaces and delete them in a flash!&lt;br /&gt;
&lt;br /&gt;
https://github.com/SublimeText/TrailingSpaces&lt;br /&gt;
&lt;br /&gt;
=== Sublime PHP CS ===&lt;br /&gt;
&lt;br /&gt;
PHP CodeSniffer, PHP Coding Standard Fixer, Linter, Mess Detector and Facebook Scheck Support for Sublime Text&lt;br /&gt;
&lt;br /&gt;
I recommend to enable only the Linter and the PHP Coding Standard Fixer. Mess Detector and Scheck may help a lot but they not fit well with some Moodle coding rules. &lt;br /&gt;
&lt;br /&gt;
The PHP Coding Standard Fixer check the code using the PEAR standard, for installing the Moodle standard you can install using PEAR or manually install it.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Install using pear installer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Install PHP CS using PEAR installer following steps described in https://docs.moodle.org/dev/CodeSniffer#Installing_PHP_CS&lt;br /&gt;
&lt;br /&gt;
2. Edit the settings for the PHP CodeSniffer package, change this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;quot;phpcs_additional_args&amp;quot;: {&lt;br /&gt;
        &amp;quot;--standard&amp;quot;: &amp;quot;moodle&amp;quot;,&lt;br /&gt;
        &amp;quot;-n&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can delete the -n option if you want to see also Warnings&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
     // This display warnings also.&lt;br /&gt;
    &amp;quot;phpcs_additional_args&amp;quot;: {&lt;br /&gt;
        &amp;quot;--standard&amp;quot;: &amp;quot;moodle&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You can put the previous directories in a different directory and change the --standard value to point to that directory&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Manually install (to avoid dependencies issues)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1 Download the phpcs.phar bundle from the author web page: https://github.com/squizlabs/PHP_CodeSniffer/releases/download/3.5.8/phpcs.phar (remember to chmod +x the phpcs.phar file)&lt;br /&gt;
&lt;br /&gt;
2 Clone the https://github.com/moodlehq/moodle-local_codechecker repo into a local directory&lt;br /&gt;
&lt;br /&gt;
3 Edit the settings for the PHP CodeSniffer package, change this:&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;phpcs_executable_path&amp;quot;: &amp;quot;/path/to/phpcs.phar&amp;quot;,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;phpcs_additional_args&amp;quot;: {&lt;br /&gt;
        &amp;quot;--standard&amp;quot;: &amp;quot;/path/to/moodle-local_codechecker/moodle&amp;quot;,&lt;br /&gt;
        &amp;quot;-n&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
===  DockBlockr ===&lt;br /&gt;
&lt;br /&gt;
Simplifies writing DocBlock comments in Javascript, PHP, CoffeeScript, Actionscript, C &amp;amp; C++&lt;br /&gt;
&lt;br /&gt;
Just type /** and tab ... It will preload the fool dock skel (tab between vars for quick editing)&lt;br /&gt;
&lt;br /&gt;
https://github.com/spadgos/sublime-jsdocs&lt;br /&gt;
&lt;br /&gt;
=== Sidebar Enhancements ===&lt;br /&gt;
&lt;br /&gt;
Enhancements to Sublime Text sidebar. Files and folders.&lt;br /&gt;
&lt;br /&gt;
https://github.com/titoBouzout/SideBarEnhancements&lt;br /&gt;
&lt;br /&gt;
=== Bracket Highlighter ===&lt;br /&gt;
&lt;br /&gt;
Bracket and tag highlighter for Sublime Text 2&lt;br /&gt;
&lt;br /&gt;
https://github.com/facelessuser/BracketHighlighter&lt;br /&gt;
&lt;br /&gt;
=== Sublime CodeIntel ===&lt;br /&gt;
&lt;br /&gt;
Full-featured code intelligence and smart autocomplete engine&lt;br /&gt;
&lt;br /&gt;
Avoid to index XML files (it will crash with Moodle), Shift + Click for jumping to function definitions&lt;br /&gt;
&lt;br /&gt;
I recomend you to index only the Moodle lib/ folder (include the folder in your project in order to allo CodeIntel to index it)&lt;br /&gt;
&lt;br /&gt;
http://github.com/Kronuz/SublimeCodeIntel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer tools|Sublime]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61916</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61916"/>
		<updated>2022-03-31T06:55:02Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Removed unnecessary 4.0 tag&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page highlights the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== Navigation changes ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
=== Primary navigation ===&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
==== Customising the primary navigation ====&lt;br /&gt;
Not yet implemented but we are looking at allowing the full addition and removal of any of the primary navigation tabs in the boost theme config file.&lt;br /&gt;
=== Secondary navigation ===&lt;br /&gt;
The main content area shows tabs for secondary navigation with a maximum of 5 items being rendered in this ‘more’ menu. A new UI component has been created to render menus like this. Files:&lt;br /&gt;
 /lib/templates/moremenu.mustache&lt;br /&gt;
==== Adding items to the navigation ====&lt;br /&gt;
The secondary navigation pulls information mainly from the settings navigation node from each context. Any plugin that implements the existing navigation hooks will have their items added to the secondary navigation.&lt;br /&gt;
Existing navigation hooks:&lt;br /&gt;
* {module}_extend_navigation&lt;br /&gt;
* {local}_extend_navigation&lt;br /&gt;
* {report}_report_extend_navigation&lt;br /&gt;
* {plugin}_extend_navigation_course&lt;br /&gt;
* {plugin}_extend_navigation_category_settings&lt;br /&gt;
==== Changing the order of tabs ====&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level.&lt;br /&gt;
=== Tertiary navigation ===&lt;br /&gt;
We&#039;ve moved action buttons to the top of the page. We would encourage you to do the same.&lt;br /&gt;
If you have any buttons on an activity page that go to another page, or open a form (or similar), then we encourage you to move them from the body of your activity page to the top. All of the core activities have been updated to follow this pattern. Please take a look to see how you can format your activity in a similar fashion. There is no API here. You are welcome to create the buttons and display them as you wish in this top area.&lt;br /&gt;
=== New API functions ===&lt;br /&gt;
==== Page API ====&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondarynav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* set_secondary_navigation - Sets the ‘_hassecondarynavigation’ and optionally the ‘_hastablistsecondarynavigation’ to indicate whether a page should render the secondary navigation, and if the secondary navigation should be rendered and behave with a tablist ARIA role (as opposed to its default which is being rendered with a menubar ARIA role).&lt;br /&gt;
==== Navigationlib ====&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
==== The activity header class ====&lt;br /&gt;
There is a new activity header class that handles the display of information common to activities. 3rd party activities are not required to explicitly output this information as part of rendering individual pages.&lt;br /&gt;
&lt;br /&gt;
The common information that are currently handled by the class are:&lt;br /&gt;
* title&lt;br /&gt;
* description&lt;br /&gt;
* completion information&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As part of the update it was required that the initial information to be displayed by the class be toggable at a theme and layout level. Taking this into account the following theme level configurable exists:&lt;br /&gt;
* activityheaderconfig =&amp;gt; An array that currently only enforces &#039;notitle&#039; but can be expanded in the future NOTE: Boost has this set as true by default &#039;options&#039;&lt;br /&gt;
The following layout level options that can be defined:&lt;br /&gt;
* noactivityheader - to remove the header in this specific layout.&lt;br /&gt;
* activityheader - An array that enforces the following options:&lt;br /&gt;
** notitle&lt;br /&gt;
** nocompletion&lt;br /&gt;
** nodescription&lt;br /&gt;
The class has a page level getter which you can use to fetch the current version of the class. The base state is initialised within the constructor with the completion information only fetched when data is exported for the template.&lt;br /&gt;
&lt;br /&gt;
The class has setters for the following variables which can be leveraged to modify the header for a particular page in the format set_{variable_name}:&lt;br /&gt;
* hidecompletion&lt;br /&gt;
* description&lt;br /&gt;
* title&lt;br /&gt;
Alternately, bulk operations can also be done by passing the above variables in an array to &#039;set_attrs&#039; which in turn calls the setters.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note: Any updates to the activityheader needs to be performed before the call to $OUTPUT-&amp;gt;header&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
===== Theme updates: =====&lt;br /&gt;
With the changes in boost to incorporate the primary and secondary navigation, 3rd party themes would need to account for the following in their templates:&lt;br /&gt;
* To leverage the activity_header, it&#039;s data needs to be exported and included into the base template :&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
   {{&amp;gt; core/activity_header}}&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;** headercontent being the array element that contains the exported activity_header data&lt;br /&gt;
* It is recommended to transition towards the secondary/tertiary navigation hierarchy to reduce user cognitive load and with a logical separation of components&lt;br /&gt;
** Secondary navigation can be added to the templates by following the example https://github.com/moodle/moodle/blob/master/theme/boost/templates/columns2.mustache#L64-L68 This leverages the secondary navigation class to generate it&#039;s content.&lt;br /&gt;
* Flat navigation classes have been marked for deprecation. Themes that leverage the flat_navigation will need to make the following changes in their plugins in order to use it&lt;br /&gt;
** Account for the additional changes [[Moodle 4.0 developer update#Theme changes]]&lt;br /&gt;
** Indicate that they do not implement secondary navigation via the page&#039;s &amp;quot;set_secondary_navigation&amp;quot; function. It is recommended to set this within the root layout file e.g. columns2&lt;br /&gt;
** Initialise the flat navigation by introducing the following in the root layout file(if not existent)&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$nav = $PAGE-&amp;gt;flatnav;&lt;br /&gt;
$templatecontext[&#039;firstcollectionlabel&#039;] = $nav-&amp;gt;get_collectionlabel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* In order to reintroduce the settings cog in the templates, you can introduce the following: &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;region-main-settings-menu&amp;quot; class=&amp;quot;d-print-none {{#hasblocks}}has-blocks{{/hasblocks}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt; {{{ output.region_main_settings_menu }}} &amp;lt;/div&amp;gt;            &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Accessibility notes: =====&lt;br /&gt;
The jump to ‘maincontent’ div is now rendered within the activity header when within an activity context&lt;br /&gt;
== Component library ==&lt;br /&gt;
Each Moodle installation now ships with a Moodle User Interface (UI) Component library, a documentation system used to describe all the Bootstrap components and the custom Moodle components. The component Library is a helper tool for developers when creating user interfaces, a testing tool for theme developers and a documentation tool for core developers. The ultimate goal of having a component library is to encourage developers to create consistent user interfaces to improve Moodle’s overall user experience.&lt;br /&gt;
&lt;br /&gt;
The library contains pages with documentation about User Interface components. It contains details on how to use the component, what variations are available and the JavaScript events / options are associated with the component.&lt;br /&gt;
&lt;br /&gt;
When writing on these pages it is possible to render core mustache templates using some custom syntax like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; mustache template=&amp;quot;core/notification_error&amp;quot; &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; /mustache &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also call core JavaScript or use HTML examples where the html code and the rendered result are visible in the Component Library. For more info visit the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-templates/ Moodle templates] page or the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-javascript/ Moodle JavaScript] page.&lt;br /&gt;
&lt;br /&gt;
Each page in the library uses the current css from the default theme in your Moodle installation, if you have multiple themes installed and enabled the setting &amp;quot;Allow theme changes on url&amp;quot;, the component library will have a theme selector option.&lt;br /&gt;
&lt;br /&gt;
A hosted version of the Component Library can be found here. http://componentlibrary.moodle.com&lt;br /&gt;
=== Enabling the Component Library ===&lt;br /&gt;
Component library pages are written in the markdown language. These pages need to be compiled to HTML pages before the Component Library is visible. To compile the pages the server running Moodle needs to have the [[Javascript Modules#Install%20NVM%20and%20Node|JavaScript developer tools installed]] (nodeJs and Grunt)&lt;br /&gt;
&lt;br /&gt;
If your server meets all requirements you can enable the library running&lt;br /&gt;
 $ npm install&lt;br /&gt;
 $ grunt componentlibrary&lt;br /&gt;
Further installation instructions can be found in the Component Library itself.&lt;br /&gt;
=== Documenting new UI Components ===&lt;br /&gt;
There are no set rules for adding new pages in the component library yet. These rules will need to be written and adopted in the integration process for Moodle code.&lt;br /&gt;
&lt;br /&gt;
As a guideline for making this rules consideration are:&lt;br /&gt;
&lt;br /&gt;
The component library is not about single use components, for example the Moodle grade book (a huge component with many custom features). Or about very common components like buttons, these are already covered by the Bootstrap section of the component library.&lt;br /&gt;
&lt;br /&gt;
New features should be build keeping in mind the UI part needs to be customisable and if possible (and making sense) reusable. And example would be the new page drawers that we are introducing for the Navigation project. Or the custom primary navigation menus where overflowing items are pushed into a More section.&lt;br /&gt;
== Theme changes ==&lt;br /&gt;
=== Edit switch ===&lt;br /&gt;
On theme boost the “Turn editing on” and “Customise this page” buttons have been replaced by an edit switch in the top navbar. Theme Classic will keep using the old buttons. Child themes can choose to use the edit switch if the theme config.php is using this variable&lt;br /&gt;
 $THEME-&amp;gt;haseditswitch = true;&lt;br /&gt;
The languague menu, which used to be rendered in place of the custom menu has moved to the user dropdown when the user is logged in. If not logged in it will be placed next to the search / notification / messaging icon in the top navbar.&lt;br /&gt;
=== Login page ===&lt;br /&gt;
The login page has been redesigned and allows the admin to configure a background image for the login page only in the theme settings page. This change is available in both Boost and Classic. The login page still has all the features with an improved layout. &lt;br /&gt;
=== The page footer ===&lt;br /&gt;
In large screens, the page footer button is only visible when clicking a help button at the bottom right of the screen.&lt;br /&gt;
=== User initials as profile picture placeholder ===&lt;br /&gt;
If users do not upload a profile picture the user initials are displayed on a rounded gray background as a placeholder picture in the top navbar or any other page using a placeholder image. This change will be available in both Boost and Classic. &lt;br /&gt;
&lt;br /&gt;
With the introduction of this placeholder image the full username will no longer be displayed in the top navbar.&lt;br /&gt;
=== Removal of back to top link ===&lt;br /&gt;
The &amp;quot;back to top&amp;quot; link will be removed for theme boost since the new course index reduced the dependence on page scrolling. Also, the new footer is positioned where this component used to be.&lt;br /&gt;
=== Styling changes ===&lt;br /&gt;
By default rounded edges will be used for UI components, for the page header and main content area the borders will be removed. &lt;br /&gt;
=== New layout page ===&lt;br /&gt;
Theme boost now uses the drawers.php layout for the course index and blocks.&lt;br /&gt;
== Question bank changes ==&lt;br /&gt;
There was a big project to deliver [[Question bank improvements for Moodle 4.0]] which added a new plugin type for adding features to the question banks, tracking the version history for each question as it is edited (question table has been split into &amp;lt;code&amp;gt;question&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;question_versions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_bank_entries&amp;lt;/code&amp;gt;), and tracking where each question is going to be used, with new tables &amp;lt;code&amp;gt;question_references&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_set_references&amp;lt;/code&amp;gt;. This work was done in Epic MDL-70329 if you want to track down the details of any of the core changes.&lt;br /&gt;
=== Question type plugins ===&lt;br /&gt;
Amazingly, we (Safat and colleagues at Catalyst AU) managed to implement this without breaking most question type plugins.&lt;br /&gt;
&lt;br /&gt;
However, the changes to the question bank, and the other Moodle 4.0 changes, probably broke the Behat tests for your plugin. To help with fixing that, MDL-74130 adds navigation to key question type pages (Preview and Edit for a question, and standard question bank pages like the bank itself, import and export) which should let you fix your test efficiently, and in a way that will work in all Moodle versions since 3.9.&lt;br /&gt;
&lt;br /&gt;
The &#039;most&#039; in the first paragraph here is becuase more advance question types may require more effort to fix. (For example qtype_combined which creates multi-part qusetions like the core qtype_multianswer; or qtype_pmatch or qtype_stack, which store additional data - questions tests - alongside the question itseld. How should that work with versionning?) But, if you have not done weird things like that, you are probably safe. If you find anything else that causes problems, please list it here.&lt;br /&gt;
&lt;br /&gt;
The same thing should apply to question behaviour and question import/export format plugings: no significant changes required (probably just fixing the Behat tests because of the navigation changes).&lt;br /&gt;
=== New plugin type: qbank plugins ===&lt;br /&gt;
This is not something that will cause problems for people upgrading from 3.x. Rather, it is an exciting possibility you can explore once you have survived process of upgrading to 4.0. There is a whole new plugin type which you can create to add new features to the question bank. For example extra columns, new actions and bulk actions, and so on. See [[Question_bank_plugins]].&lt;br /&gt;
=== Activities that use questions ===&lt;br /&gt;
The probable bad news is if you have an activity module which uses questions. So far, the only activity which has been fixed is mod_quiz in Moodle core, so we don&#039;t yet have a good picture of what fixes will be necessary in other activities. Work is about to start fixing [https://github.com/studentquiz/moodle-mod_studentquiz mod_studentquiz], so watching that should give more clues. As we do that, we will try to update this section of this page. Other help writing the information required here would also be greatly appreciated.&lt;br /&gt;
== The course format system ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
=== Mandatory renderer in course formats ===&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
=== New format base class ===&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
=== New course output classes and mustache files ===&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All course format output classes implements the new named_templatable interface, which allows the class to define its own template path using the &amp;quot;get_template_name&amp;quot; method. This new interface in combination with [[Templates#Blocks|mustache blocks]] allows the format plugins to provide alternative templates to render the course.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
=== Course editor javascript modules and frontend components ===&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
=== Other course related 4.0 changes ===&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
=== New steps ===&lt;br /&gt;
Moodle 4.0 introduces some new behat steps.&lt;br /&gt;
&lt;br /&gt;
Sometimes you want to create a bulk number of activities. In that case you can use:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
:count :entitytype exist with the following data:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
Given 100 &amp;quot;mod_lti &amp;gt; tool types&amp;quot; exist with the following data:&lt;br /&gt;
  |name        |Test tool [count]                  |&lt;br /&gt;
  |description |Example description [count]        |&lt;br /&gt;
  |baseurl     |https://www.example.com/tool[count]|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dynamic (AJAX) tabs is a new feature contributed to Moodle 4.0 by the Workplace team (MDL-71943). You can use the following step to navigate between the tabs.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on the &amp;quot;tab title&amp;quot; dynamic tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To make sure that edit mode is (or is not) available on the current page, the following steps can be used.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And edit mode should be available on the current page&lt;br /&gt;
And edit mode should not be available on the current page&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are new aliases for the existing steps &amp;lt;code&amp;gt;I turn editing mode on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;I turn editing mode off&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I switch editing mode on&lt;br /&gt;
And I switch editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to the existing step to go to a course with editing mode on, we now have the following step to do the same but with editing mode being off.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I am on &amp;quot;course full name&amp;quot; course homepage with editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step is similar to the old &amp;lt;code&amp;gt;following &amp;quot;link string&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&amp;lt;/code&amp;gt; step, with more flexibility.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;Download&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;Starter&amp;quot; &amp;quot;table_row&amp;quot; should download between &amp;quot;0&amp;quot; and &amp;quot;5000&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to hover the mouse over the trigger area.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over the &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step enables an installed plugin.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;plugin name&amp;quot; &amp;quot;plugin type&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;course_summary&amp;quot; &amp;quot;block&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following is a special variation of &#039;I click on &amp;quot;&amp;lt;page name&amp;gt;&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;page&amp;quot; &amp;quot;region&amp;quot;&#039;. It first checks to see if we are on the given page via the breadcrumb. If not we then attempt to follow the link name given.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I follow the breadcrumb &amp;quot;page name&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can use the following step to ensure a node is active in the navbar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Node&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;My courses&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to navigate to a given node in the primary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select &amp;quot;Node&amp;quot; from primary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check whether an item exists in the user menu or not.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the user menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Language&amp;quot; &amp;quot;link&amp;quot; should exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check if a submenu of the user menu is shown, and if an item exists or does not exist in a given user submenu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I follow &amp;quot;Language&amp;quot; in the user menu&lt;br /&gt;
Then I should see &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English (pirate) &amp;amp;lrm;(en_ar)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To add enrolment methods to courses you can use the following new step. The data that you provide in the next lines are used to fill the enrolment method form.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;enrolment method&amp;quot; in &amp;quot;course identifier&amp;quot; with:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I add &amp;quot;Self enrolment&amp;quot; enrolment method in &amp;quot;Course 1&amp;quot; with:&lt;br /&gt;
  | Custom instance name     | Test student enrolment |&lt;br /&gt;
  | Enrolment key            | moodle_rules           |&lt;br /&gt;
  | Use group enrolment keys | Yes                    |&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 3 new steps specific to the calendar component. These steps can be used to hover over a day in the mini-calendar or the full calendar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the full calendar page&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the mini-calendar block&lt;br /&gt;
And I hover over today in the mini-calendar block&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some new steps are added to question bank to be able to add comment to questions, verify the existence of a comment, and deleting comments form questions. Please note that the steps for adding comments only write the comment text in the comment field. You still need to click on the &amp;quot;Add comment&amp;quot; button to save the comment.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question preview&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question preview&lt;br /&gt;
And I should see &amp;quot;number of comments&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;number of comments&amp;quot; on the row on the comments column&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;Question bank&amp;quot; in current page administration&lt;br /&gt;
And I should see &amp;quot;0&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;0&amp;quot; on the row on the comments column&lt;br /&gt;
And I add &amp;quot;test comment 01&amp;quot; comment to question&lt;br /&gt;
And I click on &amp;quot;Add comment&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Close&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I should see &amp;quot;1&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;1&amp;quot; on the row on the comments column&lt;br /&gt;
And I delete &amp;quot;test comment 01&amp;quot; comment from question&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similar to the steps for comments, the following steps are to verify the number of a question&#039;s usage and to click on it in order to open the question usage modal.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
And I click &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new steps are related to bulk actions in the question bank UI.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should not see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on &amp;quot;First question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Second question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;With selected&amp;quot; &amp;quot;button&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Delete&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;Confirm&amp;quot; &amp;quot;dialogue&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://docs.moodle.org/en/Report_builder Report builder] is a new feature contributed to Moodle 4.0 by the Workplace team. The following new step is added to Moodle 4.0 to select an action from the action menu in the list of custom reports table.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I press &amp;quot;action&amp;quot; action in the &amp;quot;report name&amp;quot; report row&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There&#039;s another step related to the report builder to set a column&#039;s aggregation in the report editor.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;column title&amp;quot; column aggregation to &amp;quot;aggregation method&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;First name&amp;quot; column aggregation to &amp;quot;Comma separated values&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step needs to be used in scenarios that involve testing BigBlueButton. For this to work, you need to have a [https://github.com/moodlehq/bigbluebutton_mock BigBlueButton Mock API Server] and set &amp;lt;code&amp;gt;TEST_MOD_BIGBLUEBUTTONBN_MOCK_SERVER&amp;lt;/code&amp;gt; to point to that in config.php.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And a BigBlueButton mock server is configured&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step replicates receiving a callback from the BigBlueButton server indicating the recordings for meetings are ready for viewing.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And the BigBlueButtonBN server has sent recording ready notifications&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are specific to the lesson activity. Note that in 4.0, some links (such as the &amp;quot;edit&amp;quot; and the &amp;quot;grade essays&amp;quot; links) are replaced by buttons, so you need to update your old steps with the new ones.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I edit the lesson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;A new step is added to be used in lesson activities to edit them. This step navigates the user to the lesson edit page.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I grade lesson essays&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;It&#039;s a new step to go to the &amp;quot;Grade essays&amp;quot; page of the lesson we are currently in.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select edit type &amp;quot;edit type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Select the lesson edit type when we are in the the lesson&#039;s edit page. &amp;quot;edit type&amp;quot; can either be &amp;quot;Collapsed&amp;quot; or &amp;quot;Expanded&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new step can be used to navigate to the exports page in the course gradebook and select the specified export type from the grade exports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;export option&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;XML file&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similarly, there&#039;s a new step to navigate to the imports page in the course gradebook and select the specified import type from the grade imports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;import option&amp;quot; import page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Boost steps ===&lt;br /&gt;
In addition to the steps listed in the previous section, there are also some Boost specific steps coming with Moodle 4.0. These steps only work in Boost or Boost child themes, so you need to make sure they are not used in scenarios that may be run by non-Boost themes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step checks whether a node is active in the secondary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see :name is active in secondary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Boost theme shows the language selector menu in the primary navigation when not logged in, and within the user menu when logged in. The following steps are to check if the primary navigation includes the language selector menu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And language selector menu should exist in the navbar&lt;br /&gt;
And language selector menu should not exist in the navbar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And the following steps can be used to check whether an item exists in the language selector menu in the Boost theme.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the language selector menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Modified steps ===&lt;br /&gt;
The step &amp;lt;code&amp;gt;I change the (window|viewport) size to &amp;quot;size&amp;quot;&amp;lt;/code&amp;gt; now supports 2 new values for the size argument. The size argument now accepts &amp;lt;code&amp;gt;mobile&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tablet&amp;lt;/code&amp;gt; values in addition to &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;large&amp;lt;/code&amp;gt;.&lt;br /&gt;
=== Removed steps ===&lt;br /&gt;
Some behat steps are removed or replaced with new steps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As a result of some design changes, hidden or restricted activities are no longer dimmed. Therefore the step&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be dimmed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;is now removed.&lt;br /&gt;
Depending on what you were using that step for, you may be able to use these steps:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Label name&amp;quot; label should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Activity or resource name&amp;quot;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;region-main&amp;quot; &amp;quot;region&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Other things to consider ===&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. It is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] is integrated these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
Old behat steps that may now fail can be updated to the new steps.&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
Or for settings, instead of:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;And I follow &amp;quot;Test choice name&amp;quot;&lt;br /&gt;
And I navigate to &amp;quot;Edit settings&amp;quot; in current page administration&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;And I am on the &amp;quot;Test choice name&amp;quot; &amp;quot;choice activity editing&amp;quot; page&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are also similar stream-lined navigation steps for accessing question bank pages. See MDL-74130.&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Core plugins review ===&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;br /&gt;
=== Core blocks cleanup ===&lt;br /&gt;
In the &amp;quot;Add a block&amp;quot; menu, the list of blocks was really long. A few changes have been done to reduce this list.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Add a block cleanup]] page.&lt;br /&gt;
=== Site admin presets plugin ===&lt;br /&gt;
The third-party plugin [https://moodle.org/plugins/block_admin_presets Admin presets], created by David Monllaó and maintained by developers from [https://pimenko.com/ Pimenko] has been adapted and integrated into Moodle 4.0. It stores settings and plugins status (enabled/disabled) in what&#039;s called &amp;quot;presets&amp;quot; to let admins quickly switch between different configurations.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Site admin presets|Site admin presets plugin]] page.&lt;br /&gt;
=== JavaScript browser support changes ===&lt;br /&gt;
From Moodle 4.0, Internet Explorer is no longer supported. See MDL-73915 and MDLSITE-6109 for further information on this change.&lt;br /&gt;
&lt;br /&gt;
This change means that changes built on 4.0 onwards (including the master branch) will be different to older versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
For plugin developers supporting multiple versions of Moodle using a single plugin version, the compiled javascript files are backwards compatible and will _work_ on all supported versions, however if you run the `grunt` command on multiple versions you will see unbuilt changes. Running grunt on all versions of Moodle is not necessary and this check can be safely disabled for Moodle versions 3.9 - 4.0, as long as only at least you run `grunt` against at least one version of Moodle.&lt;br /&gt;
&lt;br /&gt;
If you need to support Internet Explorer and do not wish to fork your plugin for Moodle 4.0 onwards, then it is recommended that you run `grunt` on an older version of Moodle.&lt;br /&gt;
=== The course index element ===&lt;br /&gt;
The new course index feature can be themed using a set of scss variables. Use them to change the look and feel instead of adding custom css&lt;br /&gt;
 /theme/boost/scss/moodle/courseindex.scss&lt;br /&gt;
With the introduction of the course index component, the previous and next links shown underneath each activity are no longer needed and they will be removed.&lt;br /&gt;
=== Activity icons ===&lt;br /&gt;
The icons used for activities have been redesigned and updated for all core moodle activities.&lt;br /&gt;
&lt;br /&gt;
When viewing the new icons in a file manager, for example for the quiz activity, you will see a simple black monochrome icon with a transparent background.&lt;br /&gt;
&lt;br /&gt;
On the course page, or in the activity chooser, the icon will display as a white icon on a coloured background. Styling of the icons on the coursepage is controlled by the css in theme/boost/scss/moodle/icons.scss.&lt;br /&gt;
&lt;br /&gt;
The background colour for activity icons is set using a new variable in function [modname]_supports(). The quiz activity is of type assessment, so in function quiz_supports() there is a new line defining the purpose:&lt;br /&gt;
 case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;&lt;br /&gt;
Available purposes are:&lt;br /&gt;
* MOD_PURPOSE_COMMUNICATION&lt;br /&gt;
* MOD_PURPOSE_ASSESSMENT&lt;br /&gt;
* MOD_PURPOSE_COLLABORATION&lt;br /&gt;
* MOD_PURPOSE_CONTENT&lt;br /&gt;
* MOD_PURPOSE_ADMINISTRATION&lt;br /&gt;
* MOD_PURPOSE_INTERFACE&lt;br /&gt;
The background colours linked to these purposes are set in theme/boost/scss/moodle/variables.scss&lt;br /&gt;
 $activity-icon-colors: map-merge(&lt;br /&gt;
     (&lt;br /&gt;
         &amp;quot;administration&amp;quot;: #5d63f6,&lt;br /&gt;
         &amp;quot;assessment&amp;quot;: #eb66a2,&lt;br /&gt;
         &amp;quot;collaboration&amp;quot;: #f7634d,&lt;br /&gt;
         &amp;quot;communication&amp;quot;: #11a676,&lt;br /&gt;
         &amp;quot;content&amp;quot;: #399be2,&lt;br /&gt;
         &amp;quot;interface&amp;quot;: #a378ff&lt;br /&gt;
     ),&lt;br /&gt;
     $activity-icon-colors&lt;br /&gt;
 );&lt;br /&gt;
If activity plugins do not define FEATURE_MOD_PURPOSE the activity icon will be rendered against a light grey background. There is no requirement to define the purpose of activity plugins, it will only affect the icon styling.&lt;br /&gt;
&lt;br /&gt;
Plugins implementing the variable FEATURE_MOD_PURPOSE are only supported on Moodle 4.0 and newer.&lt;br /&gt;
&lt;br /&gt;
Customising the activity icon can be done in an alternative way. For example using the styles.css in mod/[pluginname/styles.css&lt;br /&gt;
&lt;br /&gt;
In the example below the activity plugin developer chooses to keep the coloured icon for the activity and render it as large as the coloured background on the core activities&lt;br /&gt;
 .modicon_subcourse.activityiconcontainer {&lt;br /&gt;
     background-color: transparent;&lt;br /&gt;
     padding: 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 .modicon_subcourse.activityiconcontainer img {&lt;br /&gt;
     width: 50px;&lt;br /&gt;
     height: 50px;&lt;br /&gt;
 }&lt;br /&gt;
To customize all icon colours use this scss array and add it to the ‘Raw initial SCSS’ in the theme Boost advanced settings page. The complete array of icon background colours can be overridden using the ‘Raw initial SCSS’ in the theme settings page. The example below changes the colours of each activity type.&lt;br /&gt;
 $activity-icon-colors: (&lt;br /&gt;
     &amp;quot;administration&amp;quot;: #5D63F6,&lt;br /&gt;
     &amp;quot;assessment&amp;quot;: #11A676,&lt;br /&gt;
     &amp;quot;collaboration&amp;quot;: #EB66A2,&lt;br /&gt;
     &amp;quot;communication&amp;quot;: #F7634D,&lt;br /&gt;
     &amp;quot;content&amp;quot;: #399BE2,&lt;br /&gt;
     &amp;quot;interface&amp;quot;: #A378FF&lt;br /&gt;
 )&lt;br /&gt;
== I&#039;m a developer, what do I need to know? ==&lt;br /&gt;
This section is a quick checklist of the areas in this document that you should consult when updating your plugin.&lt;br /&gt;
=== Modules ===&lt;br /&gt;
If you are a module developer (activity / resources) then you need to review the following updates and changes:&lt;br /&gt;
* If using settings, reformat to work with the secondary navigation. We have significantly changed the way that settings are shown. Settings added to the course and activity administration branch of the navigation are now by default shown in the secondary navigation. You will most likely find them in the more section of the secondary navigation. Please avoid creating settings in containers (a parent navigation node with children). These settings will still be shown, but this goes against the pattern that we are trying to establish for navigation around the site. If you have a lot of settings, consider creating a specific page to handle your additional settings.&lt;br /&gt;
** The order of the items in the secondary navigation may not be to your liking. This can be changed. See [[Moodle_4.0_developer_update#Changing_the_order_of_tabs|changing the order of tabs]]&lt;br /&gt;
* Update my behat tests to use new steps for site navigation. See [[Moodle_4.0_developer_update#Behat_changes|new behat steps]].&lt;br /&gt;
* Update my module to use the new activity_header API. See [[Moodle_4.0_developer_update#The_activity_header_class|the activity header]].&lt;br /&gt;
* Update my pages to make it work with the general format of the tertiary navigation. See [[Moodle_4.0_developer_update#Tertiary_navigation|the tertiary navigation]].&lt;br /&gt;
* Update my activity icon to use the API and set a purpose. See [[Moodle_4.0_developer_update#Activity_icons|activity icons]].&lt;br /&gt;
=== Themes ===&lt;br /&gt;
If you are a theme developer then you may want to consider the following:&lt;br /&gt;
* Take a look at the [[Moodle_4.0_developer_update#Navigation_changes|new navigation]] and decide if you want to incorporate this into your theme.&lt;br /&gt;
** A new layout ([[Moodle_4.0_developer_update#New_layout_page|drawers]])&lt;br /&gt;
** An [[Moodle_4.0_developer_update#Edit_switch|edit switch]]&lt;br /&gt;
** The [[Moodle_4.0_developer_update#The_course_index_element|course index]]&lt;br /&gt;
* Use of the flat nav&lt;br /&gt;
* New Site administration page and layout&lt;br /&gt;
* Course settings and how they are displayed&lt;br /&gt;
=== Course format ===&lt;br /&gt;
There have been a lot of changes made to the course format. Most in the process of moving the course format away from using the old rendering system and towards templates.&lt;br /&gt;
We recommend the following sections be read carefully:&lt;br /&gt;
# [[Moodle_4.0_developer_update#The_course_format_system|The course format]]. There have been a lot of deprecations and reading this section is critical in understanding the changes made.&lt;br /&gt;
# Consider moving the rendering of your content over to the [[Templates|template system]].&lt;br /&gt;
=== Other plugins ===&lt;br /&gt;
# Are you adding settings? See the [[Moodle_4.0_developer_update#Adding_items_to_the_navigation|secondary nav]] for adding items to this navigation bar.&lt;br /&gt;
# Have a look at [[Moodle_4.0_developer_update#Secondary_navigation|secondary]] and [[Moodle_4.0_developer_update#Tertiary_navigation|tertiary]] navigation changes in general if you have a plugin that has multiple pages to navigate around.&lt;br /&gt;
# Do you have behat tests? Check the new [[Moodle_4.0_developer_update#Behat_changes|behat changes]].&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61846</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61846"/>
		<updated>2022-03-16T02:43:12Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Other plugins developer update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page highlights the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== Navigation changes ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
=== Primary navigation ===&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
==== Customising the primary navigation ====&lt;br /&gt;
Not yet implemented but we are looking at allowing the full addition and removal of any of the primary navigation tabs in the boost theme config file.&lt;br /&gt;
=== Secondary navigation ===&lt;br /&gt;
The main content area shows tabs for secondary navigation with a maximum of 5 items being rendered in this ‘more’ menu. A new UI component has been created to render menus like this. Files:&lt;br /&gt;
 /lib/templates/moremenu.mustache&lt;br /&gt;
&lt;br /&gt;
==== Adding items to the navigation ====&lt;br /&gt;
The secondary navigation pulls information mainly from the settings navigation node from each context. Any plugin that implements the existing navigation hooks will have their items added to the secondary navigation.&lt;br /&gt;
Existing navigation hooks:&lt;br /&gt;
* {module}_extend_navigation&lt;br /&gt;
* {local}_extend_navigation&lt;br /&gt;
* {report}_report_extend_navigation&lt;br /&gt;
* {plugin}_extend_navigation_course&lt;br /&gt;
* {plugin}_extend_navigation_category_settings&lt;br /&gt;
&lt;br /&gt;
==== Changing the order of tabs ====&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level.&lt;br /&gt;
&lt;br /&gt;
=== Tertiary navigation ===&lt;br /&gt;
We&#039;ve moved action buttons to the top of the page. We would encourage you to do the same.&lt;br /&gt;
If you have any buttons on an activity page that go to another page, or open a form (or similar), then we encourage you to move them from the body of your activity page to the top. All of the core activities have been updated to follow this pattern. Please take a look to see how you can format your activity in a similar fashion. There is no API here. You are welcome to create the buttons and display them as you wish in this top area.&lt;br /&gt;
=== New API functions ===&lt;br /&gt;
==== Page API ====&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondary_nav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* has_secondary_navigation_setter - Sets the ‘_hassecondarynavigation’ to indicate whether a page should render the secondary navigation&lt;br /&gt;
==== Navigationlib ====&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
==== The activity header class ====&lt;br /&gt;
There is a new activity header class that handles the display of information common to activities. 3rd party activities are not required to explicitly output this information as part of rendering individual pages.&lt;br /&gt;
&lt;br /&gt;
The common information that are currently handled by the class are:&lt;br /&gt;
* title&lt;br /&gt;
* description&lt;br /&gt;
* completion information&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As part of the update it was required that the initial information to be displayed by the class be toggable at a theme and layout level. Taking this into account the following theme level configurable exists:&lt;br /&gt;
* activityheaderconfig =&amp;gt; An array that currently only enforces &#039;notitle&#039; but can be expanded in the future NOTE: Boost has this set as true by default &#039;options&#039;&lt;br /&gt;
The following layout level options that can be defined:&lt;br /&gt;
* noactivityheader - to remove the header in this specific layout.&lt;br /&gt;
* activityheader - An array that enforces the following options:&lt;br /&gt;
** notitle&lt;br /&gt;
** nocompletion&lt;br /&gt;
** nodescription&lt;br /&gt;
The class has a page level getter which you can use to fetch the current version of the class. The base state is initialised within the constructor with the completion information only fetched when data is exported for the template.&lt;br /&gt;
&lt;br /&gt;
The class has setters for the following variables which can be leveraged to modify the header for a particular page in the format set_{variable_name}:&lt;br /&gt;
* hidecompletion&lt;br /&gt;
* description&lt;br /&gt;
* title&lt;br /&gt;
Alternately, bulk operations can also be done by passing the above variables in an array to &#039;set_attrs&#039; which in turn calls the setters.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note: Any updates to the activityheader needs to be performed before the call to $OUTPUT-&amp;gt;header&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
===== Theme updates: =====&lt;br /&gt;
In order for 3rd party themes to use the class they need to export the activity_header and include the following into their base template :&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
   {{&amp;gt; core/activity_header}}&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;** headercontent being the array element that contains the exported activity_header data &lt;br /&gt;
===== Accessibility notes: =====&lt;br /&gt;
The jump to ‘maincontent’ div is now rendered within the activity header when within an activity context&lt;br /&gt;
== Component library ==&lt;br /&gt;
Each Moodle installation now ships with a Moodle User Interface (UI) Component library, a documentation system used to describe all the Bootstrap components and the custom Moodle components. The component Library is a helper tool for developers when creating user interfaces, a testing tool for theme developers and a documentation tool for core developers. The ultimate goal of having a component library is to encourage developers to create consistent user interfaces to improve Moodle’s overall user experience.&lt;br /&gt;
&lt;br /&gt;
The library contains pages with documentation about User Interface components. It contains details on how to use the component, what variations are available and the JavaScript events / options are associated with the component.&lt;br /&gt;
&lt;br /&gt;
When writing on these pages it is possible to render core mustache templates using some custom syntax like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; mustache template=&amp;quot;core/notification_error&amp;quot; &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; /mustache &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also call core JavaScript or use HTML examples where the html code and the rendered result are visible in the Component Library. For more info visit the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-templates/ Moodle templates] page or the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-javascript/ Moodle JavaScript] page.&lt;br /&gt;
&lt;br /&gt;
Each page in the library uses the current css from the default theme in your Moodle installation, if you have multiple themes installed and enabled the setting &amp;quot;Allow theme changes on url&amp;quot;, the component library will have a theme selector option.&lt;br /&gt;
&lt;br /&gt;
A hosted version of the Component Library can be found here. http://componentlibrary.moodle.com&lt;br /&gt;
=== Enabling the Component Library ===&lt;br /&gt;
Component library pages are written in the markdown language. These pages need to be compiled to HTML pages before the Component Library is visible. To compile the pages the server running Moodle needs to have the [[Javascript Modules#Install%20NVM%20and%20Node|JavaScript developer tools installed]] (nodeJs and Grunt)&lt;br /&gt;
&lt;br /&gt;
If your server meets all requirements you can enable the library running&lt;br /&gt;
 $ npm install&lt;br /&gt;
 $ grunt componentlibrary&lt;br /&gt;
Further installation instructions can be found in the Component Library itself.&lt;br /&gt;
=== Documenting new UI Components ===&lt;br /&gt;
There are no set rules for adding new pages in the component library yet. These rules will need to be written and adopted in the integration process for Moodle code.&lt;br /&gt;
&lt;br /&gt;
As a guideline for making this rules consideration are:&lt;br /&gt;
&lt;br /&gt;
The component library is not about single use components, for example the Moodle grade book (a huge component with many custom features). Or about very common components like buttons, these are already covered by the Bootstrap section of the component library.&lt;br /&gt;
&lt;br /&gt;
New features should be build keeping in mind the UI part needs to be customisable and if possible (and making sense) reusable. And example would be the new page drawers that we are introducing for the Navigation project. Or the custom primary navigation menus where overflowing items are pushed into a More section.&lt;br /&gt;
== Theme changes ==&lt;br /&gt;
=== Edit switch ===&lt;br /&gt;
On theme boost the “Turn editing on” and “Customise this page” buttons have been replaced by an edit switch in the top navbar. Theme Classic will keep using the old buttons. Child themes can choose to use the edit switch if the theme config.php is using this variable&lt;br /&gt;
 $THEME-&amp;gt;haseditswitch = true;&lt;br /&gt;
The languague menu, which used to be rendered in place of the custom menu has moved to the user dropdown when the user is logged in. If not logged in it will be placed next to the search / notification / messaging icon in the top navbar.&lt;br /&gt;
=== Login page ===&lt;br /&gt;
The login page has been redesigned and allows the admin to configure a background image for the login page only in the theme settings page. This change is available in both Boost and Classic. The login page still has all the features with an improved layout. &lt;br /&gt;
=== The page footer ===&lt;br /&gt;
In large screens, the page footer button is only visible when clicking a help button at the bottom right of the screen.&lt;br /&gt;
=== User initials as profile picture placeholder ===&lt;br /&gt;
If users do not upload a profile picture the user initials are displayed on a rounded gray background as a placeholder picture in the top navbar or any other page using a placeholder image. This change will be available in both Boost and Classic. &lt;br /&gt;
&lt;br /&gt;
With the introduction of this placeholder image the full username will no longer be displayed in the top navbar.&lt;br /&gt;
=== Removal of back to top link ===&lt;br /&gt;
The &amp;quot;back to top&amp;quot; link will be removed for theme boost since the new course index reduced the dependence on page scrolling. Also, the new footer is positioned where this component used to be.&lt;br /&gt;
=== Styling changes ===&lt;br /&gt;
By default rounded edges will be used for UI components, for the page header and main content area the borders will be removed. &lt;br /&gt;
=== New layout page ===&lt;br /&gt;
Theme boost now uses the drawers.php layout for the course index and blocks.&lt;br /&gt;
== Question bank changes ==&lt;br /&gt;
There was a big project to deliver [[Question bank improvements for Moodle 4.0]] which added a new plugin type for adding features to the question banks, tracking the version history for each question as it is edited (question table has been split into &amp;lt;code&amp;gt;question&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;question_versions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_bank_entries&amp;lt;/code&amp;gt;), and tracking where each question is going to be used, with new tables &amp;lt;code&amp;gt;question_references&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_set_references&amp;lt;/code&amp;gt;. This work was done in Epic MDL-70329 if you want to track down the details of any of the core changes.&lt;br /&gt;
=== Question type plugins ===&lt;br /&gt;
Amazingly, we (Safat and colleagues at Catalyst AU) managed to implement this without breaking most question type plugins.&lt;br /&gt;
&lt;br /&gt;
However, the changes to the question bank, and the other Moodle 4.0 changes, probably broke the Behat tests for your plugin. To help with fixing that, MDL-74130 adds navigation to key question type pages (Preview and Edit for a question, and standard question bank pages like the bank itself, import and export) which should let you fix your test efficiently, and in a way that will work in all Moodle versions since 3.9.&lt;br /&gt;
&lt;br /&gt;
The &#039;most&#039; in the first paragraph here is becuase more advance question types may require more effort to fix. (For example qtype_combined which creates multi-part qusetions like the core qtype_multianswer; or qtype_pmatch or qtype_stack, which store additional data - questions tests - alongside the question itseld. How should that work with versionning?) But, if you have not done weird things like that, you are probably safe. If you find anything else that causes problems, please list it here.&lt;br /&gt;
&lt;br /&gt;
The same thing should apply to question behaviour and question import/export format plugings: no significant changes required (probably just fixing the Behat tests because of the navigation changes).&lt;br /&gt;
=== New plugin type: qbank plugins ===&lt;br /&gt;
This is not something that will cause problems for people upgrading from 3.x. Rather, it is an exciting possibility you can explore once you have survived process of upgrading to 4.0. There is a whole new plugin type which you can create to add new features to the question bank. For example extra columns, new actions and bulk actions, and so on. See [[Question_bank_plugins]].&lt;br /&gt;
=== Activities that use questions ===&lt;br /&gt;
The probable bad news is if you have an activity module which uses questions. So far, the only activity which has been fixed is mod_quiz in Moodle core, so we don&#039;t yet have a good picture of what fixes will be necessary in other activities. Work is about to start fixing [https://github.com/studentquiz/moodle-mod_studentquiz mod_studentquiz], so watching that should give more clues. As we do that, we will try to update this section of this page. Other help writing the information required here would also be greatly appreciated.&lt;br /&gt;
== The course format system ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
=== Mandatory renderer in course formats ===&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
=== New format base class ===&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
=== New course output classes and mustache files ===&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
=== Course editor javascript modules and frontend components ===&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
=== Other course related 4.0 changes ===&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
=== New steps ===&lt;br /&gt;
Moodle 4.0 introduces some new behat steps.&lt;br /&gt;
&lt;br /&gt;
Sometimes you want to create a bulk number of activities. In that case you can use:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
:count :entitytype exist with the following data:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
Given 100 &amp;quot;mod_lti &amp;gt; tool types&amp;quot; exist with the following data:&lt;br /&gt;
  |name        |Test tool [count]                  |&lt;br /&gt;
  |description |Example description [count]        |&lt;br /&gt;
  |baseurl     |https://www.example.com/tool[count]|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dynamic (AJAX) tabs is a new feature contributed to Moodle 4.0 by the Workplace team (MDL-71943). You can use the following step to navigate between the tabs.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on the &amp;quot;tab title&amp;quot; dynamic tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To make sure that edit mode is (or is not) available on the current page, the following steps can be used.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And edit mode should be available on the current page&lt;br /&gt;
And edit mode should not be available on the current page&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are new aliases for the existing steps &amp;lt;code&amp;gt;I turn editing mode on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;I turn editing mode off&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I switch editing mode on&lt;br /&gt;
And I switch editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to the existing step to go to a course with editing mode on, we now have the following step to do the same but with editing mode being off.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I am on &amp;quot;course full name&amp;quot; course homepage with editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step is similar to the old &amp;lt;code&amp;gt;following &amp;quot;link string&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&amp;lt;/code&amp;gt; step, with more flexibility.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;Download&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;Starter&amp;quot; &amp;quot;table_row&amp;quot; should download between &amp;quot;0&amp;quot; and &amp;quot;5000&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to hover the mouse over the trigger area.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over the &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step enables an installed plugin.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;plugin name&amp;quot; &amp;quot;plugin type&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;course_summary&amp;quot; &amp;quot;block&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following is a special variation of &#039;I click on &amp;quot;&amp;lt;page name&amp;gt;&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;page&amp;quot; &amp;quot;region&amp;quot;&#039;. It first checks to see if we are on the given page via the breadcrumb. If not we then attempt to follow the link name given.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I follow the breadcrumb &amp;quot;page name&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can use the following step to ensure a node is active in the navbar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Node&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;My courses&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to navigate to a given node in the primary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select &amp;quot;Node&amp;quot; from primary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check whether an item exists in the user menu or not.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the user menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Language&amp;quot; &amp;quot;link&amp;quot; should exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check if a submenu of the user menu is shown, and if an item exists or does not exist in a given user submenu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I follow &amp;quot;Language&amp;quot; in the user menu&lt;br /&gt;
Then I should see &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English (pirate) &amp;amp;lrm;(en_ar)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To add enrolment methods to courses you can use the following new step. The data that you provide in the next lines are used to fill the enrolment method form.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;enrolment method&amp;quot; in &amp;quot;course identifier&amp;quot; with:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I add &amp;quot;Self enrolment&amp;quot; enrolment method in &amp;quot;Course 1&amp;quot; with:&lt;br /&gt;
  | Custom instance name     | Test student enrolment |&lt;br /&gt;
  | Enrolment key            | moodle_rules           |&lt;br /&gt;
  | Use group enrolment keys | Yes                    |&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 3 new steps specific to the calendar component. These steps can be used to hover over a day in the mini-calendar or the full calendar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the full calendar page&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the mini-calendar block&lt;br /&gt;
And I hover over today in the mini-calendar block&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some new steps are added to question bank to be able to add comment to questions, verify the existence of a comment, and deleting comments form questions. Please note that the steps for adding comments only write the comment text in the comment field. You still need to click on the &amp;quot;Add comment&amp;quot; button to save the comment.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question preview&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question preview&lt;br /&gt;
And I should see &amp;quot;number of comments&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;number of comments&amp;quot; on the row on the comments column&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;Question bank&amp;quot; in current page administration&lt;br /&gt;
And I should see &amp;quot;0&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;0&amp;quot; on the row on the comments column&lt;br /&gt;
And I add &amp;quot;test comment 01&amp;quot; comment to question&lt;br /&gt;
And I click on &amp;quot;Add comment&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Close&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I should see &amp;quot;1&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;1&amp;quot; on the row on the comments column&lt;br /&gt;
And I delete &amp;quot;test comment 01&amp;quot; comment from question&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similar to the steps for comments, the following steps are to verify the number of a question&#039;s usage and to click on it in order to open the question usage modal.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
And I click &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new steps are related to bulk actions in the question bank UI.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should not see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on &amp;quot;First question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Second question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;With selected&amp;quot; &amp;quot;button&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Delete&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;Confirm&amp;quot; &amp;quot;dialogue&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://docs.moodle.org/en/Report_builder Report builder] is a new feature contributed to Moodle 4.0 by the Workplace team. The following new step is added to Moodle 4.0 to select an action from the action menu in the list of custom reports table.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I press &amp;quot;action&amp;quot; action in the &amp;quot;report name&amp;quot; report row&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There&#039;s another step related to the report builder to set a column&#039;s aggregation in the report editor.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;column title&amp;quot; column aggregation to &amp;quot;aggregation method&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;First name&amp;quot; column aggregation to &amp;quot;Comma separated values&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step needs to be used in scenarios that involve testing BigBlueButton. For this to work, you need to have a [https://github.com/moodlehq/bigbluebutton_mock BigBlueButton Mock API Server] and set &amp;lt;code&amp;gt;TEST_MOD_BIGBLUEBUTTONBN_MOCK_SERVER&amp;lt;/code&amp;gt; to point to that in config.php.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And a BigBlueButton mock server is configured&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step replicates receiving a callback from the BigBlueButton server indicating the recordings for meetings are ready for viewing.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And the BigBlueButtonBN server has sent recording ready notifications&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are specific to the lesson activity. Note that in 4.0, some links (such as the &amp;quot;edit&amp;quot; and the &amp;quot;grade essays&amp;quot; links) are replaced by buttons, so you need to update your old steps with the new ones.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I edit the lesson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;A new step is added to be used in lesson activities to edit them. This step navigates the user to the lesson edit page.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I grade lesson essays&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;It&#039;s a new step to go to the &amp;quot;Grade essays&amp;quot; page of the lesson we are currently in.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select edit type &amp;quot;edit type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Select the lesson edit type when we are in the the lesson&#039;s edit page. &amp;quot;edit type&amp;quot; can either be &amp;quot;Collapsed&amp;quot; or &amp;quot;Expanded&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new step can be used to navigate to the exports page in the course gradebook and select the specified export type from the grade exports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;export option&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;XML file&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similarly, there&#039;s a new step to navigate to the imports page in the course gradebook and select the specified import type from the grade imports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;import option&amp;quot; import page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Boost steps ===&lt;br /&gt;
In addition to the steps listed in the previous section, there are also some Boost specific steps coming with Moodle 4.0. These steps only work in Boost or Boost child themes, so you need to make sure they are not used in scenarios that may be run by non-Boost themes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step checks whether a node is active in the secondary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see :name is active in secondary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Boost theme shows the language selector menu in the primary navigation when not logged in, and within the user menu when logged in. The following steps are to check if the primary navigation includes the language selector menu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And language selector menu should exist in the navbar&lt;br /&gt;
And language selector menu should not exist in the navbar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And the following steps can be used to check whether an item exists in the language selector menu in the Boost theme.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the language selector menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Modified steps ===&lt;br /&gt;
The step &amp;lt;code&amp;gt;I change the (window|viewport) size to &amp;quot;size&amp;quot;&amp;lt;/code&amp;gt; now supports 2 new values for the size argument. The size argument now accepts &amp;lt;code&amp;gt;mobile&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tablet&amp;lt;/code&amp;gt; values in addition to &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;large&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Removed steps ===&lt;br /&gt;
Some behat steps are removed or replaced with new steps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As a result of some design changes, hidden or restricted activities are no longer dimmed. Therefore the step&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be dimmed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;is now removed.&lt;br /&gt;
Depending on what you were using that step for, you may be able to use these steps:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Label name&amp;quot; label should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Activity or resource name&amp;quot;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;region-main&amp;quot; &amp;quot;region&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Other things to consider ===&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. It is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] is integrated these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
Old behat steps that may now fail can be updated to the new steps.&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Or for settings, instead of:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;And I follow &amp;quot;Test choice name&amp;quot;&lt;br /&gt;
And I navigate to &amp;quot;Edit settings&amp;quot; in current page administration&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;And I am on the &amp;quot;Test choice name&amp;quot; &amp;quot;choice activity editing&amp;quot; page&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are also similar stream-lined navigation steps for accessing question bank pages. See MDL-74130.&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Core plugins review ===&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;br /&gt;
=== Site admin presets plugin ===&lt;br /&gt;
The third-party plugin [https://moodle.org/plugins/block_admin_presets Admin presets], created by David Monllaó and maintained by developers from [https://pimenko.com/ Pimenko] has been adapted and integrated into Moodle 4.0. It stores settings and plugins status (enabled/disabled) in what&#039;s called &amp;quot;presets&amp;quot; to let admins quickly switch between different configurations.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Site admin presets|Site admin presets plugin]] page.&lt;br /&gt;
=== JavaScript browser support changes ===&lt;br /&gt;
From Moodle 4.0, Internet Explorer is no longer supported. See MDL-73915 and MDLSITE-6109 for further information on this change.&lt;br /&gt;
&lt;br /&gt;
This change means that changes built on 4.0 onwards (including the master branch) will be different to older versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
For plugin developers supporting multiple versions of Moodle using a single plugin version, the compiled javascript files are backwards compatible and will _work_ on all supported versions, however if you run the `grunt` command on multiple versions you will see unbuilt changes. Running grunt on all versions of Moodle is not necessary and this check can be safely disabled for Moodle versions 3.9 - 4.0, as long as only at least you run `grunt` against at least one version of Moodle.&lt;br /&gt;
&lt;br /&gt;
If you need to support Internet Explorer and do not wish to fork your plugin for Moodle 4.0 onwards, then it is recommended that you run `grunt` on an older version of Moodle.&lt;br /&gt;
=== The course index element ===&lt;br /&gt;
The new course index feature can be themed using a set of scss variables. Use them to change the look and feel instead of adding custom css&lt;br /&gt;
 /theme/boost/scss/moodle/courseindex.scss&lt;br /&gt;
With the introduction of the course index component, the previous and next links shown underneath each activity are no longer needed and they will be removed.&lt;br /&gt;
=== Activity icons ===&lt;br /&gt;
The icons used for activities have been redesigned and updated for all core moodle activities.&lt;br /&gt;
&lt;br /&gt;
When viewing the new icons in a file manager, for example for the quiz activity, you will see a simple black monochrome icon with a transparent background.&lt;br /&gt;
&lt;br /&gt;
On the course page, or in the activity chooser, the icon will display as a white icon on a coloured background. Styling of the icons on the coursepage is controlled by the css in theme/boost/scss/moodle/icons.scss.&lt;br /&gt;
&lt;br /&gt;
The background colour for activity icons is set using a new variable in function [modname]_supports(). The quiz activity is of type assessment, so in function quiz_supports() there is a new line defining the purpose:&lt;br /&gt;
 case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;&lt;br /&gt;
Available purposes are:&lt;br /&gt;
* MOD_PURPOSE_COMMUNICATION&lt;br /&gt;
* MOD_PURPOSE_ASSESSMENT&lt;br /&gt;
* MOD_PURPOSE_COLLABORATION&lt;br /&gt;
* MOD_PURPOSE_CONTENT&lt;br /&gt;
* MOD_PURPOSE_ADMINISTRATION&lt;br /&gt;
* MOD_PURPOSE_INTERFACE&lt;br /&gt;
The background colours linked to these purposes are set in theme/boost/scss/moodle/variables.scss&lt;br /&gt;
 $activity-icon-colors: map-merge(&lt;br /&gt;
     (&lt;br /&gt;
         &amp;quot;administration&amp;quot;: #5d63f6,&lt;br /&gt;
         &amp;quot;assessment&amp;quot;: #eb66a2,&lt;br /&gt;
         &amp;quot;collaboration&amp;quot;: #f7634d,&lt;br /&gt;
         &amp;quot;communication&amp;quot;: #11a676,&lt;br /&gt;
         &amp;quot;content&amp;quot;: #399be2,&lt;br /&gt;
         &amp;quot;interface&amp;quot;: #a378ff&lt;br /&gt;
     ),&lt;br /&gt;
     $activity-icon-colors&lt;br /&gt;
 );&lt;br /&gt;
If activity plugins do not define FEATURE_MOD_PURPOSE the activity icon will be rendered against a light grey background. There is no requirement to define the purpose of activity plugins, it will only affect the icon styling.&lt;br /&gt;
&lt;br /&gt;
Plugins implementing the variable FEATURE_MOD_PURPOSE are only supported on Moodle 4.0 and newer.&lt;br /&gt;
&lt;br /&gt;
Customising the activity icon can be done in an alternative way. For example using the styles.css in mod/[pluginname/styles.css&lt;br /&gt;
&lt;br /&gt;
In the example below the activity plugin developer chooses to keep the coloured icon for the activity and render it as large as the coloured background on the core activities&lt;br /&gt;
 .modicon_subcourse.activityiconcontainer {&lt;br /&gt;
     background-color: transparent;&lt;br /&gt;
     padding: 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 .modicon_subcourse.activityiconcontainer img {&lt;br /&gt;
     width: 50px;&lt;br /&gt;
     height: 50px;&lt;br /&gt;
 }&lt;br /&gt;
To customize all icon colours use this scss array and add it to the ‘Raw initial SCSS’ in the theme Boost advanced settings page. The complete array of icon background colours can be overridden using the ‘Raw initial SCSS’ in the theme settings page. The example below changes the colours of each activity type.&lt;br /&gt;
 $activity-icon-colors: (&lt;br /&gt;
     &amp;quot;administration&amp;quot;: #5D63F6,&lt;br /&gt;
     &amp;quot;assessment&amp;quot;: #11A676,&lt;br /&gt;
     &amp;quot;collaboration&amp;quot;: #EB66A2,&lt;br /&gt;
     &amp;quot;communication&amp;quot;: #F7634D,&lt;br /&gt;
     &amp;quot;content&amp;quot;: #399BE2,&lt;br /&gt;
     &amp;quot;interface&amp;quot;: #A378FF&lt;br /&gt;
 )&lt;br /&gt;
== I&#039;m a developer, what do I need to know? ==&lt;br /&gt;
This section is a quick checklist of the areas in this document that you should consult when updating your plugin.&lt;br /&gt;
=== Modules ===&lt;br /&gt;
If you are a module developer (activity / resources) then you need to review the following updates and changes:&lt;br /&gt;
* If using settings, reformat to work with the secondary navigation. We have significantly changed the way that settings are shown. Settings added to the course and activity administration branch of the navigation are now by default shown in the secondary navigation. You will most likely find them in the more section of the secondary navigation. Please avoid creating settings in containers (a parent navigation node with children). These settings will still be shown, but this goes against the pattern that we are trying to establish for navigation around the site. If you have a lot of settings, consider creating a specific page to handle your additional settings.&lt;br /&gt;
** The order of the items in the secondary navigation may not be to your liking. This can be changed. See [[Moodle_4.0_developer_update#Changing_the_order_of_tabs|changing the order of tabs]]&lt;br /&gt;
* Update my behat tests to use new steps for site navigation. See [[Moodle_4.0_developer_update#Behat_changes|new behat steps]].&lt;br /&gt;
* Update my module to use the new activity_header API. See [[Moodle_4.0_developer_update#The_activity_header_class|the activity header]].&lt;br /&gt;
* Update my pages to make it work with the general format of the tertiary navigation. See [[Moodle_4.0_developer_update#Tertiary_navigation|the tertiary navigation]].&lt;br /&gt;
* Update my activity icon to use the API and set a purpose. See [[Moodle_4.0_developer_update#Activity_icons|activity icons]].&lt;br /&gt;
=== Themes ===&lt;br /&gt;
If you are a theme developer then you may want to consider the following:&lt;br /&gt;
* Take a look at the [[Moodle_4.0_developer_update#Navigation_changes|new navigation]] and decide if you want to incorporate this into your theme.&lt;br /&gt;
** A new layout ([[Moodle_4.0_developer_update#New_layout_page|drawers]])&lt;br /&gt;
** An [[Moodle_4.0_developer_update#Edit_switch|edit switch]]&lt;br /&gt;
** The [[Moodle_4.0_developer_update#The_course_index_element|course index]]&lt;br /&gt;
* Use of the flat nav&lt;br /&gt;
* New Site administration page and layout&lt;br /&gt;
* Course settings and how they are displayed&lt;br /&gt;
&lt;br /&gt;
=== Course format ===&lt;br /&gt;
There have been a lot of changes made to the course format. Most in the process of moving the course format away from using the old rendering system and towards templates.&lt;br /&gt;
We recommend the following sections be read carefully:&lt;br /&gt;
# [[Moodle_4.0_developer_update#The_course_format_system|The course format]]. There have been a lot of deprecations and reading this section is critical in understanding the changes made.&lt;br /&gt;
# Consider moving the rendering of your content over to the [[Templates|template system]].&lt;br /&gt;
&lt;br /&gt;
=== Other plugins ===&lt;br /&gt;
# Are you adding settings? See the [[Moodle_4.0_developer_update#Adding_items_to_the_navigation|secondary nav]] for adding items to this navigation bar.&lt;br /&gt;
# Have a look at [[Moodle_4.0_developer_update#Secondary_navigation|secondary]] and [[Moodle_4.0_developer_update#Tertiary_navigation|tertiary]] navigation changes in general if you have a plugin that has multiple pages to navigate around.&lt;br /&gt;
# Do you have behat tests? Check the new [[Moodle_4.0_developer_update#Behat_changes|behat changes]].&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61845</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61845"/>
		<updated>2022-03-16T02:40:16Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* Secondary navigation -- adding items to the navigation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page highlights the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== Navigation changes ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
=== Primary navigation ===&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
==== Customising the primary navigation ====&lt;br /&gt;
Not yet implemented but we are looking at allowing the full addition and removal of any of the primary navigation tabs in the boost theme config file.&lt;br /&gt;
=== Secondary navigation ===&lt;br /&gt;
The main content area shows tabs for secondary navigation with a maximum of 5 items being rendered in this ‘more’ menu. A new UI component has been created to render menus like this. Files:&lt;br /&gt;
 /lib/templates/moremenu.mustache&lt;br /&gt;
&lt;br /&gt;
==== Adding items to the navigation ====&lt;br /&gt;
The secondary navigation pulls information mainly from the settings navigation node from each context. Any plugin that implements the existing navigation hooks will have their items added to the secondary navigation.&lt;br /&gt;
Existing navigation hooks:&lt;br /&gt;
* {module}_extend_navigation&lt;br /&gt;
* {local}_extend_navigation&lt;br /&gt;
* {report}_report_extend_navigation&lt;br /&gt;
* {plugin}_extend_navigation_course&lt;br /&gt;
* {plugin}_extend_navigation_category_settings&lt;br /&gt;
&lt;br /&gt;
==== Changing the order of tabs ====&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level.&lt;br /&gt;
&lt;br /&gt;
=== Tertiary navigation ===&lt;br /&gt;
We&#039;ve moved action buttons to the top of the page. We would encourage you to do the same.&lt;br /&gt;
If you have any buttons on an activity page that go to another page, or open a form (or similar), then we encourage you to move them from the body of your activity page to the top. All of the core activities have been updated to follow this pattern. Please take a look to see how you can format your activity in a similar fashion. There is no API here. You are welcome to create the buttons and display them as you wish in this top area.&lt;br /&gt;
=== New API functions ===&lt;br /&gt;
==== Page API ====&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondary_nav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* has_secondary_navigation_setter - Sets the ‘_hassecondarynavigation’ to indicate whether a page should render the secondary navigation&lt;br /&gt;
==== Navigationlib ====&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
==== The activity header class ====&lt;br /&gt;
There is a new activity header class that handles the display of information common to activities. 3rd party activities are not required to explicitly output this information as part of rendering individual pages.&lt;br /&gt;
&lt;br /&gt;
The common information that are currently handled by the class are:&lt;br /&gt;
* title&lt;br /&gt;
* description&lt;br /&gt;
* completion information&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As part of the update it was required that the initial information to be displayed by the class be toggable at a theme and layout level. Taking this into account the following theme level configurable exists:&lt;br /&gt;
* activityheaderconfig =&amp;gt; An array that currently only enforces &#039;notitle&#039; but can be expanded in the future NOTE: Boost has this set as true by default &#039;options&#039;&lt;br /&gt;
The following layout level options that can be defined:&lt;br /&gt;
* noactivityheader - to remove the header in this specific layout.&lt;br /&gt;
* activityheader - An array that enforces the following options:&lt;br /&gt;
** notitle&lt;br /&gt;
** nocompletion&lt;br /&gt;
** nodescription&lt;br /&gt;
The class has a page level getter which you can use to fetch the current version of the class. The base state is initialised within the constructor with the completion information only fetched when data is exported for the template.&lt;br /&gt;
&lt;br /&gt;
The class has setters for the following variables which can be leveraged to modify the header for a particular page in the format set_{variable_name}:&lt;br /&gt;
* hidecompletion&lt;br /&gt;
* description&lt;br /&gt;
* title&lt;br /&gt;
Alternately, bulk operations can also be done by passing the above variables in an array to &#039;set_attrs&#039; which in turn calls the setters.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note: Any updates to the activityheader needs to be performed before the call to $OUTPUT-&amp;gt;header&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
===== Theme updates: =====&lt;br /&gt;
In order for 3rd party themes to use the class they need to export the activity_header and include the following into their base template :&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
   {{&amp;gt; core/activity_header}}&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;** headercontent being the array element that contains the exported activity_header data &lt;br /&gt;
===== Accessibility notes: =====&lt;br /&gt;
The jump to ‘maincontent’ div is now rendered within the activity header when within an activity context&lt;br /&gt;
== Component library ==&lt;br /&gt;
Each Moodle installation now ships with a Moodle User Interface (UI) Component library, a documentation system used to describe all the Bootstrap components and the custom Moodle components. The component Library is a helper tool for developers when creating user interfaces, a testing tool for theme developers and a documentation tool for core developers. The ultimate goal of having a component library is to encourage developers to create consistent user interfaces to improve Moodle’s overall user experience.&lt;br /&gt;
&lt;br /&gt;
The library contains pages with documentation about User Interface components. It contains details on how to use the component, what variations are available and the JavaScript events / options are associated with the component.&lt;br /&gt;
&lt;br /&gt;
When writing on these pages it is possible to render core mustache templates using some custom syntax like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; mustache template=&amp;quot;core/notification_error&amp;quot; &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; /mustache &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also call core JavaScript or use HTML examples where the html code and the rendered result are visible in the Component Library. For more info visit the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-templates/ Moodle templates] page or the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-javascript/ Moodle JavaScript] page.&lt;br /&gt;
&lt;br /&gt;
Each page in the library uses the current css from the default theme in your Moodle installation, if you have multiple themes installed and enabled the setting &amp;quot;Allow theme changes on url&amp;quot;, the component library will have a theme selector option.&lt;br /&gt;
&lt;br /&gt;
A hosted version of the Component Library can be found here. http://componentlibrary.moodle.com&lt;br /&gt;
=== Enabling the Component Library ===&lt;br /&gt;
Component library pages are written in the markdown language. These pages need to be compiled to HTML pages before the Component Library is visible. To compile the pages the server running Moodle needs to have the [[Javascript Modules#Install%20NVM%20and%20Node|JavaScript developer tools installed]] (nodeJs and Grunt)&lt;br /&gt;
&lt;br /&gt;
If your server meets all requirements you can enable the library running&lt;br /&gt;
 $ npm install&lt;br /&gt;
 $ grunt componentlibrary&lt;br /&gt;
Further installation instructions can be found in the Component Library itself.&lt;br /&gt;
=== Documenting new UI Components ===&lt;br /&gt;
There are no set rules for adding new pages in the component library yet. These rules will need to be written and adopted in the integration process for Moodle code.&lt;br /&gt;
&lt;br /&gt;
As a guideline for making this rules consideration are:&lt;br /&gt;
&lt;br /&gt;
The component library is not about single use components, for example the Moodle grade book (a huge component with many custom features). Or about very common components like buttons, these are already covered by the Bootstrap section of the component library.&lt;br /&gt;
&lt;br /&gt;
New features should be build keeping in mind the UI part needs to be customisable and if possible (and making sense) reusable. And example would be the new page drawers that we are introducing for the Navigation project. Or the custom primary navigation menus where overflowing items are pushed into a More section.&lt;br /&gt;
== Theme changes ==&lt;br /&gt;
=== Edit switch ===&lt;br /&gt;
On theme boost the “Turn editing on” and “Customise this page” buttons have been replaced by an edit switch in the top navbar. Theme Classic will keep using the old buttons. Child themes can choose to use the edit switch if the theme config.php is using this variable&lt;br /&gt;
 $THEME-&amp;gt;haseditswitch = true;&lt;br /&gt;
The languague menu, which used to be rendered in place of the custom menu has moved to the user dropdown when the user is logged in. If not logged in it will be placed next to the search / notification / messaging icon in the top navbar.&lt;br /&gt;
=== Login page ===&lt;br /&gt;
The login page has been redesigned and allows the admin to configure a background image for the login page only in the theme settings page. This change is available in both Boost and Classic. The login page still has all the features with an improved layout. &lt;br /&gt;
=== The page footer ===&lt;br /&gt;
In large screens, the page footer button is only visible when clicking a help button at the bottom right of the screen.&lt;br /&gt;
=== User initials as profile picture placeholder ===&lt;br /&gt;
If users do not upload a profile picture the user initials are displayed on a rounded gray background as a placeholder picture in the top navbar or any other page using a placeholder image. This change will be available in both Boost and Classic. &lt;br /&gt;
&lt;br /&gt;
With the introduction of this placeholder image the full username will no longer be displayed in the top navbar.&lt;br /&gt;
=== Removal of back to top link ===&lt;br /&gt;
The &amp;quot;back to top&amp;quot; link will be removed for theme boost since the new course index reduced the dependence on page scrolling. Also, the new footer is positioned where this component used to be.&lt;br /&gt;
=== Styling changes ===&lt;br /&gt;
By default rounded edges will be used for UI components, for the page header and main content area the borders will be removed. &lt;br /&gt;
=== New layout page ===&lt;br /&gt;
Theme boost now uses the drawers.php layout for the course index and blocks.&lt;br /&gt;
== Question bank changes ==&lt;br /&gt;
There was a big project to deliver [[Question bank improvements for Moodle 4.0]] which added a new plugin type for adding features to the question banks, tracking the version history for each question as it is edited (question table has been split into &amp;lt;code&amp;gt;question&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;question_versions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_bank_entries&amp;lt;/code&amp;gt;), and tracking where each question is going to be used, with new tables &amp;lt;code&amp;gt;question_references&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_set_references&amp;lt;/code&amp;gt;. This work was done in Epic MDL-70329 if you want to track down the details of any of the core changes.&lt;br /&gt;
=== Question type plugins ===&lt;br /&gt;
Amazingly, we (Safat and colleagues at Catalyst AU) managed to implement this without breaking most question type plugins.&lt;br /&gt;
&lt;br /&gt;
However, the changes to the question bank, and the other Moodle 4.0 changes, probably broke the Behat tests for your plugin. To help with fixing that, MDL-74130 adds navigation to key question type pages (Preview and Edit for a question, and standard question bank pages like the bank itself, import and export) which should let you fix your test efficiently, and in a way that will work in all Moodle versions since 3.9.&lt;br /&gt;
&lt;br /&gt;
The &#039;most&#039; in the first paragraph here is becuase more advance question types may require more effort to fix. (For example qtype_combined which creates multi-part qusetions like the core qtype_multianswer; or qtype_pmatch or qtype_stack, which store additional data - questions tests - alongside the question itseld. How should that work with versionning?) But, if you have not done weird things like that, you are probably safe. If you find anything else that causes problems, please list it here.&lt;br /&gt;
&lt;br /&gt;
The same thing should apply to question behaviour and question import/export format plugings: no significant changes required (probably just fixing the Behat tests because of the navigation changes).&lt;br /&gt;
=== New plugin type: qbank plugins ===&lt;br /&gt;
This is not something that will cause problems for people upgrading from 3.x. Rather, it is an exciting possibility you can explore once you have survived process of upgrading to 4.0. There is a whole new plugin type which you can create to add new features to the question bank. For example extra columns, new actions and bulk actions, and so on. See [[Question_bank_plugins]].&lt;br /&gt;
=== Activities that use questions ===&lt;br /&gt;
The probable bad news is if you have an activity module which uses questions. So far, the only activity which has been fixed is mod_quiz in Moodle core, so we don&#039;t yet have a good picture of what fixes will be necessary in other activities. Work is about to start fixing [https://github.com/studentquiz/moodle-mod_studentquiz mod_studentquiz], so watching that should give more clues. As we do that, we will try to update this section of this page. Other help writing the information required here would also be greatly appreciated.&lt;br /&gt;
== The course format system ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
=== Mandatory renderer in course formats ===&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
=== New format base class ===&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
=== New course output classes and mustache files ===&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
=== Course editor javascript modules and frontend components ===&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
=== Other course related 4.0 changes ===&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
=== New steps ===&lt;br /&gt;
Moodle 4.0 introduces some new behat steps.&lt;br /&gt;
&lt;br /&gt;
Sometimes you want to create a bulk number of activities. In that case you can use:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
:count :entitytype exist with the following data:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
Given 100 &amp;quot;mod_lti &amp;gt; tool types&amp;quot; exist with the following data:&lt;br /&gt;
  |name        |Test tool [count]                  |&lt;br /&gt;
  |description |Example description [count]        |&lt;br /&gt;
  |baseurl     |https://www.example.com/tool[count]|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dynamic (AJAX) tabs is a new feature contributed to Moodle 4.0 by the Workplace team (MDL-71943). You can use the following step to navigate between the tabs.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on the &amp;quot;tab title&amp;quot; dynamic tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To make sure that edit mode is (or is not) available on the current page, the following steps can be used.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And edit mode should be available on the current page&lt;br /&gt;
And edit mode should not be available on the current page&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are new aliases for the existing steps &amp;lt;code&amp;gt;I turn editing mode on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;I turn editing mode off&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I switch editing mode on&lt;br /&gt;
And I switch editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to the existing step to go to a course with editing mode on, we now have the following step to do the same but with editing mode being off.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I am on &amp;quot;course full name&amp;quot; course homepage with editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step is similar to the old &amp;lt;code&amp;gt;following &amp;quot;link string&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&amp;lt;/code&amp;gt; step, with more flexibility.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;Download&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;Starter&amp;quot; &amp;quot;table_row&amp;quot; should download between &amp;quot;0&amp;quot; and &amp;quot;5000&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to hover the mouse over the trigger area.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over the &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step enables an installed plugin.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;plugin name&amp;quot; &amp;quot;plugin type&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;course_summary&amp;quot; &amp;quot;block&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following is a special variation of &#039;I click on &amp;quot;&amp;lt;page name&amp;gt;&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;page&amp;quot; &amp;quot;region&amp;quot;&#039;. It first checks to see if we are on the given page via the breadcrumb. If not we then attempt to follow the link name given.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I follow the breadcrumb &amp;quot;page name&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can use the following step to ensure a node is active in the navbar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Node&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;My courses&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to navigate to a given node in the primary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select &amp;quot;Node&amp;quot; from primary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check whether an item exists in the user menu or not.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the user menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Language&amp;quot; &amp;quot;link&amp;quot; should exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check if a submenu of the user menu is shown, and if an item exists or does not exist in a given user submenu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I follow &amp;quot;Language&amp;quot; in the user menu&lt;br /&gt;
Then I should see &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English (pirate) &amp;amp;lrm;(en_ar)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To add enrolment methods to courses you can use the following new step. The data that you provide in the next lines are used to fill the enrolment method form.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;enrolment method&amp;quot; in &amp;quot;course identifier&amp;quot; with:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I add &amp;quot;Self enrolment&amp;quot; enrolment method in &amp;quot;Course 1&amp;quot; with:&lt;br /&gt;
  | Custom instance name     | Test student enrolment |&lt;br /&gt;
  | Enrolment key            | moodle_rules           |&lt;br /&gt;
  | Use group enrolment keys | Yes                    |&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 3 new steps specific to the calendar component. These steps can be used to hover over a day in the mini-calendar or the full calendar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the full calendar page&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the mini-calendar block&lt;br /&gt;
And I hover over today in the mini-calendar block&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some new steps are added to question bank to be able to add comment to questions, verify the existence of a comment, and deleting comments form questions. Please note that the steps for adding comments only write the comment text in the comment field. You still need to click on the &amp;quot;Add comment&amp;quot; button to save the comment.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question preview&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question preview&lt;br /&gt;
And I should see &amp;quot;number of comments&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;number of comments&amp;quot; on the row on the comments column&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;Question bank&amp;quot; in current page administration&lt;br /&gt;
And I should see &amp;quot;0&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;0&amp;quot; on the row on the comments column&lt;br /&gt;
And I add &amp;quot;test comment 01&amp;quot; comment to question&lt;br /&gt;
And I click on &amp;quot;Add comment&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Close&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I should see &amp;quot;1&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;1&amp;quot; on the row on the comments column&lt;br /&gt;
And I delete &amp;quot;test comment 01&amp;quot; comment from question&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similar to the steps for comments, the following steps are to verify the number of a question&#039;s usage and to click on it in order to open the question usage modal.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
And I click &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new steps are related to bulk actions in the question bank UI.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should not see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on &amp;quot;First question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Second question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;With selected&amp;quot; &amp;quot;button&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Delete&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;Confirm&amp;quot; &amp;quot;dialogue&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://docs.moodle.org/en/Report_builder Report builder] is a new feature contributed to Moodle 4.0 by the Workplace team. The following new step is added to Moodle 4.0 to select an action from the action menu in the list of custom reports table.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I press &amp;quot;action&amp;quot; action in the &amp;quot;report name&amp;quot; report row&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There&#039;s another step related to the report builder to set a column&#039;s aggregation in the report editor.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;column title&amp;quot; column aggregation to &amp;quot;aggregation method&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;First name&amp;quot; column aggregation to &amp;quot;Comma separated values&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step needs to be used in scenarios that involve testing BigBlueButton. For this to work, you need to have a [https://github.com/moodlehq/bigbluebutton_mock BigBlueButton Mock API Server] and set &amp;lt;code&amp;gt;TEST_MOD_BIGBLUEBUTTONBN_MOCK_SERVER&amp;lt;/code&amp;gt; to point to that in config.php.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And a BigBlueButton mock server is configured&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step replicates receiving a callback from the BigBlueButton server indicating the recordings for meetings are ready for viewing.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And the BigBlueButtonBN server has sent recording ready notifications&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are specific to the lesson activity. Note that in 4.0, some links (such as the &amp;quot;edit&amp;quot; and the &amp;quot;grade essays&amp;quot; links) are replaced by buttons, so you need to update your old steps with the new ones.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I edit the lesson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;A new step is added to be used in lesson activities to edit them. This step navigates the user to the lesson edit page.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I grade lesson essays&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;It&#039;s a new step to go to the &amp;quot;Grade essays&amp;quot; page of the lesson we are currently in.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select edit type &amp;quot;edit type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Select the lesson edit type when we are in the the lesson&#039;s edit page. &amp;quot;edit type&amp;quot; can either be &amp;quot;Collapsed&amp;quot; or &amp;quot;Expanded&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new step can be used to navigate to the exports page in the course gradebook and select the specified export type from the grade exports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;export option&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;XML file&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similarly, there&#039;s a new step to navigate to the imports page in the course gradebook and select the specified import type from the grade imports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;import option&amp;quot; import page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Boost steps ===&lt;br /&gt;
In addition to the steps listed in the previous section, there are also some Boost specific steps coming with Moodle 4.0. These steps only work in Boost or Boost child themes, so you need to make sure they are not used in scenarios that may be run by non-Boost themes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step checks whether a node is active in the secondary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see :name is active in secondary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Boost theme shows the language selector menu in the primary navigation when not logged in, and within the user menu when logged in. The following steps are to check if the primary navigation includes the language selector menu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And language selector menu should exist in the navbar&lt;br /&gt;
And language selector menu should not exist in the navbar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And the following steps can be used to check whether an item exists in the language selector menu in the Boost theme.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the language selector menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Modified steps ===&lt;br /&gt;
The step &amp;lt;code&amp;gt;I change the (window|viewport) size to &amp;quot;size&amp;quot;&amp;lt;/code&amp;gt; now supports 2 new values for the size argument. The size argument now accepts &amp;lt;code&amp;gt;mobile&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tablet&amp;lt;/code&amp;gt; values in addition to &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;large&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Removed steps ===&lt;br /&gt;
Some behat steps are removed or replaced with new steps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As a result of some design changes, hidden or restricted activities are no longer dimmed. Therefore the step&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be dimmed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;is now removed.&lt;br /&gt;
Depending on what you were using that step for, you may be able to use these steps:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Label name&amp;quot; label should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Activity or resource name&amp;quot;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;region-main&amp;quot; &amp;quot;region&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Other things to consider ===&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. It is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] is integrated these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
Old behat steps that may now fail can be updated to the new steps.&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Or for settings, instead of:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;And I follow &amp;quot;Test choice name&amp;quot;&lt;br /&gt;
And I navigate to &amp;quot;Edit settings&amp;quot; in current page administration&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;And I am on the &amp;quot;Test choice name&amp;quot; &amp;quot;choice activity editing&amp;quot; page&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are also similar stream-lined navigation steps for accessing question bank pages. See MDL-74130.&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Core plugins review ===&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;br /&gt;
=== Site admin presets plugin ===&lt;br /&gt;
The third-party plugin [https://moodle.org/plugins/block_admin_presets Admin presets], created by David Monllaó and maintained by developers from [https://pimenko.com/ Pimenko] has been adapted and integrated into Moodle 4.0. It stores settings and plugins status (enabled/disabled) in what&#039;s called &amp;quot;presets&amp;quot; to let admins quickly switch between different configurations.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Site admin presets|Site admin presets plugin]] page.&lt;br /&gt;
=== JavaScript browser support changes ===&lt;br /&gt;
From Moodle 4.0, Internet Explorer is no longer supported. See MDL-73915 and MDLSITE-6109 for further information on this change.&lt;br /&gt;
&lt;br /&gt;
This change means that changes built on 4.0 onwards (including the master branch) will be different to older versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
For plugin developers supporting multiple versions of Moodle using a single plugin version, the compiled javascript files are backwards compatible and will _work_ on all supported versions, however if you run the `grunt` command on multiple versions you will see unbuilt changes. Running grunt on all versions of Moodle is not necessary and this check can be safely disabled for Moodle versions 3.9 - 4.0, as long as only at least you run `grunt` against at least one version of Moodle.&lt;br /&gt;
&lt;br /&gt;
If you need to support Internet Explorer and do not wish to fork your plugin for Moodle 4.0 onwards, then it is recommended that you run `grunt` on an older version of Moodle.&lt;br /&gt;
=== The course index element ===&lt;br /&gt;
The new course index feature can be themed using a set of scss variables. Use them to change the look and feel instead of adding custom css&lt;br /&gt;
 /theme/boost/scss/moodle/courseindex.scss&lt;br /&gt;
With the introduction of the course index component, the previous and next links shown underneath each activity are no longer needed and they will be removed.&lt;br /&gt;
=== Activity icons ===&lt;br /&gt;
The icons used for activities have been redesigned and updated for all core moodle activities.&lt;br /&gt;
&lt;br /&gt;
When viewing the new icons in a file manager, for example for the quiz activity, you will see a simple black monochrome icon with a transparent background.&lt;br /&gt;
&lt;br /&gt;
On the course page, or in the activity chooser, the icon will display as a white icon on a coloured background. Styling of the icons on the coursepage is controlled by the css in theme/boost/scss/moodle/icons.scss.&lt;br /&gt;
&lt;br /&gt;
The background colour for activity icons is set using a new variable in function [modname]_supports(). The quiz activity is of type assessment, so in function quiz_supports() there is a new line defining the purpose:&lt;br /&gt;
 case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;&lt;br /&gt;
Available purposes are:&lt;br /&gt;
* MOD_PURPOSE_COMMUNICATION&lt;br /&gt;
* MOD_PURPOSE_ASSESSMENT&lt;br /&gt;
* MOD_PURPOSE_COLLABORATION&lt;br /&gt;
* MOD_PURPOSE_CONTENT&lt;br /&gt;
* MOD_PURPOSE_ADMINISTRATION&lt;br /&gt;
* MOD_PURPOSE_INTERFACE&lt;br /&gt;
The background colours linked to these purposes are set in theme/boost/scss/moodle/variables.scss&lt;br /&gt;
 $activity-icon-colors: map-merge(&lt;br /&gt;
     (&lt;br /&gt;
         &amp;quot;administration&amp;quot;: #5d63f6,&lt;br /&gt;
         &amp;quot;assessment&amp;quot;: #eb66a2,&lt;br /&gt;
         &amp;quot;collaboration&amp;quot;: #f7634d,&lt;br /&gt;
         &amp;quot;communication&amp;quot;: #11a676,&lt;br /&gt;
         &amp;quot;content&amp;quot;: #399be2,&lt;br /&gt;
         &amp;quot;interface&amp;quot;: #a378ff&lt;br /&gt;
     ),&lt;br /&gt;
     $activity-icon-colors&lt;br /&gt;
 );&lt;br /&gt;
If activity plugins do not define FEATURE_MOD_PURPOSE the activity icon will be rendered against a light grey background. There is no requirement to define the purpose of activity plugins, it will only affect the icon styling.&lt;br /&gt;
&lt;br /&gt;
Plugins implementing the variable FEATURE_MOD_PURPOSE are only supported on Moodle 4.0 and newer.&lt;br /&gt;
&lt;br /&gt;
Customising the activity icon can be done in an alternative way. For example using the styles.css in mod/[pluginname/styles.css&lt;br /&gt;
&lt;br /&gt;
In the example below the activity plugin developer chooses to keep the coloured icon for the activity and render it as large as the coloured background on the core activities&lt;br /&gt;
 .modicon_subcourse.activityiconcontainer {&lt;br /&gt;
     background-color: transparent;&lt;br /&gt;
     padding: 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 .modicon_subcourse.activityiconcontainer img {&lt;br /&gt;
     width: 50px;&lt;br /&gt;
     height: 50px;&lt;br /&gt;
 }&lt;br /&gt;
To customize all icon colours use this scss array and add it to the ‘Raw initial SCSS’ in the theme Boost advanced settings page. The complete array of icon background colours can be overridden using the ‘Raw initial SCSS’ in the theme settings page. The example below changes the colours of each activity type.&lt;br /&gt;
 $activity-icon-colors: (&lt;br /&gt;
     &amp;quot;administration&amp;quot;: #5D63F6,&lt;br /&gt;
     &amp;quot;assessment&amp;quot;: #11A676,&lt;br /&gt;
     &amp;quot;collaboration&amp;quot;: #EB66A2,&lt;br /&gt;
     &amp;quot;communication&amp;quot;: #F7634D,&lt;br /&gt;
     &amp;quot;content&amp;quot;: #399BE2,&lt;br /&gt;
     &amp;quot;interface&amp;quot;: #A378FF&lt;br /&gt;
 )&lt;br /&gt;
== I&#039;m a developer, what do I need to know? ==&lt;br /&gt;
This section is a quick checklist of the areas in this document that you should consult when updating your plugin.&lt;br /&gt;
=== Modules ===&lt;br /&gt;
If you are a module developer (activity / resources) then you need to review the following updates and changes:&lt;br /&gt;
* If using settings, reformat to work with the secondary navigation. We have significantly changed the way that settings are shown. Settings added to the course and activity administration branch of the navigation are now by default shown in the secondary navigation. You will most likely find them in the more section of the secondary navigation. Please avoid creating settings in containers (a parent navigation node with children). These settings will still be shown, but this goes against the pattern that we are trying to establish for navigation around the site. If you have a lot of settings, consider creating a specific page to handle your additional settings.&lt;br /&gt;
** The order of the items in the secondary navigation may not be to your liking. This can be changed. See [[Moodle_4.0_developer_update#Changing_the_order_of_tabs|changing the order of tabs]]&lt;br /&gt;
* Update my behat tests to use new steps for site navigation. See [[Moodle_4.0_developer_update#Behat_changes|new behat steps]].&lt;br /&gt;
* Update my module to use the new activity_header API. See [[Moodle_4.0_developer_update#The_activity_header_class|the activity header]].&lt;br /&gt;
* Update my pages to make it work with the general format of the tertiary navigation. See [[Moodle_4.0_developer_update#Tertiary_navigation|the tertiary navigation]].&lt;br /&gt;
* Update my activity icon to use the API and set a purpose. See [[Moodle_4.0_developer_update#Activity_icons|activity icons]].&lt;br /&gt;
=== Themes ===&lt;br /&gt;
If you are a theme developer then you may want to consider the following:&lt;br /&gt;
* Take a look at the [[Moodle_4.0_developer_update#Navigation_changes|new navigation]] and decide if you want to incorporate this into your theme.&lt;br /&gt;
** A new layout ([[Moodle_4.0_developer_update#New_layout_page|drawers]])&lt;br /&gt;
** An [[Moodle_4.0_developer_update#Edit_switch|edit switch]]&lt;br /&gt;
** The [[Moodle_4.0_developer_update#The_course_index_element|course index]]&lt;br /&gt;
* Use of the flat nav&lt;br /&gt;
* New Site administration page and layout&lt;br /&gt;
* Course settings and how they are displayed&lt;br /&gt;
&lt;br /&gt;
=== Course format ===&lt;br /&gt;
There have been a lot of changes made to the course format. Most in the process of moving the course format away from using the old rendering system and towards templates.&lt;br /&gt;
We recommend the following sections be read carefully:&lt;br /&gt;
# [[Moodle_4.0_developer_update#The_course_format_system|The course format]]. There have been a lot of deprecations and reading this section is critical in understanding the changes made.&lt;br /&gt;
# Consider moving the rendering of your content over to the [[Templates|template system]].&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61843</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61843"/>
		<updated>2022-03-16T02:27:11Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Added the course format section for plugin developers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page highlights the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== Navigation changes ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
=== Primary navigation ===&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
==== Customising the primary navigation ====&lt;br /&gt;
Not yet implemented but we are looking at allowing the full addition and removal of any of the primary navigation tabs in the boost theme config file.&lt;br /&gt;
=== Secondary navigation ===&lt;br /&gt;
The main content area shows tabs for secondary navigation with a maximum of 5 items being rendered in this ‘more’ menu. A new UI component has been created to render menus like this. Files:&lt;br /&gt;
 /lib/templates/moremenu.mustache&lt;br /&gt;
==== Changing the order of tabs ====&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level. &lt;br /&gt;
=== Tertiary navigation ===&lt;br /&gt;
We&#039;ve moved action buttons to the top of the page. We would encourage you to do the same.&lt;br /&gt;
If you have any buttons on an activity page that go to another page, or open a form (or similar), then we encourage you to move them from the body of your activity page to the top. All of the core activities have been updated to follow this pattern. Please take a look to see how you can format your activity in a similar fashion. There is no API here. You are welcome to create the buttons and display them as you wish in this top area.&lt;br /&gt;
=== New API functions ===&lt;br /&gt;
==== Page API ====&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondary_nav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* has_secondary_navigation_setter - Sets the ‘_hassecondarynavigation’ to indicate whether a page should render the secondary navigation&lt;br /&gt;
==== Navigationlib ====&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
==== The activity header class ====&lt;br /&gt;
There is a new activity header class that handles the display of information common to activities. 3rd party activities are not required to explicitly output this information as part of rendering individual pages.&lt;br /&gt;
&lt;br /&gt;
The common information that are currently handled by the class are:&lt;br /&gt;
* title&lt;br /&gt;
* description&lt;br /&gt;
* completion information&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As part of the update it was required that the initial information to be displayed by the class be toggable at a theme and layout level. Taking this into account the following theme level configurable exists:&lt;br /&gt;
* activityheaderconfig =&amp;gt; An array that currently only enforces &#039;notitle&#039; but can be expanded in the future NOTE: Boost has this set as true by default &#039;options&#039;&lt;br /&gt;
The following layout level options that can be defined:&lt;br /&gt;
* noactivityheader - to remove the header in this specific layout.&lt;br /&gt;
* activityheader - An array that enforces the following options:&lt;br /&gt;
** notitle&lt;br /&gt;
** nocompletion&lt;br /&gt;
** nodescription&lt;br /&gt;
The class has a page level getter which you can use to fetch the current version of the class. The base state is initialised within the constructor with the completion information only fetched when data is exported for the template.&lt;br /&gt;
&lt;br /&gt;
The class has setters for the following variables which can be leveraged to modify the header for a particular page in the format set_{variable_name}:&lt;br /&gt;
* hidecompletion&lt;br /&gt;
* description&lt;br /&gt;
* title&lt;br /&gt;
Alternately, bulk operations can also be done by passing the above variables in an array to &#039;set_attrs&#039; which in turn calls the setters.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note: Any updates to the activityheader needs to be performed before the call to $OUTPUT-&amp;gt;header&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
===== Theme updates: =====&lt;br /&gt;
In order for 3rd party themes to use the class they need to export the activity_header and include the following into their base template :&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
   {{&amp;gt; core/activity_header}}&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;** headercontent being the array element that contains the exported activity_header data &lt;br /&gt;
===== Accessibility notes: =====&lt;br /&gt;
The jump to ‘maincontent’ div is now rendered within the activity header when within an activity context&lt;br /&gt;
== Component library ==&lt;br /&gt;
Each Moodle installation now ships with a Moodle User Interface (UI) Component library, a documentation system used to describe all the Bootstrap components and the custom Moodle components. The component Library is a helper tool for developers when creating user interfaces, a testing tool for theme developers and a documentation tool for core developers. The ultimate goal of having a component library is to encourage developers to create consistent user interfaces to improve Moodle’s overall user experience.&lt;br /&gt;
&lt;br /&gt;
The library contains pages with documentation about User Interface components. It contains details on how to use the component, what variations are available and the JavaScript events / options are associated with the component.&lt;br /&gt;
&lt;br /&gt;
When writing on these pages it is possible to render core mustache templates using some custom syntax like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; mustache template=&amp;quot;core/notification_error&amp;quot; &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; /mustache &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also call core JavaScript or use HTML examples where the html code and the rendered result are visible in the Component Library. For more info visit the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-templates/ Moodle templates] page or the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-javascript/ Moodle JavaScript] page.&lt;br /&gt;
&lt;br /&gt;
Each page in the library uses the current css from the default theme in your Moodle installation, if you have multiple themes installed and enabled the setting &amp;quot;Allow theme changes on url&amp;quot;, the component library will have a theme selector option.&lt;br /&gt;
&lt;br /&gt;
A hosted version of the Component Library can be found here. http://componentlibrary.moodle.com&lt;br /&gt;
=== Enabling the Component Library ===&lt;br /&gt;
Component library pages are written in the markdown language. These pages need to be compiled to HTML pages before the Component Library is visible. To compile the pages the server running Moodle needs to have the [[Javascript Modules#Install%20NVM%20and%20Node|JavaScript developer tools installed]] (nodeJs and Grunt)&lt;br /&gt;
&lt;br /&gt;
If your server meets all requirements you can enable the library running&lt;br /&gt;
 $ npm install&lt;br /&gt;
 $ grunt componentlibrary&lt;br /&gt;
Further installation instructions can be found in the Component Library itself.&lt;br /&gt;
=== Documenting new UI Components ===&lt;br /&gt;
There are no set rules for adding new pages in the component library yet. These rules will need to be written and adopted in the integration process for Moodle code.&lt;br /&gt;
&lt;br /&gt;
As a guideline for making this rules consideration are:&lt;br /&gt;
&lt;br /&gt;
The component library is not about single use components, for example the Moodle grade book (a huge component with many custom features). Or about very common components like buttons, these are already covered by the Bootstrap section of the component library.&lt;br /&gt;
&lt;br /&gt;
New features should be build keeping in mind the UI part needs to be customisable and if possible (and making sense) reusable. And example would be the new page drawers that we are introducing for the Navigation project. Or the custom primary navigation menus where overflowing items are pushed into a More section.&lt;br /&gt;
== Theme changes ==&lt;br /&gt;
=== Edit switch ===&lt;br /&gt;
On theme boost the “Turn editing on” and “Customise this page” buttons have been replaced by an edit switch in the top navbar. Theme Classic will keep using the old buttons. Child themes can choose to use the edit switch if the theme config.php is using this variable&lt;br /&gt;
 $THEME-&amp;gt;haseditswitch = true;&lt;br /&gt;
The languague menu, which used to be rendered in place of the custom menu has moved to the user dropdown when the user is logged in. If not logged in it will be placed next to the search / notification / messaging icon in the top navbar.&lt;br /&gt;
=== Login page ===&lt;br /&gt;
The login page has been redesigned and allows the admin to configure a background image for the login page only in the theme settings page. This change is available in both Boost and Classic. The login page still has all the features with an improved layout. &lt;br /&gt;
=== The page footer ===&lt;br /&gt;
In large screens, the page footer button is only visible when clicking a help button at the bottom right of the screen.&lt;br /&gt;
=== User initials as profile picture placeholder ===&lt;br /&gt;
If users do not upload a profile picture the user initials are displayed on a rounded gray background as a placeholder picture in the top navbar or any other page using a placeholder image. This change will be available in both Boost and Classic. &lt;br /&gt;
&lt;br /&gt;
With the introduction of this placeholder image the full username will no longer be displayed in the top navbar.&lt;br /&gt;
=== Removal of back to top link ===&lt;br /&gt;
The &amp;quot;back to top&amp;quot; link will be removed for theme boost since the new course index reduced the dependence on page scrolling. Also, the new footer is positioned where this component used to be.&lt;br /&gt;
=== Styling changes ===&lt;br /&gt;
By default rounded edges will be used for UI components, for the page header and main content area the borders will be removed. &lt;br /&gt;
=== New layout page ===&lt;br /&gt;
Theme boost now uses the drawers.php layout for the course index and blocks.&lt;br /&gt;
== Question bank changes ==&lt;br /&gt;
There was a big project to deliver [[Question bank improvements for Moodle 4.0]] which added a new plugin type for adding features to the question banks, tracking the version history for each question as it is edited (question table has been split into &amp;lt;code&amp;gt;question&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;question_versions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_bank_entries&amp;lt;/code&amp;gt;), and tracking where each question is going to be used, with new tables &amp;lt;code&amp;gt;question_references&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_set_references&amp;lt;/code&amp;gt;. This work was done in Epic MDL-70329 if you want to track down the details of any of the core changes.&lt;br /&gt;
=== Question type plugins ===&lt;br /&gt;
Amazingly, we (Safat and colleagues at Catalyst AU) managed to implement this without breaking most question type plugins.&lt;br /&gt;
&lt;br /&gt;
However, the changes to the question bank, and the other Moodle 4.0 changes, probably broke the Behat tests for your plugin. To help with fixing that, MDL-74130 adds navigation to key question type pages (Preview and Edit for a question, and standard question bank pages like the bank itself, import and export) which should let you fix your test efficiently, and in a way that will work in all Moodle versions since 3.9.&lt;br /&gt;
&lt;br /&gt;
The &#039;most&#039; in the first paragraph here is becuase more advance question types may require more effort to fix. (For example qtype_combined which creates multi-part qusetions like the core qtype_multianswer; or qtype_pmatch or qtype_stack, which store additional data - questions tests - alongside the question itseld. How should that work with versionning?) But, if you have not done weird things like that, you are probably safe. If you find anything else that causes problems, please list it here.&lt;br /&gt;
&lt;br /&gt;
The same thing should apply to question behaviour and question import/export format plugings: no significant changes required (probably just fixing the Behat tests because of the navigation changes).&lt;br /&gt;
=== New plugin type: qbank plugins ===&lt;br /&gt;
This is not something that will cause problems for people upgrading from 3.x. Rather, it is an exciting possibility you can explore once you have survived process of upgrading to 4.0. There is a whole new plugin type which you can create to add new features to the question bank. For example extra columns, new actions and bulk actions, and so on. See [[Question_bank_plugins]].&lt;br /&gt;
=== Activities that use questions ===&lt;br /&gt;
The probable bad news is if you have an activity module which uses questions. So far, the only activity which has been fixed is mod_quiz in Moodle core, so we don&#039;t yet have a good picture of what fixes will be necessary in other activities. Work is about to start fixing [https://github.com/studentquiz/moodle-mod_studentquiz mod_studentquiz], so watching that should give more clues. As we do that, we will try to update this section of this page. Other help writing the information required here would also be greatly appreciated.&lt;br /&gt;
== The course format system ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
=== Mandatory renderer in course formats ===&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
=== New format base class ===&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
=== New course output classes and mustache files ===&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
=== Course editor javascript modules and frontend components ===&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
=== Other course related 4.0 changes ===&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
=== New steps ===&lt;br /&gt;
Moodle 4.0 introduces some new behat steps.&lt;br /&gt;
&lt;br /&gt;
Sometimes you want to create a bulk number of activities. In that case you can use:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
:count :entitytype exist with the following data:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
Given 100 &amp;quot;mod_lti &amp;gt; tool types&amp;quot; exist with the following data:&lt;br /&gt;
  |name        |Test tool [count]                  |&lt;br /&gt;
  |description |Example description [count]        |&lt;br /&gt;
  |baseurl     |https://www.example.com/tool[count]|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dynamic (AJAX) tabs is a new feature contributed to Moodle 4.0 by the Workplace team (MDL-71943). You can use the following step to navigate between the tabs.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on the &amp;quot;tab title&amp;quot; dynamic tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To make sure that edit mode is (or is not) available on the current page, the following steps can be used.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And edit mode should be available on the current page&lt;br /&gt;
And edit mode should not be available on the current page&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are new aliases for the existing steps &amp;lt;code&amp;gt;I turn editing mode on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;I turn editing mode off&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I switch editing mode on&lt;br /&gt;
And I switch editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to the existing step to go to a course with editing mode on, we now have the following step to do the same but with editing mode being off.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I am on &amp;quot;course full name&amp;quot; course homepage with editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step is similar to the old &amp;lt;code&amp;gt;following &amp;quot;link string&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&amp;lt;/code&amp;gt; step, with more flexibility.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;Download&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;Starter&amp;quot; &amp;quot;table_row&amp;quot; should download between &amp;quot;0&amp;quot; and &amp;quot;5000&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to hover the mouse over the trigger area.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over the &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step enables an installed plugin.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;plugin name&amp;quot; &amp;quot;plugin type&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;course_summary&amp;quot; &amp;quot;block&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following is a special variation of &#039;I click on &amp;quot;&amp;lt;page name&amp;gt;&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;page&amp;quot; &amp;quot;region&amp;quot;&#039;. It first checks to see if we are on the given page via the breadcrumb. If not we then attempt to follow the link name given.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I follow the breadcrumb &amp;quot;page name&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can use the following step to ensure a node is active in the navbar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Node&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;My courses&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to navigate to a given node in the primary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select &amp;quot;Node&amp;quot; from primary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check whether an item exists in the user menu or not.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the user menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Language&amp;quot; &amp;quot;link&amp;quot; should exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check if a submenu of the user menu is shown, and if an item exists or does not exist in a given user submenu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I follow &amp;quot;Language&amp;quot; in the user menu&lt;br /&gt;
Then I should see &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English (pirate) &amp;amp;lrm;(en_ar)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To add enrolment methods to courses you can use the following new step. The data that you provide in the next lines are used to fill the enrolment method form.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;enrolment method&amp;quot; in &amp;quot;course identifier&amp;quot; with:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I add &amp;quot;Self enrolment&amp;quot; enrolment method in &amp;quot;Course 1&amp;quot; with:&lt;br /&gt;
  | Custom instance name     | Test student enrolment |&lt;br /&gt;
  | Enrolment key            | moodle_rules           |&lt;br /&gt;
  | Use group enrolment keys | Yes                    |&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 3 new steps specific to the calendar component. These steps can be used to hover over a day in the mini-calendar or the full calendar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the full calendar page&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the mini-calendar block&lt;br /&gt;
And I hover over today in the mini-calendar block&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some new steps are added to question bank to be able to add comment to questions, verify the existence of a comment, and deleting comments form questions. Please note that the steps for adding comments only write the comment text in the comment field. You still need to click on the &amp;quot;Add comment&amp;quot; button to save the comment.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question preview&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question preview&lt;br /&gt;
And I should see &amp;quot;number of comments&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;number of comments&amp;quot; on the row on the comments column&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;Question bank&amp;quot; in current page administration&lt;br /&gt;
And I should see &amp;quot;0&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;0&amp;quot; on the row on the comments column&lt;br /&gt;
And I add &amp;quot;test comment 01&amp;quot; comment to question&lt;br /&gt;
And I click on &amp;quot;Add comment&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Close&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I should see &amp;quot;1&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;1&amp;quot; on the row on the comments column&lt;br /&gt;
And I delete &amp;quot;test comment 01&amp;quot; comment from question&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similar to the steps for comments, the following steps are to verify the number of a question&#039;s usage and to click on it in order to open the question usage modal.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
And I click &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new steps are related to bulk actions in the question bank UI.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should not see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on &amp;quot;First question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Second question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;With selected&amp;quot; &amp;quot;button&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Delete&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;Confirm&amp;quot; &amp;quot;dialogue&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://docs.moodle.org/en/Report_builder Report builder] is a new feature contributed to Moodle 4.0 by the Workplace team. The following new step is added to Moodle 4.0 to select an action from the action menu in the list of custom reports table.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I press &amp;quot;action&amp;quot; action in the &amp;quot;report name&amp;quot; report row&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There&#039;s another step related to the report builder to set a column&#039;s aggregation in the report editor.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;column title&amp;quot; column aggregation to &amp;quot;aggregation method&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;First name&amp;quot; column aggregation to &amp;quot;Comma separated values&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step needs to be used in scenarios that involve testing BigBlueButton. For this to work, you need to have a [https://github.com/moodlehq/bigbluebutton_mock BigBlueButton Mock API Server] and set &amp;lt;code&amp;gt;TEST_MOD_BIGBLUEBUTTONBN_MOCK_SERVER&amp;lt;/code&amp;gt; to point to that in config.php.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And a BigBlueButton mock server is configured&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step replicates receiving a callback from the BigBlueButton server indicating the recordings for meetings are ready for viewing.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And the BigBlueButtonBN server has sent recording ready notifications&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are specific to the lesson activity. Note that in 4.0, some links (such as the &amp;quot;edit&amp;quot; and the &amp;quot;grade essays&amp;quot; links) are replaced by buttons, so you need to update your old steps with the new ones.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I edit the lesson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;A new step is added to be used in lesson activities to edit them. This step navigates the user to the lesson edit page.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I grade lesson essays&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;It&#039;s a new step to go to the &amp;quot;Grade essays&amp;quot; page of the lesson we are currently in.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select edit type &amp;quot;edit type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Select the lesson edit type when we are in the the lesson&#039;s edit page. &amp;quot;edit type&amp;quot; can either be &amp;quot;Collapsed&amp;quot; or &amp;quot;Expanded&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new step can be used to navigate to the exports page in the course gradebook and select the specified export type from the grade exports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;export option&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;XML file&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similarly, there&#039;s a new step to navigate to the imports page in the course gradebook and select the specified import type from the grade imports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;import option&amp;quot; import page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Boost steps ===&lt;br /&gt;
In addition to the steps listed in the previous section, there are also some Boost specific steps coming with Moodle 4.0. These steps only work in Boost or Boost child themes, so you need to make sure they are not used in scenarios that may be run by non-Boost themes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step checks whether a node is active in the secondary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see :name is active in secondary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Boost theme shows the language selector menu in the primary navigation when not logged in, and within the user menu when logged in. The following steps are to check if the primary navigation includes the language selector menu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And language selector menu should exist in the navbar&lt;br /&gt;
And language selector menu should not exist in the navbar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And the following steps can be used to check whether an item exists in the language selector menu in the Boost theme.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the language selector menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Modified steps ===&lt;br /&gt;
The step &amp;lt;code&amp;gt;I change the (window|viewport) size to &amp;quot;size&amp;quot;&amp;lt;/code&amp;gt; now supports 2 new values for the size argument. The size argument now accepts &amp;lt;code&amp;gt;mobile&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tablet&amp;lt;/code&amp;gt; values in addition to &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;large&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Removed steps ===&lt;br /&gt;
Some behat steps are removed or replaced with new steps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As a result of some design changes, hidden or restricted activities are no longer dimmed. Therefore the step&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be dimmed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;is now removed.&lt;br /&gt;
Depending on what you were using that step for, you may be able to use these steps:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Label name&amp;quot; label should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Activity or resource name&amp;quot;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;region-main&amp;quot; &amp;quot;region&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Other things to consider ===&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. It is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] is integrated these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
Old behat steps that may now fail can be updated to the new steps.&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Or for settings, instead of:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;And I follow &amp;quot;Test choice name&amp;quot;&lt;br /&gt;
And I navigate to &amp;quot;Edit settings&amp;quot; in current page administration&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;And I am on the &amp;quot;Test choice name&amp;quot; &amp;quot;choice activity editing&amp;quot; page&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are also similar stream-lined navigation steps for accessing question bank pages. See MDL-74130.&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Core plugins review ===&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;br /&gt;
=== Site admin presets plugin ===&lt;br /&gt;
The third-party plugin [https://moodle.org/plugins/block_admin_presets Admin presets], created by David Monllaó and maintained by developers from [https://pimenko.com/ Pimenko] has been adapted and integrated into Moodle 4.0. It stores settings and plugins status (enabled/disabled) in what&#039;s called &amp;quot;presets&amp;quot; to let admins quickly switch between different configurations.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Site admin presets|Site admin presets plugin]] page.&lt;br /&gt;
=== JavaScript browser support changes ===&lt;br /&gt;
From Moodle 4.0, Internet Explorer is no longer supported. See MDL-73915 and MDLSITE-6109 for further information on this change.&lt;br /&gt;
&lt;br /&gt;
This change means that changes built on 4.0 onwards (including the master branch) will be different to older versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
For plugin developers supporting multiple versions of Moodle using a single plugin version, the compiled javascript files are backwards compatible and will _work_ on all supported versions, however if you run the `grunt` command on multiple versions you will see unbuilt changes. Running grunt on all versions of Moodle is not necessary and this check can be safely disabled for Moodle versions 3.9 - 4.0, as long as only at least you run `grunt` against at least one version of Moodle.&lt;br /&gt;
&lt;br /&gt;
If you need to support Internet Explorer and do not wish to fork your plugin for Moodle 4.0 onwards, then it is recommended that you run `grunt` on an older version of Moodle.&lt;br /&gt;
=== The course index element ===&lt;br /&gt;
The new course index feature can be themed using a set of scss variables. Use them to change the look and feel instead of adding custom css&lt;br /&gt;
 /theme/boost/scss/moodle/courseindex.scss&lt;br /&gt;
With the introduction of the course index component, the previous and next links shown underneath each activity are no longer needed and they will be removed.&lt;br /&gt;
=== Activity icons ===&lt;br /&gt;
The icons used for activities have been redesigned and updated for all core moodle activities.&lt;br /&gt;
&lt;br /&gt;
When viewing the new icons in a file manager, for example for the quiz activity, you will see a simple black monochrome icon with a transparent background.&lt;br /&gt;
&lt;br /&gt;
On the course page, or in the activity chooser, the icon will display as a white icon on a coloured background. Styling of the icons on the coursepage is controlled by the css in theme/boost/scss/moodle/icons.scss.&lt;br /&gt;
&lt;br /&gt;
The background colour for activity icons is set using a new variable in function [modname]_supports(). The quiz activity is of type assessment, so in function quiz_supports() there is a new line defining the purpose:&lt;br /&gt;
 case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;&lt;br /&gt;
Available purposes are:&lt;br /&gt;
* MOD_PURPOSE_COMMUNICATION&lt;br /&gt;
* MOD_PURPOSE_ASSESSMENT&lt;br /&gt;
* MOD_PURPOSE_COLLABORATION&lt;br /&gt;
* MOD_PURPOSE_CONTENT&lt;br /&gt;
* MOD_PURPOSE_ADMINISTRATION&lt;br /&gt;
* MOD_PURPOSE_INTERFACE&lt;br /&gt;
The background colours linked to these purposes are set in theme/boost/scss/moodle/variables.scss&lt;br /&gt;
 $activity-icon-colors: map-merge(&lt;br /&gt;
     (&lt;br /&gt;
         &amp;quot;administration&amp;quot;: #5d63f6,&lt;br /&gt;
         &amp;quot;assessment&amp;quot;: #eb66a2,&lt;br /&gt;
         &amp;quot;collaboration&amp;quot;: #f7634d,&lt;br /&gt;
         &amp;quot;communication&amp;quot;: #11a676,&lt;br /&gt;
         &amp;quot;content&amp;quot;: #399be2,&lt;br /&gt;
         &amp;quot;interface&amp;quot;: #a378ff&lt;br /&gt;
     ),&lt;br /&gt;
     $activity-icon-colors&lt;br /&gt;
 );&lt;br /&gt;
If activity plugins do not define FEATURE_MOD_PURPOSE the activity icon will be rendered against a light grey background. There is no requirement to define the purpose of activity plugins, it will only affect the icon styling.&lt;br /&gt;
&lt;br /&gt;
Plugins implementing the variable FEATURE_MOD_PURPOSE are only supported on Moodle 4.0 and newer.&lt;br /&gt;
&lt;br /&gt;
Customising the activity icon can be done in an alternative way. For example using the styles.css in mod/[pluginname/styles.css&lt;br /&gt;
&lt;br /&gt;
In the example below the activity plugin developer chooses to keep the coloured icon for the activity and render it as large as the coloured background on the core activities&lt;br /&gt;
 .modicon_subcourse.activityiconcontainer {&lt;br /&gt;
     background-color: transparent;&lt;br /&gt;
     padding: 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 .modicon_subcourse.activityiconcontainer img {&lt;br /&gt;
     width: 50px;&lt;br /&gt;
     height: 50px;&lt;br /&gt;
 }&lt;br /&gt;
To customize all icon colours use this scss array and add it to the ‘Raw initial SCSS’ in the theme Boost advanced settings page. The complete array of icon background colours can be overridden using the ‘Raw initial SCSS’ in the theme settings page. The example below changes the colours of each activity type.&lt;br /&gt;
 $activity-icon-colors: (&lt;br /&gt;
     &amp;quot;administration&amp;quot;: #5D63F6,&lt;br /&gt;
     &amp;quot;assessment&amp;quot;: #11A676,&lt;br /&gt;
     &amp;quot;collaboration&amp;quot;: #EB66A2,&lt;br /&gt;
     &amp;quot;communication&amp;quot;: #F7634D,&lt;br /&gt;
     &amp;quot;content&amp;quot;: #399BE2,&lt;br /&gt;
     &amp;quot;interface&amp;quot;: #A378FF&lt;br /&gt;
 )&lt;br /&gt;
== I&#039;m a developer, what do I need to know? ==&lt;br /&gt;
This section is a quick checklist of the areas in this document that you should consult when updating your plugin.&lt;br /&gt;
=== Modules ===&lt;br /&gt;
If you are a module developer (activity / resources) then you need to review the following updates and changes:&lt;br /&gt;
* If using settings, reformat to work with the secondary navigation. We have significantly changed the way that settings are shown. Settings added to the course and activity administration branch of the navigation are now by default shown in the secondary navigation. You will most likely find them in the more section of the secondary navigation. Please avoid creating settings in containers (a parent navigation node with children). These settings will still be shown, but this goes against the pattern that we are trying to establish for navigation around the site. If you have a lot of settings, consider creating a specific page to handle your additional settings.&lt;br /&gt;
** The order of the items in the secondary navigation may not be to your liking. This can be changed. See [[Moodle_4.0_developer_update#Changing_the_order_of_tabs|changing the order of tabs]]&lt;br /&gt;
* Update my behat tests to use new steps for site navigation. See [[Moodle_4.0_developer_update#Behat_changes|new behat steps]].&lt;br /&gt;
* Update my module to use the new activity_header API. See [[Moodle_4.0_developer_update#The_activity_header_class|the activity header]].&lt;br /&gt;
* Update my pages to make it work with the general format of the tertiary navigation. See [[Moodle_4.0_developer_update#Tertiary_navigation|the tertiary navigation]].&lt;br /&gt;
* Update my activity icon to use the API and set a purpose. See [[Moodle_4.0_developer_update#Activity_icons|activity icons]].&lt;br /&gt;
=== Themes ===&lt;br /&gt;
If you are a theme developer then you may want to consider the following:&lt;br /&gt;
* Take a look at the [[Moodle_4.0_developer_update#Navigation_changes|new navigation]] and decide if you want to incorporate this into your theme.&lt;br /&gt;
** A new layout ([[Moodle_4.0_developer_update#New_layout_page|drawers]])&lt;br /&gt;
** An [[Moodle_4.0_developer_update#Edit_switch|edit switch]]&lt;br /&gt;
** The [[Moodle_4.0_developer_update#The_course_index_element|course index]]&lt;br /&gt;
* Use of the flat nav&lt;br /&gt;
* New Site administration page and layout&lt;br /&gt;
* Course settings and how they are displayed&lt;br /&gt;
&lt;br /&gt;
=== Course format ===&lt;br /&gt;
There have been a lot of changes made to the course format. Most in the process of moving the course format away from using the old rendering system and towards templates.&lt;br /&gt;
We recommend the following sections be read carefully:&lt;br /&gt;
# [[Moodle_4.0_developer_update#The_course_format_system|The course format]]. There have been a lot of deprecations and reading this section is critical in understanding the changes made.&lt;br /&gt;
# Consider moving the rendering of your content over to the [[Templates|template system]].&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61814</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61814"/>
		<updated>2022-03-14T07:58:39Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* I&amp;#039;m a developer, what do I need to know? - description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page highlights the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== Navigation changes ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
=== Primary navigation ===&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
==== Customising the primary navigation ====&lt;br /&gt;
Not yet implemented but we are looking at allowing the full addition and removal of any of the primary navigation tabs in the boost theme config file.&lt;br /&gt;
=== Secondary navigation ===&lt;br /&gt;
The main content area shows tabs for secondary navigation with a maximum of 5 items being rendered in this ‘more’ menu. A new UI component has been created to render menus like this. Files:&lt;br /&gt;
 /lib/templates/moremenu.mustache&lt;br /&gt;
==== Changing the order of tabs ====&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level. &lt;br /&gt;
=== Tertiary navigation ===&lt;br /&gt;
We&#039;ve moved action buttons to the top of the page. We would encourage you to do the same.&lt;br /&gt;
If you have any buttons on an activity page that go to another page, or open a form (or similar), then we encourage you to move them from the body of your activity page to the top. All of the core activities have been updated to follow this pattern. Please take a look to see how you can format your activity in a similar fashion. There is no API here. You are welcome to create the buttons and display them as you wish in this top area.&lt;br /&gt;
=== New API functions ===&lt;br /&gt;
==== Page API ====&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondary_nav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* has_secondary_navigation_setter - Sets the ‘_hassecondarynavigation’ to indicate whether a page should render the secondary navigation&lt;br /&gt;
==== Navigationlib ====&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
==== The activity header class ====&lt;br /&gt;
There is a new activity header class that handles the display of information common to activities. 3rd party activities are not required to explicitly output this information as part of rendering individual pages.&lt;br /&gt;
&lt;br /&gt;
The common information that are currently handled by the class are:&lt;br /&gt;
* title&lt;br /&gt;
* description&lt;br /&gt;
* completion information&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As part of the update it was required that the initial information to be displayed by the class be toggable at a theme and layout level. Taking this into account the following theme level configurable exists:&lt;br /&gt;
* activityheaderconfig =&amp;gt; An array that currently only enforces &#039;notitle&#039; but can be expanded in the future NOTE: Boost has this set as true by default &#039;options&#039;&lt;br /&gt;
The following layout level options that can be defined:&lt;br /&gt;
* noactivityheader - to remove the header in this specific layout.&lt;br /&gt;
* activityheader - An array that enforces the following options:&lt;br /&gt;
** notitle&lt;br /&gt;
** nocompletion&lt;br /&gt;
** nodescription&lt;br /&gt;
The class has a page level getter which you can use to fetch the current version of the class. The base state is initialised within the constructor with the completion information only fetched when data is exported for the template.&lt;br /&gt;
&lt;br /&gt;
The class has setters for the following variables which can be leveraged to modify the header for a particular page in the format set_{variable_name}:&lt;br /&gt;
* hidecompletion&lt;br /&gt;
* description&lt;br /&gt;
* title&lt;br /&gt;
Alternately, bulk operations can also be done by passing the above variables in an array to &#039;set_attrs&#039; which in turn calls the setters.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note: Any updates to the activityheader needs to be performed before the call to $OUTPUT-&amp;gt;header&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
===== Theme updates: =====&lt;br /&gt;
In order for 3rd party themes to use the class they need to export the activity_header and include the following into their base template :&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
   {{&amp;gt; core/activity_header}}&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;** headercontent being the array element that contains the exported activity_header data &lt;br /&gt;
===== Accessibility notes: =====&lt;br /&gt;
The jump to ‘maincontent’ div is now rendered within the activity header when within an activity context&lt;br /&gt;
== Component library ==&lt;br /&gt;
Each Moodle installation now ships with a Moodle User Interface (UI) Component library, a documentation system used to describe all the Bootstrap components and the custom Moodle components. The component Library is a helper tool for developers when creating user interfaces, a testing tool for theme developers and a documentation tool for core developers. The ultimate goal of having a component library is to encourage developers to create consistent user interfaces to improve Moodle’s overall user experience.&lt;br /&gt;
&lt;br /&gt;
The library contains pages with documentation about User Interface components. It contains details on how to use the component, what variations are available and the JavaScript events / options are associated with the component.&lt;br /&gt;
&lt;br /&gt;
When writing on these pages it is possible to render core mustache templates using some custom syntax like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; mustache template=&amp;quot;core/notification_error&amp;quot; &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; /mustache &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also call core JavaScript or use HTML examples where the html code and the rendered result are visible in the Component Library. For more info visit the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-templates/ Moodle templates] page or the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-javascript/ Moodle JavaScript] page.&lt;br /&gt;
&lt;br /&gt;
Each page in the library uses the current css from the default theme in your Moodle installation, if you have multiple themes installed and enabled the setting &amp;quot;Allow theme changes on url&amp;quot;, the component library will have a theme selector option.&lt;br /&gt;
&lt;br /&gt;
A hosted version of the Component Library can be found here. http://componentlibrary.moodle.com&lt;br /&gt;
=== Enabling the Component Library ===&lt;br /&gt;
Component library pages are written in the markdown language. These pages need to be compiled to HTML pages before the Component Library is visible. To compile the pages the server running Moodle needs to have the [[Javascript Modules#Install%20NVM%20and%20Node|JavaScript developer tools installed]] (nodeJs and Grunt)&lt;br /&gt;
&lt;br /&gt;
If your server meets all requirements you can enable the library running&lt;br /&gt;
 $ npm install&lt;br /&gt;
 $ grunt componentlibrary&lt;br /&gt;
Further installation instructions can be found in the Component Library itself.&lt;br /&gt;
=== Documenting new UI Components ===&lt;br /&gt;
There are no set rules for adding new pages in the component library yet. These rules will need to be written and adopted in the integration process for Moodle code.&lt;br /&gt;
&lt;br /&gt;
As a guideline for making this rules consideration are:&lt;br /&gt;
&lt;br /&gt;
The component library is not about single use components, for example the Moodle grade book (a huge component with many custom features). Or about very common components like buttons, these are already covered by the Bootstrap section of the component library.&lt;br /&gt;
&lt;br /&gt;
New features should be build keeping in mind the UI part needs to be customisable and if possible (and making sense) reusable. And example would be the new page drawers that we are introducing for the Navigation project. Or the custom primary navigation menus where overflowing items are pushed into a More section.&lt;br /&gt;
== Theme changes ==&lt;br /&gt;
=== Edit switch ===&lt;br /&gt;
On theme boost the “Turn editing on” and “Customise this page” buttons have been replaced by an edit switch in the top navbar. Theme Classic will keep using the old buttons. Child themes can choose to use the edit switch if the theme config.php is using this variable&lt;br /&gt;
 $THEME-&amp;gt;haseditswitch = true;&lt;br /&gt;
The languague menu, which used to be rendered in place of the custom menu has moved to the user dropdown when the user is logged in. If not logged in it will be placed next to the search / notification / messaging icon in the top navbar.&lt;br /&gt;
=== Login page ===&lt;br /&gt;
The login page has been redesigned and allows the admin to configure a background image for the login page only in the theme settings page. This change is available in both Boost and Classic. The login page still has all the features with an improved layout. &lt;br /&gt;
=== The page footer ===&lt;br /&gt;
In large screens, the page footer button is only visible when clicking a help button at the bottom right of the screen.&lt;br /&gt;
=== User initials as profile picture placeholder ===&lt;br /&gt;
If users do not upload a profile picture the user initials are displayed on a rounded gray background as a placeholder picture in the top navbar or any other page using a placeholder image. This change will be available in both Boost and Classic. &lt;br /&gt;
&lt;br /&gt;
With the introduction of this placeholder image the full username will no longer be displayed in the top navbar.&lt;br /&gt;
=== Removal of back to top link ===&lt;br /&gt;
The &amp;quot;back to top&amp;quot; link will be removed for theme boost since the new course index reduced the dependence on page scrolling. Also, the new footer is positioned where this component used to be.&lt;br /&gt;
=== Styling changes ===&lt;br /&gt;
By default rounded edges will be used for UI components, for the page header and main content area the borders will be removed. &lt;br /&gt;
=== New layout page ===&lt;br /&gt;
Theme boost now uses the drawers.php layout for the course index and blocks.&lt;br /&gt;
== Question bank changes ==&lt;br /&gt;
There was a big project to deliver [[Question bank improvements for Moodle 4.0]] which added a new plugin type for adding features to the question banks, tracking the version history for each question as it is edited (question table has been split into &amp;lt;code&amp;gt;question&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;question_versions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_bank_entries&amp;lt;/code&amp;gt;), and tracking where each question is going to be used, with new tables &amp;lt;code&amp;gt;question_references&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_set_references&amp;lt;/code&amp;gt;. This work was done in Epic MDL-70329 if you want to track down the details of any of the core changes.&lt;br /&gt;
=== Question type plugins ===&lt;br /&gt;
Amazingly, we (Safat and colleagues at Catalyst AU) managed to implement this without breaking most question type plugins.&lt;br /&gt;
&lt;br /&gt;
However, the changes to the question bank, and the other Moodle 4.0 changes, probably broke the Behat tests for your plugin. To help with fixing that, MDL-74130 adds navigation to key question type pages (Preview and Edit for a question, and standard question bank pages like the bank itself, import and export) which should let you fix your test efficiently, and in a way that will work in all Moodle versions since 3.9.&lt;br /&gt;
&lt;br /&gt;
The &#039;most&#039; in the first paragraph here is becuase more advance question types may require more effort to fix. (For example qtype_combined which creates multi-part qusetions like the core qtype_multianswer; or qtype_pmatch or qtype_stack, which store additional data - questions tests - alongside the question itseld. How should that work with versionning?) But, if you have not done weird things like that, you are probably safe. If you find anything else that causes problems, please list it here.&lt;br /&gt;
&lt;br /&gt;
The same thing should apply to question behaviour and question import/export format plugings: no significant changes required (probably just fixing the Behat tests because of the navigation changes).&lt;br /&gt;
=== New plugin type: qbank plugins ===&lt;br /&gt;
This is not something that will cause problems for people upgrading from 3.x. Rather, it is an exciting possibility you can explore once you have survived process of upgrading to 4.0. There is a whole new plugin type which you can create to add new features to the question bank. For example extra columns, new actions and bulk actions, and so on. See [[Question_bank_plugins]].&lt;br /&gt;
=== Activities that use questions ===&lt;br /&gt;
The probable bad news is if you have an activity module which uses questions. So far, the only activity which has been fixed is mod_quiz in Moodle core, so we don&#039;t yet have a good picture of what fixes will be necessary in other activities. Work is about to start fixing [https://github.com/studentquiz/moodle-mod_studentquiz mod_studentquiz], so watching that should give more clues. As we do that, we will try to update this section of this page. Other help writing the information required here would also be greatly appreciated.&lt;br /&gt;
== The course format system ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
=== Mandatory renderer in course formats ===&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
=== New format base class ===&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
=== New course output classes and mustache files ===&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
=== Course editor javascript modules and frontend components ===&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
=== Other course related 4.0 changes ===&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
=== New steps ===&lt;br /&gt;
Moodle 4.0 introduces some new behat steps.&lt;br /&gt;
&lt;br /&gt;
Sometimes you want to create a bulk number of activities. In that case you can use:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
:count :entitytype exist with the following data:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
Given 100 &amp;quot;mod_lti &amp;gt; tool types&amp;quot; exist with the following data:&lt;br /&gt;
  |name        |Test tool [count]                  |&lt;br /&gt;
  |description |Example description [count]        |&lt;br /&gt;
  |baseurl     |https://www.example.com/tool[count]|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dynamic (AJAX) tabs is a new feature contributed to Moodle 4.0 by the Workplace team (MDL-71943). You can use the following step to navigate between the tabs.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on the &amp;quot;tab title&amp;quot; dynamic tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To make sure that edit mode is (or is not) available on the current page, the following steps can be used.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And edit mode should be available on the current page&lt;br /&gt;
And edit mode should not be available on the current page&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are new aliases for the existing steps &amp;lt;code&amp;gt;I turn editing mode on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;I turn editing mode off&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I switch editing mode on&lt;br /&gt;
And I switch editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to the existing step to go to a course with editing mode on, we now have the following step to do the same but with editing mode being off.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I am on &amp;quot;course full name&amp;quot; course homepage with editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step is similar to the old &amp;lt;code&amp;gt;following &amp;quot;link string&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&amp;lt;/code&amp;gt; step, with more flexibility.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;Download&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;Starter&amp;quot; &amp;quot;table_row&amp;quot; should download between &amp;quot;0&amp;quot; and &amp;quot;5000&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to hover the mouse over the trigger area.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over the &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step enables an installed plugin.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;plugin name&amp;quot; &amp;quot;plugin type&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;course_summary&amp;quot; &amp;quot;block&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following is a special variation of &#039;I click on &amp;quot;&amp;lt;page name&amp;gt;&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;page&amp;quot; &amp;quot;region&amp;quot;&#039;. It first checks to see if we are on the given page via the breadcrumb. If not we then attempt to follow the link name given.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I follow the breadcrumb &amp;quot;page name&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can use the following step to ensure a node is active in the navbar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Node&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;My courses&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to navigate to a given node in the primary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select &amp;quot;Node&amp;quot; from primary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check whether an item exists in the user menu or not.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the user menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Language&amp;quot; &amp;quot;link&amp;quot; should exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check if a submenu of the user menu is shown, and if an item exists or does not exist in a given user submenu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I follow &amp;quot;Language&amp;quot; in the user menu&lt;br /&gt;
Then I should see &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English (pirate) &amp;amp;lrm;(en_ar)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To add enrolment methods to courses you can use the following new step. The data that you provide in the next lines are used to fill the enrolment method form.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;enrolment method&amp;quot; in &amp;quot;course identifier&amp;quot; with:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I add &amp;quot;Self enrolment&amp;quot; enrolment method in &amp;quot;Course 1&amp;quot; with:&lt;br /&gt;
  | Custom instance name     | Test student enrolment |&lt;br /&gt;
  | Enrolment key            | moodle_rules           |&lt;br /&gt;
  | Use group enrolment keys | Yes                    |&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 3 new steps specific to the calendar component. These steps can be used to hover over a day in the mini-calendar or the full calendar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the full calendar page&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the mini-calendar block&lt;br /&gt;
And I hover over today in the mini-calendar block&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some new steps are added to question bank to be able to add comment to questions, verify the existence of a comment, and deleting comments form questions. Please note that the steps for adding comments only write the comment text in the comment field. You still need to click on the &amp;quot;Add comment&amp;quot; button to save the comment.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question preview&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question preview&lt;br /&gt;
And I should see &amp;quot;number of comments&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;number of comments&amp;quot; on the row on the comments column&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;Question bank&amp;quot; in current page administration&lt;br /&gt;
And I should see &amp;quot;0&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;0&amp;quot; on the row on the comments column&lt;br /&gt;
And I add &amp;quot;test comment 01&amp;quot; comment to question&lt;br /&gt;
And I click on &amp;quot;Add comment&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Close&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I should see &amp;quot;1&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;1&amp;quot; on the row on the comments column&lt;br /&gt;
And I delete &amp;quot;test comment 01&amp;quot; comment from question&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similar to the steps for comments, the following steps are to verify the number of a question&#039;s usage and to click on it in order to open the question usage modal.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
And I click &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new steps are related to bulk actions in the question bank UI.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should not see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on &amp;quot;First question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Second question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;With selected&amp;quot; &amp;quot;button&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Delete&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;Confirm&amp;quot; &amp;quot;dialogue&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://docs.moodle.org/en/Report_builder Report builder] is a new feature contributed to Moodle 4.0 by the Workplace team. The following new step is added to Moodle 4.0 to select an action from the action menu in the list of custom reports table.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I press &amp;quot;action&amp;quot; action in the &amp;quot;report name&amp;quot; report row&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There&#039;s another step related to the report builder to set a column&#039;s aggregation in the report editor.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;column title&amp;quot; column aggregation to &amp;quot;aggregation method&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;First name&amp;quot; column aggregation to &amp;quot;Comma separated values&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step needs to be used in scenarios that involve testing BigBlueButton. For this to work, you need to have a [https://github.com/moodlehq/bigbluebutton_mock BigBlueButton Mock API Server] and set &amp;lt;code&amp;gt;TEST_MOD_BIGBLUEBUTTONBN_MOCK_SERVER&amp;lt;/code&amp;gt; to point to that in config.php.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And a BigBlueButton mock server is configured&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step replicates receiving a callback from the BigBlueButton server indicating the recordings for meetings are ready for viewing.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And the BigBlueButtonBN server has sent recording ready notifications&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are specific to the lesson activity. Note that in 4.0, some links (such as the &amp;quot;edit&amp;quot; and the &amp;quot;grade essays&amp;quot; links) are replaced by buttons, so you need to update your old steps with the new ones.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I edit the lesson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;A new step is added to be used in lesson activities to edit them. This step navigates the user to the lesson edit page.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I grade lesson essays&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;It&#039;s a new step to go to the &amp;quot;Grade essays&amp;quot; page of the lesson we are currently in.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select edit type &amp;quot;edit type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Select the lesson edit type when we are in the the lesson&#039;s edit page. &amp;quot;edit type&amp;quot; can either be &amp;quot;Collapsed&amp;quot; or &amp;quot;Expanded&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new step can be used to navigate to the exports page in the course gradebook and select the specified export type from the grade exports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;export option&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;XML file&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similarly, there&#039;s a new step to navigate to the imports page in the course gradebook and select the specified import type from the grade imports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;import option&amp;quot; import page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Boost steps ===&lt;br /&gt;
In addition to the steps listed in the previous section, there are also some Boost specific steps coming with Moodle 4.0. These steps only work in Boost or Boost child themes, so you need to make sure they are not used in scenarios that may be run by non-Boost themes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step checks whether a node is active in the secondary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see :name is active in secondary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Boost theme shows the language selector menu in the primary navigation when not logged in, and within the user menu when logged in. The following steps are to check if the primary navigation includes the language selector menu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And language selector menu should exist in the navbar&lt;br /&gt;
And language selector menu should not exist in the navbar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And the following steps can be used to check whether an item exists in the language selector menu in the Boost theme.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the language selector menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Modified steps ===&lt;br /&gt;
The step &amp;lt;code&amp;gt;I change the (window|viewport) size to &amp;quot;size&amp;quot;&amp;lt;/code&amp;gt; now supports 2 new values for the size argument. The size argument now accepts &amp;lt;code&amp;gt;mobile&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tablet&amp;lt;/code&amp;gt; values in addition to &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;large&amp;lt;/code&amp;gt;.&lt;br /&gt;
=== Removed steps ===&lt;br /&gt;
Some behat steps are removed or replaced with new steps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As a result of some design changes, hidden or restricted activities are no longer dimmed. Therefore the step&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be dimmed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;is now removed.&lt;br /&gt;
Depending on what you were using that step for, you may be able to use these steps:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Label name&amp;quot; label should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Activity or resource name&amp;quot;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;region-main&amp;quot; &amp;quot;region&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Other things to consider ===&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. It is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] is integrated these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
Old behat steps that may now fail can be updated to the new steps.&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
There are also similar stream-lined navigation steps for accessing question bank pages. See MDL-74130.&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Core plugins review ===&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;br /&gt;
=== Site admin presets plugin ===&lt;br /&gt;
The third-party plugin [https://moodle.org/plugins/block_admin_presets Admin presets], created by David Monllaó and maintained by developers from [https://pimenko.com/ Pimenko] has been adapted and integrated into Moodle 4.0. It stores settings and plugins status (enabled/disabled) in what&#039;s called &amp;quot;presets&amp;quot; to let admins quickly switch between different configurations.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Site admin presets|Site admin presets plugin]] page.&lt;br /&gt;
=== JavaScript browser support changes ===&lt;br /&gt;
From Moodle 4.0, Internet Explorer is no longer supported. See MDL-73915 and MDLSITE-6109 for further information on this change.&lt;br /&gt;
&lt;br /&gt;
This change means that changes built on 4.0 onwards (including the master branch) will be different to older versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
For plugin developers supporting multiple versions of Moodle using a single plugin version, the compiled javascript files are backwards compatible and will _work_ on all supported versions, however if you run the `grunt` command on multiple versions you will see unbuilt changes. Running grunt on all versions of Moodle is not necessary and this check can be safely disabled for Moodle versions 3.9 - 4.0, as long as only at least you run `grunt` against at least one version of Moodle.&lt;br /&gt;
&lt;br /&gt;
If you need to support Internet Explorer and do not wish to fork your plugin for Moodle 4.0 onwards, then it is recommended that you run `grunt` on an older version of Moodle.&lt;br /&gt;
=== The course index element ===&lt;br /&gt;
The new course index feature can be themed using a set of scss variables. Use them to change the look and feel instead of adding custom css&lt;br /&gt;
 /theme/boost/scss/moodle/courseindex.scss&lt;br /&gt;
With the introduction of the course index component, the previous and next links shown underneath each activity are no longer needed and they will be removed.&lt;br /&gt;
=== Activity icons ===&lt;br /&gt;
The icons used for activities have been redesigned and updated for all core moodle activities.&lt;br /&gt;
&lt;br /&gt;
When viewing the new icons in a file manager, for example for the quiz activity, you will see a simple black monochrome icon with a transparent background.&lt;br /&gt;
&lt;br /&gt;
On the course page, or in the activity chooser, the icon will display as a white icon on a coloured background. Styling of the icons on the coursepage is controlled by the css in theme/boost/scss/moodle/icons.scss.&lt;br /&gt;
&lt;br /&gt;
The background colour for activity icons is set using a new variable in function [modname]_supports(). The quiz activity is of type assessment, so in function quiz_supports() there is a new line defining the purpose:&lt;br /&gt;
 case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;&lt;br /&gt;
Available purposes are:&lt;br /&gt;
* MOD_PURPOSE_COMMUNICATION&lt;br /&gt;
* MOD_PURPOSE_ASSESSMENT&lt;br /&gt;
* MOD_PURPOSE_COLLABORATION&lt;br /&gt;
* MOD_PURPOSE_CONTENT&lt;br /&gt;
* MOD_PURPOSE_ADMINISTRATION&lt;br /&gt;
* MOD_PURPOSE_INTERFACE&lt;br /&gt;
The background colours linked to these purposes are set in theme/boost/scss/moodle/variables.scss&lt;br /&gt;
 $activity-icon-colors: map-merge(&lt;br /&gt;
     (&lt;br /&gt;
         &amp;quot;administration&amp;quot;: #5d63f6,&lt;br /&gt;
         &amp;quot;assessment&amp;quot;: #eb66a2,&lt;br /&gt;
         &amp;quot;collaboration&amp;quot;: #f7634d,&lt;br /&gt;
         &amp;quot;communication&amp;quot;: #11a676,&lt;br /&gt;
         &amp;quot;content&amp;quot;: #399be2,&lt;br /&gt;
         &amp;quot;interface&amp;quot;: #a378ff&lt;br /&gt;
     ),&lt;br /&gt;
     $activity-icon-colors&lt;br /&gt;
 );&lt;br /&gt;
If activity plugins do not define FEATURE_MOD_PURPOSE the activity icon will be rendered against a light grey background. There is no requirement to define the purpose of activity plugins, it will only affect the icon styling.&lt;br /&gt;
&lt;br /&gt;
Plugins implementing the variable FEATURE_MOD_PURPOSE are only supported on Moodle 4.0 and newer.&lt;br /&gt;
&lt;br /&gt;
Customising the activity icon can be done in an alternative way. For example using the styles.css in mod/[pluginname/styles.css&lt;br /&gt;
&lt;br /&gt;
In the example below the activity plugin developer chooses to keep the coloured icon for the activity and render it as large as the coloured background on the core activities&lt;br /&gt;
 .modicon_subcourse.activityiconcontainer {&lt;br /&gt;
     background-color: transparent;&lt;br /&gt;
     padding: 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 .modicon_subcourse.activityiconcontainer img {&lt;br /&gt;
     width: 50px;&lt;br /&gt;
     height: 50px;&lt;br /&gt;
 }&lt;br /&gt;
To customize all icon colours use this scss array and add it to the ‘Raw initial SCSS’ in the theme Boost advanced settings page. The complete array of icon background colours can be overridden using the ‘Raw initial SCSS’ in the theme settings page. The example below changes the colours of each activity type.&lt;br /&gt;
 $activity-icon-colors: (&lt;br /&gt;
     &amp;quot;administration&amp;quot;: #5D63F6,&lt;br /&gt;
     &amp;quot;assessment&amp;quot;: #11A676,&lt;br /&gt;
     &amp;quot;collaboration&amp;quot;: #EB66A2,&lt;br /&gt;
     &amp;quot;communication&amp;quot;: #F7634D,&lt;br /&gt;
     &amp;quot;content&amp;quot;: #399BE2,&lt;br /&gt;
     &amp;quot;interface&amp;quot;: #A378FF&lt;br /&gt;
 )&lt;br /&gt;
== I&#039;m a developer, what do I need to know? ==&lt;br /&gt;
This section is a quick checklist of the areas in this document that you should consult when updating your plugin.&lt;br /&gt;
=== Modules ===&lt;br /&gt;
If you are a module developer (activity / resources) then you need to review the following updates and changes:&lt;br /&gt;
* If using settings, reformat to work with the secondary navigation. We have significantly changed the way that settings are shown. Settings added to the course and activity administration branch of the navigation are now by default shown in the secondary navigation. You will most likely find them in the more section of the secondary navigation. Please avoid creating settings in containers (a parent navigation node with children). These settings will still be shown, but this goes against the pattern that we are trying to establish for navigation around the site. If you have a lot of settings, consider creating a specific page to handle your additional settings.&lt;br /&gt;
** The order of the items in the secondary navigation may not be to your liking. This can be changed. See [[Moodle_4.0_developer_update#Changing_the_order_of_tabs|changing the order of tabs]]&lt;br /&gt;
* Update my behat tests to use new steps for site navigation. See [[Moodle_4.0_developer_update#Behat_changes|new behat steps]].&lt;br /&gt;
* Update my module to use the new activity_header API. See [[Moodle_4.0_developer_update#The_activity_header_class|the activity header]].&lt;br /&gt;
* Update my pages to make it work with the general format of the tertiary navigation. See [[Moodle_4.0_developer_update#Tertiary_navigation|the tertiary navigation]].&lt;br /&gt;
* Update my activity icon to use the API and set a purpose. See [[Moodle_4.0_developer_update#Activity_icons|activity icons]].&lt;br /&gt;
=== Themes ===&lt;br /&gt;
If you are a theme developer then you may want to consider the following:&lt;br /&gt;
* Take a look at the [[Moodle_4.0_developer_update#Navigation_changes|new navigation]] and decide if you want to incorporate this into your theme.&lt;br /&gt;
** A new layout ([[Moodle_4.0_developer_update#New_layout_page|drawers]])&lt;br /&gt;
** An [[Moodle_4.0_developer_update#Edit_switch|edit switch]]&lt;br /&gt;
** The [[Moodle_4.0_developer_update#The_course_index_element|course index]]&lt;br /&gt;
* Use of the flat nav&lt;br /&gt;
* New Site administration page and layout&lt;br /&gt;
* Course settings and how they are displayed&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=61813</id>
		<title>Releases</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=61813"/>
		<updated>2022-03-14T07:49:08Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* Moodle 3.9 (LTS)  update to 3.9.13 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all official releases of Moodle, grouped by branch in reverse chronological order.&lt;br /&gt;
==Version support==&lt;br /&gt;
From Moodle 2.6 onwards, the end of support, both general and security, happens the second Monday of May and November, observing the 12, 18... month periods, no matter if the major release date was moved or not.&lt;br /&gt;
&lt;br /&gt;
The most recent [https://en.wikipedia.org/wiki/Long-term_support long-term support release (LTS)] version is Moodle 3.9.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Version&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Release status&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Initial release&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:rgba(0, 0, 0, 0.05);&amp;quot; | General support ends&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Security support ends&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.9 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 15 June 2020&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 10 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 November 2023 (ext 6M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.10&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 9 November 2020&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 8 November 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 9 May 2022&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.11&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 17 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 14 Nov 2022 (ext 6M)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 Nov 2023 (ext 12M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |4.0&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |April 2022&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |May 2023&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |November 2023&lt;br /&gt;
|-&lt;br /&gt;
|4.1 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stable&lt;br /&gt;
|November 2022&lt;br /&gt;
|November 2023&lt;br /&gt;
|November 2025&lt;br /&gt;
|}&lt;br /&gt;
[[Image:releasescurrent.png|alt=Release graph]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Release graph key:&amp;lt;/b&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Currently supported stable releases.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | Current release of versions still receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Future point releases receiving bug fixes, as well as security updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#316d5e; color:white; adding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Future point releases receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#686566; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Previously released versions containing bug fixes, as well as security updates. Updating to a currently supported version is recommended.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#282828; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Previously released versions containing security updates only. Updating to a currently supported version is recommended.&lt;br /&gt;
|}&lt;br /&gt;
==General release calendar==&lt;br /&gt;
These are the target dates for releases. These dates may vary slightly due to unforeseen circumstances.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Release type&lt;br /&gt;
!Frequency&lt;br /&gt;
!Months&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Major_release_cycles|Major]] (eg. 3.x)&lt;br /&gt;
|6 monthly&lt;br /&gt;
|Second Monday of May and November&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Stable_maintenance_cycles|Minor]] (Point) (eg. 3.x.y)&lt;br /&gt;
| 2 monthly&lt;br /&gt;
|Second Monday of July, September, November, March and May.&lt;br /&gt;
Third Monday of January.&lt;br /&gt;
|}&lt;br /&gt;
All releases are preceded by a one week warning. Upcoming release dates can be found in the [https://www.google.com/calendar/ical/moodle.com_p4c2oe7hsb77ltaro5qtihb5d4%40group.calendar.google.com/public/basic.ics Moodle development calendar] (Note, this is an iCAL link that will try to add the dates to your personal calendar. If you just want to browse the dates online, use [https://calendar.google.com/calendar/embed?src=moodle.com_p4c2oe7hsb77ltaro5qtihb5d4@group.calendar.google.com&amp;amp;pli=1 this link].).&lt;br /&gt;
==Moodle 3.11==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11&lt;br /&gt;
|17 May 2021&lt;br /&gt;
|2021051700&lt;br /&gt;
|[[Moodle 3.11 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/311/en/Upgrading Upgrading to 3.11]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.1&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2021051701&lt;br /&gt;
|[[Moodle 3.11.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.2&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2021051702&lt;br /&gt;
|[[Moodle 3.11.2 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.3&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2021051703&lt;br /&gt;
|[[Moodle 3.11.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.4&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2021051704&lt;br /&gt;
|[[Moodle 3.11.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.5&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2021051705&lt;br /&gt;
|[[Moodle 3.11.5 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.6&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2021051706&lt;br /&gt;
|[[Moodle 3.11.6 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).&lt;br /&gt;
 Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.10==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020110900&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 3.10 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/310/en/Upgrading Upgrading to 3.10]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.1&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020110901&lt;br /&gt;
| [[Moodle 3.10.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.2&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020110902&lt;br /&gt;
|[[Moodle 3.10.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.3&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020110903&lt;br /&gt;
|[[Moodle 3.10.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.4&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020110904&lt;br /&gt;
|[[Moodle 3.10.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.5&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020110905&lt;br /&gt;
|[[Moodle 3.10.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.6&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020110906&lt;br /&gt;
|[[Moodle 3.10.6 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.7&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020110907&lt;br /&gt;
|[[Moodle 3.10.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.8&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2020110908&lt;br /&gt;
|[[Moodle 3.10.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.9&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2020110909&lt;br /&gt;
|[[Moodle 3.10.9 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.10&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2020110910&lt;br /&gt;
|[[Moodle 3.10.10 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.10.x ended 8 November 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.9 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9&lt;br /&gt;
|15 June 2020&lt;br /&gt;
|2020061500&lt;br /&gt;
|[[Moodle 3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/39/en/Upgrading Upgrading to 3.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.1&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2020061501&lt;br /&gt;
|[[Moodle 3.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.2&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2020061502&lt;br /&gt;
| [[Moodle 3.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.3&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020061503&lt;br /&gt;
| [[Moodle 3.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.4&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020061504&lt;br /&gt;
|[[Moodle 3.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.5&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020061505&lt;br /&gt;
|[[Moodle 3.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.6&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020061506&lt;br /&gt;
|[[Moodle 3.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.7&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020061507&lt;br /&gt;
|[[Moodle 3.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.8&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020061508&lt;br /&gt;
|[[Moodle 3.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.9&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020061509&lt;br /&gt;
|[[Moodle 3.9.9 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.10&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020061510&lt;br /&gt;
|[[Moodle 3.9.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.11&lt;br /&gt;
| 8 November 2021&lt;br /&gt;
|2020061511&lt;br /&gt;
|[[Moodle 3.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.12&lt;br /&gt;
| 17 January 2022&lt;br /&gt;
|2020061512&lt;br /&gt;
|[[Moodle 3.9.12 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.13&lt;br /&gt;
| 14 March 2022&lt;br /&gt;
|2020061513&lt;br /&gt;
|[[Moodle 3.9.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.9.x ended 10 May 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.9.x will end 13 Nov 2023 (36 months plus 6 months extension).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8&lt;br /&gt;
|18 November 2019&lt;br /&gt;
|2019111800&lt;br /&gt;
|[[Moodle 3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/38/en/Upgrading Upgrading to 3.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.1&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019111801&lt;br /&gt;
|[[Moodle 3.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.2&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019111802&lt;br /&gt;
|[[Moodle 3.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.3&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019111803&lt;br /&gt;
|[[Moodle 3.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.4&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019111804&lt;br /&gt;
|[[Moodle 3.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.5&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019111805&lt;br /&gt;
| [[Moodle 3.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.6&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019111806&lt;br /&gt;
| [[Moodle 3.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.7&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2019111807&lt;br /&gt;
|[[Moodle 3.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.8&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2019111808&lt;br /&gt;
|[[Moodle 3.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.9&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2019111809&lt;br /&gt;
|[[Moodle 3.8.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.8.x ended 9 November 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.8.x ended 10 May 2021 (18 months).&lt;br /&gt;
==Moodle 3.7==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7&lt;br /&gt;
|20 May 2019&lt;br /&gt;
|2019052000&lt;br /&gt;
|[[Moodle 3.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/37/en/Upgrading Upgrading to 3.7]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.1&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2019052001&lt;br /&gt;
|[[Moodle 3.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.2&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2019052002&lt;br /&gt;
|[[Moodle 3.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.3&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2019052003&lt;br /&gt;
| [[Moodle 3.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.4&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019052004&lt;br /&gt;
|[[Moodle 3.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.5&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019052005&lt;br /&gt;
|[[Moodle 3.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.6&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019052006&lt;br /&gt;
|[[Moodle 3.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.7&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019052007&lt;br /&gt;
|[[Moodle 3.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.8&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019052008&lt;br /&gt;
| [[Moodle 3.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.9&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019052009&lt;br /&gt;
|[[Moodle 3.7.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.7.x ended 11 May 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.7.x ended 9 November 2020 (18 months).&lt;br /&gt;
==Moodle 3.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6&lt;br /&gt;
| 3 December 2018&lt;br /&gt;
|2018120300&lt;br /&gt;
|[[Moodle 3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/36/en/Upgrading Upgrading to 3.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.1&lt;br /&gt;
|5 December 2018&lt;br /&gt;
|2018120301&lt;br /&gt;
| [[Moodle 3.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6.2&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018120302&lt;br /&gt;
|[[Moodle 3.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.3&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018120303&lt;br /&gt;
|[[Moodle 3.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.4&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018120304&lt;br /&gt;
|[[Moodle 3.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.5&lt;br /&gt;
|8th July 2019&lt;br /&gt;
|2018120305&lt;br /&gt;
|[[Moodle 3.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.6&lt;br /&gt;
|9th September 2019&lt;br /&gt;
|2018120306&lt;br /&gt;
|[[Moodle 3.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.7&lt;br /&gt;
| 11th November 2019&lt;br /&gt;
|2018120307&lt;br /&gt;
|[[Moodle 3.6.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.8&lt;br /&gt;
|13th January 2020&lt;br /&gt;
|2018120308&lt;br /&gt;
|[[Moodle 3.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.9&lt;br /&gt;
|9th March 2020&lt;br /&gt;
|2018120309&lt;br /&gt;
| [[Moodle 3.6.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.10&lt;br /&gt;
|11th May 2020&lt;br /&gt;
|2018120310&lt;br /&gt;
|[[Moodle 3.6.10 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.6.x ended 11 November 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.6.x ended 11 May 2020 (18 months).&lt;br /&gt;
==Moodle 3.5 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2018051700&lt;br /&gt;
|[[Moodle 3.5 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/35/en/Upgrading Upgrading to 3.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.1&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2018051701&lt;br /&gt;
|[[Moodle 3.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.2&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2018051702&lt;br /&gt;
|[[Moodle 3.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.3&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2018051703&lt;br /&gt;
| [[Moodle 3.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.4&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018051704&lt;br /&gt;
|[[Moodle 3.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.5&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018051705&lt;br /&gt;
|[[Moodle 3.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.6&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018051706&lt;br /&gt;
|[[Moodle 3.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.7&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2018051707&lt;br /&gt;
|[[Moodle 3.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.8&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2018051708&lt;br /&gt;
|[[Moodle 3.5.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.9&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2018051709&lt;br /&gt;
|[[Moodle 3.5.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.10&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2018051710&lt;br /&gt;
| [[Moodle 3.5.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.11&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2018051711&lt;br /&gt;
|[[Moodle 3.5.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.12&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2018051712&lt;br /&gt;
| [[Moodle 3.5.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.13&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2018051713&lt;br /&gt;
|[[Moodle 3.5.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.14&lt;br /&gt;
| 14 September 2020&lt;br /&gt;
|2018051714&lt;br /&gt;
|[[Moodle 3.5.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.15&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2018051715&lt;br /&gt;
|[[Moodle 3.5.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.16&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2018051716&lt;br /&gt;
| [[Moodle 3.5.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.17&lt;br /&gt;
|8 March 2021&lt;br /&gt;
| 2018051717&lt;br /&gt;
|[[Moodle 3.5.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.18&lt;br /&gt;
| 10 May 2021&lt;br /&gt;
| 2018051718&lt;br /&gt;
|[[Moodle 3.5.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.5.x ended May 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.5.x ended 10 May 2021 (36 months).&lt;br /&gt;
==Moodle 3.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017111300&lt;br /&gt;
|[[Moodle 3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/34/en/Upgrading Upgrading to 3.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.1&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017111301&lt;br /&gt;
|[[Moodle 3.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.2&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017111302&lt;br /&gt;
|[[Moodle 3.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.3&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017111303&lt;br /&gt;
|[[Moodle 3.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.4&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017111304&lt;br /&gt;
|[[Moodle 3.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.5&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017111305&lt;br /&gt;
|[[Moodle 3.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.6&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017111306&lt;br /&gt;
| [[Moodle 3.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.7&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2017111307&lt;br /&gt;
|[[Moodle 3.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.8&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2017111308&lt;br /&gt;
|[[Moodle 3.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.9&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2017111309&lt;br /&gt;
| [[Moodle 3.4.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.4.x ended 12 November 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.4.x ended 13 May 2019 (18 months).&lt;br /&gt;
==Moodle 3.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3&lt;br /&gt;
|15 May 2017&lt;br /&gt;
|2017051500&lt;br /&gt;
|[[Moodle 3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/33/en/Upgrading Upgrading to 3.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.1&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2017051501&lt;br /&gt;
|[[Moodle 3.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.2&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2017051502&lt;br /&gt;
|[[Moodle 3.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.3&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017051503&lt;br /&gt;
| [[Moodle 3.3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.4&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017051504&lt;br /&gt;
|[[Moodle 3.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.5&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017051505&lt;br /&gt;
|[[Moodle 3.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.6&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017051506&lt;br /&gt;
|[[Moodle 3.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.7&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017051507&lt;br /&gt;
|[[Moodle 3.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.8&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017051508&lt;br /&gt;
|[[Moodle 3.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.9&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017051509&lt;br /&gt;
|[[Moodle 3.3.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.3.x ended 17 May 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.3.x ended 12 November 2018 (18 months).&lt;br /&gt;
==Moodle 3.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2&lt;br /&gt;
| 5 December 2016&lt;br /&gt;
|2016120500&lt;br /&gt;
|[[Moodle 3.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/32/en/Upgrading Upgrading to 3.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.1&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016120501&lt;br /&gt;
|[[Moodle 3.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.2&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016120502&lt;br /&gt;
|[[Moodle 3.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.3&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016120503&lt;br /&gt;
|[[Moodle 3.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.4&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016120504&lt;br /&gt;
|[[Moodle 3.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.5&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016120505&lt;br /&gt;
|[[Moodle 3.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.6&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016120506&lt;br /&gt;
| [[Moodle 3.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.7&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016120507&lt;br /&gt;
|[[Moodle 3.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.8&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016120508&lt;br /&gt;
|[[Moodle 3.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.9&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016120509&lt;br /&gt;
| [[Moodle 3.2.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.2.x ended 13 November 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.2.x ended 17 May 2018 (18 months).&lt;br /&gt;
==Moodle 3.1 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1&lt;br /&gt;
|23 May 2016&lt;br /&gt;
|2016052300&lt;br /&gt;
|[[Moodle 3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/31/en/Upgrading Upgrading to 3.1]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.1&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2016052301&lt;br /&gt;
|[[Moodle 3.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.2&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2016052302&lt;br /&gt;
|[[Moodle 3.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.3&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2016052303&lt;br /&gt;
|[[Moodle 3.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.4&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016052304&lt;br /&gt;
|[[Moodle 3.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.5&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016052305&lt;br /&gt;
|[[Moodle 3.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.6&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016052306&lt;br /&gt;
|[[Moodle 3.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.7&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016052307&lt;br /&gt;
|[[Moodle 3.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.8&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016052308&lt;br /&gt;
|[[Moodle 3.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.9&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016052309&lt;br /&gt;
|[[Moodle 3.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.10&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016052310&lt;br /&gt;
|[[Moodle 3.1.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.11&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016052311&lt;br /&gt;
|[[Moodle 3.1.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.12&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016052312&lt;br /&gt;
|[[Moodle 3.1.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.13&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2016052313&lt;br /&gt;
|[[Moodle 3.1.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.14&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2016052314&lt;br /&gt;
|[[Moodle 3.1.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.15&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2016052315&lt;br /&gt;
|[[Moodle 3.1.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.16&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2016052316&lt;br /&gt;
|[[Moodle 3.1.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.17&lt;br /&gt;
|11 March 2019&lt;br /&gt;
| 2016052317&lt;br /&gt;
|[[Moodle 3.1.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.18&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2016052318&lt;br /&gt;
|[[Moodle 3.1.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.1.x ended 8 May 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.1.x ended 13 May 2019 (36 months).&lt;br /&gt;
==Moodle 3.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0&lt;br /&gt;
|16 November 2015&lt;br /&gt;
|2015111600&lt;br /&gt;
|[[Moodle 3.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/30/en/Upgrading Upgrading to 3.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.1&lt;br /&gt;
|21 December 2015&lt;br /&gt;
|2015111601&lt;br /&gt;
| [[Moodle 3.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.2&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015111602&lt;br /&gt;
|[[Moodle 3.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.3&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015111603&lt;br /&gt;
|[[Moodle 3.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.4&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015111604&lt;br /&gt;
|[[Moodle 3.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.5&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015111605&lt;br /&gt;
|[[Moodle 3.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.6&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015111606&lt;br /&gt;
|[[Moodle 3.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.7&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015111607&lt;br /&gt;
|[[Moodle 3.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.8&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2015111608&lt;br /&gt;
|[[Moodle 3.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.9&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2015111609&lt;br /&gt;
|[[Moodle 3.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.10&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2015111610&lt;br /&gt;
|[[Moodle 3.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.0.x ended 14 November 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.0.x ended 8 May 2017 (18 months).&lt;br /&gt;
==Moodle 2.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9&lt;br /&gt;
| 11 May 2015&lt;br /&gt;
|2015051100&lt;br /&gt;
|[[Moodle 2.9 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/29/en/Upgrading_to_Moodle_2.9 Upgrading to 2.9]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.1&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2015051101&lt;br /&gt;
|[[Moodle 2.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.2&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2015051102&lt;br /&gt;
| [[Moodle 2.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.3&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2015051103&lt;br /&gt;
| [[Moodle 2.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.4&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015051104&lt;br /&gt;
|[[Moodle 2.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.5&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015051105&lt;br /&gt;
|[[Moodle 2.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.6&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015051106&lt;br /&gt;
|[[Moodle 2.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.7&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015051107&lt;br /&gt;
|[[Moodle 2.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.8&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015051108&lt;br /&gt;
|[[Moodle 2.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.9&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015051109&lt;br /&gt;
|[[Moodle 2.9.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.9.x ended 9 May 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.9.x ended 14 November 2016 (18 months).&lt;br /&gt;
==Moodle 2.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014111000&lt;br /&gt;
| [[Moodle 2.8 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/28/en/Upgrading_to_Moodle_2.8 Upgrading to 2.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.1&lt;br /&gt;
|13 November 2014&lt;br /&gt;
|2014111001&lt;br /&gt;
| [[Moodle 2.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.2&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014111002&lt;br /&gt;
| [[Moodle 2.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.3&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014111003&lt;br /&gt;
|[[Moodle 2.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.4&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014111004&lt;br /&gt;
|[[Moodle 2.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.5&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014111005&lt;br /&gt;
|[[Moodle 2.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.6&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014111006&lt;br /&gt;
|[[Moodle 2.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.7&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014111007&lt;br /&gt;
|[[Moodle 2.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.8&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2014111008&lt;br /&gt;
| [[Moodle 2.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.9&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014111009&lt;br /&gt;
|[[Moodle 2.8.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.10&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014111010&lt;br /&gt;
|[[Moodle 2.8.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.11&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014111011&lt;br /&gt;
|[[Moodle 2.8.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.12&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014111012&lt;br /&gt;
| [[Moodle 2.8.12 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.8.x ended 9 November 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.8.x ended 9 May 2016 (18 months).&lt;br /&gt;
==Moodle 2.7 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7&lt;br /&gt;
| 12 May 2014&lt;br /&gt;
|2014051200&lt;br /&gt;
|[[Moodle 2.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/27/en/Upgrading_to_Moodle_2.7 Upgrading to 2.7]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.1&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2014051201&lt;br /&gt;
|[[Moodle 2.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.2&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2014051202&lt;br /&gt;
|[[Moodle 2.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.3&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014051203&lt;br /&gt;
| [[Moodle 2.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.4&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014051204&lt;br /&gt;
| [[Moodle 2.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.5&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014051205&lt;br /&gt;
|[[Moodle 2.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.6&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014051206&lt;br /&gt;
|[[Moodle 2.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.7&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014051207&lt;br /&gt;
|[[Moodle 2.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.8&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014051208&lt;br /&gt;
|[[Moodle 2.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.9&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014051209&lt;br /&gt;
|[[Moodle 2.7.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.10&lt;br /&gt;
| 14 September 2015&lt;br /&gt;
|2014051210&lt;br /&gt;
|[[Moodle 2.7.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.11&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014051211&lt;br /&gt;
|[[Moodle 2.7.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.12&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014051212&lt;br /&gt;
|[[Moodle 2.7.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.13&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014051213&lt;br /&gt;
|[[Moodle 2.7.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.14&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014051214&lt;br /&gt;
| [[Moodle 2.7.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.15&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2014051215&lt;br /&gt;
|[[Moodle 2.7.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.16&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2014051216&lt;br /&gt;
|[[Moodle 2.7.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.17&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2014051217&lt;br /&gt;
|[[Moodle 2.7.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.18&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2014051218&lt;br /&gt;
|[[Moodle 2.7.18 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.19&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2014051219&lt;br /&gt;
|[[Moodle 2.7.19 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.20&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2014051220&lt;br /&gt;
| [[Moodle 2.7.20 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.7.x ended 11 May 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.7.x ended 8 May 2017 (36 months).&lt;br /&gt;
==Moodle 2.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6&lt;br /&gt;
|18 November 2013&lt;br /&gt;
|2013111800&lt;br /&gt;
|[[Moodle 2.6 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/26/en/Upgrading_to_Moodle_2.6 Upgrading to 2.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.1&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013111801&lt;br /&gt;
| [[Moodle 2.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.2&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013111802&lt;br /&gt;
|[[Moodle 2.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.3&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013111803&lt;br /&gt;
|[[Moodle 2.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.4&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013111804&lt;br /&gt;
|[[Moodle 2.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.5&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013111805&lt;br /&gt;
|[[Moodle 2.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.6&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2013111806&lt;br /&gt;
|[[Moodle 2.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.7&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2013111807&lt;br /&gt;
|[[Moodle 2.6.7 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.8&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2013111808&lt;br /&gt;
|[[Moodle 2.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.9&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2013111809&lt;br /&gt;
|[[Moodle 2.6.9 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.10&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2013111810&lt;br /&gt;
| [[Moodle 2.6.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.11&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2013111811&lt;br /&gt;
|[[Moodle 2.6.11 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.6.x ended 10 November 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.6.x ended 11 May 2015 (18 months).&lt;br /&gt;
==Moodle 2.5==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5&lt;br /&gt;
| 14 May 2013&lt;br /&gt;
|2013051400&lt;br /&gt;
|[[Moodle 2.5 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/25/en/Upgrading_to_Moodle_2.5 Upgrading to 2.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.1&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2013051401&lt;br /&gt;
|[[Moodle 2.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.2&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2013051402&lt;br /&gt;
|[[Moodle 2.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.3&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2013051403&lt;br /&gt;
|[[Moodle 2.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.4&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013051404&lt;br /&gt;
| [[Moodle 2.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.5&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013051405&lt;br /&gt;
|[[Moodle 2.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.6&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013051406&lt;br /&gt;
|[[Moodle 2.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.7&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013051407&lt;br /&gt;
|[[Moodle 2.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.8&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013051408&lt;br /&gt;
|[[Moodle 2.5.8 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.9&lt;br /&gt;
| 10 November 2014&lt;br /&gt;
|2013051409&lt;br /&gt;
|[[Moodle 2.5.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.5.x ended May 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.5.x ended 10 November 2014 (18 months).&lt;br /&gt;
==Moodle 2.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4&lt;br /&gt;
|3 December 2012&lt;br /&gt;
|2012120300&lt;br /&gt;
|[[Moodle 2.4 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/24/en/Upgrading_to_Moodle_2.4 Upgrading to 2.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.1&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012120301&lt;br /&gt;
|[[Moodle 2.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.2&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012120302&lt;br /&gt;
|[[Moodle 2.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.3&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012120303&lt;br /&gt;
|[[Moodle 2.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.4&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012120304&lt;br /&gt;
|[[Moodle 2.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.5&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012120305&lt;br /&gt;
|[[Moodle 2.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.6&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012120306&lt;br /&gt;
|[[Moodle 2.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.7&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012120307&lt;br /&gt;
| [[Moodle 2.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.8&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012120308&lt;br /&gt;
|[[Moodle 2.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.9&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2012120309&lt;br /&gt;
|[[Moodle 2.4.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.10&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2012120310&lt;br /&gt;
| [[Moodle 2.4.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.11&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2012120311&lt;br /&gt;
|[[Moodle 2.4.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.4.x ended December 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.4.x ended June 2014 (18 months).&lt;br /&gt;
==Moodle 2.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3&lt;br /&gt;
|25 June 2012&lt;br /&gt;
|2012062500&lt;br /&gt;
|[[Moodle 2.3 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/23/en/Upgrading_to_Moodle_2.3 Upgrading to 2.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.1&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2012062501&lt;br /&gt;
|[[Moodle 2.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.2&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2012062502&lt;br /&gt;
|[[Moodle 2.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.3&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2012062503&lt;br /&gt;
|[[Moodle 2.3.3 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.4&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012062504&lt;br /&gt;
|[[Moodle 2.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.5&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012062505&lt;br /&gt;
|[[Moodle 2.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.6&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012062506&lt;br /&gt;
|[[Moodle 2.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.7&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012062507&lt;br /&gt;
|[[Moodle 2.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.8&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012062508&lt;br /&gt;
|[[Moodle 2.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.9&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012062509&lt;br /&gt;
|[[Moodle 2.3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.10&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012062510&lt;br /&gt;
|[[Moodle 2.3.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.11&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012062511&lt;br /&gt;
|[[Moodle 2.3.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.3.x ended June 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.3.x ended December 2013 (18 months).&lt;br /&gt;
==Moodle 2.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2&lt;br /&gt;
|5 December 2011&lt;br /&gt;
|2011120500&lt;br /&gt;
|[[Moodle 2.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/22/en/Upgrading_to_Moodle_2.2 Upgrading to 2.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.1&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011120501&lt;br /&gt;
|[[Moodle 2.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.2&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011120502&lt;br /&gt;
|[[Moodle 2.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.3&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011120503&lt;br /&gt;
|[[Moodle 2.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.4&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011120504&lt;br /&gt;
|[[Moodle 2.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.5&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011120505&lt;br /&gt;
|[[Moodle 2.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.6&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011120506&lt;br /&gt;
| [[Moodle 2.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.7&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011120507&lt;br /&gt;
|[[Moodle 2.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.8&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2011120508&lt;br /&gt;
|[[Moodle 2.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.9&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2011120509&lt;br /&gt;
|[[Moodle 2.2.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.10&lt;br /&gt;
|14 May 2013&lt;br /&gt;
| 2011120510&lt;br /&gt;
|[[Moodle 2.2.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.11&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2011120511&lt;br /&gt;
|[[Moodle 2.2.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.2.x ended December 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.2.x ended June 2013 (18 months).&lt;br /&gt;
==Moodle 2.1==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1&lt;br /&gt;
| 1 July 2011&lt;br /&gt;
|2011070100&lt;br /&gt;
|[[Moodle 2.1 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/21/en/Upgrading_to_Moodle_2.1 Upgrading to 2.1]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.1&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011070101&lt;br /&gt;
| [[Moodle 2.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.2&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011070102&lt;br /&gt;
|[[Moodle 2.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.3&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011070103&lt;br /&gt;
|[[Moodle 2.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.4&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011070104&lt;br /&gt;
|[[Moodle 2.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.5&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011070105&lt;br /&gt;
|[[Moodle 2.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.6&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011070106&lt;br /&gt;
|[[Moodle 2.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.7&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011070107&lt;br /&gt;
|[[Moodle 2.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.8&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011070108&lt;br /&gt;
|[[Moodle 2.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.9&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011070109&lt;br /&gt;
|[[Moodle 2.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.10&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011070110&lt;br /&gt;
|[[Moodle 2.1.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.1.x ended June 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.1.x ended December 2012 (18 months).&lt;br /&gt;
==Moodle 2.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0&lt;br /&gt;
|24 November 2010&lt;br /&gt;
|2010112400&lt;br /&gt;
| [[Moodle 2.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/20/en/Upgrading_to_Moodle_2.0 Upgrading to 2.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.1&lt;br /&gt;
|25 December 2010&lt;br /&gt;
|2010122500&lt;br /&gt;
|[[Moodle 2.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.2&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2011022100&lt;br /&gt;
|[[Moodle 2.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.3&lt;br /&gt;
|5 May 2011&lt;br /&gt;
|2011033003&lt;br /&gt;
|[[Moodle 2.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.4&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011033004&lt;br /&gt;
| [[Moodle 2.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.5&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011033005&lt;br /&gt;
|[[Moodle 2.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.6&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011033006&lt;br /&gt;
|[[Moodle 2.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.7&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011033007&lt;br /&gt;
|[[Moodle 2.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.8&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011033008&lt;br /&gt;
|[[Moodle 2.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.9&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011033009&lt;br /&gt;
|[[Moodle 2.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.10&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011033010&lt;br /&gt;
|[[Moodle 2.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.0.x ended December 2011 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.0.x ended June 2012 (18 months).&lt;br /&gt;
==Moodle 1.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9&lt;br /&gt;
|3 March 2008&lt;br /&gt;
|2007101509&lt;br /&gt;
|[[Moodle 1.9 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/19/en/Upgrading_to_Moodle_1.9 Upgrading to 1.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.1&lt;br /&gt;
|15 May 2008&lt;br /&gt;
| 2007101512&lt;br /&gt;
|[[Moodle 1.9.1 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.2&lt;br /&gt;
|11 July 2008&lt;br /&gt;
|2007101520&lt;br /&gt;
|[[Moodle 1.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.3&lt;br /&gt;
|15 October 2008&lt;br /&gt;
|2007101530&lt;br /&gt;
|[[Moodle 1.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.4&lt;br /&gt;
|28 January 2009&lt;br /&gt;
|2007101540&lt;br /&gt;
|[[Moodle 1.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.5&lt;br /&gt;
|13 May 2009&lt;br /&gt;
|2007101550&lt;br /&gt;
|[[Moodle 1.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.6&lt;br /&gt;
|21 October 2009&lt;br /&gt;
|2007101560&lt;br /&gt;
|[[Moodle 1.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.7&lt;br /&gt;
|25 November 2009&lt;br /&gt;
|2007101570&lt;br /&gt;
|[[Moodle 1.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.8&lt;br /&gt;
|25 March 2010&lt;br /&gt;
|2007101580.00&lt;br /&gt;
|[[Moodle 1.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.9&lt;br /&gt;
| 8 June 2010&lt;br /&gt;
| 2007101590.00&lt;br /&gt;
| [[Moodle 1.9.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.10&lt;br /&gt;
|25 October 2010&lt;br /&gt;
|2007101591.00&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.10 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.11&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2007101591.02&lt;br /&gt;
|[[Moodle 1.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.12&lt;br /&gt;
|10 May 2011&lt;br /&gt;
|2007101591.03&lt;br /&gt;
|[[Moodle 1.9.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.13&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2007101591.04&lt;br /&gt;
|[[Moodle 1.9.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.14&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2007101591.06&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.15&lt;br /&gt;
|28 November 2011&lt;br /&gt;
| 2007101591.07&lt;br /&gt;
| [[Moodle 1.9.15 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.16&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2007101591.10&lt;br /&gt;
|[[Moodle 1.9.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.17&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2007101591.12&lt;br /&gt;
|[[Moodle 1.9.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.18&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2007101591.16&lt;br /&gt;
|[[Moodle 1.9.18 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.19&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2007101592.00&lt;br /&gt;
|[[Moodle 1.9.19 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 1.9.x has ended June 2011 (3.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.x by Moodle HQ ended June 2012 (4.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.19+ branch by [http://catalyst.net.nz Catalyst IT] ended [http://moodle.org/mod/forum/discuss.php?d=199706 Dec 2013] (6 years).&lt;br /&gt;
==Moodle 1.8 ==&lt;br /&gt;
*[[Moodle 1.8 release notes|Moodle 1.8]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.8.1 release notes|Moodle 1.8.1]] - 14 June 2007&lt;br /&gt;
*[[Moodle 1.8.2 release notes|Moodle 1.8.2]] - 8 July 2007&lt;br /&gt;
*[[Moodle 1.8.3 release notes|Moodle 1.8.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.8.4 release notes|Moodle 1.8.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.8.5 release notes|Moodle 1.8.5]] - 8 April 2008&lt;br /&gt;
*[[Moodle 1.8.6 release notes|Moodle 1.8.6]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.8.7 release notes|Moodle 1.8.7]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.8.8 release notes|Moodle 1.8.8]] - 28 January 2009&lt;br /&gt;
*[[Moodle 1.8.9 release notes|Moodle 1.8.9]] - 15 May 2009&lt;br /&gt;
*[[Moodle 1.8.10 release notes|Moodle 1.8.10]] - 26 October 2009&lt;br /&gt;
*[[Moodle 1.8.11 release notes|Moodle 1.8.11]] - 25 November 2009&lt;br /&gt;
*[[Moodle 1.8.12 release notes|Moodle 1.8.12]] - 27 March 2010&lt;br /&gt;
*[[Moodle 1.8.13 release notes|Moodle 1.8.13]] - 8 June 2010&lt;br /&gt;
*[[Moodle 1.8.14 release notes|Moodle 1.8.14]] - 3 December 2010&lt;br /&gt;
*Support has ended&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.7==&lt;br /&gt;
*[[Moodle 1.7 release notes|Moodle 1.7]] - 7 November 2006&lt;br /&gt;
*[[Moodle 1.7.1 release notes|Moodle 1.7.1]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.7.2 release notes|Moodle 1.7.2]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.7.3 release notes|Moodle 1.7.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.7.4 release notes|Moodle 1.7.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.7.5 release notes|Moodle 1.7.5]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.7.6 release notes|Moodle 1.7.6]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.7.7 release notes|Moodle 1.7.7]] - 28 January 2009&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.6==&lt;br /&gt;
*[[Moodle 1.6 release notes|Moodle 1.6]] - 20 June 2006&lt;br /&gt;
*[[Moodle 1.6.1 release notes|Moodle 1.6.1]] - 20 July 2006&lt;br /&gt;
*[[Moodle 1.6.2 release notes|Moodle 1.6.2]] - 12 September 2006&lt;br /&gt;
*[[Moodle 1.6.3 release notes|Moodle 1.6.3]] - 10 October 2006&lt;br /&gt;
*[[Moodle 1.6.4 release notes|Moodle 1.6.4]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.6.5 release notes|Moodle 1.6.5]] - 30 March 2007&lt;br /&gt;
*Moodle 1.6.6 - 11 January 2008&lt;br /&gt;
*Moodle 1.6.7 - 11 July 2008&lt;br /&gt;
*[[Moodle 1.6.8 release notes|Moodle 1.6.8]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.6.9 release notes|Moodle 1.6.9]] - 28 January 2009&lt;br /&gt;
* Support has ended&lt;br /&gt;
==Moodle 1.5==&lt;br /&gt;
*[[Moodle 1.5 release notes|Moodle 1.5]] - 5 June 2005&lt;br /&gt;
*[[Moodle 1.5.1 release notes|Moodle 1.5.1]] - 8 July 2005&lt;br /&gt;
*[[Moodle 1.5.2 release notes|Moodle 1.5.2]] - 16 July 2005&lt;br /&gt;
*[[Moodle 1.5.3 release notes|Moodle 1.5.3]] - 11 November 2005&lt;br /&gt;
*[[Moodle 1.5.4 release notes|Moodle 1.5.4]] - 21 May 2006&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.4==&lt;br /&gt;
*Moodle 1.4 - 31 August 2004&lt;br /&gt;
*Moodle 1.4.1 - 12 September 2004&lt;br /&gt;
*Moodle 1.4.2 - 5 November 2004&lt;br /&gt;
*Moodle 1.4.3 - 21 December 2004&lt;br /&gt;
*Moodle 1.4.4 - 7 March 2005&lt;br /&gt;
*[[Moodle 1.4.5 release notes|Moodle 1.4.5]] - 7 May 2005&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.3==&lt;br /&gt;
*Moodle 1.3 - 25 May 2004&lt;br /&gt;
* Moodle 1.3.1 - 4 June 2004&lt;br /&gt;
*Moodle 1.3.2 - 9 July 2004&lt;br /&gt;
*Moodle 1.3.3 - 16 July 2004&lt;br /&gt;
* Moodle 1.3.4 - 11 August 2004&lt;br /&gt;
*Moodle 1.3.5 - 9 September 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.2==&lt;br /&gt;
*Moodle 1.2 - 20 March 2004&lt;br /&gt;
*Moodle 1.2.1 - 25 March 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.1==&lt;br /&gt;
*Moodle 1.1 - 29 August 2003&lt;br /&gt;
*Moodle 1.1.1 - 11 September 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
== Moodle 1.0==&lt;br /&gt;
*Moodle 1.0 - 20 August 2002&lt;br /&gt;
*Moodle 1.0.1 - 26 August 2002&lt;br /&gt;
*Moodle 1.0.2 - 2 September 2002&lt;br /&gt;
*Moodle 1.0.3 - 5 September 2002&lt;br /&gt;
*Moodle 1.0.4 - 10 September 2002&lt;br /&gt;
*Moodle 1.0.5 - 27 September 2002&lt;br /&gt;
* Moodle 1.0.6 - 26 October 2002&lt;br /&gt;
::1.0.6.1 - 6 November 2002&lt;br /&gt;
::1.0.6.2 - 11 November 2002&lt;br /&gt;
::1.0.6.3 - 14 November 2002&lt;br /&gt;
::1.0.6.4 - 25 November 2002&lt;br /&gt;
*Moodle 1.0.7 - 9 December 2002&lt;br /&gt;
*Moodle 1.0.8 - 7 January 2003&lt;br /&gt;
*Moodle 1.0.9 - 30 May 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Roadmap]] - future versions&lt;br /&gt;
*[[Moodle versions]] - an explanation of how our versions work plus version numbers for each release (for $plugin-&amp;gt;requires)&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Core development]]&lt;br /&gt;
[[fr:Historique des versions]]&lt;br /&gt;
[[es:dev/Historia de las versiones]]&lt;br /&gt;
[[de:Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=61812</id>
		<title>Releases</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=61812"/>
		<updated>2022-03-14T07:46:41Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* Moodle 3.10.10 detail update */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all official releases of Moodle, grouped by branch in reverse chronological order.&lt;br /&gt;
==Version support==&lt;br /&gt;
From Moodle 2.6 onwards, the end of support, both general and security, happens the second Monday of May and November, observing the 12, 18... month periods, no matter if the major release date was moved or not.&lt;br /&gt;
&lt;br /&gt;
The most recent [https://en.wikipedia.org/wiki/Long-term_support long-term support release (LTS)] version is Moodle 3.9.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Version&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Release status&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Initial release&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:rgba(0, 0, 0, 0.05);&amp;quot; | General support ends&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Security support ends&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.9 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 15 June 2020&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 10 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 November 2023 (ext 6M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.10&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 9 November 2020&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 8 November 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 9 May 2022&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.11&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 17 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 14 Nov 2022 (ext 6M)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 Nov 2023 (ext 12M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |4.0&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |April 2022&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |May 2023&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |November 2023&lt;br /&gt;
|-&lt;br /&gt;
|4.1 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stable&lt;br /&gt;
|November 2022&lt;br /&gt;
|November 2023&lt;br /&gt;
|November 2025&lt;br /&gt;
|}&lt;br /&gt;
[[Image:releasescurrent.png|alt=Release graph]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Release graph key:&amp;lt;/b&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Currently supported stable releases.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | Current release of versions still receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Future point releases receiving bug fixes, as well as security updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#316d5e; color:white; adding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Future point releases receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#686566; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Previously released versions containing bug fixes, as well as security updates. Updating to a currently supported version is recommended.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#282828; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Previously released versions containing security updates only. Updating to a currently supported version is recommended.&lt;br /&gt;
|}&lt;br /&gt;
==General release calendar==&lt;br /&gt;
These are the target dates for releases. These dates may vary slightly due to unforeseen circumstances.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Release type&lt;br /&gt;
!Frequency&lt;br /&gt;
!Months&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Major_release_cycles|Major]] (eg. 3.x)&lt;br /&gt;
|6 monthly&lt;br /&gt;
|Second Monday of May and November&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Stable_maintenance_cycles|Minor]] (Point) (eg. 3.x.y)&lt;br /&gt;
| 2 monthly&lt;br /&gt;
|Second Monday of July, September, November, March and May.&lt;br /&gt;
Third Monday of January.&lt;br /&gt;
|}&lt;br /&gt;
All releases are preceded by a one week warning. Upcoming release dates can be found in the [https://www.google.com/calendar/ical/moodle.com_p4c2oe7hsb77ltaro5qtihb5d4%40group.calendar.google.com/public/basic.ics Moodle development calendar] (Note, this is an iCAL link that will try to add the dates to your personal calendar. If you just want to browse the dates online, use [https://calendar.google.com/calendar/embed?src=moodle.com_p4c2oe7hsb77ltaro5qtihb5d4@group.calendar.google.com&amp;amp;pli=1 this link].).&lt;br /&gt;
==Moodle 3.11==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11&lt;br /&gt;
|17 May 2021&lt;br /&gt;
|2021051700&lt;br /&gt;
|[[Moodle 3.11 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/311/en/Upgrading Upgrading to 3.11]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.1&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2021051701&lt;br /&gt;
|[[Moodle 3.11.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.2&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2021051702&lt;br /&gt;
|[[Moodle 3.11.2 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.3&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2021051703&lt;br /&gt;
|[[Moodle 3.11.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.4&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2021051704&lt;br /&gt;
|[[Moodle 3.11.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.5&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2021051705&lt;br /&gt;
|[[Moodle 3.11.5 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.6&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2021051706&lt;br /&gt;
|[[Moodle 3.11.6 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).&lt;br /&gt;
 Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.10==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020110900&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 3.10 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/310/en/Upgrading Upgrading to 3.10]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.1&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020110901&lt;br /&gt;
| [[Moodle 3.10.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.2&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020110902&lt;br /&gt;
|[[Moodle 3.10.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.3&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020110903&lt;br /&gt;
|[[Moodle 3.10.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.4&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020110904&lt;br /&gt;
|[[Moodle 3.10.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.5&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020110905&lt;br /&gt;
|[[Moodle 3.10.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.6&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020110906&lt;br /&gt;
|[[Moodle 3.10.6 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.7&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020110907&lt;br /&gt;
|[[Moodle 3.10.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.8&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2020110908&lt;br /&gt;
|[[Moodle 3.10.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.9&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2020110909&lt;br /&gt;
|[[Moodle 3.10.9 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.10&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2020110910&lt;br /&gt;
|[[Moodle 3.10.10 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.10.x ended 8 November 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.9 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9&lt;br /&gt;
|15 June 2020&lt;br /&gt;
|2020061500&lt;br /&gt;
|[[Moodle 3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/39/en/Upgrading Upgrading to 3.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.1&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2020061501&lt;br /&gt;
|[[Moodle 3.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.2&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2020061502&lt;br /&gt;
| [[Moodle 3.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.3&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020061503&lt;br /&gt;
| [[Moodle 3.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.4&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020061504&lt;br /&gt;
|[[Moodle 3.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.5&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020061505&lt;br /&gt;
|[[Moodle 3.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.6&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020061506&lt;br /&gt;
|[[Moodle 3.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.7&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020061507&lt;br /&gt;
|[[Moodle 3.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.8&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020061508&lt;br /&gt;
|[[Moodle 3.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.9&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020061509&lt;br /&gt;
|[[Moodle 3.9.9 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.10&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020061510&lt;br /&gt;
|[[Moodle 3.9.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.11&lt;br /&gt;
| 8 November 2021&lt;br /&gt;
|2020061511&lt;br /&gt;
|[[Moodle 3.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.12&lt;br /&gt;
| 17 January 2022&lt;br /&gt;
|2020061512&lt;br /&gt;
|[[Moodle 3.9.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.9.x ended 10 May 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.9.x will end 13 Nov 2023 (36 months plus 6 months extension).&lt;br /&gt;
==Moodle 3.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8&lt;br /&gt;
|18 November 2019&lt;br /&gt;
|2019111800&lt;br /&gt;
|[[Moodle 3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/38/en/Upgrading Upgrading to 3.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.1&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019111801&lt;br /&gt;
|[[Moodle 3.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.2&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019111802&lt;br /&gt;
|[[Moodle 3.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.3&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019111803&lt;br /&gt;
|[[Moodle 3.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.4&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019111804&lt;br /&gt;
|[[Moodle 3.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.5&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019111805&lt;br /&gt;
| [[Moodle 3.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.6&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019111806&lt;br /&gt;
| [[Moodle 3.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.7&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2019111807&lt;br /&gt;
|[[Moodle 3.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.8&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2019111808&lt;br /&gt;
|[[Moodle 3.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.9&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2019111809&lt;br /&gt;
|[[Moodle 3.8.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.8.x ended 9 November 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.8.x ended 10 May 2021 (18 months).&lt;br /&gt;
==Moodle 3.7==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7&lt;br /&gt;
|20 May 2019&lt;br /&gt;
|2019052000&lt;br /&gt;
|[[Moodle 3.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/37/en/Upgrading Upgrading to 3.7]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.1&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2019052001&lt;br /&gt;
|[[Moodle 3.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.2&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2019052002&lt;br /&gt;
|[[Moodle 3.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.3&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2019052003&lt;br /&gt;
| [[Moodle 3.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.4&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019052004&lt;br /&gt;
|[[Moodle 3.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.5&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019052005&lt;br /&gt;
|[[Moodle 3.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.6&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019052006&lt;br /&gt;
|[[Moodle 3.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.7&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019052007&lt;br /&gt;
|[[Moodle 3.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.8&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019052008&lt;br /&gt;
| [[Moodle 3.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.9&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019052009&lt;br /&gt;
|[[Moodle 3.7.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.7.x ended 11 May 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.7.x ended 9 November 2020 (18 months).&lt;br /&gt;
==Moodle 3.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6&lt;br /&gt;
| 3 December 2018&lt;br /&gt;
|2018120300&lt;br /&gt;
|[[Moodle 3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/36/en/Upgrading Upgrading to 3.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.1&lt;br /&gt;
|5 December 2018&lt;br /&gt;
|2018120301&lt;br /&gt;
| [[Moodle 3.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6.2&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018120302&lt;br /&gt;
|[[Moodle 3.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.3&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018120303&lt;br /&gt;
|[[Moodle 3.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.4&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018120304&lt;br /&gt;
|[[Moodle 3.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.5&lt;br /&gt;
|8th July 2019&lt;br /&gt;
|2018120305&lt;br /&gt;
|[[Moodle 3.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.6&lt;br /&gt;
|9th September 2019&lt;br /&gt;
|2018120306&lt;br /&gt;
|[[Moodle 3.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.7&lt;br /&gt;
| 11th November 2019&lt;br /&gt;
|2018120307&lt;br /&gt;
|[[Moodle 3.6.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.8&lt;br /&gt;
|13th January 2020&lt;br /&gt;
|2018120308&lt;br /&gt;
|[[Moodle 3.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.9&lt;br /&gt;
|9th March 2020&lt;br /&gt;
|2018120309&lt;br /&gt;
| [[Moodle 3.6.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.10&lt;br /&gt;
|11th May 2020&lt;br /&gt;
|2018120310&lt;br /&gt;
|[[Moodle 3.6.10 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.6.x ended 11 November 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.6.x ended 11 May 2020 (18 months).&lt;br /&gt;
==Moodle 3.5 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2018051700&lt;br /&gt;
|[[Moodle 3.5 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/35/en/Upgrading Upgrading to 3.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.1&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2018051701&lt;br /&gt;
|[[Moodle 3.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.2&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2018051702&lt;br /&gt;
|[[Moodle 3.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.3&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2018051703&lt;br /&gt;
| [[Moodle 3.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.4&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018051704&lt;br /&gt;
|[[Moodle 3.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.5&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018051705&lt;br /&gt;
|[[Moodle 3.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.6&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018051706&lt;br /&gt;
|[[Moodle 3.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.7&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2018051707&lt;br /&gt;
|[[Moodle 3.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.8&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2018051708&lt;br /&gt;
|[[Moodle 3.5.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.9&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2018051709&lt;br /&gt;
|[[Moodle 3.5.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.10&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2018051710&lt;br /&gt;
| [[Moodle 3.5.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.11&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2018051711&lt;br /&gt;
|[[Moodle 3.5.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.12&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2018051712&lt;br /&gt;
| [[Moodle 3.5.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.13&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2018051713&lt;br /&gt;
|[[Moodle 3.5.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.14&lt;br /&gt;
| 14 September 2020&lt;br /&gt;
|2018051714&lt;br /&gt;
|[[Moodle 3.5.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.15&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2018051715&lt;br /&gt;
|[[Moodle 3.5.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.16&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2018051716&lt;br /&gt;
| [[Moodle 3.5.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.17&lt;br /&gt;
|8 March 2021&lt;br /&gt;
| 2018051717&lt;br /&gt;
|[[Moodle 3.5.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.18&lt;br /&gt;
| 10 May 2021&lt;br /&gt;
| 2018051718&lt;br /&gt;
|[[Moodle 3.5.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.5.x ended May 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.5.x ended 10 May 2021 (36 months).&lt;br /&gt;
==Moodle 3.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017111300&lt;br /&gt;
|[[Moodle 3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/34/en/Upgrading Upgrading to 3.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.1&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017111301&lt;br /&gt;
|[[Moodle 3.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.2&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017111302&lt;br /&gt;
|[[Moodle 3.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.3&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017111303&lt;br /&gt;
|[[Moodle 3.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.4&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017111304&lt;br /&gt;
|[[Moodle 3.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.5&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017111305&lt;br /&gt;
|[[Moodle 3.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.6&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017111306&lt;br /&gt;
| [[Moodle 3.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.7&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2017111307&lt;br /&gt;
|[[Moodle 3.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.8&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2017111308&lt;br /&gt;
|[[Moodle 3.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.9&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2017111309&lt;br /&gt;
| [[Moodle 3.4.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.4.x ended 12 November 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.4.x ended 13 May 2019 (18 months).&lt;br /&gt;
==Moodle 3.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3&lt;br /&gt;
|15 May 2017&lt;br /&gt;
|2017051500&lt;br /&gt;
|[[Moodle 3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/33/en/Upgrading Upgrading to 3.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.1&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2017051501&lt;br /&gt;
|[[Moodle 3.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.2&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2017051502&lt;br /&gt;
|[[Moodle 3.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.3&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017051503&lt;br /&gt;
| [[Moodle 3.3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.4&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017051504&lt;br /&gt;
|[[Moodle 3.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.5&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017051505&lt;br /&gt;
|[[Moodle 3.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.6&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017051506&lt;br /&gt;
|[[Moodle 3.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.7&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017051507&lt;br /&gt;
|[[Moodle 3.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.8&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017051508&lt;br /&gt;
|[[Moodle 3.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.9&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017051509&lt;br /&gt;
|[[Moodle 3.3.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.3.x ended 17 May 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.3.x ended 12 November 2018 (18 months).&lt;br /&gt;
==Moodle 3.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2&lt;br /&gt;
| 5 December 2016&lt;br /&gt;
|2016120500&lt;br /&gt;
|[[Moodle 3.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/32/en/Upgrading Upgrading to 3.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.1&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016120501&lt;br /&gt;
|[[Moodle 3.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.2&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016120502&lt;br /&gt;
|[[Moodle 3.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.3&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016120503&lt;br /&gt;
|[[Moodle 3.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.4&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016120504&lt;br /&gt;
|[[Moodle 3.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.5&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016120505&lt;br /&gt;
|[[Moodle 3.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.6&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016120506&lt;br /&gt;
| [[Moodle 3.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.7&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016120507&lt;br /&gt;
|[[Moodle 3.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.8&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016120508&lt;br /&gt;
|[[Moodle 3.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.9&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016120509&lt;br /&gt;
| [[Moodle 3.2.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.2.x ended 13 November 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.2.x ended 17 May 2018 (18 months).&lt;br /&gt;
==Moodle 3.1 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1&lt;br /&gt;
|23 May 2016&lt;br /&gt;
|2016052300&lt;br /&gt;
|[[Moodle 3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/31/en/Upgrading Upgrading to 3.1]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.1&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2016052301&lt;br /&gt;
|[[Moodle 3.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.2&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2016052302&lt;br /&gt;
|[[Moodle 3.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.3&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2016052303&lt;br /&gt;
|[[Moodle 3.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.4&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016052304&lt;br /&gt;
|[[Moodle 3.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.5&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016052305&lt;br /&gt;
|[[Moodle 3.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.6&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016052306&lt;br /&gt;
|[[Moodle 3.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.7&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016052307&lt;br /&gt;
|[[Moodle 3.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.8&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016052308&lt;br /&gt;
|[[Moodle 3.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.9&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016052309&lt;br /&gt;
|[[Moodle 3.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.10&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016052310&lt;br /&gt;
|[[Moodle 3.1.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.11&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016052311&lt;br /&gt;
|[[Moodle 3.1.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.12&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016052312&lt;br /&gt;
|[[Moodle 3.1.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.13&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2016052313&lt;br /&gt;
|[[Moodle 3.1.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.14&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2016052314&lt;br /&gt;
|[[Moodle 3.1.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.15&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2016052315&lt;br /&gt;
|[[Moodle 3.1.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.16&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2016052316&lt;br /&gt;
|[[Moodle 3.1.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.17&lt;br /&gt;
|11 March 2019&lt;br /&gt;
| 2016052317&lt;br /&gt;
|[[Moodle 3.1.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.18&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2016052318&lt;br /&gt;
|[[Moodle 3.1.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.1.x ended 8 May 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.1.x ended 13 May 2019 (36 months).&lt;br /&gt;
==Moodle 3.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0&lt;br /&gt;
|16 November 2015&lt;br /&gt;
|2015111600&lt;br /&gt;
|[[Moodle 3.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/30/en/Upgrading Upgrading to 3.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.1&lt;br /&gt;
|21 December 2015&lt;br /&gt;
|2015111601&lt;br /&gt;
| [[Moodle 3.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.2&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015111602&lt;br /&gt;
|[[Moodle 3.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.3&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015111603&lt;br /&gt;
|[[Moodle 3.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.4&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015111604&lt;br /&gt;
|[[Moodle 3.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.5&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015111605&lt;br /&gt;
|[[Moodle 3.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.6&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015111606&lt;br /&gt;
|[[Moodle 3.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.7&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015111607&lt;br /&gt;
|[[Moodle 3.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.8&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2015111608&lt;br /&gt;
|[[Moodle 3.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.9&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2015111609&lt;br /&gt;
|[[Moodle 3.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.10&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2015111610&lt;br /&gt;
|[[Moodle 3.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.0.x ended 14 November 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.0.x ended 8 May 2017 (18 months).&lt;br /&gt;
==Moodle 2.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9&lt;br /&gt;
| 11 May 2015&lt;br /&gt;
|2015051100&lt;br /&gt;
|[[Moodle 2.9 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/29/en/Upgrading_to_Moodle_2.9 Upgrading to 2.9]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.1&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2015051101&lt;br /&gt;
|[[Moodle 2.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.2&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2015051102&lt;br /&gt;
| [[Moodle 2.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.3&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2015051103&lt;br /&gt;
| [[Moodle 2.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.4&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015051104&lt;br /&gt;
|[[Moodle 2.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.5&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015051105&lt;br /&gt;
|[[Moodle 2.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.6&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015051106&lt;br /&gt;
|[[Moodle 2.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.7&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015051107&lt;br /&gt;
|[[Moodle 2.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.8&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015051108&lt;br /&gt;
|[[Moodle 2.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.9&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015051109&lt;br /&gt;
|[[Moodle 2.9.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.9.x ended 9 May 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.9.x ended 14 November 2016 (18 months).&lt;br /&gt;
==Moodle 2.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014111000&lt;br /&gt;
| [[Moodle 2.8 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/28/en/Upgrading_to_Moodle_2.8 Upgrading to 2.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.1&lt;br /&gt;
|13 November 2014&lt;br /&gt;
|2014111001&lt;br /&gt;
| [[Moodle 2.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.2&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014111002&lt;br /&gt;
| [[Moodle 2.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.3&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014111003&lt;br /&gt;
|[[Moodle 2.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.4&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014111004&lt;br /&gt;
|[[Moodle 2.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.5&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014111005&lt;br /&gt;
|[[Moodle 2.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.6&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014111006&lt;br /&gt;
|[[Moodle 2.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.7&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014111007&lt;br /&gt;
|[[Moodle 2.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.8&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2014111008&lt;br /&gt;
| [[Moodle 2.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.9&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014111009&lt;br /&gt;
|[[Moodle 2.8.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.10&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014111010&lt;br /&gt;
|[[Moodle 2.8.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.11&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014111011&lt;br /&gt;
|[[Moodle 2.8.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.12&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014111012&lt;br /&gt;
| [[Moodle 2.8.12 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.8.x ended 9 November 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.8.x ended 9 May 2016 (18 months).&lt;br /&gt;
==Moodle 2.7 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7&lt;br /&gt;
| 12 May 2014&lt;br /&gt;
|2014051200&lt;br /&gt;
|[[Moodle 2.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/27/en/Upgrading_to_Moodle_2.7 Upgrading to 2.7]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.1&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2014051201&lt;br /&gt;
|[[Moodle 2.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.2&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2014051202&lt;br /&gt;
|[[Moodle 2.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.3&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014051203&lt;br /&gt;
| [[Moodle 2.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.4&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014051204&lt;br /&gt;
| [[Moodle 2.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.5&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014051205&lt;br /&gt;
|[[Moodle 2.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.6&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014051206&lt;br /&gt;
|[[Moodle 2.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.7&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014051207&lt;br /&gt;
|[[Moodle 2.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.8&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014051208&lt;br /&gt;
|[[Moodle 2.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.9&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014051209&lt;br /&gt;
|[[Moodle 2.7.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.10&lt;br /&gt;
| 14 September 2015&lt;br /&gt;
|2014051210&lt;br /&gt;
|[[Moodle 2.7.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.11&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014051211&lt;br /&gt;
|[[Moodle 2.7.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.12&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014051212&lt;br /&gt;
|[[Moodle 2.7.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.13&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014051213&lt;br /&gt;
|[[Moodle 2.7.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.14&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014051214&lt;br /&gt;
| [[Moodle 2.7.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.15&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2014051215&lt;br /&gt;
|[[Moodle 2.7.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.16&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2014051216&lt;br /&gt;
|[[Moodle 2.7.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.17&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2014051217&lt;br /&gt;
|[[Moodle 2.7.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.18&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2014051218&lt;br /&gt;
|[[Moodle 2.7.18 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.19&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2014051219&lt;br /&gt;
|[[Moodle 2.7.19 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.20&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2014051220&lt;br /&gt;
| [[Moodle 2.7.20 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.7.x ended 11 May 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.7.x ended 8 May 2017 (36 months).&lt;br /&gt;
==Moodle 2.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6&lt;br /&gt;
|18 November 2013&lt;br /&gt;
|2013111800&lt;br /&gt;
|[[Moodle 2.6 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/26/en/Upgrading_to_Moodle_2.6 Upgrading to 2.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.1&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013111801&lt;br /&gt;
| [[Moodle 2.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.2&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013111802&lt;br /&gt;
|[[Moodle 2.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.3&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013111803&lt;br /&gt;
|[[Moodle 2.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.4&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013111804&lt;br /&gt;
|[[Moodle 2.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.5&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013111805&lt;br /&gt;
|[[Moodle 2.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.6&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2013111806&lt;br /&gt;
|[[Moodle 2.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.7&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2013111807&lt;br /&gt;
|[[Moodle 2.6.7 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.8&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2013111808&lt;br /&gt;
|[[Moodle 2.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.9&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2013111809&lt;br /&gt;
|[[Moodle 2.6.9 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.10&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2013111810&lt;br /&gt;
| [[Moodle 2.6.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.11&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2013111811&lt;br /&gt;
|[[Moodle 2.6.11 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.6.x ended 10 November 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.6.x ended 11 May 2015 (18 months).&lt;br /&gt;
==Moodle 2.5==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5&lt;br /&gt;
| 14 May 2013&lt;br /&gt;
|2013051400&lt;br /&gt;
|[[Moodle 2.5 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/25/en/Upgrading_to_Moodle_2.5 Upgrading to 2.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.1&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2013051401&lt;br /&gt;
|[[Moodle 2.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.2&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2013051402&lt;br /&gt;
|[[Moodle 2.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.3&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2013051403&lt;br /&gt;
|[[Moodle 2.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.4&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013051404&lt;br /&gt;
| [[Moodle 2.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.5&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013051405&lt;br /&gt;
|[[Moodle 2.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.6&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013051406&lt;br /&gt;
|[[Moodle 2.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.7&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013051407&lt;br /&gt;
|[[Moodle 2.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.8&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013051408&lt;br /&gt;
|[[Moodle 2.5.8 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.9&lt;br /&gt;
| 10 November 2014&lt;br /&gt;
|2013051409&lt;br /&gt;
|[[Moodle 2.5.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.5.x ended May 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.5.x ended 10 November 2014 (18 months).&lt;br /&gt;
==Moodle 2.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4&lt;br /&gt;
|3 December 2012&lt;br /&gt;
|2012120300&lt;br /&gt;
|[[Moodle 2.4 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/24/en/Upgrading_to_Moodle_2.4 Upgrading to 2.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.1&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012120301&lt;br /&gt;
|[[Moodle 2.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.2&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012120302&lt;br /&gt;
|[[Moodle 2.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.3&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012120303&lt;br /&gt;
|[[Moodle 2.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.4&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012120304&lt;br /&gt;
|[[Moodle 2.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.5&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012120305&lt;br /&gt;
|[[Moodle 2.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.6&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012120306&lt;br /&gt;
|[[Moodle 2.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.7&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012120307&lt;br /&gt;
| [[Moodle 2.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.8&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012120308&lt;br /&gt;
|[[Moodle 2.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.9&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2012120309&lt;br /&gt;
|[[Moodle 2.4.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.10&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2012120310&lt;br /&gt;
| [[Moodle 2.4.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.11&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2012120311&lt;br /&gt;
|[[Moodle 2.4.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.4.x ended December 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.4.x ended June 2014 (18 months).&lt;br /&gt;
==Moodle 2.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3&lt;br /&gt;
|25 June 2012&lt;br /&gt;
|2012062500&lt;br /&gt;
|[[Moodle 2.3 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/23/en/Upgrading_to_Moodle_2.3 Upgrading to 2.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.1&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2012062501&lt;br /&gt;
|[[Moodle 2.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.2&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2012062502&lt;br /&gt;
|[[Moodle 2.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.3&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2012062503&lt;br /&gt;
|[[Moodle 2.3.3 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.4&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012062504&lt;br /&gt;
|[[Moodle 2.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.5&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012062505&lt;br /&gt;
|[[Moodle 2.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.6&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012062506&lt;br /&gt;
|[[Moodle 2.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.7&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012062507&lt;br /&gt;
|[[Moodle 2.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.8&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012062508&lt;br /&gt;
|[[Moodle 2.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.9&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012062509&lt;br /&gt;
|[[Moodle 2.3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.10&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012062510&lt;br /&gt;
|[[Moodle 2.3.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.11&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012062511&lt;br /&gt;
|[[Moodle 2.3.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.3.x ended June 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.3.x ended December 2013 (18 months).&lt;br /&gt;
==Moodle 2.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2&lt;br /&gt;
|5 December 2011&lt;br /&gt;
|2011120500&lt;br /&gt;
|[[Moodle 2.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/22/en/Upgrading_to_Moodle_2.2 Upgrading to 2.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.1&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011120501&lt;br /&gt;
|[[Moodle 2.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.2&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011120502&lt;br /&gt;
|[[Moodle 2.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.3&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011120503&lt;br /&gt;
|[[Moodle 2.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.4&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011120504&lt;br /&gt;
|[[Moodle 2.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.5&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011120505&lt;br /&gt;
|[[Moodle 2.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.6&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011120506&lt;br /&gt;
| [[Moodle 2.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.7&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011120507&lt;br /&gt;
|[[Moodle 2.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.8&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2011120508&lt;br /&gt;
|[[Moodle 2.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.9&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2011120509&lt;br /&gt;
|[[Moodle 2.2.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.10&lt;br /&gt;
|14 May 2013&lt;br /&gt;
| 2011120510&lt;br /&gt;
|[[Moodle 2.2.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.11&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2011120511&lt;br /&gt;
|[[Moodle 2.2.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.2.x ended December 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.2.x ended June 2013 (18 months).&lt;br /&gt;
==Moodle 2.1==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1&lt;br /&gt;
| 1 July 2011&lt;br /&gt;
|2011070100&lt;br /&gt;
|[[Moodle 2.1 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/21/en/Upgrading_to_Moodle_2.1 Upgrading to 2.1]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.1&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011070101&lt;br /&gt;
| [[Moodle 2.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.2&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011070102&lt;br /&gt;
|[[Moodle 2.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.3&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011070103&lt;br /&gt;
|[[Moodle 2.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.4&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011070104&lt;br /&gt;
|[[Moodle 2.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.5&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011070105&lt;br /&gt;
|[[Moodle 2.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.6&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011070106&lt;br /&gt;
|[[Moodle 2.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.7&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011070107&lt;br /&gt;
|[[Moodle 2.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.8&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011070108&lt;br /&gt;
|[[Moodle 2.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.9&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011070109&lt;br /&gt;
|[[Moodle 2.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.10&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011070110&lt;br /&gt;
|[[Moodle 2.1.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.1.x ended June 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.1.x ended December 2012 (18 months).&lt;br /&gt;
==Moodle 2.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0&lt;br /&gt;
|24 November 2010&lt;br /&gt;
|2010112400&lt;br /&gt;
| [[Moodle 2.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/20/en/Upgrading_to_Moodle_2.0 Upgrading to 2.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.1&lt;br /&gt;
|25 December 2010&lt;br /&gt;
|2010122500&lt;br /&gt;
|[[Moodle 2.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.2&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2011022100&lt;br /&gt;
|[[Moodle 2.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.3&lt;br /&gt;
|5 May 2011&lt;br /&gt;
|2011033003&lt;br /&gt;
|[[Moodle 2.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.4&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011033004&lt;br /&gt;
| [[Moodle 2.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.5&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011033005&lt;br /&gt;
|[[Moodle 2.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.6&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011033006&lt;br /&gt;
|[[Moodle 2.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.7&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011033007&lt;br /&gt;
|[[Moodle 2.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.8&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011033008&lt;br /&gt;
|[[Moodle 2.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.9&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011033009&lt;br /&gt;
|[[Moodle 2.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.10&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011033010&lt;br /&gt;
|[[Moodle 2.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.0.x ended December 2011 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.0.x ended June 2012 (18 months).&lt;br /&gt;
==Moodle 1.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9&lt;br /&gt;
|3 March 2008&lt;br /&gt;
|2007101509&lt;br /&gt;
|[[Moodle 1.9 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/19/en/Upgrading_to_Moodle_1.9 Upgrading to 1.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.1&lt;br /&gt;
|15 May 2008&lt;br /&gt;
| 2007101512&lt;br /&gt;
|[[Moodle 1.9.1 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.2&lt;br /&gt;
|11 July 2008&lt;br /&gt;
|2007101520&lt;br /&gt;
|[[Moodle 1.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.3&lt;br /&gt;
|15 October 2008&lt;br /&gt;
|2007101530&lt;br /&gt;
|[[Moodle 1.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.4&lt;br /&gt;
|28 January 2009&lt;br /&gt;
|2007101540&lt;br /&gt;
|[[Moodle 1.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.5&lt;br /&gt;
|13 May 2009&lt;br /&gt;
|2007101550&lt;br /&gt;
|[[Moodle 1.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.6&lt;br /&gt;
|21 October 2009&lt;br /&gt;
|2007101560&lt;br /&gt;
|[[Moodle 1.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.7&lt;br /&gt;
|25 November 2009&lt;br /&gt;
|2007101570&lt;br /&gt;
|[[Moodle 1.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.8&lt;br /&gt;
|25 March 2010&lt;br /&gt;
|2007101580.00&lt;br /&gt;
|[[Moodle 1.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.9&lt;br /&gt;
| 8 June 2010&lt;br /&gt;
| 2007101590.00&lt;br /&gt;
| [[Moodle 1.9.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.10&lt;br /&gt;
|25 October 2010&lt;br /&gt;
|2007101591.00&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.10 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.11&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2007101591.02&lt;br /&gt;
|[[Moodle 1.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.12&lt;br /&gt;
|10 May 2011&lt;br /&gt;
|2007101591.03&lt;br /&gt;
|[[Moodle 1.9.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.13&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2007101591.04&lt;br /&gt;
|[[Moodle 1.9.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.14&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2007101591.06&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.15&lt;br /&gt;
|28 November 2011&lt;br /&gt;
| 2007101591.07&lt;br /&gt;
| [[Moodle 1.9.15 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.16&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2007101591.10&lt;br /&gt;
|[[Moodle 1.9.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.17&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2007101591.12&lt;br /&gt;
|[[Moodle 1.9.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.18&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2007101591.16&lt;br /&gt;
|[[Moodle 1.9.18 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.19&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2007101592.00&lt;br /&gt;
|[[Moodle 1.9.19 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 1.9.x has ended June 2011 (3.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.x by Moodle HQ ended June 2012 (4.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.19+ branch by [http://catalyst.net.nz Catalyst IT] ended [http://moodle.org/mod/forum/discuss.php?d=199706 Dec 2013] (6 years).&lt;br /&gt;
==Moodle 1.8 ==&lt;br /&gt;
*[[Moodle 1.8 release notes|Moodle 1.8]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.8.1 release notes|Moodle 1.8.1]] - 14 June 2007&lt;br /&gt;
*[[Moodle 1.8.2 release notes|Moodle 1.8.2]] - 8 July 2007&lt;br /&gt;
*[[Moodle 1.8.3 release notes|Moodle 1.8.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.8.4 release notes|Moodle 1.8.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.8.5 release notes|Moodle 1.8.5]] - 8 April 2008&lt;br /&gt;
*[[Moodle 1.8.6 release notes|Moodle 1.8.6]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.8.7 release notes|Moodle 1.8.7]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.8.8 release notes|Moodle 1.8.8]] - 28 January 2009&lt;br /&gt;
*[[Moodle 1.8.9 release notes|Moodle 1.8.9]] - 15 May 2009&lt;br /&gt;
*[[Moodle 1.8.10 release notes|Moodle 1.8.10]] - 26 October 2009&lt;br /&gt;
*[[Moodle 1.8.11 release notes|Moodle 1.8.11]] - 25 November 2009&lt;br /&gt;
*[[Moodle 1.8.12 release notes|Moodle 1.8.12]] - 27 March 2010&lt;br /&gt;
*[[Moodle 1.8.13 release notes|Moodle 1.8.13]] - 8 June 2010&lt;br /&gt;
*[[Moodle 1.8.14 release notes|Moodle 1.8.14]] - 3 December 2010&lt;br /&gt;
*Support has ended&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.7==&lt;br /&gt;
*[[Moodle 1.7 release notes|Moodle 1.7]] - 7 November 2006&lt;br /&gt;
*[[Moodle 1.7.1 release notes|Moodle 1.7.1]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.7.2 release notes|Moodle 1.7.2]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.7.3 release notes|Moodle 1.7.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.7.4 release notes|Moodle 1.7.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.7.5 release notes|Moodle 1.7.5]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.7.6 release notes|Moodle 1.7.6]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.7.7 release notes|Moodle 1.7.7]] - 28 January 2009&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.6==&lt;br /&gt;
*[[Moodle 1.6 release notes|Moodle 1.6]] - 20 June 2006&lt;br /&gt;
*[[Moodle 1.6.1 release notes|Moodle 1.6.1]] - 20 July 2006&lt;br /&gt;
*[[Moodle 1.6.2 release notes|Moodle 1.6.2]] - 12 September 2006&lt;br /&gt;
*[[Moodle 1.6.3 release notes|Moodle 1.6.3]] - 10 October 2006&lt;br /&gt;
*[[Moodle 1.6.4 release notes|Moodle 1.6.4]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.6.5 release notes|Moodle 1.6.5]] - 30 March 2007&lt;br /&gt;
*Moodle 1.6.6 - 11 January 2008&lt;br /&gt;
*Moodle 1.6.7 - 11 July 2008&lt;br /&gt;
*[[Moodle 1.6.8 release notes|Moodle 1.6.8]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.6.9 release notes|Moodle 1.6.9]] - 28 January 2009&lt;br /&gt;
* Support has ended&lt;br /&gt;
==Moodle 1.5==&lt;br /&gt;
*[[Moodle 1.5 release notes|Moodle 1.5]] - 5 June 2005&lt;br /&gt;
*[[Moodle 1.5.1 release notes|Moodle 1.5.1]] - 8 July 2005&lt;br /&gt;
*[[Moodle 1.5.2 release notes|Moodle 1.5.2]] - 16 July 2005&lt;br /&gt;
*[[Moodle 1.5.3 release notes|Moodle 1.5.3]] - 11 November 2005&lt;br /&gt;
*[[Moodle 1.5.4 release notes|Moodle 1.5.4]] - 21 May 2006&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.4==&lt;br /&gt;
*Moodle 1.4 - 31 August 2004&lt;br /&gt;
*Moodle 1.4.1 - 12 September 2004&lt;br /&gt;
*Moodle 1.4.2 - 5 November 2004&lt;br /&gt;
*Moodle 1.4.3 - 21 December 2004&lt;br /&gt;
*Moodle 1.4.4 - 7 March 2005&lt;br /&gt;
*[[Moodle 1.4.5 release notes|Moodle 1.4.5]] - 7 May 2005&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.3==&lt;br /&gt;
*Moodle 1.3 - 25 May 2004&lt;br /&gt;
* Moodle 1.3.1 - 4 June 2004&lt;br /&gt;
*Moodle 1.3.2 - 9 July 2004&lt;br /&gt;
*Moodle 1.3.3 - 16 July 2004&lt;br /&gt;
* Moodle 1.3.4 - 11 August 2004&lt;br /&gt;
*Moodle 1.3.5 - 9 September 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.2==&lt;br /&gt;
*Moodle 1.2 - 20 March 2004&lt;br /&gt;
*Moodle 1.2.1 - 25 March 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.1==&lt;br /&gt;
*Moodle 1.1 - 29 August 2003&lt;br /&gt;
*Moodle 1.1.1 - 11 September 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
== Moodle 1.0==&lt;br /&gt;
*Moodle 1.0 - 20 August 2002&lt;br /&gt;
*Moodle 1.0.1 - 26 August 2002&lt;br /&gt;
*Moodle 1.0.2 - 2 September 2002&lt;br /&gt;
*Moodle 1.0.3 - 5 September 2002&lt;br /&gt;
*Moodle 1.0.4 - 10 September 2002&lt;br /&gt;
*Moodle 1.0.5 - 27 September 2002&lt;br /&gt;
* Moodle 1.0.6 - 26 October 2002&lt;br /&gt;
::1.0.6.1 - 6 November 2002&lt;br /&gt;
::1.0.6.2 - 11 November 2002&lt;br /&gt;
::1.0.6.3 - 14 November 2002&lt;br /&gt;
::1.0.6.4 - 25 November 2002&lt;br /&gt;
*Moodle 1.0.7 - 9 December 2002&lt;br /&gt;
*Moodle 1.0.8 - 7 January 2003&lt;br /&gt;
*Moodle 1.0.9 - 30 May 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Roadmap]] - future versions&lt;br /&gt;
*[[Moodle versions]] - an explanation of how our versions work plus version numbers for each release (for $plugin-&amp;gt;requires)&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Core development]]&lt;br /&gt;
[[fr:Historique des versions]]&lt;br /&gt;
[[es:dev/Historia de las versiones]]&lt;br /&gt;
[[de:Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=61811</id>
		<title>Releases</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=61811"/>
		<updated>2022-03-14T07:43:49Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* Moodle 3.11.6 update */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all official releases of Moodle, grouped by branch in reverse chronological order.&lt;br /&gt;
==Version support==&lt;br /&gt;
From Moodle 2.6 onwards, the end of support, both general and security, happens the second Monday of May and November, observing the 12, 18... month periods, no matter if the major release date was moved or not.&lt;br /&gt;
&lt;br /&gt;
The most recent [https://en.wikipedia.org/wiki/Long-term_support long-term support release (LTS)] version is Moodle 3.9.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Version&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Release status&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Initial release&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:rgba(0, 0, 0, 0.05);&amp;quot; | General support ends&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Security support ends&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.9 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 15 June 2020&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 10 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 November 2023 (ext 6M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.10&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 9 November 2020&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 8 November 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 9 May 2022&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.11&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 17 May 2021&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 14 Nov 2022 (ext 6M)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 Nov 2023 (ext 12M)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |4.0&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |April 2022&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |May 2023&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |November 2023&lt;br /&gt;
|-&lt;br /&gt;
|4.1 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stable&lt;br /&gt;
|November 2022&lt;br /&gt;
|November 2023&lt;br /&gt;
|November 2025&lt;br /&gt;
|}&lt;br /&gt;
[[Image:releasescurrent.png|alt=Release graph]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Release graph key:&amp;lt;/b&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Currently supported stable releases.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | Current release of versions still receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Future point releases receiving bug fixes, as well as security updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#316d5e; color:white; adding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Future security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Future point releases receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#686566; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; |Previously released versions containing bug fixes, as well as security updates. Updating to a currently supported version is recommended.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#282828; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; |Past security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; |Previously released versions containing security updates only. Updating to a currently supported version is recommended.&lt;br /&gt;
|}&lt;br /&gt;
==General release calendar==&lt;br /&gt;
These are the target dates for releases. These dates may vary slightly due to unforeseen circumstances.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Release type&lt;br /&gt;
!Frequency&lt;br /&gt;
!Months&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Major_release_cycles|Major]] (eg. 3.x)&lt;br /&gt;
|6 monthly&lt;br /&gt;
|Second Monday of May and November&lt;br /&gt;
|-&lt;br /&gt;
|[[Process#Stable_maintenance_cycles|Minor]] (Point) (eg. 3.x.y)&lt;br /&gt;
| 2 monthly&lt;br /&gt;
|Second Monday of July, September, November, March and May.&lt;br /&gt;
Third Monday of January.&lt;br /&gt;
|}&lt;br /&gt;
All releases are preceded by a one week warning. Upcoming release dates can be found in the [https://www.google.com/calendar/ical/moodle.com_p4c2oe7hsb77ltaro5qtihb5d4%40group.calendar.google.com/public/basic.ics Moodle development calendar] (Note, this is an iCAL link that will try to add the dates to your personal calendar. If you just want to browse the dates online, use [https://calendar.google.com/calendar/embed?src=moodle.com_p4c2oe7hsb77ltaro5qtihb5d4@group.calendar.google.com&amp;amp;pli=1 this link].).&lt;br /&gt;
==Moodle 3.11==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11&lt;br /&gt;
|17 May 2021&lt;br /&gt;
|2021051700&lt;br /&gt;
|[[Moodle 3.11 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/311/en/Upgrading Upgrading to 3.11]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.1&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2021051701&lt;br /&gt;
|[[Moodle 3.11.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.11.2&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2021051702&lt;br /&gt;
|[[Moodle 3.11.2 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.3&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2021051703&lt;br /&gt;
|[[Moodle 3.11.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.4&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2021051704&lt;br /&gt;
|[[Moodle 3.11.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.5&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2021051705&lt;br /&gt;
|[[Moodle 3.11.5 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.11.6&lt;br /&gt;
|14 March 2022&lt;br /&gt;
|2021051706&lt;br /&gt;
|[[Moodle 3.11.6 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).&lt;br /&gt;
 Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.10==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020110900&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 3.10 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/310/en/Upgrading Upgrading to 3.10]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.1&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020110901&lt;br /&gt;
| [[Moodle 3.10.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.2&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020110902&lt;br /&gt;
|[[Moodle 3.10.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.3&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020110903&lt;br /&gt;
|[[Moodle 3.10.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.4&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020110904&lt;br /&gt;
|[[Moodle 3.10.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.5&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020110905&lt;br /&gt;
|[[Moodle 3.10.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.6&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020110906&lt;br /&gt;
|[[Moodle 3.10.6 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.10.7&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020110907&lt;br /&gt;
|[[Moodle 3.10.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.8&lt;br /&gt;
|8 November 2021&lt;br /&gt;
|2020110908&lt;br /&gt;
|[[Moodle 3.10.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.10.9&lt;br /&gt;
|17 January 2022&lt;br /&gt;
|2020110909&lt;br /&gt;
|[[Moodle 3.10.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.10.x ended 8 November 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).&lt;br /&gt;
==Moodle 3.9 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9&lt;br /&gt;
|15 June 2020&lt;br /&gt;
|2020061500&lt;br /&gt;
|[[Moodle 3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/39/en/Upgrading Upgrading to 3.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.1&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2020061501&lt;br /&gt;
|[[Moodle 3.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.2&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2020061502&lt;br /&gt;
| [[Moodle 3.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.3&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2020061503&lt;br /&gt;
| [[Moodle 3.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.4&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2020061504&lt;br /&gt;
|[[Moodle 3.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.5&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2020061505&lt;br /&gt;
|[[Moodle 3.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.6&lt;br /&gt;
|25 March 2021&lt;br /&gt;
|2020061506&lt;br /&gt;
|[[Moodle 3.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.7&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2020061507&lt;br /&gt;
|[[Moodle 3.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.8&lt;br /&gt;
|12 July 2021&lt;br /&gt;
|2020061508&lt;br /&gt;
|[[Moodle 3.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.9&lt;br /&gt;
|29 July 2021&lt;br /&gt;
|2020061509&lt;br /&gt;
|[[Moodle 3.9.9 release notes|Release Notes]]&lt;br /&gt;
|Emergency minor release&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.9.10&lt;br /&gt;
|13 September 2021&lt;br /&gt;
|2020061510&lt;br /&gt;
|[[Moodle 3.9.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.11&lt;br /&gt;
| 8 November 2021&lt;br /&gt;
|2020061511&lt;br /&gt;
|[[Moodle 3.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.9.12&lt;br /&gt;
| 17 January 2022&lt;br /&gt;
|2020061512&lt;br /&gt;
|[[Moodle 3.9.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.9.x ended 10 May 2021 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.9.x will end 13 Nov 2023 (36 months plus 6 months extension).&lt;br /&gt;
==Moodle 3.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8&lt;br /&gt;
|18 November 2019&lt;br /&gt;
|2019111800&lt;br /&gt;
|[[Moodle 3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/38/en/Upgrading Upgrading to 3.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.1&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019111801&lt;br /&gt;
|[[Moodle 3.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.2&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019111802&lt;br /&gt;
|[[Moodle 3.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.3&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019111803&lt;br /&gt;
|[[Moodle 3.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.4&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019111804&lt;br /&gt;
|[[Moodle 3.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.5&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019111805&lt;br /&gt;
| [[Moodle 3.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.6&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019111806&lt;br /&gt;
| [[Moodle 3.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.7&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2019111807&lt;br /&gt;
|[[Moodle 3.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.8&lt;br /&gt;
|8 March 2021&lt;br /&gt;
|2019111808&lt;br /&gt;
|[[Moodle 3.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.8.9&lt;br /&gt;
|10 May 2021&lt;br /&gt;
|2019111809&lt;br /&gt;
|[[Moodle 3.8.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.8.x ended 9 November 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.8.x ended 10 May 2021 (18 months).&lt;br /&gt;
==Moodle 3.7==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7&lt;br /&gt;
|20 May 2019&lt;br /&gt;
|2019052000&lt;br /&gt;
|[[Moodle 3.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/37/en/Upgrading Upgrading to 3.7]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.1&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2019052001&lt;br /&gt;
|[[Moodle 3.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.2&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2019052002&lt;br /&gt;
|[[Moodle 3.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.3&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2019052003&lt;br /&gt;
| [[Moodle 3.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.4&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2019052004&lt;br /&gt;
|[[Moodle 3.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.5&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2019052005&lt;br /&gt;
|[[Moodle 3.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.6&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2019052006&lt;br /&gt;
|[[Moodle 3.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.7&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2019052007&lt;br /&gt;
|[[Moodle 3.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.8&lt;br /&gt;
|14 September 2020&lt;br /&gt;
|2019052008&lt;br /&gt;
| [[Moodle 3.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.7.9&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2019052009&lt;br /&gt;
|[[Moodle 3.7.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.7.x ended 11 May 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.7.x ended 9 November 2020 (18 months).&lt;br /&gt;
==Moodle 3.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6&lt;br /&gt;
| 3 December 2018&lt;br /&gt;
|2018120300&lt;br /&gt;
|[[Moodle 3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/36/en/Upgrading Upgrading to 3.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.1&lt;br /&gt;
|5 December 2018&lt;br /&gt;
|2018120301&lt;br /&gt;
| [[Moodle 3.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6.2&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018120302&lt;br /&gt;
|[[Moodle 3.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.3&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018120303&lt;br /&gt;
|[[Moodle 3.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.4&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018120304&lt;br /&gt;
|[[Moodle 3.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.5&lt;br /&gt;
|8th July 2019&lt;br /&gt;
|2018120305&lt;br /&gt;
|[[Moodle 3.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.6&lt;br /&gt;
|9th September 2019&lt;br /&gt;
|2018120306&lt;br /&gt;
|[[Moodle 3.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.7&lt;br /&gt;
| 11th November 2019&lt;br /&gt;
|2018120307&lt;br /&gt;
|[[Moodle 3.6.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.8&lt;br /&gt;
|13th January 2020&lt;br /&gt;
|2018120308&lt;br /&gt;
|[[Moodle 3.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.9&lt;br /&gt;
|9th March 2020&lt;br /&gt;
|2018120309&lt;br /&gt;
| [[Moodle 3.6.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.6.10&lt;br /&gt;
|11th May 2020&lt;br /&gt;
|2018120310&lt;br /&gt;
|[[Moodle 3.6.10 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.6.x ended 11 November 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.6.x ended 11 May 2020 (18 months).&lt;br /&gt;
==Moodle 3.5 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2018051700&lt;br /&gt;
|[[Moodle 3.5 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/35/en/Upgrading Upgrading to 3.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.1&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2018051701&lt;br /&gt;
|[[Moodle 3.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.2&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2018051702&lt;br /&gt;
|[[Moodle 3.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.3&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2018051703&lt;br /&gt;
| [[Moodle 3.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.4&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2018051704&lt;br /&gt;
|[[Moodle 3.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.5&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2018051705&lt;br /&gt;
|[[Moodle 3.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.6&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2018051706&lt;br /&gt;
|[[Moodle 3.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.7&lt;br /&gt;
|8 July 2019&lt;br /&gt;
|2018051707&lt;br /&gt;
|[[Moodle 3.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.8&lt;br /&gt;
|9 September 2019&lt;br /&gt;
|2018051708&lt;br /&gt;
|[[Moodle 3.5.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.9&lt;br /&gt;
|11 November 2019&lt;br /&gt;
|2018051709&lt;br /&gt;
|[[Moodle 3.5.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.10&lt;br /&gt;
|13 January 2020&lt;br /&gt;
|2018051710&lt;br /&gt;
| [[Moodle 3.5.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.11&lt;br /&gt;
|9 March 2020&lt;br /&gt;
|2018051711&lt;br /&gt;
|[[Moodle 3.5.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.12&lt;br /&gt;
|11 May 2020&lt;br /&gt;
|2018051712&lt;br /&gt;
| [[Moodle 3.5.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.13&lt;br /&gt;
|13 July 2020&lt;br /&gt;
|2018051713&lt;br /&gt;
|[[Moodle 3.5.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.14&lt;br /&gt;
| 14 September 2020&lt;br /&gt;
|2018051714&lt;br /&gt;
|[[Moodle 3.5.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.15&lt;br /&gt;
|9 November 2020&lt;br /&gt;
|2018051715&lt;br /&gt;
|[[Moodle 3.5.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.16&lt;br /&gt;
|18 January 2021&lt;br /&gt;
|2018051716&lt;br /&gt;
| [[Moodle 3.5.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.17&lt;br /&gt;
|8 March 2021&lt;br /&gt;
| 2018051717&lt;br /&gt;
|[[Moodle 3.5.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.5.18&lt;br /&gt;
| 10 May 2021&lt;br /&gt;
| 2018051718&lt;br /&gt;
|[[Moodle 3.5.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.5.x ended May 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.5.x ended 10 May 2021 (36 months).&lt;br /&gt;
==Moodle 3.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017111300&lt;br /&gt;
|[[Moodle 3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/34/en/Upgrading Upgrading to 3.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.1&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017111301&lt;br /&gt;
|[[Moodle 3.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.2&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017111302&lt;br /&gt;
|[[Moodle 3.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.3&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017111303&lt;br /&gt;
|[[Moodle 3.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.4&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017111304&lt;br /&gt;
|[[Moodle 3.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.5&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017111305&lt;br /&gt;
|[[Moodle 3.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.6&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017111306&lt;br /&gt;
| [[Moodle 3.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.7&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2017111307&lt;br /&gt;
|[[Moodle 3.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.8&lt;br /&gt;
|11 March 2019&lt;br /&gt;
|2017111308&lt;br /&gt;
|[[Moodle 3.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.4.9&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2017111309&lt;br /&gt;
| [[Moodle 3.4.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.4.x ended 12 November 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.4.x ended 13 May 2019 (18 months).&lt;br /&gt;
==Moodle 3.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3&lt;br /&gt;
|15 May 2017&lt;br /&gt;
|2017051500&lt;br /&gt;
|[[Moodle 3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/33/en/Upgrading Upgrading to 3.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.1&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2017051501&lt;br /&gt;
|[[Moodle 3.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.2&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2017051502&lt;br /&gt;
|[[Moodle 3.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.3&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2017051503&lt;br /&gt;
| [[Moodle 3.3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.4&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2017051504&lt;br /&gt;
|[[Moodle 3.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.5&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2017051505&lt;br /&gt;
|[[Moodle 3.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.6&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2017051506&lt;br /&gt;
|[[Moodle 3.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.7&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2017051507&lt;br /&gt;
|[[Moodle 3.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.3.8&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2017051508&lt;br /&gt;
|[[Moodle 3.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.9&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2017051509&lt;br /&gt;
|[[Moodle 3.3.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.3.x ended 17 May 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.3.x ended 12 November 2018 (18 months).&lt;br /&gt;
==Moodle 3.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2&lt;br /&gt;
| 5 December 2016&lt;br /&gt;
|2016120500&lt;br /&gt;
|[[Moodle 3.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/32/en/Upgrading Upgrading to 3.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.1&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016120501&lt;br /&gt;
|[[Moodle 3.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.2&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016120502&lt;br /&gt;
|[[Moodle 3.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.3&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016120503&lt;br /&gt;
|[[Moodle 3.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.4&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016120504&lt;br /&gt;
|[[Moodle 3.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.5&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016120505&lt;br /&gt;
|[[Moodle 3.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.6&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016120506&lt;br /&gt;
| [[Moodle 3.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.7&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016120507&lt;br /&gt;
|[[Moodle 3.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.8&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016120508&lt;br /&gt;
|[[Moodle 3.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.2.9&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016120509&lt;br /&gt;
| [[Moodle 3.2.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.2.x ended 13 November 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.2.x ended 17 May 2018 (18 months).&lt;br /&gt;
==Moodle 3.1 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1&lt;br /&gt;
|23 May 2016&lt;br /&gt;
|2016052300&lt;br /&gt;
|[[Moodle 3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
[https://docs.moodle.org/31/en/Upgrading Upgrading to 3.1]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.1&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2016052301&lt;br /&gt;
|[[Moodle 3.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.2&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2016052302&lt;br /&gt;
|[[Moodle 3.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.3&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2016052303&lt;br /&gt;
|[[Moodle 3.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.4&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2016052304&lt;br /&gt;
|[[Moodle 3.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.5&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2016052305&lt;br /&gt;
|[[Moodle 3.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.6&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2016052306&lt;br /&gt;
|[[Moodle 3.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.7&lt;br /&gt;
|10 July 2017&lt;br /&gt;
|2016052307&lt;br /&gt;
|[[Moodle 3.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.8&lt;br /&gt;
|11 September 2017&lt;br /&gt;
|2016052308&lt;br /&gt;
|[[Moodle 3.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.9&lt;br /&gt;
|13 November 2017&lt;br /&gt;
|2016052309&lt;br /&gt;
|[[Moodle 3.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.10&lt;br /&gt;
|15 January 2018&lt;br /&gt;
|2016052310&lt;br /&gt;
|[[Moodle 3.1.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.11&lt;br /&gt;
|19 March 2018&lt;br /&gt;
|2016052311&lt;br /&gt;
|[[Moodle 3.1.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.12&lt;br /&gt;
|17 May 2018&lt;br /&gt;
|2016052312&lt;br /&gt;
|[[Moodle 3.1.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.13&lt;br /&gt;
|9 July 2018&lt;br /&gt;
|2016052313&lt;br /&gt;
|[[Moodle 3.1.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.14&lt;br /&gt;
|10 September 2018&lt;br /&gt;
|2016052314&lt;br /&gt;
|[[Moodle 3.1.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.15&lt;br /&gt;
|12 November 2018&lt;br /&gt;
|2016052315&lt;br /&gt;
|[[Moodle 3.1.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.16&lt;br /&gt;
|14 January 2019&lt;br /&gt;
|2016052316&lt;br /&gt;
|[[Moodle 3.1.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.17&lt;br /&gt;
|11 March 2019&lt;br /&gt;
| 2016052317&lt;br /&gt;
|[[Moodle 3.1.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.1.18&lt;br /&gt;
|13 May 2019&lt;br /&gt;
|2016052318&lt;br /&gt;
|[[Moodle 3.1.18 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.1.x ended 8 May 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.1.x ended 13 May 2019 (36 months).&lt;br /&gt;
==Moodle 3.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0&lt;br /&gt;
|16 November 2015&lt;br /&gt;
|2015111600&lt;br /&gt;
|[[Moodle 3.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/30/en/Upgrading Upgrading to 3.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.1&lt;br /&gt;
|21 December 2015&lt;br /&gt;
|2015111601&lt;br /&gt;
| [[Moodle 3.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.2&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015111602&lt;br /&gt;
|[[Moodle 3.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.3&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015111603&lt;br /&gt;
|[[Moodle 3.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.4&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015111604&lt;br /&gt;
|[[Moodle 3.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.5&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015111605&lt;br /&gt;
|[[Moodle 3.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.6&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015111606&lt;br /&gt;
|[[Moodle 3.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.7&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015111607&lt;br /&gt;
|[[Moodle 3.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.8&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2015111608&lt;br /&gt;
|[[Moodle 3.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.9&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2015111609&lt;br /&gt;
|[[Moodle 3.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 3.0.10&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2015111610&lt;br /&gt;
|[[Moodle 3.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 3.0.x ended 14 November 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.0.x ended 8 May 2017 (18 months).&lt;br /&gt;
==Moodle 2.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9&lt;br /&gt;
| 11 May 2015&lt;br /&gt;
|2015051100&lt;br /&gt;
|[[Moodle 2.9 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/29/en/Upgrading_to_Moodle_2.9 Upgrading to 2.9]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.1&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2015051101&lt;br /&gt;
|[[Moodle 2.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.2&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2015051102&lt;br /&gt;
| [[Moodle 2.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.3&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2015051103&lt;br /&gt;
| [[Moodle 2.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.4&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2015051104&lt;br /&gt;
|[[Moodle 2.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.5&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2015051105&lt;br /&gt;
|[[Moodle 2.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.6&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2015051106&lt;br /&gt;
|[[Moodle 2.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.7&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2015051107&lt;br /&gt;
|[[Moodle 2.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.9.8&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2015051108&lt;br /&gt;
|[[Moodle 2.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.9&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2015051109&lt;br /&gt;
|[[Moodle 2.9.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.9.x ended 9 May 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.9.x ended 14 November 2016 (18 months).&lt;br /&gt;
==Moodle 2.8==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014111000&lt;br /&gt;
| [[Moodle 2.8 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/28/en/Upgrading_to_Moodle_2.8 Upgrading to 2.8]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.1&lt;br /&gt;
|13 November 2014&lt;br /&gt;
|2014111001&lt;br /&gt;
| [[Moodle 2.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.2&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014111002&lt;br /&gt;
| [[Moodle 2.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.3&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014111003&lt;br /&gt;
|[[Moodle 2.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.4&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014111004&lt;br /&gt;
|[[Moodle 2.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.5&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014111005&lt;br /&gt;
|[[Moodle 2.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.6&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014111006&lt;br /&gt;
|[[Moodle 2.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.7&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014111007&lt;br /&gt;
|[[Moodle 2.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.8&lt;br /&gt;
|14 September 2015&lt;br /&gt;
|2014111008&lt;br /&gt;
| [[Moodle 2.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.9&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014111009&lt;br /&gt;
|[[Moodle 2.8.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.10&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014111010&lt;br /&gt;
|[[Moodle 2.8.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.11&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014111011&lt;br /&gt;
|[[Moodle 2.8.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.8.12&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014111012&lt;br /&gt;
| [[Moodle 2.8.12 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.8.x ended 9 November 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.8.x ended 9 May 2016 (18 months).&lt;br /&gt;
==Moodle 2.7 (LTS)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7&lt;br /&gt;
| 12 May 2014&lt;br /&gt;
|2014051200&lt;br /&gt;
|[[Moodle 2.7 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/27/en/Upgrading_to_Moodle_2.7 Upgrading to 2.7]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.1&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2014051201&lt;br /&gt;
|[[Moodle 2.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.2&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2014051202&lt;br /&gt;
|[[Moodle 2.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.3&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2014051203&lt;br /&gt;
| [[Moodle 2.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.4&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2014051204&lt;br /&gt;
| [[Moodle 2.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.5&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2014051205&lt;br /&gt;
|[[Moodle 2.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.6&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2014051206&lt;br /&gt;
|[[Moodle 2.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.7&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2014051207&lt;br /&gt;
|[[Moodle 2.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.8&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2014051208&lt;br /&gt;
|[[Moodle 2.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.9&lt;br /&gt;
|6 July 2015&lt;br /&gt;
|2014051209&lt;br /&gt;
|[[Moodle 2.7.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.10&lt;br /&gt;
| 14 September 2015&lt;br /&gt;
|2014051210&lt;br /&gt;
|[[Moodle 2.7.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.11&lt;br /&gt;
|9 November 2015&lt;br /&gt;
|2014051211&lt;br /&gt;
|[[Moodle 2.7.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.12&lt;br /&gt;
|11 January 2016&lt;br /&gt;
|2014051212&lt;br /&gt;
|[[Moodle 2.7.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.13&lt;br /&gt;
|14 March 2016&lt;br /&gt;
|2014051213&lt;br /&gt;
|[[Moodle 2.7.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.14&lt;br /&gt;
|9 May 2016&lt;br /&gt;
|2014051214&lt;br /&gt;
| [[Moodle 2.7.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.15&lt;br /&gt;
|11 July 2016&lt;br /&gt;
|2014051215&lt;br /&gt;
|[[Moodle 2.7.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.16&lt;br /&gt;
|12 September 2016&lt;br /&gt;
|2014051216&lt;br /&gt;
|[[Moodle 2.7.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.17&lt;br /&gt;
|14 November 2016&lt;br /&gt;
|2014051217&lt;br /&gt;
|[[Moodle 2.7.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.18&lt;br /&gt;
|9 January 2017&lt;br /&gt;
|2014051218&lt;br /&gt;
|[[Moodle 2.7.18 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.19&lt;br /&gt;
|13 March 2017&lt;br /&gt;
|2014051219&lt;br /&gt;
|[[Moodle 2.7.19 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.7.20&lt;br /&gt;
|8 May 2017&lt;br /&gt;
|2014051220&lt;br /&gt;
| [[Moodle 2.7.20 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.7.x ended 11 May 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.7.x ended 8 May 2017 (36 months).&lt;br /&gt;
==Moodle 2.6==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6&lt;br /&gt;
|18 November 2013&lt;br /&gt;
|2013111800&lt;br /&gt;
|[[Moodle 2.6 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/26/en/Upgrading_to_Moodle_2.6 Upgrading to 2.6]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.1&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013111801&lt;br /&gt;
| [[Moodle 2.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.2&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013111802&lt;br /&gt;
|[[Moodle 2.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.3&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013111803&lt;br /&gt;
|[[Moodle 2.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.4&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013111804&lt;br /&gt;
|[[Moodle 2.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.5&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013111805&lt;br /&gt;
|[[Moodle 2.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.6&lt;br /&gt;
|10 November 2014&lt;br /&gt;
|2013111806&lt;br /&gt;
|[[Moodle 2.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.7&lt;br /&gt;
|12 January 2015&lt;br /&gt;
|2013111807&lt;br /&gt;
|[[Moodle 2.6.7 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.8&lt;br /&gt;
|2 February 2015&lt;br /&gt;
|2013111808&lt;br /&gt;
|[[Moodle 2.6.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.9&lt;br /&gt;
|9 March 2015&lt;br /&gt;
|2013111809&lt;br /&gt;
|[[Moodle 2.6.9 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.10&lt;br /&gt;
|10 March 2015&lt;br /&gt;
|2013111810&lt;br /&gt;
| [[Moodle 2.6.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.6.11&lt;br /&gt;
|11 May 2015&lt;br /&gt;
|2013111811&lt;br /&gt;
|[[Moodle 2.6.11 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.6.x ended 10 November 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.6.x ended 11 May 2015 (18 months).&lt;br /&gt;
==Moodle 2.5==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5&lt;br /&gt;
| 14 May 2013&lt;br /&gt;
|2013051400&lt;br /&gt;
|[[Moodle 2.5 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/25/en/Upgrading_to_Moodle_2.5 Upgrading to 2.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.1&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2013051401&lt;br /&gt;
|[[Moodle 2.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.2&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2013051402&lt;br /&gt;
|[[Moodle 2.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.3&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2013051403&lt;br /&gt;
|[[Moodle 2.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.4&lt;br /&gt;
|13 January 2014&lt;br /&gt;
| 2013051404&lt;br /&gt;
| [[Moodle 2.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.5&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2013051405&lt;br /&gt;
|[[Moodle 2.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.6&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2013051406&lt;br /&gt;
|[[Moodle 2.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.7&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2013051407&lt;br /&gt;
|[[Moodle 2.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.5.8&lt;br /&gt;
|8 September 2014&lt;br /&gt;
|2013051408&lt;br /&gt;
|[[Moodle 2.5.8 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.9&lt;br /&gt;
| 10 November 2014&lt;br /&gt;
|2013051409&lt;br /&gt;
|[[Moodle 2.5.9 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.5.x ended May 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.5.x ended 10 November 2014 (18 months).&lt;br /&gt;
==Moodle 2.4==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4&lt;br /&gt;
|3 December 2012&lt;br /&gt;
|2012120300&lt;br /&gt;
|[[Moodle 2.4 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/24/en/Upgrading_to_Moodle_2.4 Upgrading to 2.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.1&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012120301&lt;br /&gt;
|[[Moodle 2.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.2&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012120302&lt;br /&gt;
|[[Moodle 2.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.3&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012120303&lt;br /&gt;
|[[Moodle 2.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.4&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012120304&lt;br /&gt;
|[[Moodle 2.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.5&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012120305&lt;br /&gt;
|[[Moodle 2.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.6&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012120306&lt;br /&gt;
|[[Moodle 2.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.7&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012120307&lt;br /&gt;
| [[Moodle 2.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.8&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012120308&lt;br /&gt;
|[[Moodle 2.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.9&lt;br /&gt;
|10 March 2014&lt;br /&gt;
|2012120309&lt;br /&gt;
|[[Moodle 2.4.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.10&lt;br /&gt;
|12 May 2014&lt;br /&gt;
|2012120310&lt;br /&gt;
| [[Moodle 2.4.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.4.11&lt;br /&gt;
|14 July 2014&lt;br /&gt;
|2012120311&lt;br /&gt;
|[[Moodle 2.4.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.4.x ended December 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.4.x ended June 2014 (18 months).&lt;br /&gt;
==Moodle 2.3==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3&lt;br /&gt;
|25 June 2012&lt;br /&gt;
|2012062500&lt;br /&gt;
|[[Moodle 2.3 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/23/en/Upgrading_to_Moodle_2.3 Upgrading to 2.3]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.1&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2012062501&lt;br /&gt;
|[[Moodle 2.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.2&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2012062502&lt;br /&gt;
|[[Moodle 2.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.3&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2012062503&lt;br /&gt;
|[[Moodle 2.3.3 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.4&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2012062504&lt;br /&gt;
|[[Moodle 2.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.5&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2012062505&lt;br /&gt;
|[[Moodle 2.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.6&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2012062506&lt;br /&gt;
|[[Moodle 2.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.7&lt;br /&gt;
|14 May 2013&lt;br /&gt;
|2012062507&lt;br /&gt;
|[[Moodle 2.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.8&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2012062508&lt;br /&gt;
|[[Moodle 2.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.9&lt;br /&gt;
|9 September 2013&lt;br /&gt;
|2012062509&lt;br /&gt;
|[[Moodle 2.3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.10&lt;br /&gt;
|11 November 2013&lt;br /&gt;
|2012062510&lt;br /&gt;
|[[Moodle 2.3.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.3.11&lt;br /&gt;
|13 January 2014&lt;br /&gt;
|2012062511&lt;br /&gt;
|[[Moodle 2.3.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.3.x ended June 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.3.x ended December 2013 (18 months).&lt;br /&gt;
==Moodle 2.2==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2&lt;br /&gt;
|5 December 2011&lt;br /&gt;
|2011120500&lt;br /&gt;
|[[Moodle 2.2 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/22/en/Upgrading_to_Moodle_2.2 Upgrading to 2.2]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.1&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011120501&lt;br /&gt;
|[[Moodle 2.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.2&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011120502&lt;br /&gt;
|[[Moodle 2.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.3&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011120503&lt;br /&gt;
|[[Moodle 2.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.4&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011120504&lt;br /&gt;
|[[Moodle 2.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.5&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011120505&lt;br /&gt;
|[[Moodle 2.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.6&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011120506&lt;br /&gt;
| [[Moodle 2.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.7&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011120507&lt;br /&gt;
|[[Moodle 2.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.8&lt;br /&gt;
|11 March 2013&lt;br /&gt;
|2011120508&lt;br /&gt;
|[[Moodle 2.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.9&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|2011120509&lt;br /&gt;
|[[Moodle 2.2.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.10&lt;br /&gt;
|14 May 2013&lt;br /&gt;
| 2011120510&lt;br /&gt;
|[[Moodle 2.2.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.2.11&lt;br /&gt;
|8 July 2013&lt;br /&gt;
|2011120511&lt;br /&gt;
|[[Moodle 2.2.11 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.2.x ended December 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.2.x ended June 2013 (18 months).&lt;br /&gt;
==Moodle 2.1==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1&lt;br /&gt;
| 1 July 2011&lt;br /&gt;
|2011070100&lt;br /&gt;
|[[Moodle 2.1 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/21/en/Upgrading_to_Moodle_2.1 Upgrading to 2.1]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.1&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011070101&lt;br /&gt;
| [[Moodle 2.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.2&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011070102&lt;br /&gt;
|[[Moodle 2.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.3&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011070103&lt;br /&gt;
|[[Moodle 2.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.4&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011070104&lt;br /&gt;
|[[Moodle 2.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.5&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011070105&lt;br /&gt;
|[[Moodle 2.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.6&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011070106&lt;br /&gt;
|[[Moodle 2.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.7&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011070107&lt;br /&gt;
|[[Moodle 2.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.8&lt;br /&gt;
|10 September 2012&lt;br /&gt;
|2011070108&lt;br /&gt;
|[[Moodle 2.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.9&lt;br /&gt;
|12 November 2012&lt;br /&gt;
|2011070109&lt;br /&gt;
|[[Moodle 2.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.1.10&lt;br /&gt;
|14 January 2013&lt;br /&gt;
|2011070110&lt;br /&gt;
|[[Moodle 2.1.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.1.x ended June 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.1.x ended December 2012 (18 months).&lt;br /&gt;
==Moodle 2.0==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0&lt;br /&gt;
|24 November 2010&lt;br /&gt;
|2010112400&lt;br /&gt;
| [[Moodle 2.0 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/20/en/Upgrading_to_Moodle_2.0 Upgrading to 2.0]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.1&lt;br /&gt;
|25 December 2010&lt;br /&gt;
|2010122500&lt;br /&gt;
|[[Moodle 2.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.2&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2011022100&lt;br /&gt;
|[[Moodle 2.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.3&lt;br /&gt;
|5 May 2011&lt;br /&gt;
|2011033003&lt;br /&gt;
|[[Moodle 2.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.4&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2011033004&lt;br /&gt;
| [[Moodle 2.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.5&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2011033005&lt;br /&gt;
|[[Moodle 2.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.6&lt;br /&gt;
|28 November 2011&lt;br /&gt;
|2011033006&lt;br /&gt;
|[[Moodle 2.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.7&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2011033007&lt;br /&gt;
|[[Moodle 2.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.8&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2011033008&lt;br /&gt;
|[[Moodle 2.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.9&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2011033009&lt;br /&gt;
|[[Moodle 2.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 2.0.10&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2011033010&lt;br /&gt;
|[[Moodle 2.0.10 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 2.0.x ended December 2011 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.0.x ended June 2012 (18 months).&lt;br /&gt;
==Moodle 1.9==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9&lt;br /&gt;
|3 March 2008&lt;br /&gt;
|2007101509&lt;br /&gt;
|[[Moodle 1.9 release notes|Release Notes]]&lt;br /&gt;
|[https://docs.moodle.org/19/en/Upgrading_to_Moodle_1.9 Upgrading to 1.9]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.1&lt;br /&gt;
|15 May 2008&lt;br /&gt;
| 2007101512&lt;br /&gt;
|[[Moodle 1.9.1 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.2&lt;br /&gt;
|11 July 2008&lt;br /&gt;
|2007101520&lt;br /&gt;
|[[Moodle 1.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.3&lt;br /&gt;
|15 October 2008&lt;br /&gt;
|2007101530&lt;br /&gt;
|[[Moodle 1.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.4&lt;br /&gt;
|28 January 2009&lt;br /&gt;
|2007101540&lt;br /&gt;
|[[Moodle 1.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.5&lt;br /&gt;
|13 May 2009&lt;br /&gt;
|2007101550&lt;br /&gt;
|[[Moodle 1.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.6&lt;br /&gt;
|21 October 2009&lt;br /&gt;
|2007101560&lt;br /&gt;
|[[Moodle 1.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.7&lt;br /&gt;
|25 November 2009&lt;br /&gt;
|2007101570&lt;br /&gt;
|[[Moodle 1.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.8&lt;br /&gt;
|25 March 2010&lt;br /&gt;
|2007101580.00&lt;br /&gt;
|[[Moodle 1.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.9&lt;br /&gt;
| 8 June 2010&lt;br /&gt;
| 2007101590.00&lt;br /&gt;
| [[Moodle 1.9.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.10&lt;br /&gt;
|25 October 2010&lt;br /&gt;
|2007101591.00&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.10 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.11&lt;br /&gt;
|21 February 2011&lt;br /&gt;
|2007101591.02&lt;br /&gt;
|[[Moodle 1.9.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.12&lt;br /&gt;
|10 May 2011&lt;br /&gt;
|2007101591.03&lt;br /&gt;
|[[Moodle 1.9.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.13&lt;br /&gt;
|1 August 2011&lt;br /&gt;
|2007101591.04&lt;br /&gt;
|[[Moodle 1.9.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.14&lt;br /&gt;
|10 October 2011&lt;br /&gt;
|2007101591.06&lt;br /&gt;
|&lt;br /&gt;
[[Moodle 1.9.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.15&lt;br /&gt;
|28 November 2011&lt;br /&gt;
| 2007101591.07&lt;br /&gt;
| [[Moodle 1.9.15 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.16&lt;br /&gt;
|9 January 2012&lt;br /&gt;
|2007101591.10&lt;br /&gt;
|[[Moodle 1.9.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.17&lt;br /&gt;
|12 March 2012&lt;br /&gt;
|2007101591.12&lt;br /&gt;
|[[Moodle 1.9.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!Moodle 1.9.18&lt;br /&gt;
|14 May 2012&lt;br /&gt;
|2007101591.16&lt;br /&gt;
|[[Moodle 1.9.18 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.19&lt;br /&gt;
|9 July 2012&lt;br /&gt;
|2007101592.00&lt;br /&gt;
|[[Moodle 1.9.19 release notes|Release Notes]]&lt;br /&gt;
|Support has ended&lt;br /&gt;
|}&lt;br /&gt;
 Bug fixes for general core bugs in 1.9.x has ended June 2011 (3.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.x by Moodle HQ ended June 2012 (4.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.19+ branch by [http://catalyst.net.nz Catalyst IT] ended [http://moodle.org/mod/forum/discuss.php?d=199706 Dec 2013] (6 years).&lt;br /&gt;
==Moodle 1.8 ==&lt;br /&gt;
*[[Moodle 1.8 release notes|Moodle 1.8]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.8.1 release notes|Moodle 1.8.1]] - 14 June 2007&lt;br /&gt;
*[[Moodle 1.8.2 release notes|Moodle 1.8.2]] - 8 July 2007&lt;br /&gt;
*[[Moodle 1.8.3 release notes|Moodle 1.8.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.8.4 release notes|Moodle 1.8.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.8.5 release notes|Moodle 1.8.5]] - 8 April 2008&lt;br /&gt;
*[[Moodle 1.8.6 release notes|Moodle 1.8.6]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.8.7 release notes|Moodle 1.8.7]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.8.8 release notes|Moodle 1.8.8]] - 28 January 2009&lt;br /&gt;
*[[Moodle 1.8.9 release notes|Moodle 1.8.9]] - 15 May 2009&lt;br /&gt;
*[[Moodle 1.8.10 release notes|Moodle 1.8.10]] - 26 October 2009&lt;br /&gt;
*[[Moodle 1.8.11 release notes|Moodle 1.8.11]] - 25 November 2009&lt;br /&gt;
*[[Moodle 1.8.12 release notes|Moodle 1.8.12]] - 27 March 2010&lt;br /&gt;
*[[Moodle 1.8.13 release notes|Moodle 1.8.13]] - 8 June 2010&lt;br /&gt;
*[[Moodle 1.8.14 release notes|Moodle 1.8.14]] - 3 December 2010&lt;br /&gt;
*Support has ended&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.7==&lt;br /&gt;
*[[Moodle 1.7 release notes|Moodle 1.7]] - 7 November 2006&lt;br /&gt;
*[[Moodle 1.7.1 release notes|Moodle 1.7.1]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.7.2 release notes|Moodle 1.7.2]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.7.3 release notes|Moodle 1.7.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.7.4 release notes|Moodle 1.7.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.7.5 release notes|Moodle 1.7.5]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.7.6 release notes|Moodle 1.7.6]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.7.7 release notes|Moodle 1.7.7]] - 28 January 2009&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.6==&lt;br /&gt;
*[[Moodle 1.6 release notes|Moodle 1.6]] - 20 June 2006&lt;br /&gt;
*[[Moodle 1.6.1 release notes|Moodle 1.6.1]] - 20 July 2006&lt;br /&gt;
*[[Moodle 1.6.2 release notes|Moodle 1.6.2]] - 12 September 2006&lt;br /&gt;
*[[Moodle 1.6.3 release notes|Moodle 1.6.3]] - 10 October 2006&lt;br /&gt;
*[[Moodle 1.6.4 release notes|Moodle 1.6.4]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.6.5 release notes|Moodle 1.6.5]] - 30 March 2007&lt;br /&gt;
*Moodle 1.6.6 - 11 January 2008&lt;br /&gt;
*Moodle 1.6.7 - 11 July 2008&lt;br /&gt;
*[[Moodle 1.6.8 release notes|Moodle 1.6.8]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.6.9 release notes|Moodle 1.6.9]] - 28 January 2009&lt;br /&gt;
* Support has ended&lt;br /&gt;
==Moodle 1.5==&lt;br /&gt;
*[[Moodle 1.5 release notes|Moodle 1.5]] - 5 June 2005&lt;br /&gt;
*[[Moodle 1.5.1 release notes|Moodle 1.5.1]] - 8 July 2005&lt;br /&gt;
*[[Moodle 1.5.2 release notes|Moodle 1.5.2]] - 16 July 2005&lt;br /&gt;
*[[Moodle 1.5.3 release notes|Moodle 1.5.3]] - 11 November 2005&lt;br /&gt;
*[[Moodle 1.5.4 release notes|Moodle 1.5.4]] - 21 May 2006&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.4==&lt;br /&gt;
*Moodle 1.4 - 31 August 2004&lt;br /&gt;
*Moodle 1.4.1 - 12 September 2004&lt;br /&gt;
*Moodle 1.4.2 - 5 November 2004&lt;br /&gt;
*Moodle 1.4.3 - 21 December 2004&lt;br /&gt;
*Moodle 1.4.4 - 7 March 2005&lt;br /&gt;
*[[Moodle 1.4.5 release notes|Moodle 1.4.5]] - 7 May 2005&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.3==&lt;br /&gt;
*Moodle 1.3 - 25 May 2004&lt;br /&gt;
* Moodle 1.3.1 - 4 June 2004&lt;br /&gt;
*Moodle 1.3.2 - 9 July 2004&lt;br /&gt;
*Moodle 1.3.3 - 16 July 2004&lt;br /&gt;
* Moodle 1.3.4 - 11 August 2004&lt;br /&gt;
*Moodle 1.3.5 - 9 September 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.2==&lt;br /&gt;
*Moodle 1.2 - 20 March 2004&lt;br /&gt;
*Moodle 1.2.1 - 25 March 2004&lt;br /&gt;
*Support has ended&lt;br /&gt;
==Moodle 1.1==&lt;br /&gt;
*Moodle 1.1 - 29 August 2003&lt;br /&gt;
*Moodle 1.1.1 - 11 September 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
== Moodle 1.0==&lt;br /&gt;
*Moodle 1.0 - 20 August 2002&lt;br /&gt;
*Moodle 1.0.1 - 26 August 2002&lt;br /&gt;
*Moodle 1.0.2 - 2 September 2002&lt;br /&gt;
*Moodle 1.0.3 - 5 September 2002&lt;br /&gt;
*Moodle 1.0.4 - 10 September 2002&lt;br /&gt;
*Moodle 1.0.5 - 27 September 2002&lt;br /&gt;
* Moodle 1.0.6 - 26 October 2002&lt;br /&gt;
::1.0.6.1 - 6 November 2002&lt;br /&gt;
::1.0.6.2 - 11 November 2002&lt;br /&gt;
::1.0.6.3 - 14 November 2002&lt;br /&gt;
::1.0.6.4 - 25 November 2002&lt;br /&gt;
*Moodle 1.0.7 - 9 December 2002&lt;br /&gt;
*Moodle 1.0.8 - 7 January 2003&lt;br /&gt;
*Moodle 1.0.9 - 30 May 2003&lt;br /&gt;
*Support has ended&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Roadmap]] - future versions&lt;br /&gt;
*[[Moodle versions]] - an explanation of how our versions work plus version numbers for each release (for $plugin-&amp;gt;requires)&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Core development]]&lt;br /&gt;
[[fr:Historique des versions]]&lt;br /&gt;
[[es:dev/Historia de las versiones]]&lt;br /&gt;
[[de:Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61810</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61810"/>
		<updated>2022-03-14T07:32:27Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Removed comments in module plugin section.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page highlights the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== Navigation changes ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
=== Primary navigation ===&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
==== Customising the primary navigation ====&lt;br /&gt;
Not yet implemented but we are looking at allowing the full addition and removal of any of the primary navigation tabs in the boost theme config file.&lt;br /&gt;
=== Secondary navigation ===&lt;br /&gt;
The main content area shows tabs for secondary navigation with a maximum of 5 items being rendered in this ‘more’ menu. A new UI component has been created to render menus like this. Files:&lt;br /&gt;
 /lib/templates/moremenu.mustache&lt;br /&gt;
==== Changing the order of tabs ====&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level. &lt;br /&gt;
=== Tertiary navigation ===&lt;br /&gt;
We&#039;ve moved action buttons to the top of the page. We would encourage you to do the same.&lt;br /&gt;
If you have any buttons on an activity page that go to another page, or open a form (or similar), then we encourage you to move them from the body of your activity page to the top. All of the core activities have been updated to follow this pattern. Please take a look to see how you can format your activity in a similar fashion. There is no API here. You are welcome to create the buttons and display them as you wish in this top area.&lt;br /&gt;
=== New API functions ===&lt;br /&gt;
==== Page API ====&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondary_nav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* has_secondary_navigation_setter - Sets the ‘_hassecondarynavigation’ to indicate whether a page should render the secondary navigation&lt;br /&gt;
==== Navigationlib ====&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
==== The activity header class ====&lt;br /&gt;
There is a new activity header class that handles the display of information common to activities. 3rd party activities are not required to explicitly output this information as part of rendering individual pages.&lt;br /&gt;
&lt;br /&gt;
The common information that are currently handled by the class are:&lt;br /&gt;
* title&lt;br /&gt;
* description&lt;br /&gt;
* completion information&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As part of the update it was required that the initial information to be displayed by the class be toggable at a theme and layout level. Taking this into account the following theme level configurable exists:&lt;br /&gt;
* activityheaderconfig =&amp;gt; An array that currently only enforces &#039;notitle&#039; but can be expanded in the future NOTE: Boost has this set as true by default &#039;options&#039;&lt;br /&gt;
The following layout level options that can be defined:&lt;br /&gt;
* noactivityheader - to remove the header in this specific layout.&lt;br /&gt;
* activityheader - An array that enforces the following options:&lt;br /&gt;
** notitle&lt;br /&gt;
** nocompletion&lt;br /&gt;
** nodescription&lt;br /&gt;
The class has a page level getter which you can use to fetch the current version of the class. The base state is initialised within the constructor with the completion information only fetched when data is exported for the template.&lt;br /&gt;
&lt;br /&gt;
The class has setters for the following variables which can be leveraged to modify the header for a particular page in the format set_{variable_name}:&lt;br /&gt;
* hidecompletion&lt;br /&gt;
* description&lt;br /&gt;
* title&lt;br /&gt;
Alternately, bulk operations can also be done by passing the above variables in an array to &#039;set_attrs&#039; which in turn calls the setters.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note: Any updates to the activityheader needs to be performed before the call to $OUTPUT-&amp;gt;header&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
===== Theme updates: =====&lt;br /&gt;
In order for 3rd party themes to use the class they need to export the activity_header and include the following into their base template :&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
   {{&amp;gt; core/activity_header}}&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;** headercontent being the array element that contains the exported activity_header data &lt;br /&gt;
===== Accessibility notes: =====&lt;br /&gt;
The jump to ‘maincontent’ div is now rendered within the activity header when within an activity context&lt;br /&gt;
== Component library ==&lt;br /&gt;
Each Moodle installation now ships with a Moodle User Interface (UI) Component library, a documentation system used to describe all the Bootstrap components and the custom Moodle components. The component Library is a helper tool for developers when creating user interfaces, a testing tool for theme developers and a documentation tool for core developers. The ultimate goal of having a component library is to encourage developers to create consistent user interfaces to improve Moodle’s overall user experience.&lt;br /&gt;
&lt;br /&gt;
The library contains pages with documentation about User Interface components. It contains details on how to use the component, what variations are available and the JavaScript events / options are associated with the component.&lt;br /&gt;
&lt;br /&gt;
When writing on these pages it is possible to render core mustache templates using some custom syntax like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; mustache template=&amp;quot;core/notification_error&amp;quot; &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; /mustache &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also call core JavaScript or use HTML examples where the html code and the rendered result are visible in the Component Library. For more info visit the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-templates/ Moodle templates] page or the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-javascript/ Moodle JavaScript] page.&lt;br /&gt;
&lt;br /&gt;
Each page in the library uses the current css from the default theme in your Moodle installation, if you have multiple themes installed and enabled the setting &amp;quot;Allow theme changes on url&amp;quot;, the component library will have a theme selector option.&lt;br /&gt;
&lt;br /&gt;
A hosted version of the Component Library can be found here. http://componentlibrary.moodle.com&lt;br /&gt;
=== Enabling the Component Library ===&lt;br /&gt;
Component library pages are written in the markdown language. These pages need to be compiled to HTML pages before the Component Library is visible. To compile the pages the server running Moodle needs to have the [[Javascript Modules#Install%20NVM%20and%20Node|JavaScript developer tools installed]] (nodeJs and Grunt)&lt;br /&gt;
&lt;br /&gt;
If your server meets all requirements you can enable the library running&lt;br /&gt;
 $ npm install&lt;br /&gt;
 $ grunt componentlibrary&lt;br /&gt;
Further installation instructions can be found in the Component Library itself.&lt;br /&gt;
=== Documenting new UI Components ===&lt;br /&gt;
There are no set rules for adding new pages in the component library yet. These rules will need to be written and adopted in the integration process for Moodle code.&lt;br /&gt;
&lt;br /&gt;
As a guideline for making this rules consideration are:&lt;br /&gt;
&lt;br /&gt;
The component library is not about single use components, for example the Moodle grade book (a huge component with many custom features). Or about very common components like buttons, these are already covered by the Bootstrap section of the component library.&lt;br /&gt;
&lt;br /&gt;
New features should be build keeping in mind the UI part needs to be customisable and if possible (and making sense) reusable. And example would be the new page drawers that we are introducing for the Navigation project. Or the custom primary navigation menus where overflowing items are pushed into a More section.&lt;br /&gt;
== Theme changes ==&lt;br /&gt;
=== Edit switch ===&lt;br /&gt;
On theme boost the “Turn editing on” and “Customise this page” buttons have been replaced by an edit switch in the top navbar. Theme Classic will keep using the old buttons. Child themes can choose to use the edit switch if the theme config.php is using this variable&lt;br /&gt;
 $THEME-&amp;gt;haseditswitch = true;&lt;br /&gt;
The languague menu, which used to be rendered in place of the custom menu has moved to the user dropdown when the user is logged in. If not logged in it will be placed next to the search / notification / messaging icon in the top navbar.&lt;br /&gt;
=== Login page ===&lt;br /&gt;
The login page has been redesigned and allows the admin to configure a background image for the login page only in the theme settings page. This change is available in both Boost and Classic. The login page still has all the features with an improved layout. &lt;br /&gt;
=== The page footer ===&lt;br /&gt;
In large screens, the page footer button is only visible when clicking a help button at the bottom right of the screen.&lt;br /&gt;
=== User initials as profile picture placeholder ===&lt;br /&gt;
If users do not upload a profile picture the user initials are displayed on a rounded gray background as a placeholder picture in the top navbar or any other page using a placeholder image. This change will be available in both Boost and Classic. &lt;br /&gt;
&lt;br /&gt;
With the introduction of this placeholder image the full username will no longer be displayed in the top navbar.&lt;br /&gt;
=== Removal of back to top link ===&lt;br /&gt;
The &amp;quot;back to top&amp;quot; link will be removed for theme boost since the new course index reduced the dependence on page scrolling. Also, the new footer is positioned where this component used to be.&lt;br /&gt;
=== Styling changes ===&lt;br /&gt;
By default rounded edges will be used for UI components, for the page header and main content area the borders will be removed. &lt;br /&gt;
=== New layout page ===&lt;br /&gt;
Theme boost now uses the drawers.php layout for the course index and blocks.&lt;br /&gt;
== Question bank changes ==&lt;br /&gt;
There was a big project to deliver [[Question bank improvements for Moodle 4.0]] which added a new plugin type for adding features to the question banks, tracking the version history for each question as it is edited (question table has been split into &amp;lt;code&amp;gt;question&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;question_versions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_bank_entries&amp;lt;/code&amp;gt;), and tracking where each question is going to be used, with new tables &amp;lt;code&amp;gt;question_references&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_set_references&amp;lt;/code&amp;gt;. This work was done in Epic MDL-70329 if you want to track down the details of any of the core changes.&lt;br /&gt;
=== Question type plugins ===&lt;br /&gt;
Amazingly, we (Safat and colleagues at Catalyst AU) managed to implement this without breaking most question type plugins.&lt;br /&gt;
&lt;br /&gt;
However, the changes to the question bank, and the other Moodle 4.0 changes, probably broke the Behat tests for your plugin. To help with fixing that, MDL-74130 adds navigation to key question type pages (Preview and Edit for a question, and standard question bank pages like the bank itself, import and export) which should let you fix your test efficiently, and in a way that will work in all Moodle versions since 3.9.&lt;br /&gt;
&lt;br /&gt;
The &#039;most&#039; in the first paragraph here is becuase more advance question types may require more effort to fix. (For example qtype_combined which creates multi-part qusetions like the core qtype_multianswer; or qtype_pmatch or qtype_stack, which store additional data - questions tests - alongside the question itseld. How should that work with versionning?) But, if you have not done weird things like that, you are probably safe. If you find anything else that causes problems, please list it here.&lt;br /&gt;
&lt;br /&gt;
The same thing should apply to question behaviour and question import/export format plugings: no significant changes required (probably just fixing the Behat tests because of the navigation changes).&lt;br /&gt;
=== New plugin type: qbank plugins ===&lt;br /&gt;
This is not something that will cause problems for people upgrading from 3.x. Rather, it is an exciting possibility you can explore once you have survived process of upgrading to 4.0. There is a whole new plugin type which you can create to add new features to the question bank. For example extra columns, new actions and bulk actions, and so on. See [[Question_bank_plugins]].&lt;br /&gt;
=== Activities that use questions ===&lt;br /&gt;
The probable bad news is if you have an activity module which uses questions. So far, the only activity which has been fixed is mod_quiz in Moodle core, so we don&#039;t yet have a good picture of what fixes will be necessary in other activities. Work is about to start fixing [https://github.com/studentquiz/moodle-mod_studentquiz mod_studentquiz], so watching that should give more clues. As we do that, we will try to update this section of this page. Other help writing the information required here would also be greatly appreciated.&lt;br /&gt;
== The course format system ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
=== Mandatory renderer in course formats ===&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
=== New format base class ===&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
=== New course output classes and mustache files ===&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
=== Course editor javascript modules and frontend components ===&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
=== Other course related 4.0 changes ===&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
=== New steps ===&lt;br /&gt;
Moodle 4.0 introduces some new behat steps.&lt;br /&gt;
&lt;br /&gt;
Sometimes you want to create a bulk number of activities. In that case you can use:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
:count :entitytype exist with the following data:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
Given 100 &amp;quot;mod_lti &amp;gt; tool types&amp;quot; exist with the following data:&lt;br /&gt;
  |name        |Test tool [count]                  |&lt;br /&gt;
  |description |Example description [count]        |&lt;br /&gt;
  |baseurl     |https://www.example.com/tool[count]|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dynamic (AJAX) tabs is a new feature contributed to Moodle 4.0 by the Workplace team (MDL-71943). You can use the following step to navigate between the tabs.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on the &amp;quot;tab title&amp;quot; dynamic tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To make sure that edit mode is (or is not) available on the current page, the following steps can be used.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And edit mode should be available on the current page&lt;br /&gt;
And edit mode should not be available on the current page&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are new aliases for the existing steps &amp;lt;code&amp;gt;I turn editing mode on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;I turn editing mode off&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I switch editing mode on&lt;br /&gt;
And I switch editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to the existing step to go to a course with editing mode on, we now have the following step to do the same but with editing mode being off.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I am on &amp;quot;course full name&amp;quot; course homepage with editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step is similar to the old &amp;lt;code&amp;gt;following &amp;quot;link string&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&amp;lt;/code&amp;gt; step, with more flexibility.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;Download&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;Starter&amp;quot; &amp;quot;table_row&amp;quot; should download between &amp;quot;0&amp;quot; and &amp;quot;5000&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to hover the mouse over the trigger area.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over the &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step enables an installed plugin.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;plugin name&amp;quot; &amp;quot;plugin type&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;course_summary&amp;quot; &amp;quot;block&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following is a special variation of &#039;I click on &amp;quot;&amp;lt;page name&amp;gt;&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;page&amp;quot; &amp;quot;region&amp;quot;&#039;. It first checks to see if we are on the given page via the breadcrumb. If not we then attempt to follow the link name given.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I follow the breadcrumb &amp;quot;page name&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can use the following step to ensure a node is active in the navbar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Node&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;My courses&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to navigate to a given node in the primary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select &amp;quot;Node&amp;quot; from primary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check whether an item exists in the user menu or not.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the user menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Language&amp;quot; &amp;quot;link&amp;quot; should exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check if a submenu of the user menu is shown, and if an item exists or does not exist in a given user submenu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I follow &amp;quot;Language&amp;quot; in the user menu&lt;br /&gt;
Then I should see &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English (pirate) &amp;amp;lrm;(en_ar)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To add enrolment methods to courses you can use the following new step. The data that you provide in the next lines are used to fill the enrolment method form.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;enrolment method&amp;quot; in &amp;quot;course identifier&amp;quot; with:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I add &amp;quot;Self enrolment&amp;quot; enrolment method in &amp;quot;Course 1&amp;quot; with:&lt;br /&gt;
  | Custom instance name     | Test student enrolment |&lt;br /&gt;
  | Enrolment key            | moodle_rules           |&lt;br /&gt;
  | Use group enrolment keys | Yes                    |&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 3 new steps specific to the calendar component. These steps can be used to hover over a day in the mini-calendar or the full calendar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the full calendar page&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the mini-calendar block&lt;br /&gt;
And I hover over today in the mini-calendar block&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some new steps are added to question bank to be able to add comment to questions, verify the existence of a comment, and deleting comments form questions. Please note that the steps for adding comments only write the comment text in the comment field. You still need to click on the &amp;quot;Add comment&amp;quot; button to save the comment.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question preview&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question preview&lt;br /&gt;
And I should see &amp;quot;number of comments&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;number of comments&amp;quot; on the row on the comments column&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;Question bank&amp;quot; in current page administration&lt;br /&gt;
And I should see &amp;quot;0&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;0&amp;quot; on the row on the comments column&lt;br /&gt;
And I add &amp;quot;test comment 01&amp;quot; comment to question&lt;br /&gt;
And I click on &amp;quot;Add comment&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Close&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I should see &amp;quot;1&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;1&amp;quot; on the row on the comments column&lt;br /&gt;
And I delete &amp;quot;test comment 01&amp;quot; comment from question&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similar to the steps for comments, the following steps are to verify the number of a question&#039;s usage and to click on it in order to open the question usage modal.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
And I click &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new steps are related to bulk actions in the question bank UI.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should not see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on &amp;quot;First question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Second question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;With selected&amp;quot; &amp;quot;button&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Delete&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;Confirm&amp;quot; &amp;quot;dialogue&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://docs.moodle.org/en/Report_builder Report builder] is a new feature contributed to Moodle 4.0 by the Workplace team. The following new step is added to Moodle 4.0 to select an action from the action menu in the list of custom reports table.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I press &amp;quot;action&amp;quot; action in the &amp;quot;report name&amp;quot; report row&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There&#039;s another step related to the report builder to set a column&#039;s aggregation in the report editor.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;column title&amp;quot; column aggregation to &amp;quot;aggregation method&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;First name&amp;quot; column aggregation to &amp;quot;Comma separated values&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step needs to be used in scenarios that involve testing BigBlueButton. For this to work, you need to have a [https://github.com/moodlehq/bigbluebutton_mock BigBlueButton Mock API Server] and set &amp;lt;code&amp;gt;TEST_MOD_BIGBLUEBUTTONBN_MOCK_SERVER&amp;lt;/code&amp;gt; to point to that in config.php.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And a BigBlueButton mock server is configured&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step replicates receiving a callback from the BigBlueButton server indicating the recordings for meetings are ready for viewing.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And the BigBlueButtonBN server has sent recording ready notifications&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are specific to the lesson activity. Note that in 4.0, some links (such as the &amp;quot;edit&amp;quot; and the &amp;quot;grade essays&amp;quot; links) are replaced by buttons, so you need to update your old steps with the new ones.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I edit the lesson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;A new step is added to be used in lesson activities to edit them. This step navigates the user to the lesson edit page.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I grade lesson essays&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;It&#039;s a new step to go to the &amp;quot;Grade essays&amp;quot; page of the lesson we are currently in.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select edit type &amp;quot;edit type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Select the lesson edit type when we are in the the lesson&#039;s edit page. &amp;quot;edit type&amp;quot; can either be &amp;quot;Collapsed&amp;quot; or &amp;quot;Expanded&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new step can be used to navigate to the exports page in the course gradebook and select the specified export type from the grade exports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;export option&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;XML file&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similarly, there&#039;s a new step to navigate to the imports page in the course gradebook and select the specified import type from the grade imports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;import option&amp;quot; import page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Boost steps ===&lt;br /&gt;
In addition to the steps listed in the previous section, there are also some Boost specific steps coming with Moodle 4.0. These steps only work in Boost or Boost child themes, so you need to make sure they are not used in scenarios that may be run by non-Boost themes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step checks whether a node is active in the secondary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see :name is active in secondary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Boost theme shows the language selector menu in the primary navigation when not logged in, and within the user menu when logged in. The following steps are to check if the primary navigation includes the language selector menu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And language selector menu should exist in the navbar&lt;br /&gt;
And language selector menu should not exist in the navbar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And the following steps can be used to check whether an item exists in the language selector menu in the Boost theme.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the language selector menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Modified steps ===&lt;br /&gt;
The step &amp;lt;code&amp;gt;I change the (window|viewport) size to &amp;quot;size&amp;quot;&amp;lt;/code&amp;gt; now supports 2 new values for the size argument. The size argument now accepts &amp;lt;code&amp;gt;mobile&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tablet&amp;lt;/code&amp;gt; values in addition to &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;large&amp;lt;/code&amp;gt;.&lt;br /&gt;
=== Removed steps ===&lt;br /&gt;
Some behat steps are removed or replaced with new steps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As a result of some design changes, hidden or restricted activities are no longer dimmed. Therefore the step&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be dimmed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;is now removed.&lt;br /&gt;
Depending on what you were using that step for, you may be able to use these steps:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Label name&amp;quot; label should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Activity or resource name&amp;quot;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;region-main&amp;quot; &amp;quot;region&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Other things to consider ===&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. It is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] is integrated these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
Old behat steps that may now fail can be updated to the new steps.&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
There are also similar stream-lined navigation steps for accessing question bank pages. See MDL-74130.&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Core plugins review ===&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;br /&gt;
=== Site admin presets plugin ===&lt;br /&gt;
The third-party plugin [https://moodle.org/plugins/block_admin_presets Admin presets], created by David Monllaó and maintained by developers from [https://pimenko.com/ Pimenko] has been adapted and integrated into Moodle 4.0. It stores settings and plugins status (enabled/disabled) in what&#039;s called &amp;quot;presets&amp;quot; to let admins quickly switch between different configurations.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Site admin presets|Site admin presets plugin]] page.&lt;br /&gt;
=== JavaScript browser support changes ===&lt;br /&gt;
From Moodle 4.0, Internet Explorer is no longer supported. See MDL-73915 and MDLSITE-6109 for further information on this change.&lt;br /&gt;
&lt;br /&gt;
This change means that changes built on 4.0 onwards (including the master branch) will be different to older versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
For plugin developers supporting multiple versions of Moodle using a single plugin version, the compiled javascript files are backwards compatible and will _work_ on all supported versions, however if you run the `grunt` command on multiple versions you will see unbuilt changes. Running grunt on all versions of Moodle is not necessary and this check can be safely disabled for Moodle versions 3.9 - 4.0, as long as only at least you run `grunt` against at least one version of Moodle.&lt;br /&gt;
&lt;br /&gt;
If you need to support Internet Explorer and do not wish to fork your plugin for Moodle 4.0 onwards, then it is recommended that you run `grunt` on an older version of Moodle.&lt;br /&gt;
=== The course index element ===&lt;br /&gt;
The new course index feature can be themed using a set of scss variables. Use them to change the look and feel instead of adding custom css&lt;br /&gt;
 /theme/boost/scss/moodle/courseindex.scss&lt;br /&gt;
With the introduction of the course index component, the previous and next links shown underneath each activity are no longer needed and they will be removed.&lt;br /&gt;
=== Activity icons ===&lt;br /&gt;
The icons used for activities have been redesigned and updated for all core moodle activities.&lt;br /&gt;
&lt;br /&gt;
When viewing the new icons in a file manager, for example for the quiz activity, you will see a simple black monochrome icon with a transparent background.&lt;br /&gt;
&lt;br /&gt;
On the course page, or in the activity chooser, the icon will display as a white icon on a coloured background. Styling of the icons on the coursepage is controlled by the css in theme/boost/scss/moodle/icons.scss.&lt;br /&gt;
&lt;br /&gt;
The background colour for activity icons is set using a new variable in function [modname]_supports(). The quiz activity is of type assessment, so in function quiz_supports() there is a new line defining the purpose:&lt;br /&gt;
 case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;&lt;br /&gt;
Available purposes are:&lt;br /&gt;
* MOD_PURPOSE_COMMUNICATION&lt;br /&gt;
* MOD_PURPOSE_ASSESSMENT&lt;br /&gt;
* MOD_PURPOSE_COLLABORATION&lt;br /&gt;
* MOD_PURPOSE_CONTENT&lt;br /&gt;
* MOD_PURPOSE_ADMINISTRATION&lt;br /&gt;
* MOD_PURPOSE_INTERFACE&lt;br /&gt;
The background colours linked to these purposes are set in theme/boost/scss/moodle/variables.scss&lt;br /&gt;
 $activity-icon-colors: map-merge(&lt;br /&gt;
     (&lt;br /&gt;
         &amp;quot;administration&amp;quot;: #5d63f6,&lt;br /&gt;
         &amp;quot;assessment&amp;quot;: #eb66a2,&lt;br /&gt;
         &amp;quot;collaboration&amp;quot;: #f7634d,&lt;br /&gt;
         &amp;quot;communication&amp;quot;: #11a676,&lt;br /&gt;
         &amp;quot;content&amp;quot;: #399be2,&lt;br /&gt;
         &amp;quot;interface&amp;quot;: #a378ff&lt;br /&gt;
     ),&lt;br /&gt;
     $activity-icon-colors&lt;br /&gt;
 );&lt;br /&gt;
If activity plugins do not define FEATURE_MOD_PURPOSE the activity icon will be rendered against a light grey background. There is no requirement to define the purpose of activity plugins, it will only affect the icon styling.&lt;br /&gt;
&lt;br /&gt;
Plugins implementing the variable FEATURE_MOD_PURPOSE are only supported on Moodle 4.0 and newer.&lt;br /&gt;
&lt;br /&gt;
Customising the activity icon can be done in an alternative way. For example using the styles.css in mod/[pluginname/styles.css&lt;br /&gt;
&lt;br /&gt;
In the example below the activity plugin developer chooses to keep the coloured icon for the activity and render it as large as the coloured background on the core activities&lt;br /&gt;
 .modicon_subcourse.activityiconcontainer {&lt;br /&gt;
     background-color: transparent;&lt;br /&gt;
     padding: 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 .modicon_subcourse.activityiconcontainer img {&lt;br /&gt;
     width: 50px;&lt;br /&gt;
     height: 50px;&lt;br /&gt;
 }&lt;br /&gt;
To customize all icon colours use this scss array and add it to the ‘Raw initial SCSS’ in the theme Boost advanced settings page. The complete array of icon background colours can be overridden using the ‘Raw initial SCSS’ in the theme settings page. The example below changes the colours of each activity type.&lt;br /&gt;
 $activity-icon-colors: (&lt;br /&gt;
     &amp;quot;administration&amp;quot;: #5D63F6,&lt;br /&gt;
     &amp;quot;assessment&amp;quot;: #11A676,&lt;br /&gt;
     &amp;quot;collaboration&amp;quot;: #EB66A2,&lt;br /&gt;
     &amp;quot;communication&amp;quot;: #F7634D,&lt;br /&gt;
     &amp;quot;content&amp;quot;: #399BE2,&lt;br /&gt;
     &amp;quot;interface&amp;quot;: #A378FF&lt;br /&gt;
 )&lt;br /&gt;
== I&#039;m a developer, what do I need to know? ==&lt;br /&gt;
=== Modules ===&lt;br /&gt;
If you are a module developer (activity / resources) then you need to review the following updates and changes:&lt;br /&gt;
* If using settings, reformat to work with the secondary navigation. We have significantly changed the way that settings are shown. Settings added to the course and activity administration branch of the navigation are now by default shown in the secondary navigation. You will most likely find them in the more section of the secondary navigation. Please avoid creating settings in containers (a parent navigation node with children). These settings will still be shown, but this goes against the pattern that we are trying to establish for navigation around the site. If you have a lot of settings, consider creating a specific page to handle your additional settings.&lt;br /&gt;
** The order of the items in the secondary navigation may not be to your liking. This can be changed. See [[Moodle_4.0_developer_update#Changing_the_order_of_tabs|changing the order of tabs]]&lt;br /&gt;
* Update my behat tests to use new steps for site navigation. See [[Moodle_4.0_developer_update#Behat_changes|new behat steps]].&lt;br /&gt;
* Update my module to use the new activity_header API. See [[Moodle_4.0_developer_update#The_activity_header_class|the activity header]].&lt;br /&gt;
* Update my pages to make it work with the general format of the tertiary navigation. See [[Moodle_4.0_developer_update#Tertiary_navigation|the tertiary navigation]].&lt;br /&gt;
* Update my activity icon to use the API and set a purpose. See [[Moodle_4.0_developer_update#Activity_icons|activity icons]].&lt;br /&gt;
=== Themes ===&lt;br /&gt;
If you are a theme developer then you may want to consider the following:&lt;br /&gt;
* Take a look at the [[Moodle_4.0_developer_update#Navigation_changes|new navigation]] and decide if you want to incorporate this into your theme.&lt;br /&gt;
** A new layout ([[Moodle_4.0_developer_update#New_layout_page|drawers]])&lt;br /&gt;
** An [[Moodle_4.0_developer_update#Edit_switch|edit switch]]&lt;br /&gt;
** The [[Moodle_4.0_developer_update#The_course_index_element|course index]]&lt;br /&gt;
* Use of the flat nav&lt;br /&gt;
* New Site administration page and layout&lt;br /&gt;
* Course settings and how they are displayed&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61809</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61809"/>
		<updated>2022-03-14T07:30:36Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Change to unordered list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page highlights the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== Navigation changes ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
=== Primary navigation ===&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
==== Customising the primary navigation ====&lt;br /&gt;
Not yet implemented but we are looking at allowing the full addition and removal of any of the primary navigation tabs in the boost theme config file.&lt;br /&gt;
=== Secondary navigation ===&lt;br /&gt;
The main content area shows tabs for secondary navigation with a maximum of 5 items being rendered in this ‘more’ menu. A new UI component has been created to render menus like this. Files:&lt;br /&gt;
 /lib/templates/moremenu.mustache&lt;br /&gt;
==== Changing the order of tabs ====&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level. &lt;br /&gt;
=== Tertiary navigation ===&lt;br /&gt;
We&#039;ve moved action buttons to the top of the page. We would encourage you to do the same. &lt;br /&gt;
If you have any buttons on an activity page that go to another page, or open a form (or similar), then we encourage you to move them from the body of your activity page to the top. All of the core activities have been updated to follow this pattern. Please take a look to see how you can format your activity in a similar fashion. There is no API here. You are welcome to create the buttons and display them as you wish in this top area.&lt;br /&gt;
&lt;br /&gt;
=== New API functions ===&lt;br /&gt;
==== Page API ====&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondary_nav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* has_secondary_navigation_setter - Sets the ‘_hassecondarynavigation’ to indicate whether a page should render the secondary navigation&lt;br /&gt;
==== Navigationlib ====&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
==== The activity header class ====&lt;br /&gt;
There is a new activity header class that handles the display of information common to activities. 3rd party activities are not required to explicitly output this information as part of rendering individual pages.&lt;br /&gt;
&lt;br /&gt;
The common information that are currently handled by the class are:&lt;br /&gt;
* title&lt;br /&gt;
* description&lt;br /&gt;
* completion information&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As part of the update it was required that the initial information to be displayed by the class be toggable at a theme and layout level. Taking this into account the following theme level configurable exists:&lt;br /&gt;
* activityheaderconfig =&amp;gt; An array that currently only enforces &#039;notitle&#039; but can be expanded in the future NOTE: Boost has this set as true by default &#039;options&#039;&lt;br /&gt;
The following layout level options that can be defined:&lt;br /&gt;
* noactivityheader - to remove the header in this specific layout.&lt;br /&gt;
* activityheader - An array that enforces the following options:&lt;br /&gt;
** notitle&lt;br /&gt;
** nocompletion&lt;br /&gt;
** nodescription&lt;br /&gt;
The class has a page level getter which you can use to fetch the current version of the class. The base state is initialised within the constructor with the completion information only fetched when data is exported for the template.&lt;br /&gt;
&lt;br /&gt;
The class has setters for the following variables which can be leveraged to modify the header for a particular page in the format set_{variable_name}:&lt;br /&gt;
* hidecompletion&lt;br /&gt;
* description&lt;br /&gt;
* title&lt;br /&gt;
Alternately, bulk operations can also be done by passing the above variables in an array to &#039;set_attrs&#039; which in turn calls the setters.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note: Any updates to the activityheader needs to be performed before the call to $OUTPUT-&amp;gt;header&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
===== Theme updates: =====&lt;br /&gt;
In order for 3rd party themes to use the class they need to export the activity_header and include the following into their base template :&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
   {{&amp;gt; core/activity_header}}&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;** headercontent being the array element that contains the exported activity_header data &lt;br /&gt;
===== Accessibility notes: =====&lt;br /&gt;
The jump to ‘maincontent’ div is now rendered within the activity header when within an activity context&lt;br /&gt;
== Component library ==&lt;br /&gt;
Each Moodle installation now ships with a Moodle User Interface (UI) Component library, a documentation system used to describe all the Bootstrap components and the custom Moodle components. The component Library is a helper tool for developers when creating user interfaces, a testing tool for theme developers and a documentation tool for core developers. The ultimate goal of having a component library is to encourage developers to create consistent user interfaces to improve Moodle’s overall user experience.&lt;br /&gt;
&lt;br /&gt;
The library contains pages with documentation about User Interface components. It contains details on how to use the component, what variations are available and the JavaScript events / options are associated with the component.&lt;br /&gt;
&lt;br /&gt;
When writing on these pages it is possible to render core mustache templates using some custom syntax like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; mustache template=&amp;quot;core/notification_error&amp;quot; &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; /mustache &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also call core JavaScript or use HTML examples where the html code and the rendered result are visible in the Component Library. For more info visit the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-templates/ Moodle templates] page or the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-javascript/ Moodle JavaScript] page.&lt;br /&gt;
&lt;br /&gt;
Each page in the library uses the current css from the default theme in your Moodle installation, if you have multiple themes installed and enabled the setting &amp;quot;Allow theme changes on url&amp;quot;, the component library will have a theme selector option.&lt;br /&gt;
&lt;br /&gt;
A hosted version of the Component Library can be found here. http://componentlibrary.moodle.com&lt;br /&gt;
=== Enabling the Component Library ===&lt;br /&gt;
Component library pages are written in the markdown language. These pages need to be compiled to HTML pages before the Component Library is visible. To compile the pages the server running Moodle needs to have the [[Javascript Modules#Install%20NVM%20and%20Node|JavaScript developer tools installed]] (nodeJs and Grunt)&lt;br /&gt;
&lt;br /&gt;
If your server meets all requirements you can enable the library running&lt;br /&gt;
 $ npm install&lt;br /&gt;
 $ grunt componentlibrary&lt;br /&gt;
Further installation instructions can be found in the Component Library itself.&lt;br /&gt;
=== Documenting new UI Components ===&lt;br /&gt;
There are no set rules for adding new pages in the component library yet. These rules will need to be written and adopted in the integration process for Moodle code.&lt;br /&gt;
&lt;br /&gt;
As a guideline for making this rules consideration are:&lt;br /&gt;
&lt;br /&gt;
The component library is not about single use components, for example the Moodle grade book (a huge component with many custom features). Or about very common components like buttons, these are already covered by the Bootstrap section of the component library.&lt;br /&gt;
&lt;br /&gt;
New features should be build keeping in mind the UI part needs to be customisable and if possible (and making sense) reusable. And example would be the new page drawers that we are introducing for the Navigation project. Or the custom primary navigation menus where overflowing items are pushed into a More section.&lt;br /&gt;
== Theme changes ==&lt;br /&gt;
=== Edit switch ===&lt;br /&gt;
On theme boost the “Turn editing on” and “Customise this page” buttons have been replaced by an edit switch in the top navbar. Theme Classic will keep using the old buttons. Child themes can choose to use the edit switch if the theme config.php is using this variable&lt;br /&gt;
 $THEME-&amp;gt;haseditswitch = true;&lt;br /&gt;
The languague menu, which used to be rendered in place of the custom menu has moved to the user dropdown when the user is logged in. If not logged in it will be placed next to the search / notification / messaging icon in the top navbar.&lt;br /&gt;
=== Login page ===&lt;br /&gt;
The login page has been redesigned and allows the admin to configure a background image for the login page only in the theme settings page. This change is available in both Boost and Classic. The login page still has all the features with an improved layout. &lt;br /&gt;
=== The page footer ===&lt;br /&gt;
In large screens, the page footer button is only visible when clicking a help button at the bottom right of the screen.&lt;br /&gt;
=== User initials as profile picture placeholder ===&lt;br /&gt;
If users do not upload a profile picture the user initials are displayed on a rounded gray background as a placeholder picture in the top navbar or any other page using a placeholder image. This change will be available in both Boost and Classic. &lt;br /&gt;
&lt;br /&gt;
With the introduction of this placeholder image the full username will no longer be displayed in the top navbar.&lt;br /&gt;
=== Removal of back to top link ===&lt;br /&gt;
The &amp;quot;back to top&amp;quot; link will be removed for theme boost since the new course index reduced the dependence on page scrolling. Also, the new footer is positioned where this component used to be.&lt;br /&gt;
=== Styling changes ===&lt;br /&gt;
By default rounded edges will be used for UI components, for the page header and main content area the borders will be removed. &lt;br /&gt;
=== New layout page ===&lt;br /&gt;
Theme boost now uses the drawers.php layout for the course index and blocks.&lt;br /&gt;
== Question bank changes ==&lt;br /&gt;
There was a big project to deliver [[Question bank improvements for Moodle 4.0]] which added a new plugin type for adding features to the question banks, tracking the version history for each question as it is edited (question table has been split into &amp;lt;code&amp;gt;question&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;question_versions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_bank_entries&amp;lt;/code&amp;gt;), and tracking where each question is going to be used, with new tables &amp;lt;code&amp;gt;question_references&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_set_references&amp;lt;/code&amp;gt;. This work was done in Epic MDL-70329 if you want to track down the details of any of the core changes.&lt;br /&gt;
=== Question type plugins ===&lt;br /&gt;
Amazingly, we (Safat and colleagues at Catalyst AU) managed to implement this without breaking most question type plugins.&lt;br /&gt;
&lt;br /&gt;
However, the changes to the question bank, and the other Moodle 4.0 changes, probably broke the Behat tests for your plugin. To help with fixing that, MDL-74130 adds navigation to key question type pages (Preview and Edit for a question, and standard question bank pages like the bank itself, import and export) which should let you fix your test efficiently, and in a way that will work in all Moodle versions since 3.9.&lt;br /&gt;
&lt;br /&gt;
The &#039;most&#039; in the first paragraph here is becuase more advance question types may require more effort to fix. (For example qtype_combined which creates multi-part qusetions like the core qtype_multianswer; or qtype_pmatch or qtype_stack, which store additional data - questions tests - alongside the question itseld. How should that work with versionning?) But, if you have not done weird things like that, you are probably safe. If you find anything else that causes problems, please list it here.&lt;br /&gt;
&lt;br /&gt;
The same thing should apply to question behaviour and question import/export format plugings: no significant changes required (probably just fixing the Behat tests because of the navigation changes).&lt;br /&gt;
=== New plugin type: qbank plugins ===&lt;br /&gt;
This is not something that will cause problems for people upgrading from 3.x. Rather, it is an exciting possibility you can explore once you have survived process of upgrading to 4.0. There is a whole new plugin type which you can create to add new features to the question bank. For example extra columns, new actions and bulk actions, and so on. See [[Question_bank_plugins]].&lt;br /&gt;
=== Activities that use questions ===&lt;br /&gt;
The probable bad news is if you have an activity module which uses questions. So far, the only activity which has been fixed is mod_quiz in Moodle core, so we don&#039;t yet have a good picture of what fixes will be necessary in other activities. Work is about to start fixing [https://github.com/studentquiz/moodle-mod_studentquiz mod_studentquiz], so watching that should give more clues. As we do that, we will try to update this section of this page. Other help writing the information required here would also be greatly appreciated.&lt;br /&gt;
== The course format system ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
=== Mandatory renderer in course formats ===&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
=== New format base class ===&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
=== New course output classes and mustache files ===&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
=== Course editor javascript modules and frontend components ===&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
=== Other course related 4.0 changes ===&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
&lt;br /&gt;
=== New steps ===&lt;br /&gt;
Moodle 4.0 introduces some new behat steps.&lt;br /&gt;
&lt;br /&gt;
Sometimes you want to create a bulk number of activities. In that case you can use:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
:count :entitytype exist with the following data:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
Given 100 &amp;quot;mod_lti &amp;gt; tool types&amp;quot; exist with the following data:&lt;br /&gt;
  |name        |Test tool [count]                  |&lt;br /&gt;
  |description |Example description [count]        |&lt;br /&gt;
  |baseurl     |https://www.example.com/tool[count]|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dynamic (AJAX) tabs is a new feature contributed to Moodle 4.0 by the Workplace team (MDL-71943). You can use the following step to navigate between the tabs.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on the &amp;quot;tab title&amp;quot; dynamic tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To make sure that edit mode is (or is not) available on the current page, the following steps can be used.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And edit mode should be available on the current page&lt;br /&gt;
And edit mode should not be available on the current page&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are new aliases for the existing steps &amp;lt;code&amp;gt;I turn editing mode on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;I turn editing mode off&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I switch editing mode on&lt;br /&gt;
And I switch editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to the existing step to go to a course with editing mode on, we now have the following step to do the same but with editing mode being off.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I am on &amp;quot;course full name&amp;quot; course homepage with editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step is similar to the old &amp;lt;code&amp;gt;following &amp;quot;link string&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&amp;lt;/code&amp;gt; step, with more flexibility.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;Download&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;Starter&amp;quot; &amp;quot;table_row&amp;quot; should download between &amp;quot;0&amp;quot; and &amp;quot;5000&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to hover the mouse over the trigger area.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over the &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step enables an installed plugin.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;plugin name&amp;quot; &amp;quot;plugin type&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;course_summary&amp;quot; &amp;quot;block&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following is a special variation of &#039;I click on &amp;quot;&amp;lt;page name&amp;gt;&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;page&amp;quot; &amp;quot;region&amp;quot;&#039;. It first checks to see if we are on the given page via the breadcrumb. If not we then attempt to follow the link name given.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I follow the breadcrumb &amp;quot;page name&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can use the following step to ensure a node is active in the navbar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Node&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;My courses&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to navigate to a given node in the primary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select &amp;quot;Node&amp;quot; from primary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check whether an item exists in the user menu or not.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the user menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Language&amp;quot; &amp;quot;link&amp;quot; should exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check if a submenu of the user menu is shown, and if an item exists or does not exist in a given user submenu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I follow &amp;quot;Language&amp;quot; in the user menu&lt;br /&gt;
Then I should see &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English (pirate) &amp;amp;lrm;(en_ar)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To add enrolment methods to courses you can use the following new step. The data that you provide in the next lines are used to fill the enrolment method form.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;enrolment method&amp;quot; in &amp;quot;course identifier&amp;quot; with:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I add &amp;quot;Self enrolment&amp;quot; enrolment method in &amp;quot;Course 1&amp;quot; with:&lt;br /&gt;
  | Custom instance name     | Test student enrolment |&lt;br /&gt;
  | Enrolment key            | moodle_rules           |&lt;br /&gt;
  | Use group enrolment keys | Yes                    |&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 3 new steps specific to the calendar component. These steps can be used to hover over a day in the mini-calendar or the full calendar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the full calendar page&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the mini-calendar block&lt;br /&gt;
And I hover over today in the mini-calendar block&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some new steps are added to question bank to be able to add comment to questions, verify the existence of a comment, and deleting comments form questions. Please note that the steps for adding comments only write the comment text in the comment field. You still need to click on the &amp;quot;Add comment&amp;quot; button to save the comment.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question preview&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question preview&lt;br /&gt;
And I should see &amp;quot;number of comments&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;number of comments&amp;quot; on the row on the comments column&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;Question bank&amp;quot; in current page administration&lt;br /&gt;
And I should see &amp;quot;0&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;0&amp;quot; on the row on the comments column&lt;br /&gt;
And I add &amp;quot;test comment 01&amp;quot; comment to question&lt;br /&gt;
And I click on &amp;quot;Add comment&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Close&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I should see &amp;quot;1&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;1&amp;quot; on the row on the comments column&lt;br /&gt;
And I delete &amp;quot;test comment 01&amp;quot; comment from question&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similar to the steps for comments, the following steps are to verify the number of a question&#039;s usage and to click on it in order to open the question usage modal.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
And I click &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new steps are related to bulk actions in the question bank UI.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should not see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on &amp;quot;First question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Second question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;With selected&amp;quot; &amp;quot;button&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Delete&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;Confirm&amp;quot; &amp;quot;dialogue&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://docs.moodle.org/en/Report_builder Report builder] is a new feature contributed to Moodle 4.0 by the Workplace team. The following new step is added to Moodle 4.0 to select an action from the action menu in the list of custom reports table.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I press &amp;quot;action&amp;quot; action in the &amp;quot;report name&amp;quot; report row&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There&#039;s another step related to the report builder to set a column&#039;s aggregation in the report editor.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;column title&amp;quot; column aggregation to &amp;quot;aggregation method&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;First name&amp;quot; column aggregation to &amp;quot;Comma separated values&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step needs to be used in scenarios that involve testing BigBlueButton. For this to work, you need to have a [https://github.com/moodlehq/bigbluebutton_mock BigBlueButton Mock API Server] and set &amp;lt;code&amp;gt;TEST_MOD_BIGBLUEBUTTONBN_MOCK_SERVER&amp;lt;/code&amp;gt; to point to that in config.php.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And a BigBlueButton mock server is configured&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step replicates receiving a callback from the BigBlueButton server indicating the recordings for meetings are ready for viewing.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And the BigBlueButtonBN server has sent recording ready notifications&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are specific to the lesson activity. Note that in 4.0, some links (such as the &amp;quot;edit&amp;quot; and the &amp;quot;grade essays&amp;quot; links) are replaced by buttons, so you need to update your old steps with the new ones.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I edit the lesson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;A new step is added to be used in lesson activities to edit them. This step navigates the user to the lesson edit page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I grade lesson essays&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;It&#039;s a new step to go to the &amp;quot;Grade essays&amp;quot; page of the lesson we are currently in.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select edit type &amp;quot;edit type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Select the lesson edit type when we are in the the lesson&#039;s edit page. &amp;quot;edit type&amp;quot; can either be &amp;quot;Collapsed&amp;quot; or &amp;quot;Expanded&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new step can be used to navigate to the exports page in the course gradebook and select the specified export type from the grade exports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;export option&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;XML file&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similarly, there&#039;s a new step to navigate to the imports page in the course gradebook and select the specified import type from the grade imports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;import option&amp;quot; import page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Boost steps ===&lt;br /&gt;
In addition to the steps listed in the previous section, there are also some Boost specific steps coming with Moodle 4.0. These steps only work in Boost or Boost child themes, so you need to make sure they are not used in scenarios that may be run by non-Boost themes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step checks whether a node is active in the secondary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see :name is active in secondary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Boost theme shows the language selector menu in the primary navigation when not logged in, and within the user menu when logged in. The following steps are to check if the primary navigation includes the language selector menu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And language selector menu should exist in the navbar&lt;br /&gt;
And language selector menu should not exist in the navbar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And the following steps can be used to check whether an item exists in the language selector menu in the Boost theme.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the language selector menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modified steps ===&lt;br /&gt;
The step &amp;lt;code&amp;gt;I change the (window|viewport) size to &amp;quot;size&amp;quot;&amp;lt;/code&amp;gt; now supports 2 new values for the size argument. The size argument now accepts &amp;lt;code&amp;gt;mobile&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tablet&amp;lt;/code&amp;gt; values in addition to &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;large&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Removed steps ===&lt;br /&gt;
Some behat steps are removed or replaced with new steps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As a result of some design changes, hidden or restricted activities are no longer dimmed. Therefore the step&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be dimmed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;is now removed.&lt;br /&gt;
&lt;br /&gt;
Depending on what you were using that step for, you may be able to use these steps:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Label name&amp;quot; label should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Activity or resource name&amp;quot;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;region-main&amp;quot; &amp;quot;region&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Other things to consider ===&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. It is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] is integrated these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
Old behat steps that may now fail can be updated to the new steps.&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
There are also similar stream-lined navigation steps for accessing question bank pages. See MDL-74130.&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Core plugins review ===&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;br /&gt;
=== Site admin presets plugin ===&lt;br /&gt;
The third-party plugin [https://moodle.org/plugins/block_admin_presets Admin presets], created by David Monllaó and maintained by developers from [https://pimenko.com/ Pimenko] has been adapted and integrated into Moodle 4.0. It stores settings and plugins status (enabled/disabled) in what&#039;s called &amp;quot;presets&amp;quot; to let admins quickly switch between different configurations.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Site admin presets|Site admin presets plugin]] page.&lt;br /&gt;
=== JavaScript browser support changes ===&lt;br /&gt;
From Moodle 4.0, Internet Explorer is no longer supported. See MDL-73915 and MDLSITE-6109 for further information on this change.&lt;br /&gt;
&lt;br /&gt;
This change means that changes built on 4.0 onwards (including the master branch) will be different to older versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
For plugin developers supporting multiple versions of Moodle using a single plugin version, the compiled javascript files are backwards compatible and will _work_ on all supported versions, however if you run the `grunt` command on multiple versions you will see unbuilt changes. Running grunt on all versions of Moodle is not necessary and this check can be safely disabled for Moodle versions 3.9 - 4.0, as long as only at least you run `grunt` against at least one version of Moodle.&lt;br /&gt;
&lt;br /&gt;
If you need to support Internet Explorer and do not wish to fork your plugin for Moodle 4.0 onwards, then it is recommended that you run `grunt` on an older version of Moodle.&lt;br /&gt;
=== The course index element ===&lt;br /&gt;
The new course index feature can be themed using a set of scss variables. Use them to change the look and feel instead of adding custom css&lt;br /&gt;
 /theme/boost/scss/moodle/courseindex.scss&lt;br /&gt;
With the introduction of the course index component, the previous and next links shown underneath each activity are no longer needed and they will be removed.&lt;br /&gt;
=== Activity icons ===&lt;br /&gt;
The icons used for activities have been redesigned and updated for all core moodle activities.&lt;br /&gt;
&lt;br /&gt;
When viewing the new icons in a file manager, for example for the quiz activity, you will see a simple black monochrome icon with a transparent background.&lt;br /&gt;
&lt;br /&gt;
On the course page, or in the activity chooser, the icon will display as a white icon on a coloured background. Styling of the icons on the coursepage is controlled by the css in theme/boost/scss/moodle/icons.scss.&lt;br /&gt;
&lt;br /&gt;
The background colour for activity icons is set using a new variable in function [modname]_supports(). The quiz activity is of type assessment, so in function quiz_supports() there is a new line defining the purpose:&lt;br /&gt;
 case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;&lt;br /&gt;
Available purposes are:&lt;br /&gt;
* MOD_PURPOSE_COMMUNICATION&lt;br /&gt;
* MOD_PURPOSE_ASSESSMENT&lt;br /&gt;
* MOD_PURPOSE_COLLABORATION&lt;br /&gt;
* MOD_PURPOSE_CONTENT&lt;br /&gt;
* MOD_PURPOSE_ADMINISTRATION&lt;br /&gt;
* MOD_PURPOSE_INTERFACE&lt;br /&gt;
The background colours linked to these purposes are set in theme/boost/scss/moodle/variables.scss&lt;br /&gt;
 $activity-icon-colors: map-merge(&lt;br /&gt;
     (&lt;br /&gt;
         &amp;quot;administration&amp;quot;: #5d63f6,&lt;br /&gt;
         &amp;quot;assessment&amp;quot;: #eb66a2,&lt;br /&gt;
         &amp;quot;collaboration&amp;quot;: #f7634d,&lt;br /&gt;
         &amp;quot;communication&amp;quot;: #11a676,&lt;br /&gt;
         &amp;quot;content&amp;quot;: #399be2,&lt;br /&gt;
         &amp;quot;interface&amp;quot;: #a378ff&lt;br /&gt;
     ),&lt;br /&gt;
     $activity-icon-colors&lt;br /&gt;
 );&lt;br /&gt;
If activity plugins do not define FEATURE_MOD_PURPOSE the activity icon will be rendered against a light grey background. There is no requirement to define the purpose of activity plugins, it will only affect the icon styling.&lt;br /&gt;
&lt;br /&gt;
Plugins implementing the variable FEATURE_MOD_PURPOSE are only supported on Moodle 4.0 and newer.&lt;br /&gt;
&lt;br /&gt;
Customising the activity icon can be done in an alternative way. For example using the styles.css in mod/[pluginname/styles.css&lt;br /&gt;
&lt;br /&gt;
In the example below the activity plugin developer chooses to keep the coloured icon for the activity and render it as large as the coloured background on the core activities&lt;br /&gt;
 .modicon_subcourse.activityiconcontainer {&lt;br /&gt;
     background-color: transparent;&lt;br /&gt;
     padding: 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 .modicon_subcourse.activityiconcontainer img {&lt;br /&gt;
     width: 50px;&lt;br /&gt;
     height: 50px;&lt;br /&gt;
 }&lt;br /&gt;
To customize all icon colours use this scss array and add it to the ‘Raw initial SCSS’ in the theme Boost advanced settings page. The complete array of icon background colours can be overridden using the ‘Raw initial SCSS’ in the theme settings page. The example below changes the colours of each activity type.&lt;br /&gt;
 $activity-icon-colors: (&lt;br /&gt;
     &amp;quot;administration&amp;quot;: #5D63F6,&lt;br /&gt;
     &amp;quot;assessment&amp;quot;: #11A676,&lt;br /&gt;
     &amp;quot;collaboration&amp;quot;: #EB66A2,&lt;br /&gt;
     &amp;quot;communication&amp;quot;: #F7634D,&lt;br /&gt;
     &amp;quot;content&amp;quot;: #399BE2,&lt;br /&gt;
     &amp;quot;interface&amp;quot;: #A378FF&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
== I&#039;m a developer, what do I need to know? ==&lt;br /&gt;
=== Modules ===&lt;br /&gt;
If you are a module developer (activity / resources) then you need to review the following updates and changes:&lt;br /&gt;
&lt;br /&gt;
* If using settings, reformat to work with the secondary navigation. We have significantly changed the way that settings are shown. Settings added to the course and activity administration branch of the navigation are now by default shown in the secondary navigation. You will most likely find them in the more section of the secondary navigation. Please avoid creating settings in containers (a parent navigation node with children). These settings will still be shown (details about that), but this goes against the pattern that we are trying to establish for navigation around the site. If you have a lot of settings, consider creating a specific page to handle your additional settings (screenshot?).&lt;br /&gt;
** The order of the items in the secondary navigation may not be to your liking. This can be changed. See [[Moodle_4.0_developer_update#Changing_the_order_of_tabs|changing the order of tabs]]&lt;br /&gt;
* Update my behat tests to use new steps for site navigation. See [[Moodle_4.0_developer_update#Behat_changes|new behat steps]].&lt;br /&gt;
* Update my module to use the new activity_header API. See [[Moodle_4.0_developer_update#The_activity_header_class|the activity header]].&lt;br /&gt;
* Update my pages to make it work with the general format of the tertiary navigation. See [[Moodle_4.0_developer_update#Tertiary_navigation|the tertiary navigation]].&lt;br /&gt;
* Update my activity icon to use the API and set a purpose. See [[Moodle_4.0_developer_update#Activity_icons|activity icons]].&lt;br /&gt;
&lt;br /&gt;
=== Themes ===&lt;br /&gt;
If you are a theme developer then you may want to consider the following:&lt;br /&gt;
* Take a look at the [[Moodle_4.0_developer_update#Navigation_changes|new navigation]] and decide if you want to incorporate this into your theme.&lt;br /&gt;
** A new layout ([[Moodle_4.0_developer_update#New_layout_page|drawers]])&lt;br /&gt;
** An [[Moodle_4.0_developer_update#Edit_switch|edit switch]]&lt;br /&gt;
** The [[Moodle_4.0_developer_update#The_course_index_element|course index]]&lt;br /&gt;
* Use of the flat nav&lt;br /&gt;
* New Site administration page and layout&lt;br /&gt;
* Course settings and how they are displayed&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61808</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61808"/>
		<updated>2022-03-14T07:28:38Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Base for theme developers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page highlights the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== Navigation changes ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
=== Primary navigation ===&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
==== Customising the primary navigation ====&lt;br /&gt;
Not yet implemented but we are looking at allowing the full addition and removal of any of the primary navigation tabs in the boost theme config file.&lt;br /&gt;
=== Secondary navigation ===&lt;br /&gt;
The main content area shows tabs for secondary navigation with a maximum of 5 items being rendered in this ‘more’ menu. A new UI component has been created to render menus like this. Files:&lt;br /&gt;
 /lib/templates/moremenu.mustache&lt;br /&gt;
==== Changing the order of tabs ====&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level. &lt;br /&gt;
=== Tertiary navigation ===&lt;br /&gt;
We&#039;ve moved action buttons to the top of the page. We would encourage you to do the same. &lt;br /&gt;
If you have any buttons on an activity page that go to another page, or open a form (or similar), then we encourage you to move them from the body of your activity page to the top. All of the core activities have been updated to follow this pattern. Please take a look to see how you can format your activity in a similar fashion. There is no API here. You are welcome to create the buttons and display them as you wish in this top area.&lt;br /&gt;
&lt;br /&gt;
=== New API functions ===&lt;br /&gt;
==== Page API ====&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondary_nav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* has_secondary_navigation_setter - Sets the ‘_hassecondarynavigation’ to indicate whether a page should render the secondary navigation&lt;br /&gt;
==== Navigationlib ====&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
==== The activity header class ====&lt;br /&gt;
There is a new activity header class that handles the display of information common to activities. 3rd party activities are not required to explicitly output this information as part of rendering individual pages.&lt;br /&gt;
&lt;br /&gt;
The common information that are currently handled by the class are:&lt;br /&gt;
* title&lt;br /&gt;
* description&lt;br /&gt;
* completion information&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As part of the update it was required that the initial information to be displayed by the class be toggable at a theme and layout level. Taking this into account the following theme level configurable exists:&lt;br /&gt;
* activityheaderconfig =&amp;gt; An array that currently only enforces &#039;notitle&#039; but can be expanded in the future NOTE: Boost has this set as true by default &#039;options&#039;&lt;br /&gt;
The following layout level options that can be defined:&lt;br /&gt;
* noactivityheader - to remove the header in this specific layout.&lt;br /&gt;
* activityheader - An array that enforces the following options:&lt;br /&gt;
** notitle&lt;br /&gt;
** nocompletion&lt;br /&gt;
** nodescription&lt;br /&gt;
The class has a page level getter which you can use to fetch the current version of the class. The base state is initialised within the constructor with the completion information only fetched when data is exported for the template.&lt;br /&gt;
&lt;br /&gt;
The class has setters for the following variables which can be leveraged to modify the header for a particular page in the format set_{variable_name}:&lt;br /&gt;
* hidecompletion&lt;br /&gt;
* description&lt;br /&gt;
* title&lt;br /&gt;
Alternately, bulk operations can also be done by passing the above variables in an array to &#039;set_attrs&#039; which in turn calls the setters.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note: Any updates to the activityheader needs to be performed before the call to $OUTPUT-&amp;gt;header&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
===== Theme updates: =====&lt;br /&gt;
In order for 3rd party themes to use the class they need to export the activity_header and include the following into their base template :&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
   {{&amp;gt; core/activity_header}}&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;** headercontent being the array element that contains the exported activity_header data &lt;br /&gt;
===== Accessibility notes: =====&lt;br /&gt;
The jump to ‘maincontent’ div is now rendered within the activity header when within an activity context&lt;br /&gt;
== Component library ==&lt;br /&gt;
Each Moodle installation now ships with a Moodle User Interface (UI) Component library, a documentation system used to describe all the Bootstrap components and the custom Moodle components. The component Library is a helper tool for developers when creating user interfaces, a testing tool for theme developers and a documentation tool for core developers. The ultimate goal of having a component library is to encourage developers to create consistent user interfaces to improve Moodle’s overall user experience.&lt;br /&gt;
&lt;br /&gt;
The library contains pages with documentation about User Interface components. It contains details on how to use the component, what variations are available and the JavaScript events / options are associated with the component.&lt;br /&gt;
&lt;br /&gt;
When writing on these pages it is possible to render core mustache templates using some custom syntax like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; mustache template=&amp;quot;core/notification_error&amp;quot; &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; /mustache &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also call core JavaScript or use HTML examples where the html code and the rendered result are visible in the Component Library. For more info visit the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-templates/ Moodle templates] page or the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-javascript/ Moodle JavaScript] page.&lt;br /&gt;
&lt;br /&gt;
Each page in the library uses the current css from the default theme in your Moodle installation, if you have multiple themes installed and enabled the setting &amp;quot;Allow theme changes on url&amp;quot;, the component library will have a theme selector option.&lt;br /&gt;
&lt;br /&gt;
A hosted version of the Component Library can be found here. http://componentlibrary.moodle.com&lt;br /&gt;
=== Enabling the Component Library ===&lt;br /&gt;
Component library pages are written in the markdown language. These pages need to be compiled to HTML pages before the Component Library is visible. To compile the pages the server running Moodle needs to have the [[Javascript Modules#Install%20NVM%20and%20Node|JavaScript developer tools installed]] (nodeJs and Grunt)&lt;br /&gt;
&lt;br /&gt;
If your server meets all requirements you can enable the library running&lt;br /&gt;
 $ npm install&lt;br /&gt;
 $ grunt componentlibrary&lt;br /&gt;
Further installation instructions can be found in the Component Library itself.&lt;br /&gt;
=== Documenting new UI Components ===&lt;br /&gt;
There are no set rules for adding new pages in the component library yet. These rules will need to be written and adopted in the integration process for Moodle code.&lt;br /&gt;
&lt;br /&gt;
As a guideline for making this rules consideration are:&lt;br /&gt;
&lt;br /&gt;
The component library is not about single use components, for example the Moodle grade book (a huge component with many custom features). Or about very common components like buttons, these are already covered by the Bootstrap section of the component library.&lt;br /&gt;
&lt;br /&gt;
New features should be build keeping in mind the UI part needs to be customisable and if possible (and making sense) reusable. And example would be the new page drawers that we are introducing for the Navigation project. Or the custom primary navigation menus where overflowing items are pushed into a More section.&lt;br /&gt;
== Theme changes ==&lt;br /&gt;
=== Edit switch ===&lt;br /&gt;
On theme boost the “Turn editing on” and “Customise this page” buttons have been replaced by an edit switch in the top navbar. Theme Classic will keep using the old buttons. Child themes can choose to use the edit switch if the theme config.php is using this variable&lt;br /&gt;
 $THEME-&amp;gt;haseditswitch = true;&lt;br /&gt;
The languague menu, which used to be rendered in place of the custom menu has moved to the user dropdown when the user is logged in. If not logged in it will be placed next to the search / notification / messaging icon in the top navbar.&lt;br /&gt;
=== Login page ===&lt;br /&gt;
The login page has been redesigned and allows the admin to configure a background image for the login page only in the theme settings page. This change is available in both Boost and Classic. The login page still has all the features with an improved layout. &lt;br /&gt;
=== The page footer ===&lt;br /&gt;
In large screens, the page footer button is only visible when clicking a help button at the bottom right of the screen.&lt;br /&gt;
=== User initials as profile picture placeholder ===&lt;br /&gt;
If users do not upload a profile picture the user initials are displayed on a rounded gray background as a placeholder picture in the top navbar or any other page using a placeholder image. This change will be available in both Boost and Classic. &lt;br /&gt;
&lt;br /&gt;
With the introduction of this placeholder image the full username will no longer be displayed in the top navbar.&lt;br /&gt;
=== Removal of back to top link ===&lt;br /&gt;
The &amp;quot;back to top&amp;quot; link will be removed for theme boost since the new course index reduced the dependence on page scrolling. Also, the new footer is positioned where this component used to be.&lt;br /&gt;
=== Styling changes ===&lt;br /&gt;
By default rounded edges will be used for UI components, for the page header and main content area the borders will be removed. &lt;br /&gt;
=== New layout page ===&lt;br /&gt;
Theme boost now uses the drawers.php layout for the course index and blocks.&lt;br /&gt;
== Question bank changes ==&lt;br /&gt;
There was a big project to deliver [[Question bank improvements for Moodle 4.0]] which added a new plugin type for adding features to the question banks, tracking the version history for each question as it is edited (question table has been split into &amp;lt;code&amp;gt;question&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;question_versions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_bank_entries&amp;lt;/code&amp;gt;), and tracking where each question is going to be used, with new tables &amp;lt;code&amp;gt;question_references&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_set_references&amp;lt;/code&amp;gt;. This work was done in Epic MDL-70329 if you want to track down the details of any of the core changes.&lt;br /&gt;
=== Question type plugins ===&lt;br /&gt;
Amazingly, we (Safat and colleagues at Catalyst AU) managed to implement this without breaking most question type plugins.&lt;br /&gt;
&lt;br /&gt;
However, the changes to the question bank, and the other Moodle 4.0 changes, probably broke the Behat tests for your plugin. To help with fixing that, MDL-74130 adds navigation to key question type pages (Preview and Edit for a question, and standard question bank pages like the bank itself, import and export) which should let you fix your test efficiently, and in a way that will work in all Moodle versions since 3.9.&lt;br /&gt;
&lt;br /&gt;
The &#039;most&#039; in the first paragraph here is becuase more advance question types may require more effort to fix. (For example qtype_combined which creates multi-part qusetions like the core qtype_multianswer; or qtype_pmatch or qtype_stack, which store additional data - questions tests - alongside the question itseld. How should that work with versionning?) But, if you have not done weird things like that, you are probably safe. If you find anything else that causes problems, please list it here.&lt;br /&gt;
&lt;br /&gt;
The same thing should apply to question behaviour and question import/export format plugings: no significant changes required (probably just fixing the Behat tests because of the navigation changes).&lt;br /&gt;
=== New plugin type: qbank plugins ===&lt;br /&gt;
This is not something that will cause problems for people upgrading from 3.x. Rather, it is an exciting possibility you can explore once you have survived process of upgrading to 4.0. There is a whole new plugin type which you can create to add new features to the question bank. For example extra columns, new actions and bulk actions, and so on. See [[Question_bank_plugins]].&lt;br /&gt;
=== Activities that use questions ===&lt;br /&gt;
The probable bad news is if you have an activity module which uses questions. So far, the only activity which has been fixed is mod_quiz in Moodle core, so we don&#039;t yet have a good picture of what fixes will be necessary in other activities. Work is about to start fixing [https://github.com/studentquiz/moodle-mod_studentquiz mod_studentquiz], so watching that should give more clues. As we do that, we will try to update this section of this page. Other help writing the information required here would also be greatly appreciated.&lt;br /&gt;
== The course format system ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
=== Mandatory renderer in course formats ===&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
=== New format base class ===&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
=== New course output classes and mustache files ===&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
=== Course editor javascript modules and frontend components ===&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
=== Other course related 4.0 changes ===&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
&lt;br /&gt;
=== New steps ===&lt;br /&gt;
Moodle 4.0 introduces some new behat steps.&lt;br /&gt;
&lt;br /&gt;
Sometimes you want to create a bulk number of activities. In that case you can use:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
:count :entitytype exist with the following data:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
Given 100 &amp;quot;mod_lti &amp;gt; tool types&amp;quot; exist with the following data:&lt;br /&gt;
  |name        |Test tool [count]                  |&lt;br /&gt;
  |description |Example description [count]        |&lt;br /&gt;
  |baseurl     |https://www.example.com/tool[count]|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dynamic (AJAX) tabs is a new feature contributed to Moodle 4.0 by the Workplace team (MDL-71943). You can use the following step to navigate between the tabs.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on the &amp;quot;tab title&amp;quot; dynamic tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To make sure that edit mode is (or is not) available on the current page, the following steps can be used.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And edit mode should be available on the current page&lt;br /&gt;
And edit mode should not be available on the current page&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are new aliases for the existing steps &amp;lt;code&amp;gt;I turn editing mode on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;I turn editing mode off&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I switch editing mode on&lt;br /&gt;
And I switch editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to the existing step to go to a course with editing mode on, we now have the following step to do the same but with editing mode being off.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I am on &amp;quot;course full name&amp;quot; course homepage with editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step is similar to the old &amp;lt;code&amp;gt;following &amp;quot;link string&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&amp;lt;/code&amp;gt; step, with more flexibility.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;Download&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;Starter&amp;quot; &amp;quot;table_row&amp;quot; should download between &amp;quot;0&amp;quot; and &amp;quot;5000&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to hover the mouse over the trigger area.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over the &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step enables an installed plugin.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;plugin name&amp;quot; &amp;quot;plugin type&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;course_summary&amp;quot; &amp;quot;block&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following is a special variation of &#039;I click on &amp;quot;&amp;lt;page name&amp;gt;&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;page&amp;quot; &amp;quot;region&amp;quot;&#039;. It first checks to see if we are on the given page via the breadcrumb. If not we then attempt to follow the link name given.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I follow the breadcrumb &amp;quot;page name&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can use the following step to ensure a node is active in the navbar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Node&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;My courses&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to navigate to a given node in the primary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select &amp;quot;Node&amp;quot; from primary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check whether an item exists in the user menu or not.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the user menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Language&amp;quot; &amp;quot;link&amp;quot; should exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check if a submenu of the user menu is shown, and if an item exists or does not exist in a given user submenu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I follow &amp;quot;Language&amp;quot; in the user menu&lt;br /&gt;
Then I should see &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English (pirate) &amp;amp;lrm;(en_ar)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To add enrolment methods to courses you can use the following new step. The data that you provide in the next lines are used to fill the enrolment method form.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;enrolment method&amp;quot; in &amp;quot;course identifier&amp;quot; with:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I add &amp;quot;Self enrolment&amp;quot; enrolment method in &amp;quot;Course 1&amp;quot; with:&lt;br /&gt;
  | Custom instance name     | Test student enrolment |&lt;br /&gt;
  | Enrolment key            | moodle_rules           |&lt;br /&gt;
  | Use group enrolment keys | Yes                    |&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 3 new steps specific to the calendar component. These steps can be used to hover over a day in the mini-calendar or the full calendar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the full calendar page&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the mini-calendar block&lt;br /&gt;
And I hover over today in the mini-calendar block&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some new steps are added to question bank to be able to add comment to questions, verify the existence of a comment, and deleting comments form questions. Please note that the steps for adding comments only write the comment text in the comment field. You still need to click on the &amp;quot;Add comment&amp;quot; button to save the comment.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question preview&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question preview&lt;br /&gt;
And I should see &amp;quot;number of comments&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;number of comments&amp;quot; on the row on the comments column&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;Question bank&amp;quot; in current page administration&lt;br /&gt;
And I should see &amp;quot;0&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;0&amp;quot; on the row on the comments column&lt;br /&gt;
And I add &amp;quot;test comment 01&amp;quot; comment to question&lt;br /&gt;
And I click on &amp;quot;Add comment&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Close&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I should see &amp;quot;1&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;1&amp;quot; on the row on the comments column&lt;br /&gt;
And I delete &amp;quot;test comment 01&amp;quot; comment from question&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similar to the steps for comments, the following steps are to verify the number of a question&#039;s usage and to click on it in order to open the question usage modal.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
And I click &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new steps are related to bulk actions in the question bank UI.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should not see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on &amp;quot;First question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Second question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;With selected&amp;quot; &amp;quot;button&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Delete&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;Confirm&amp;quot; &amp;quot;dialogue&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://docs.moodle.org/en/Report_builder Report builder] is a new feature contributed to Moodle 4.0 by the Workplace team. The following new step is added to Moodle 4.0 to select an action from the action menu in the list of custom reports table.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I press &amp;quot;action&amp;quot; action in the &amp;quot;report name&amp;quot; report row&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There&#039;s another step related to the report builder to set a column&#039;s aggregation in the report editor.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;column title&amp;quot; column aggregation to &amp;quot;aggregation method&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;First name&amp;quot; column aggregation to &amp;quot;Comma separated values&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step needs to be used in scenarios that involve testing BigBlueButton. For this to work, you need to have a [https://github.com/moodlehq/bigbluebutton_mock BigBlueButton Mock API Server] and set &amp;lt;code&amp;gt;TEST_MOD_BIGBLUEBUTTONBN_MOCK_SERVER&amp;lt;/code&amp;gt; to point to that in config.php.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And a BigBlueButton mock server is configured&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step replicates receiving a callback from the BigBlueButton server indicating the recordings for meetings are ready for viewing.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And the BigBlueButtonBN server has sent recording ready notifications&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are specific to the lesson activity. Note that in 4.0, some links (such as the &amp;quot;edit&amp;quot; and the &amp;quot;grade essays&amp;quot; links) are replaced by buttons, so you need to update your old steps with the new ones.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I edit the lesson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;A new step is added to be used in lesson activities to edit them. This step navigates the user to the lesson edit page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I grade lesson essays&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;It&#039;s a new step to go to the &amp;quot;Grade essays&amp;quot; page of the lesson we are currently in.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select edit type &amp;quot;edit type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Select the lesson edit type when we are in the the lesson&#039;s edit page. &amp;quot;edit type&amp;quot; can either be &amp;quot;Collapsed&amp;quot; or &amp;quot;Expanded&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new step can be used to navigate to the exports page in the course gradebook and select the specified export type from the grade exports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;export option&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;XML file&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similarly, there&#039;s a new step to navigate to the imports page in the course gradebook and select the specified import type from the grade imports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;import option&amp;quot; import page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Boost steps ===&lt;br /&gt;
In addition to the steps listed in the previous section, there are also some Boost specific steps coming with Moodle 4.0. These steps only work in Boost or Boost child themes, so you need to make sure they are not used in scenarios that may be run by non-Boost themes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step checks whether a node is active in the secondary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see :name is active in secondary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Boost theme shows the language selector menu in the primary navigation when not logged in, and within the user menu when logged in. The following steps are to check if the primary navigation includes the language selector menu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And language selector menu should exist in the navbar&lt;br /&gt;
And language selector menu should not exist in the navbar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And the following steps can be used to check whether an item exists in the language selector menu in the Boost theme.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the language selector menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modified steps ===&lt;br /&gt;
The step &amp;lt;code&amp;gt;I change the (window|viewport) size to &amp;quot;size&amp;quot;&amp;lt;/code&amp;gt; now supports 2 new values for the size argument. The size argument now accepts &amp;lt;code&amp;gt;mobile&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tablet&amp;lt;/code&amp;gt; values in addition to &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;large&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Removed steps ===&lt;br /&gt;
Some behat steps are removed or replaced with new steps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As a result of some design changes, hidden or restricted activities are no longer dimmed. Therefore the step&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be dimmed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;is now removed.&lt;br /&gt;
&lt;br /&gt;
Depending on what you were using that step for, you may be able to use these steps:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Label name&amp;quot; label should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Activity or resource name&amp;quot;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;region-main&amp;quot; &amp;quot;region&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Other things to consider ===&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. It is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] is integrated these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
Old behat steps that may now fail can be updated to the new steps.&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
There are also similar stream-lined navigation steps for accessing question bank pages. See MDL-74130.&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Core plugins review ===&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;br /&gt;
=== Site admin presets plugin ===&lt;br /&gt;
The third-party plugin [https://moodle.org/plugins/block_admin_presets Admin presets], created by David Monllaó and maintained by developers from [https://pimenko.com/ Pimenko] has been adapted and integrated into Moodle 4.0. It stores settings and plugins status (enabled/disabled) in what&#039;s called &amp;quot;presets&amp;quot; to let admins quickly switch between different configurations.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Site admin presets|Site admin presets plugin]] page.&lt;br /&gt;
=== JavaScript browser support changes ===&lt;br /&gt;
From Moodle 4.0, Internet Explorer is no longer supported. See MDL-73915 and MDLSITE-6109 for further information on this change.&lt;br /&gt;
&lt;br /&gt;
This change means that changes built on 4.0 onwards (including the master branch) will be different to older versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
For plugin developers supporting multiple versions of Moodle using a single plugin version, the compiled javascript files are backwards compatible and will _work_ on all supported versions, however if you run the `grunt` command on multiple versions you will see unbuilt changes. Running grunt on all versions of Moodle is not necessary and this check can be safely disabled for Moodle versions 3.9 - 4.0, as long as only at least you run `grunt` against at least one version of Moodle.&lt;br /&gt;
&lt;br /&gt;
If you need to support Internet Explorer and do not wish to fork your plugin for Moodle 4.0 onwards, then it is recommended that you run `grunt` on an older version of Moodle.&lt;br /&gt;
=== The course index element ===&lt;br /&gt;
The new course index feature can be themed using a set of scss variables. Use them to change the look and feel instead of adding custom css&lt;br /&gt;
 /theme/boost/scss/moodle/courseindex.scss&lt;br /&gt;
With the introduction of the course index component, the previous and next links shown underneath each activity are no longer needed and they will be removed.&lt;br /&gt;
=== Activity icons ===&lt;br /&gt;
The icons used for activities have been redesigned and updated for all core moodle activities.&lt;br /&gt;
&lt;br /&gt;
When viewing the new icons in a file manager, for example for the quiz activity, you will see a simple black monochrome icon with a transparent background.&lt;br /&gt;
&lt;br /&gt;
On the course page, or in the activity chooser, the icon will display as a white icon on a coloured background. Styling of the icons on the coursepage is controlled by the css in theme/boost/scss/moodle/icons.scss.&lt;br /&gt;
&lt;br /&gt;
The background colour for activity icons is set using a new variable in function [modname]_supports(). The quiz activity is of type assessment, so in function quiz_supports() there is a new line defining the purpose:&lt;br /&gt;
 case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;&lt;br /&gt;
Available purposes are:&lt;br /&gt;
* MOD_PURPOSE_COMMUNICATION&lt;br /&gt;
* MOD_PURPOSE_ASSESSMENT&lt;br /&gt;
* MOD_PURPOSE_COLLABORATION&lt;br /&gt;
* MOD_PURPOSE_CONTENT&lt;br /&gt;
* MOD_PURPOSE_ADMINISTRATION&lt;br /&gt;
* MOD_PURPOSE_INTERFACE&lt;br /&gt;
The background colours linked to these purposes are set in theme/boost/scss/moodle/variables.scss&lt;br /&gt;
 $activity-icon-colors: map-merge(&lt;br /&gt;
     (&lt;br /&gt;
         &amp;quot;administration&amp;quot;: #5d63f6,&lt;br /&gt;
         &amp;quot;assessment&amp;quot;: #eb66a2,&lt;br /&gt;
         &amp;quot;collaboration&amp;quot;: #f7634d,&lt;br /&gt;
         &amp;quot;communication&amp;quot;: #11a676,&lt;br /&gt;
         &amp;quot;content&amp;quot;: #399be2,&lt;br /&gt;
         &amp;quot;interface&amp;quot;: #a378ff&lt;br /&gt;
     ),&lt;br /&gt;
     $activity-icon-colors&lt;br /&gt;
 );&lt;br /&gt;
If activity plugins do not define FEATURE_MOD_PURPOSE the activity icon will be rendered against a light grey background. There is no requirement to define the purpose of activity plugins, it will only affect the icon styling.&lt;br /&gt;
&lt;br /&gt;
Plugins implementing the variable FEATURE_MOD_PURPOSE are only supported on Moodle 4.0 and newer.&lt;br /&gt;
&lt;br /&gt;
Customising the activity icon can be done in an alternative way. For example using the styles.css in mod/[pluginname/styles.css&lt;br /&gt;
&lt;br /&gt;
In the example below the activity plugin developer chooses to keep the coloured icon for the activity and render it as large as the coloured background on the core activities&lt;br /&gt;
 .modicon_subcourse.activityiconcontainer {&lt;br /&gt;
     background-color: transparent;&lt;br /&gt;
     padding: 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 .modicon_subcourse.activityiconcontainer img {&lt;br /&gt;
     width: 50px;&lt;br /&gt;
     height: 50px;&lt;br /&gt;
 }&lt;br /&gt;
To customize all icon colours use this scss array and add it to the ‘Raw initial SCSS’ in the theme Boost advanced settings page. The complete array of icon background colours can be overridden using the ‘Raw initial SCSS’ in the theme settings page. The example below changes the colours of each activity type.&lt;br /&gt;
 $activity-icon-colors: (&lt;br /&gt;
     &amp;quot;administration&amp;quot;: #5D63F6,&lt;br /&gt;
     &amp;quot;assessment&amp;quot;: #11A676,&lt;br /&gt;
     &amp;quot;collaboration&amp;quot;: #EB66A2,&lt;br /&gt;
     &amp;quot;communication&amp;quot;: #F7634D,&lt;br /&gt;
     &amp;quot;content&amp;quot;: #399BE2,&lt;br /&gt;
     &amp;quot;interface&amp;quot;: #A378FF&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
== I&#039;m a developer, what do I need to know? ==&lt;br /&gt;
=== Modules ===&lt;br /&gt;
If you are a module developer (activity / resources) then you need to review the following updates and changes:&lt;br /&gt;
&lt;br /&gt;
* If using settings, reformat to work with the secondary navigation. We have significantly changed the way that settings are shown. Settings added to the course and activity administration branch of the navigation are now by default shown in the secondary navigation. You will most likely find them in the more section of the secondary navigation. Please avoid creating settings in containers (a parent navigation node with children). These settings will still be shown (details about that), but this goes against the pattern that we are trying to establish for navigation around the site. If you have a lot of settings, consider creating a specific page to handle your additional settings (screenshot?).&lt;br /&gt;
** The order of the items in the secondary navigation may not be to your liking. This can be changed. See [[Moodle_4.0_developer_update#Changing_the_order_of_tabs|changing the order of tabs]]&lt;br /&gt;
* Update my behat tests to use new steps for site navigation. See [[Moodle_4.0_developer_update#Behat_changes|new behat steps]].&lt;br /&gt;
* Update my module to use the new activity_header API. See [[Moodle_4.0_developer_update#The_activity_header_class|the activity header]].&lt;br /&gt;
* Update my pages to make it work with the general format of the tertiary navigation. See [[Moodle_4.0_developer_update#Tertiary_navigation|the tertiary navigation]].&lt;br /&gt;
* Update my activity icon to use the API and set a purpose. See [[Moodle_4.0_developer_update#Activity_icons|activity icons]].&lt;br /&gt;
&lt;br /&gt;
=== Themes ===&lt;br /&gt;
If you are a theme developer then you may want to consider the following:&lt;br /&gt;
# Take a look at the [[Moodle_4.0_developer_update#Navigation_changes|new navigation]] and decide if you want to incorporate this into your theme.&lt;br /&gt;
## A new layout ([[Moodle_4.0_developer_update#New_layout_page|drawers]])&lt;br /&gt;
## An [[Moodle_4.0_developer_update#Edit_switch|edit switch]]&lt;br /&gt;
## The [[Moodle_4.0_developer_update#The_course_index_element|course index]]&lt;br /&gt;
# Use of the flat nav&lt;br /&gt;
# New Site administration page and layout&lt;br /&gt;
# Course settings and how they are displayed&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61807</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61807"/>
		<updated>2022-03-14T07:15:02Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: First lot of plugin developer specific comments&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page highlights the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== Navigation changes ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
=== Primary navigation ===&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
==== Customising the primary navigation ====&lt;br /&gt;
Not yet implemented but we are looking at allowing the full addition and removal of any of the primary navigation tabs in the boost theme config file.&lt;br /&gt;
=== Secondary navigation ===&lt;br /&gt;
The main content area shows tabs for secondary navigation with a maximum of 5 items being rendered in this ‘more’ menu. A new UI component has been created to render menus like this. Files:&lt;br /&gt;
 /lib/templates/moremenu.mustache&lt;br /&gt;
==== Changing the order of tabs ====&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level. &lt;br /&gt;
=== Tertiary navigation ===&lt;br /&gt;
We&#039;ve moved action buttons to the top of the page. We would encourage you to do the same. &lt;br /&gt;
If you have any buttons on an activity page that go to another page, or open a form (or similar), then we encourage you to move them from the body of your activity page to the top. All of the core activities have been updated to follow this pattern. Please take a look to see how you can format your activity in a similar fashion. There is no API here. You are welcome to create the buttons and display them as you wish in this top area.&lt;br /&gt;
&lt;br /&gt;
=== New API functions ===&lt;br /&gt;
==== Page API ====&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondary_nav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* has_secondary_navigation_setter - Sets the ‘_hassecondarynavigation’ to indicate whether a page should render the secondary navigation&lt;br /&gt;
==== Navigationlib ====&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
==== The activity header class ====&lt;br /&gt;
There is a new activity header class that handles the display of information common to activities. 3rd party activities are not required to explicitly output this information as part of rendering individual pages.&lt;br /&gt;
&lt;br /&gt;
The common information that are currently handled by the class are:&lt;br /&gt;
* title&lt;br /&gt;
* description&lt;br /&gt;
* completion information&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As part of the update it was required that the initial information to be displayed by the class be toggable at a theme and layout level. Taking this into account the following theme level configurable exists:&lt;br /&gt;
* activityheaderconfig =&amp;gt; An array that currently only enforces &#039;notitle&#039; but can be expanded in the future NOTE: Boost has this set as true by default &#039;options&#039;&lt;br /&gt;
The following layout level options that can be defined:&lt;br /&gt;
* noactivityheader - to remove the header in this specific layout.&lt;br /&gt;
* activityheader - An array that enforces the following options:&lt;br /&gt;
** notitle&lt;br /&gt;
** nocompletion&lt;br /&gt;
** nodescription&lt;br /&gt;
The class has a page level getter which you can use to fetch the current version of the class. The base state is initialised within the constructor with the completion information only fetched when data is exported for the template.&lt;br /&gt;
&lt;br /&gt;
The class has setters for the following variables which can be leveraged to modify the header for a particular page in the format set_{variable_name}:&lt;br /&gt;
* hidecompletion&lt;br /&gt;
* description&lt;br /&gt;
* title&lt;br /&gt;
Alternately, bulk operations can also be done by passing the above variables in an array to &#039;set_attrs&#039; which in turn calls the setters.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note: Any updates to the activityheader needs to be performed before the call to $OUTPUT-&amp;gt;header&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
===== Theme updates: =====&lt;br /&gt;
In order for 3rd party themes to use the class they need to export the activity_header and include the following into their base template :&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
   {{&amp;gt; core/activity_header}}&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;** headercontent being the array element that contains the exported activity_header data &lt;br /&gt;
===== Accessibility notes: =====&lt;br /&gt;
The jump to ‘maincontent’ div is now rendered within the activity header when within an activity context&lt;br /&gt;
== Component library ==&lt;br /&gt;
Each Moodle installation now ships with a Moodle User Interface (UI) Component library, a documentation system used to describe all the Bootstrap components and the custom Moodle components. The component Library is a helper tool for developers when creating user interfaces, a testing tool for theme developers and a documentation tool for core developers. The ultimate goal of having a component library is to encourage developers to create consistent user interfaces to improve Moodle’s overall user experience.&lt;br /&gt;
&lt;br /&gt;
The library contains pages with documentation about User Interface components. It contains details on how to use the component, what variations are available and the JavaScript events / options are associated with the component.&lt;br /&gt;
&lt;br /&gt;
When writing on these pages it is possible to render core mustache templates using some custom syntax like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; mustache template=&amp;quot;core/notification_error&amp;quot; &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; /mustache &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also call core JavaScript or use HTML examples where the html code and the rendered result are visible in the Component Library. For more info visit the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-templates/ Moodle templates] page or the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-javascript/ Moodle JavaScript] page.&lt;br /&gt;
&lt;br /&gt;
Each page in the library uses the current css from the default theme in your Moodle installation, if you have multiple themes installed and enabled the setting &amp;quot;Allow theme changes on url&amp;quot;, the component library will have a theme selector option.&lt;br /&gt;
&lt;br /&gt;
A hosted version of the Component Library can be found here. http://componentlibrary.moodle.com&lt;br /&gt;
=== Enabling the Component Library ===&lt;br /&gt;
Component library pages are written in the markdown language. These pages need to be compiled to HTML pages before the Component Library is visible. To compile the pages the server running Moodle needs to have the [[Javascript Modules#Install%20NVM%20and%20Node|JavaScript developer tools installed]] (nodeJs and Grunt)&lt;br /&gt;
&lt;br /&gt;
If your server meets all requirements you can enable the library running&lt;br /&gt;
 $ npm install&lt;br /&gt;
 $ grunt componentlibrary&lt;br /&gt;
Further installation instructions can be found in the Component Library itself.&lt;br /&gt;
=== Documenting new UI Components ===&lt;br /&gt;
There are no set rules for adding new pages in the component library yet. These rules will need to be written and adopted in the integration process for Moodle code.&lt;br /&gt;
&lt;br /&gt;
As a guideline for making this rules consideration are:&lt;br /&gt;
&lt;br /&gt;
The component library is not about single use components, for example the Moodle grade book (a huge component with many custom features). Or about very common components like buttons, these are already covered by the Bootstrap section of the component library.&lt;br /&gt;
&lt;br /&gt;
New features should be build keeping in mind the UI part needs to be customisable and if possible (and making sense) reusable. And example would be the new page drawers that we are introducing for the Navigation project. Or the custom primary navigation menus where overflowing items are pushed into a More section.&lt;br /&gt;
== Theme changes ==&lt;br /&gt;
=== Edit switch ===&lt;br /&gt;
On theme boost the “Turn editing on” and “Customise this page” buttons have been replaced by an edit switch in the top navbar. Theme Classic will keep using the old buttons. Child themes can choose to use the edit switch if the theme config.php is using this variable&lt;br /&gt;
 $THEME-&amp;gt;haseditswitch = true;&lt;br /&gt;
The languague menu, which used to be rendered in place of the custom menu has moved to the user dropdown when the user is logged in. If not logged in it will be placed next to the search / notification / messaging icon in the top navbar.&lt;br /&gt;
=== Login page ===&lt;br /&gt;
The login page has been redesigned and allows the admin to configure a background image for the login page only in the theme settings page. This change is available in both Boost and Classic. The login page still has all the features with an improved layout. &lt;br /&gt;
=== The page footer ===&lt;br /&gt;
In large screens, the page footer button is only visible when clicking a help button at the bottom right of the screen.&lt;br /&gt;
=== User initials as profile picture placeholder ===&lt;br /&gt;
If users do not upload a profile picture the user initials are displayed on a rounded gray background as a placeholder picture in the top navbar or any other page using a placeholder image. This change will be available in both Boost and Classic. &lt;br /&gt;
&lt;br /&gt;
With the introduction of this placeholder image the full username will no longer be displayed in the top navbar.&lt;br /&gt;
=== Removal of back to top link ===&lt;br /&gt;
The &amp;quot;back to top&amp;quot; link will be removed for theme boost since the new course index reduced the dependence on page scrolling. Also, the new footer is positioned where this component used to be.&lt;br /&gt;
=== Styling changes ===&lt;br /&gt;
By default rounded edges will be used for UI components, for the page header and main content area the borders will be removed. &lt;br /&gt;
=== New layout page ===&lt;br /&gt;
Theme boost now uses the drawers.php layout for the course index and blocks.&lt;br /&gt;
== Question bank changes ==&lt;br /&gt;
There was a big project to deliver [[Question bank improvements for Moodle 4.0]] which added a new plugin type for adding features to the question banks, tracking the version history for each question as it is edited (question table has been split into &amp;lt;code&amp;gt;question&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;question_versions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_bank_entries&amp;lt;/code&amp;gt;), and tracking where each question is going to be used, with new tables &amp;lt;code&amp;gt;question_references&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_set_references&amp;lt;/code&amp;gt;. This work was done in Epic MDL-70329 if you want to track down the details of any of the core changes.&lt;br /&gt;
=== Question type plugins ===&lt;br /&gt;
Amazingly, we (Safat and colleagues at Catalyst AU) managed to implement this without breaking most question type plugins.&lt;br /&gt;
&lt;br /&gt;
However, the changes to the question bank, and the other Moodle 4.0 changes, probably broke the Behat tests for your plugin. To help with fixing that, MDL-74130 adds navigation to key question type pages (Preview and Edit for a question, and standard question bank pages like the bank itself, import and export) which should let you fix your test efficiently, and in a way that will work in all Moodle versions since 3.9.&lt;br /&gt;
&lt;br /&gt;
The &#039;most&#039; in the first paragraph here is becuase more advance question types may require more effort to fix. (For example qtype_combined which creates multi-part qusetions like the core qtype_multianswer; or qtype_pmatch or qtype_stack, which store additional data - questions tests - alongside the question itseld. How should that work with versionning?) But, if you have not done weird things like that, you are probably safe. If you find anything else that causes problems, please list it here.&lt;br /&gt;
&lt;br /&gt;
The same thing should apply to question behaviour and question import/export format plugings: no significant changes required (probably just fixing the Behat tests because of the navigation changes).&lt;br /&gt;
=== New plugin type: qbank plugins ===&lt;br /&gt;
This is not something that will cause problems for people upgrading from 3.x. Rather, it is an exciting possibility you can explore once you have survived process of upgrading to 4.0. There is a whole new plugin type which you can create to add new features to the question bank. For example extra columns, new actions and bulk actions, and so on. See [[Question_bank_plugins]].&lt;br /&gt;
=== Activities that use questions ===&lt;br /&gt;
The probable bad news is if you have an activity module which uses questions. So far, the only activity which has been fixed is mod_quiz in Moodle core, so we don&#039;t yet have a good picture of what fixes will be necessary in other activities. Work is about to start fixing [https://github.com/studentquiz/moodle-mod_studentquiz mod_studentquiz], so watching that should give more clues. As we do that, we will try to update this section of this page. Other help writing the information required here would also be greatly appreciated.&lt;br /&gt;
== The course format system ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
=== Mandatory renderer in course formats ===&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
=== New format base class ===&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
=== New course output classes and mustache files ===&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
=== Course editor javascript modules and frontend components ===&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
=== Other course related 4.0 changes ===&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
&lt;br /&gt;
=== New steps ===&lt;br /&gt;
Moodle 4.0 introduces some new behat steps.&lt;br /&gt;
&lt;br /&gt;
Sometimes you want to create a bulk number of activities. In that case you can use:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
:count :entitytype exist with the following data:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
Given 100 &amp;quot;mod_lti &amp;gt; tool types&amp;quot; exist with the following data:&lt;br /&gt;
  |name        |Test tool [count]                  |&lt;br /&gt;
  |description |Example description [count]        |&lt;br /&gt;
  |baseurl     |https://www.example.com/tool[count]|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dynamic (AJAX) tabs is a new feature contributed to Moodle 4.0 by the Workplace team (MDL-71943). You can use the following step to navigate between the tabs.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on the &amp;quot;tab title&amp;quot; dynamic tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To make sure that edit mode is (or is not) available on the current page, the following steps can be used.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And edit mode should be available on the current page&lt;br /&gt;
And edit mode should not be available on the current page&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are new aliases for the existing steps &amp;lt;code&amp;gt;I turn editing mode on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;I turn editing mode off&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I switch editing mode on&lt;br /&gt;
And I switch editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to the existing step to go to a course with editing mode on, we now have the following step to do the same but with editing mode being off.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I am on &amp;quot;course full name&amp;quot; course homepage with editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step is similar to the old &amp;lt;code&amp;gt;following &amp;quot;link string&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&amp;lt;/code&amp;gt; step, with more flexibility.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;Download&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;Starter&amp;quot; &amp;quot;table_row&amp;quot; should download between &amp;quot;0&amp;quot; and &amp;quot;5000&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to hover the mouse over the trigger area.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over the &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step enables an installed plugin.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;plugin name&amp;quot; &amp;quot;plugin type&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;course_summary&amp;quot; &amp;quot;block&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following is a special variation of &#039;I click on &amp;quot;&amp;lt;page name&amp;gt;&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;page&amp;quot; &amp;quot;region&amp;quot;&#039;. It first checks to see if we are on the given page via the breadcrumb. If not we then attempt to follow the link name given.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I follow the breadcrumb &amp;quot;page name&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can use the following step to ensure a node is active in the navbar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Node&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;My courses&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to navigate to a given node in the primary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select &amp;quot;Node&amp;quot; from primary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check whether an item exists in the user menu or not.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the user menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Language&amp;quot; &amp;quot;link&amp;quot; should exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check if a submenu of the user menu is shown, and if an item exists or does not exist in a given user submenu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I follow &amp;quot;Language&amp;quot; in the user menu&lt;br /&gt;
Then I should see &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English (pirate) &amp;amp;lrm;(en_ar)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To add enrolment methods to courses you can use the following new step. The data that you provide in the next lines are used to fill the enrolment method form.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;enrolment method&amp;quot; in &amp;quot;course identifier&amp;quot; with:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I add &amp;quot;Self enrolment&amp;quot; enrolment method in &amp;quot;Course 1&amp;quot; with:&lt;br /&gt;
  | Custom instance name     | Test student enrolment |&lt;br /&gt;
  | Enrolment key            | moodle_rules           |&lt;br /&gt;
  | Use group enrolment keys | Yes                    |&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 3 new steps specific to the calendar component. These steps can be used to hover over a day in the mini-calendar or the full calendar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the full calendar page&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the mini-calendar block&lt;br /&gt;
And I hover over today in the mini-calendar block&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some new steps are added to question bank to be able to add comment to questions, verify the existence of a comment, and deleting comments form questions. Please note that the steps for adding comments only write the comment text in the comment field. You still need to click on the &amp;quot;Add comment&amp;quot; button to save the comment.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question preview&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question preview&lt;br /&gt;
And I should see &amp;quot;number of comments&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;number of comments&amp;quot; on the row on the comments column&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;Question bank&amp;quot; in current page administration&lt;br /&gt;
And I should see &amp;quot;0&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;0&amp;quot; on the row on the comments column&lt;br /&gt;
And I add &amp;quot;test comment 01&amp;quot; comment to question&lt;br /&gt;
And I click on &amp;quot;Add comment&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Close&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I should see &amp;quot;1&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;1&amp;quot; on the row on the comments column&lt;br /&gt;
And I delete &amp;quot;test comment 01&amp;quot; comment from question&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similar to the steps for comments, the following steps are to verify the number of a question&#039;s usage and to click on it in order to open the question usage modal.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
And I click &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new steps are related to bulk actions in the question bank UI.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should not see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on &amp;quot;First question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Second question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;With selected&amp;quot; &amp;quot;button&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Delete&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;Confirm&amp;quot; &amp;quot;dialogue&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://docs.moodle.org/en/Report_builder Report builder] is a new feature contributed to Moodle 4.0 by the Workplace team. The following new step is added to Moodle 4.0 to select an action from the action menu in the list of custom reports table.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I press &amp;quot;action&amp;quot; action in the &amp;quot;report name&amp;quot; report row&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There&#039;s another step related to the report builder to set a column&#039;s aggregation in the report editor.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;column title&amp;quot; column aggregation to &amp;quot;aggregation method&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;First name&amp;quot; column aggregation to &amp;quot;Comma separated values&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step needs to be used in scenarios that involve testing BigBlueButton. For this to work, you need to have a [https://github.com/moodlehq/bigbluebutton_mock BigBlueButton Mock API Server] and set &amp;lt;code&amp;gt;TEST_MOD_BIGBLUEBUTTONBN_MOCK_SERVER&amp;lt;/code&amp;gt; to point to that in config.php.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And a BigBlueButton mock server is configured&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step replicates receiving a callback from the BigBlueButton server indicating the recordings for meetings are ready for viewing.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And the BigBlueButtonBN server has sent recording ready notifications&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are specific to the lesson activity. Note that in 4.0, some links (such as the &amp;quot;edit&amp;quot; and the &amp;quot;grade essays&amp;quot; links) are replaced by buttons, so you need to update your old steps with the new ones.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I edit the lesson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;A new step is added to be used in lesson activities to edit them. This step navigates the user to the lesson edit page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I grade lesson essays&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;It&#039;s a new step to go to the &amp;quot;Grade essays&amp;quot; page of the lesson we are currently in.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select edit type &amp;quot;edit type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Select the lesson edit type when we are in the the lesson&#039;s edit page. &amp;quot;edit type&amp;quot; can either be &amp;quot;Collapsed&amp;quot; or &amp;quot;Expanded&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new step can be used to navigate to the exports page in the course gradebook and select the specified export type from the grade exports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;export option&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;XML file&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similarly, there&#039;s a new step to navigate to the imports page in the course gradebook and select the specified import type from the grade imports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;import option&amp;quot; import page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Boost steps ===&lt;br /&gt;
In addition to the steps listed in the previous section, there are also some Boost specific steps coming with Moodle 4.0. These steps only work in Boost or Boost child themes, so you need to make sure they are not used in scenarios that may be run by non-Boost themes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step checks whether a node is active in the secondary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see :name is active in secondary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Boost theme shows the language selector menu in the primary navigation when not logged in, and within the user menu when logged in. The following steps are to check if the primary navigation includes the language selector menu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And language selector menu should exist in the navbar&lt;br /&gt;
And language selector menu should not exist in the navbar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And the following steps can be used to check whether an item exists in the language selector menu in the Boost theme.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the language selector menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modified steps ===&lt;br /&gt;
The step &amp;lt;code&amp;gt;I change the (window|viewport) size to &amp;quot;size&amp;quot;&amp;lt;/code&amp;gt; now supports 2 new values for the size argument. The size argument now accepts &amp;lt;code&amp;gt;mobile&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tablet&amp;lt;/code&amp;gt; values in addition to &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;large&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Removed steps ===&lt;br /&gt;
Some behat steps are removed or replaced with new steps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As a result of some design changes, hidden or restricted activities are no longer dimmed. Therefore the step&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be dimmed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;is now removed.&lt;br /&gt;
&lt;br /&gt;
Depending on what you were using that step for, you may be able to use these steps:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Label name&amp;quot; label should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Activity or resource name&amp;quot;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;region-main&amp;quot; &amp;quot;region&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Other things to consider ===&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. It is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] is integrated these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
Old behat steps that may now fail can be updated to the new steps.&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
There are also similar stream-lined navigation steps for accessing question bank pages. See MDL-74130.&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Core plugins review ===&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;br /&gt;
=== Site admin presets plugin ===&lt;br /&gt;
The third-party plugin [https://moodle.org/plugins/block_admin_presets Admin presets], created by David Monllaó and maintained by developers from [https://pimenko.com/ Pimenko] has been adapted and integrated into Moodle 4.0. It stores settings and plugins status (enabled/disabled) in what&#039;s called &amp;quot;presets&amp;quot; to let admins quickly switch between different configurations.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Site admin presets|Site admin presets plugin]] page.&lt;br /&gt;
=== JavaScript browser support changes ===&lt;br /&gt;
From Moodle 4.0, Internet Explorer is no longer supported. See MDL-73915 and MDLSITE-6109 for further information on this change.&lt;br /&gt;
&lt;br /&gt;
This change means that changes built on 4.0 onwards (including the master branch) will be different to older versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
For plugin developers supporting multiple versions of Moodle using a single plugin version, the compiled javascript files are backwards compatible and will _work_ on all supported versions, however if you run the `grunt` command on multiple versions you will see unbuilt changes. Running grunt on all versions of Moodle is not necessary and this check can be safely disabled for Moodle versions 3.9 - 4.0, as long as only at least you run `grunt` against at least one version of Moodle.&lt;br /&gt;
&lt;br /&gt;
If you need to support Internet Explorer and do not wish to fork your plugin for Moodle 4.0 onwards, then it is recommended that you run `grunt` on an older version of Moodle.&lt;br /&gt;
=== The course index element ===&lt;br /&gt;
The new course index feature can be themed using a set of scss variables. Use them to change the look and feel instead of adding custom css&lt;br /&gt;
 /theme/boost/scss/moodle/courseindex.scss&lt;br /&gt;
With the introduction of the course index component, the previous and next links shown underneath each activity are no longer needed and they will be removed.&lt;br /&gt;
=== Activity icons ===&lt;br /&gt;
The icons used for activities have been redesigned and updated for all core moodle activities.&lt;br /&gt;
&lt;br /&gt;
When viewing the new icons in a file manager, for example for the quiz activity, you will see a simple black monochrome icon with a transparent background.&lt;br /&gt;
&lt;br /&gt;
On the course page, or in the activity chooser, the icon will display as a white icon on a coloured background. Styling of the icons on the coursepage is controlled by the css in theme/boost/scss/moodle/icons.scss.&lt;br /&gt;
&lt;br /&gt;
The background colour for activity icons is set using a new variable in function [modname]_supports(). The quiz activity is of type assessment, so in function quiz_supports() there is a new line defining the purpose:&lt;br /&gt;
 case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;&lt;br /&gt;
Available purposes are:&lt;br /&gt;
* MOD_PURPOSE_COMMUNICATION&lt;br /&gt;
* MOD_PURPOSE_ASSESSMENT&lt;br /&gt;
* MOD_PURPOSE_COLLABORATION&lt;br /&gt;
* MOD_PURPOSE_CONTENT&lt;br /&gt;
* MOD_PURPOSE_ADMINISTRATION&lt;br /&gt;
* MOD_PURPOSE_INTERFACE&lt;br /&gt;
The background colours linked to these purposes are set in theme/boost/scss/moodle/variables.scss&lt;br /&gt;
 $activity-icon-colors: map-merge(&lt;br /&gt;
     (&lt;br /&gt;
         &amp;quot;administration&amp;quot;: #5d63f6,&lt;br /&gt;
         &amp;quot;assessment&amp;quot;: #eb66a2,&lt;br /&gt;
         &amp;quot;collaboration&amp;quot;: #f7634d,&lt;br /&gt;
         &amp;quot;communication&amp;quot;: #11a676,&lt;br /&gt;
         &amp;quot;content&amp;quot;: #399be2,&lt;br /&gt;
         &amp;quot;interface&amp;quot;: #a378ff&lt;br /&gt;
     ),&lt;br /&gt;
     $activity-icon-colors&lt;br /&gt;
 );&lt;br /&gt;
If activity plugins do not define FEATURE_MOD_PURPOSE the activity icon will be rendered against a light grey background. There is no requirement to define the purpose of activity plugins, it will only affect the icon styling.&lt;br /&gt;
&lt;br /&gt;
Plugins implementing the variable FEATURE_MOD_PURPOSE are only supported on Moodle 4.0 and newer.&lt;br /&gt;
&lt;br /&gt;
Customising the activity icon can be done in an alternative way. For example using the styles.css in mod/[pluginname/styles.css&lt;br /&gt;
&lt;br /&gt;
In the example below the activity plugin developer chooses to keep the coloured icon for the activity and render it as large as the coloured background on the core activities&lt;br /&gt;
 .modicon_subcourse.activityiconcontainer {&lt;br /&gt;
     background-color: transparent;&lt;br /&gt;
     padding: 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 .modicon_subcourse.activityiconcontainer img {&lt;br /&gt;
     width: 50px;&lt;br /&gt;
     height: 50px;&lt;br /&gt;
 }&lt;br /&gt;
To customize all icon colours use this scss array and add it to the ‘Raw initial SCSS’ in the theme Boost advanced settings page. The complete array of icon background colours can be overridden using the ‘Raw initial SCSS’ in the theme settings page. The example below changes the colours of each activity type.&lt;br /&gt;
 $activity-icon-colors: (&lt;br /&gt;
     &amp;quot;administration&amp;quot;: #5D63F6,&lt;br /&gt;
     &amp;quot;assessment&amp;quot;: #11A676,&lt;br /&gt;
     &amp;quot;collaboration&amp;quot;: #EB66A2,&lt;br /&gt;
     &amp;quot;communication&amp;quot;: #F7634D,&lt;br /&gt;
     &amp;quot;content&amp;quot;: #399BE2,&lt;br /&gt;
     &amp;quot;interface&amp;quot;: #A378FF&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
== I&#039;m a developer, what do I need to know? ==&lt;br /&gt;
=== Modules ===&lt;br /&gt;
If you are a module developer (activity / resources) then you need to review the following updates and changes:&lt;br /&gt;
&lt;br /&gt;
* If using settings, reformat to work with the secondary navigation. We have significantly changed the way that settings are shown. Settings added to the course and activity administration branch of the navigation are now by default shown in the secondary navigation. You will most likely find them in the more section of the secondary navigation. Please avoid creating settings in containers (a parent navigation node with children). These settings will still be shown (details about that), but this goes against the pattern that we are trying to establish for navigation around the site. If you have a lot of settings, consider creating a specific page to handle your additional settings (screenshot?).&lt;br /&gt;
** The order of the items in the secondary navigation may not be to your liking. This can be changed. See [[Moodle_4.0_developer_update#Changing_the_order_of_tabs|changing the order of tabs]]&lt;br /&gt;
* Update my behat tests to use new steps for site navigation. See [[Moodle_4.0_developer_update#Behat_changes|new behat steps]].&lt;br /&gt;
* Update my module to use the new activity_header API. See [[Moodle_4.0_developer_update#The_activity_header_class|the activity header]].&lt;br /&gt;
* Update my pages to make it work with the general format of the tertiary navigation. See [[Moodle_4.0_developer_update#Tertiary_navigation|the tertiary navigation]].&lt;br /&gt;
* Update my activity icon to use the API and set a purpose. See [[Moodle_4.0_developer_update#Activity_icons|activity icons]].&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61806</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61806"/>
		<updated>2022-03-14T07:07:57Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* Tertiary navigation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page highlights the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== Navigation changes ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
=== Primary navigation ===&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
==== Customising the primary navigation ====&lt;br /&gt;
Not yet implemented but we are looking at allowing the full addition and removal of any of the primary navigation tabs in the boost theme config file.&lt;br /&gt;
=== Secondary navigation ===&lt;br /&gt;
The main content area shows tabs for secondary navigation with a maximum of 5 items being rendered in this ‘more’ menu. A new UI component has been created to render menus like this. Files:&lt;br /&gt;
 /lib/templates/moremenu.mustache&lt;br /&gt;
==== Changing the order of tabs ====&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level. &lt;br /&gt;
=== Tertiary navigation ===&lt;br /&gt;
We&#039;ve moved action buttons to the top of the page. We would encourage you to do the same. &lt;br /&gt;
If you have any buttons on an activity page that go to another page, or open a form (or similar), then we encourage you to move them from the body of your activity page to the top. All of the core activities have been updated to follow this pattern. Please take a look to see how you can format your activity in a similar fashion. There is no API here. You are welcome to create the buttons and display them as you wish in this top area.&lt;br /&gt;
&lt;br /&gt;
=== New API functions ===&lt;br /&gt;
==== Page API ====&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondary_nav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* has_secondary_navigation_setter - Sets the ‘_hassecondarynavigation’ to indicate whether a page should render the secondary navigation&lt;br /&gt;
==== Navigationlib ====&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
==== The activity header class ====&lt;br /&gt;
There is a new activity header class that handles the display of information common to activities. 3rd party activities are not required to explicitly output this information as part of rendering individual pages.&lt;br /&gt;
&lt;br /&gt;
The common information that are currently handled by the class are:&lt;br /&gt;
* title&lt;br /&gt;
* description&lt;br /&gt;
* completion information&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As part of the update it was required that the initial information to be displayed by the class be toggable at a theme and layout level. Taking this into account the following theme level configurable exists:&lt;br /&gt;
* activityheaderconfig =&amp;gt; An array that currently only enforces &#039;notitle&#039; but can be expanded in the future NOTE: Boost has this set as true by default &#039;options&#039;&lt;br /&gt;
The following layout level options that can be defined:&lt;br /&gt;
* noactivityheader - to remove the header in this specific layout.&lt;br /&gt;
* activityheader - An array that enforces the following options:&lt;br /&gt;
** notitle&lt;br /&gt;
** nocompletion&lt;br /&gt;
** nodescription&lt;br /&gt;
The class has a page level getter which you can use to fetch the current version of the class. The base state is initialised within the constructor with the completion information only fetched when data is exported for the template.&lt;br /&gt;
&lt;br /&gt;
The class has setters for the following variables which can be leveraged to modify the header for a particular page in the format set_{variable_name}:&lt;br /&gt;
* hidecompletion&lt;br /&gt;
* description&lt;br /&gt;
* title&lt;br /&gt;
Alternately, bulk operations can also be done by passing the above variables in an array to &#039;set_attrs&#039; which in turn calls the setters.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note: Any updates to the activityheader needs to be performed before the call to $OUTPUT-&amp;gt;header&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
===== Theme updates: =====&lt;br /&gt;
In order for 3rd party themes to use the class they need to export the activity_header and include the following into their base template :&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
   {{&amp;gt; core/activity_header}}&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;** headercontent being the array element that contains the exported activity_header data &lt;br /&gt;
===== Accessibility notes: =====&lt;br /&gt;
The jump to ‘maincontent’ div is now rendered within the activity header when within an activity context&lt;br /&gt;
== Component library ==&lt;br /&gt;
Each Moodle installation now ships with a Moodle User Interface (UI) Component library, a documentation system used to describe all the Bootstrap components and the custom Moodle components. The component Library is a helper tool for developers when creating user interfaces, a testing tool for theme developers and a documentation tool for core developers. The ultimate goal of having a component library is to encourage developers to create consistent user interfaces to improve Moodle’s overall user experience.&lt;br /&gt;
&lt;br /&gt;
The library contains pages with documentation about User Interface components. It contains details on how to use the component, what variations are available and the JavaScript events / options are associated with the component.&lt;br /&gt;
&lt;br /&gt;
When writing on these pages it is possible to render core mustache templates using some custom syntax like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; mustache template=&amp;quot;core/notification_error&amp;quot; &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; /mustache &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also call core JavaScript or use HTML examples where the html code and the rendered result are visible in the Component Library. For more info visit the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-templates/ Moodle templates] page or the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-javascript/ Moodle JavaScript] page.&lt;br /&gt;
&lt;br /&gt;
Each page in the library uses the current css from the default theme in your Moodle installation, if you have multiple themes installed and enabled the setting &amp;quot;Allow theme changes on url&amp;quot;, the component library will have a theme selector option.&lt;br /&gt;
&lt;br /&gt;
A hosted version of the Component Library can be found here. http://componentlibrary.moodle.com&lt;br /&gt;
=== Enabling the Component Library ===&lt;br /&gt;
Component library pages are written in the markdown language. These pages need to be compiled to HTML pages before the Component Library is visible. To compile the pages the server running Moodle needs to have the [[Javascript Modules#Install%20NVM%20and%20Node|JavaScript developer tools installed]] (nodeJs and Grunt)&lt;br /&gt;
&lt;br /&gt;
If your server meets all requirements you can enable the library running&lt;br /&gt;
 $ npm install&lt;br /&gt;
 $ grunt componentlibrary&lt;br /&gt;
Further installation instructions can be found in the Component Library itself.&lt;br /&gt;
=== Documenting new UI Components ===&lt;br /&gt;
There are no set rules for adding new pages in the component library yet. These rules will need to be written and adopted in the integration process for Moodle code.&lt;br /&gt;
&lt;br /&gt;
As a guideline for making this rules consideration are:&lt;br /&gt;
&lt;br /&gt;
The component library is not about single use components, for example the Moodle grade book (a huge component with many custom features). Or about very common components like buttons, these are already covered by the Bootstrap section of the component library.&lt;br /&gt;
&lt;br /&gt;
New features should be build keeping in mind the UI part needs to be customisable and if possible (and making sense) reusable. And example would be the new page drawers that we are introducing for the Navigation project. Or the custom primary navigation menus where overflowing items are pushed into a More section.&lt;br /&gt;
== Theme changes ==&lt;br /&gt;
=== Edit switch ===&lt;br /&gt;
On theme boost the “Turn editing on” and “Customise this page” buttons have been replaced by an edit switch in the top navbar. Theme Classic will keep using the old buttons. Child themes can choose to use the edit switch if the theme config.php is using this variable&lt;br /&gt;
 $THEME-&amp;gt;haseditswitch = true;&lt;br /&gt;
The languague menu, which used to be rendered in place of the custom menu has moved to the user dropdown when the user is logged in. If not logged in it will be placed next to the search / notification / messaging icon in the top navbar.&lt;br /&gt;
=== Login page ===&lt;br /&gt;
The login page has been redesigned and allows the admin to configure a background image for the login page only in the theme settings page. This change is available in both Boost and Classic. The login page still has all the features with an improved layout. &lt;br /&gt;
=== The page footer ===&lt;br /&gt;
In large screens, the page footer button is only visible when clicking a help button at the bottom right of the screen.&lt;br /&gt;
=== User initials as profile picture placeholder ===&lt;br /&gt;
If users do not upload a profile picture the user initials are displayed on a rounded gray background as a placeholder picture in the top navbar or any other page using a placeholder image. This change will be available in both Boost and Classic. &lt;br /&gt;
&lt;br /&gt;
With the introduction of this placeholder image the full username will no longer be displayed in the top navbar.&lt;br /&gt;
=== Removal of back to top link ===&lt;br /&gt;
The &amp;quot;back to top&amp;quot; link will be removed for theme boost since the new course index reduced the dependence on page scrolling. Also, the new footer is positioned where this component used to be.&lt;br /&gt;
=== Styling changes ===&lt;br /&gt;
By default rounded edges will be used for UI components, for the page header and main content area the borders will be removed. &lt;br /&gt;
=== New layout page ===&lt;br /&gt;
Theme boost now uses the drawers.php layout for the course index and blocks.&lt;br /&gt;
== Question bank changes ==&lt;br /&gt;
There was a big project to deliver [[Question bank improvements for Moodle 4.0]] which added a new plugin type for adding features to the question banks, tracking the version history for each question as it is edited (question table has been split into &amp;lt;code&amp;gt;question&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;question_versions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_bank_entries&amp;lt;/code&amp;gt;), and tracking where each question is going to be used, with new tables &amp;lt;code&amp;gt;question_references&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_set_references&amp;lt;/code&amp;gt;. This work was done in Epic MDL-70329 if you want to track down the details of any of the core changes.&lt;br /&gt;
=== Question type plugins ===&lt;br /&gt;
Amazingly, we (Safat and colleagues at Catalyst AU) managed to implement this without breaking most question type plugins.&lt;br /&gt;
&lt;br /&gt;
However, the changes to the question bank, and the other Moodle 4.0 changes, probably broke the Behat tests for your plugin. To help with fixing that, MDL-74130 adds navigation to key question type pages (Preview and Edit for a question, and standard question bank pages like the bank itself, import and export) which should let you fix your test efficiently, and in a way that will work in all Moodle versions since 3.9.&lt;br /&gt;
&lt;br /&gt;
The &#039;most&#039; in the first paragraph here is becuase more advance question types may require more effort to fix. (For example qtype_combined which creates multi-part qusetions like the core qtype_multianswer; or qtype_pmatch or qtype_stack, which store additional data - questions tests - alongside the question itseld. How should that work with versionning?) But, if you have not done weird things like that, you are probably safe. If you find anything else that causes problems, please list it here.&lt;br /&gt;
&lt;br /&gt;
The same thing should apply to question behaviour and question import/export format plugings: no significant changes required (probably just fixing the Behat tests because of the navigation changes).&lt;br /&gt;
=== New plugin type: qbank plugins ===&lt;br /&gt;
This is not something that will cause problems for people upgrading from 3.x. Rather, it is an exciting possibility you can explore once you have survived process of upgrading to 4.0. There is a whole new plugin type which you can create to add new features to the question bank. For example extra columns, new actions and bulk actions, and so on. See [[Question_bank_plugins]].&lt;br /&gt;
=== Activities that use questions ===&lt;br /&gt;
The probable bad news is if you have an activity module which uses questions. So far, the only activity which has been fixed is mod_quiz in Moodle core, so we don&#039;t yet have a good picture of what fixes will be necessary in other activities. Work is about to start fixing [https://github.com/studentquiz/moodle-mod_studentquiz mod_studentquiz], so watching that should give more clues. As we do that, we will try to update this section of this page. Other help writing the information required here would also be greatly appreciated.&lt;br /&gt;
== The course format system ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
=== Mandatory renderer in course formats ===&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
=== New format base class ===&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
=== New course output classes and mustache files ===&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
=== Course editor javascript modules and frontend components ===&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
=== Other course related 4.0 changes ===&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
&lt;br /&gt;
=== New steps ===&lt;br /&gt;
Moodle 4.0 introduces some new behat steps.&lt;br /&gt;
&lt;br /&gt;
Sometimes you want to create a bulk number of activities. In that case you can use:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
:count :entitytype exist with the following data:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
Given 100 &amp;quot;mod_lti &amp;gt; tool types&amp;quot; exist with the following data:&lt;br /&gt;
  |name        |Test tool [count]                  |&lt;br /&gt;
  |description |Example description [count]        |&lt;br /&gt;
  |baseurl     |https://www.example.com/tool[count]|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dynamic (AJAX) tabs is a new feature contributed to Moodle 4.0 by the Workplace team (MDL-71943). You can use the following step to navigate between the tabs.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on the &amp;quot;tab title&amp;quot; dynamic tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To make sure that edit mode is (or is not) available on the current page, the following steps can be used.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And edit mode should be available on the current page&lt;br /&gt;
And edit mode should not be available on the current page&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are new aliases for the existing steps &amp;lt;code&amp;gt;I turn editing mode on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;I turn editing mode off&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I switch editing mode on&lt;br /&gt;
And I switch editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to the existing step to go to a course with editing mode on, we now have the following step to do the same but with editing mode being off.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I am on &amp;quot;course full name&amp;quot; course homepage with editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step is similar to the old &amp;lt;code&amp;gt;following &amp;quot;link string&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&amp;lt;/code&amp;gt; step, with more flexibility.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;Download&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;Starter&amp;quot; &amp;quot;table_row&amp;quot; should download between &amp;quot;0&amp;quot; and &amp;quot;5000&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to hover the mouse over the trigger area.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over the &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step enables an installed plugin.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;plugin name&amp;quot; &amp;quot;plugin type&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;course_summary&amp;quot; &amp;quot;block&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following is a special variation of &#039;I click on &amp;quot;&amp;lt;page name&amp;gt;&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;page&amp;quot; &amp;quot;region&amp;quot;&#039;. It first checks to see if we are on the given page via the breadcrumb. If not we then attempt to follow the link name given.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I follow the breadcrumb &amp;quot;page name&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can use the following step to ensure a node is active in the navbar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Node&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;My courses&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to navigate to a given node in the primary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select &amp;quot;Node&amp;quot; from primary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check whether an item exists in the user menu or not.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the user menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Language&amp;quot; &amp;quot;link&amp;quot; should exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check if a submenu of the user menu is shown, and if an item exists or does not exist in a given user submenu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I follow &amp;quot;Language&amp;quot; in the user menu&lt;br /&gt;
Then I should see &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English (pirate) &amp;amp;lrm;(en_ar)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To add enrolment methods to courses you can use the following new step. The data that you provide in the next lines are used to fill the enrolment method form.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;enrolment method&amp;quot; in &amp;quot;course identifier&amp;quot; with:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I add &amp;quot;Self enrolment&amp;quot; enrolment method in &amp;quot;Course 1&amp;quot; with:&lt;br /&gt;
  | Custom instance name     | Test student enrolment |&lt;br /&gt;
  | Enrolment key            | moodle_rules           |&lt;br /&gt;
  | Use group enrolment keys | Yes                    |&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 3 new steps specific to the calendar component. These steps can be used to hover over a day in the mini-calendar or the full calendar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the full calendar page&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the mini-calendar block&lt;br /&gt;
And I hover over today in the mini-calendar block&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some new steps are added to question bank to be able to add comment to questions, verify the existence of a comment, and deleting comments form questions. Please note that the steps for adding comments only write the comment text in the comment field. You still need to click on the &amp;quot;Add comment&amp;quot; button to save the comment.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question preview&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question preview&lt;br /&gt;
And I should see &amp;quot;number of comments&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;number of comments&amp;quot; on the row on the comments column&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;Question bank&amp;quot; in current page administration&lt;br /&gt;
And I should see &amp;quot;0&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;0&amp;quot; on the row on the comments column&lt;br /&gt;
And I add &amp;quot;test comment 01&amp;quot; comment to question&lt;br /&gt;
And I click on &amp;quot;Add comment&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Close&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I should see &amp;quot;1&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;1&amp;quot; on the row on the comments column&lt;br /&gt;
And I delete &amp;quot;test comment 01&amp;quot; comment from question&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similar to the steps for comments, the following steps are to verify the number of a question&#039;s usage and to click on it in order to open the question usage modal.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
And I click &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new steps are related to bulk actions in the question bank UI.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should not see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on &amp;quot;First question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Second question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;With selected&amp;quot; &amp;quot;button&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Delete&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;Confirm&amp;quot; &amp;quot;dialogue&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://docs.moodle.org/en/Report_builder Report builder] is a new feature contributed to Moodle 4.0 by the Workplace team. The following new step is added to Moodle 4.0 to select an action from the action menu in the list of custom reports table.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I press &amp;quot;action&amp;quot; action in the &amp;quot;report name&amp;quot; report row&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There&#039;s another step related to the report builder to set a column&#039;s aggregation in the report editor.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;column title&amp;quot; column aggregation to &amp;quot;aggregation method&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;First name&amp;quot; column aggregation to &amp;quot;Comma separated values&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step needs to be used in scenarios that involve testing BigBlueButton. For this to work, you need to have a [https://github.com/moodlehq/bigbluebutton_mock BigBlueButton Mock API Server] and set &amp;lt;code&amp;gt;TEST_MOD_BIGBLUEBUTTONBN_MOCK_SERVER&amp;lt;/code&amp;gt; to point to that in config.php.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And a BigBlueButton mock server is configured&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step replicates receiving a callback from the BigBlueButton server indicating the recordings for meetings are ready for viewing.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And the BigBlueButtonBN server has sent recording ready notifications&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are specific to the lesson activity. Note that in 4.0, some links (such as the &amp;quot;edit&amp;quot; and the &amp;quot;grade essays&amp;quot; links) are replaced by buttons, so you need to update your old steps with the new ones.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I edit the lesson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;A new step is added to be used in lesson activities to edit them. This step navigates the user to the lesson edit page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I grade lesson essays&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;It&#039;s a new step to go to the &amp;quot;Grade essays&amp;quot; page of the lesson we are currently in.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select edit type &amp;quot;edit type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Select the lesson edit type when we are in the the lesson&#039;s edit page. &amp;quot;edit type&amp;quot; can either be &amp;quot;Collapsed&amp;quot; or &amp;quot;Expanded&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new step can be used to navigate to the exports page in the course gradebook and select the specified export type from the grade exports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;export option&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;XML file&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similarly, there&#039;s a new step to navigate to the imports page in the course gradebook and select the specified import type from the grade imports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;import option&amp;quot; import page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Boost steps ===&lt;br /&gt;
In addition to the steps listed in the previous section, there are also some Boost specific steps coming with Moodle 4.0. These steps only work in Boost or Boost child themes, so you need to make sure they are not used in scenarios that may be run by non-Boost themes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step checks whether a node is active in the secondary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see :name is active in secondary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Boost theme shows the language selector menu in the primary navigation when not logged in, and within the user menu when logged in. The following steps are to check if the primary navigation includes the language selector menu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And language selector menu should exist in the navbar&lt;br /&gt;
And language selector menu should not exist in the navbar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And the following steps can be used to check whether an item exists in the language selector menu in the Boost theme.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the language selector menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modified steps ===&lt;br /&gt;
The step &amp;lt;code&amp;gt;I change the (window|viewport) size to &amp;quot;size&amp;quot;&amp;lt;/code&amp;gt; now supports 2 new values for the size argument. The size argument now accepts &amp;lt;code&amp;gt;mobile&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tablet&amp;lt;/code&amp;gt; values in addition to &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;large&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Removed steps ===&lt;br /&gt;
Some behat steps are removed or replaced with new steps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As a result of some design changes, hidden or restricted activities are no longer dimmed. Therefore the step&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be dimmed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;is now removed.&lt;br /&gt;
&lt;br /&gt;
Depending on what you were using that step for, you may be able to use these steps:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Label name&amp;quot; label should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Activity or resource name&amp;quot;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;region-main&amp;quot; &amp;quot;region&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Other things to consider ===&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. It is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] is integrated these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
Old behat steps that may now fail can be updated to the new steps.&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
There are also similar stream-lined navigation steps for accessing question bank pages. See MDL-74130.&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Core plugins review ===&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;br /&gt;
=== Site admin presets plugin ===&lt;br /&gt;
The third-party plugin [https://moodle.org/plugins/block_admin_presets Admin presets], created by David Monllaó and maintained by developers from [https://pimenko.com/ Pimenko] has been adapted and integrated into Moodle 4.0. It stores settings and plugins status (enabled/disabled) in what&#039;s called &amp;quot;presets&amp;quot; to let admins quickly switch between different configurations.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Site admin presets|Site admin presets plugin]] page.&lt;br /&gt;
=== JavaScript browser support changes ===&lt;br /&gt;
From Moodle 4.0, Internet Explorer is no longer supported. See MDL-73915 and MDLSITE-6109 for further information on this change.&lt;br /&gt;
&lt;br /&gt;
This change means that changes built on 4.0 onwards (including the master branch) will be different to older versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
For plugin developers supporting multiple versions of Moodle using a single plugin version, the compiled javascript files are backwards compatible and will _work_ on all supported versions, however if you run the `grunt` command on multiple versions you will see unbuilt changes. Running grunt on all versions of Moodle is not necessary and this check can be safely disabled for Moodle versions 3.9 - 4.0, as long as only at least you run `grunt` against at least one version of Moodle.&lt;br /&gt;
&lt;br /&gt;
If you need to support Internet Explorer and do not wish to fork your plugin for Moodle 4.0 onwards, then it is recommended that you run `grunt` on an older version of Moodle.&lt;br /&gt;
=== The course index element ===&lt;br /&gt;
The new course index feature can be themed using a set of scss variables. Use them to change the look and feel instead of adding custom css&lt;br /&gt;
 /theme/boost/scss/moodle/courseindex.scss&lt;br /&gt;
With the introduction of the course index component, the previous and next links shown underneath each activity are no longer needed and they will be removed.&lt;br /&gt;
=== Activity icons ===&lt;br /&gt;
The icons used for activities have been redesigned and updated for all core moodle activities.&lt;br /&gt;
&lt;br /&gt;
When viewing the new icons in a file manager, for example for the quiz activity, you will see a simple black monochrome icon with a transparent background.&lt;br /&gt;
&lt;br /&gt;
On the course page, or in the activity chooser, the icon will display as a white icon on a coloured background. Styling of the icons on the coursepage is controlled by the css in theme/boost/scss/moodle/icons.scss.&lt;br /&gt;
&lt;br /&gt;
The background colour for activity icons is set using a new variable in function [modname]_supports(). The quiz activity is of type assessment, so in function quiz_supports() there is a new line defining the purpose:&lt;br /&gt;
 case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;&lt;br /&gt;
Available purposes are:&lt;br /&gt;
* MOD_PURPOSE_COMMUNICATION&lt;br /&gt;
* MOD_PURPOSE_ASSESSMENT&lt;br /&gt;
* MOD_PURPOSE_COLLABORATION&lt;br /&gt;
* MOD_PURPOSE_CONTENT&lt;br /&gt;
* MOD_PURPOSE_ADMINISTRATION&lt;br /&gt;
* MOD_PURPOSE_INTERFACE&lt;br /&gt;
The background colours linked to these purposes are set in theme/boost/scss/moodle/variables.scss&lt;br /&gt;
 $activity-icon-colors: map-merge(&lt;br /&gt;
     (&lt;br /&gt;
         &amp;quot;administration&amp;quot;: #5d63f6,&lt;br /&gt;
         &amp;quot;assessment&amp;quot;: #eb66a2,&lt;br /&gt;
         &amp;quot;collaboration&amp;quot;: #f7634d,&lt;br /&gt;
         &amp;quot;communication&amp;quot;: #11a676,&lt;br /&gt;
         &amp;quot;content&amp;quot;: #399be2,&lt;br /&gt;
         &amp;quot;interface&amp;quot;: #a378ff&lt;br /&gt;
     ),&lt;br /&gt;
     $activity-icon-colors&lt;br /&gt;
 );&lt;br /&gt;
If activity plugins do not define FEATURE_MOD_PURPOSE the activity icon will be rendered against a light grey background. There is no requirement to define the purpose of activity plugins, it will only affect the icon styling.&lt;br /&gt;
&lt;br /&gt;
Plugins implementing the variable FEATURE_MOD_PURPOSE are only supported on Moodle 4.0 and newer.&lt;br /&gt;
&lt;br /&gt;
Customising the activity icon can be done in an alternative way. For example using the styles.css in mod/[pluginname/styles.css&lt;br /&gt;
&lt;br /&gt;
In the example below the activity plugin developer chooses to keep the coloured icon for the activity and render it as large as the coloured background on the core activities&lt;br /&gt;
 .modicon_subcourse.activityiconcontainer {&lt;br /&gt;
     background-color: transparent;&lt;br /&gt;
     padding: 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 .modicon_subcourse.activityiconcontainer img {&lt;br /&gt;
     width: 50px;&lt;br /&gt;
     height: 50px;&lt;br /&gt;
 }&lt;br /&gt;
To customize all icon colours use this scss array and add it to the ‘Raw initial SCSS’ in the theme Boost advanced settings page. The complete array of icon background colours can be overridden using the ‘Raw initial SCSS’ in the theme settings page. The example below changes the colours of each activity type.&lt;br /&gt;
 $activity-icon-colors: (&lt;br /&gt;
     &amp;quot;administration&amp;quot;: #5D63F6,&lt;br /&gt;
     &amp;quot;assessment&amp;quot;: #11A676,&lt;br /&gt;
     &amp;quot;collaboration&amp;quot;: #EB66A2,&lt;br /&gt;
     &amp;quot;communication&amp;quot;: #F7634D,&lt;br /&gt;
     &amp;quot;content&amp;quot;: #399BE2,&lt;br /&gt;
     &amp;quot;interface&amp;quot;: #A378FF&lt;br /&gt;
 )&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61762</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61762"/>
		<updated>2022-03-03T06:26:30Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Changing header levels&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page highlights the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== Navigation changes ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
=== Primary navigation ===&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
==== Customising the primary navigation ====&lt;br /&gt;
Not yet implemented but we are looking at allowing the full addition and removal of any of the primary navigation tabs in the boost theme config file.&lt;br /&gt;
=== Secondary navigation ===&lt;br /&gt;
The main content area shows tabs for secondary navigation with a maximum of 5 items being rendered in this ‘more’ menu. A new UI component has been created to render menus like this. Files:&lt;br /&gt;
 /lib/templates/moremenu.mustache&lt;br /&gt;
==== Changing the order of tabs ====&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level. &lt;br /&gt;
=== Tertiary navigation ===&lt;br /&gt;
=== New API functions ===&lt;br /&gt;
==== Page API ====&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondary_nav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* has_secondary_navigation_setter - Sets the ‘_hassecondarynavigation’ to indicate whether a page should render the secondary navigation&lt;br /&gt;
==== Navigationlib ====&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
==== The activity header class ====&lt;br /&gt;
== Component library ==&lt;br /&gt;
Each Moodle installation now ships with a Moodle User Interface (UI) Component library, a documentation system used to describe all the Bootstrap components and the custom Moodle components. The component Library is a helper tool for developers when creating user interfaces, a testing tool for theme developers and a documentation tool for core developers. The ultimate goal of having a component library is to encourage developers to create consistent user interfaces to improve Moodle’s overall user experience.&lt;br /&gt;
&lt;br /&gt;
The library contains pages with documentation about User Interface components. It contains details on how to use the component, what variations are available and the JavaScript events / options are associated with the component.&lt;br /&gt;
&lt;br /&gt;
When writing on these pages it is possible to render core mustache templates using some custom syntax like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; mustache template=&amp;quot;core/notification_error&amp;quot; &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; /mustache &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also call core JavaScript or use HTML examples where the html code and the rendered result are visible in the Component Library. For more info visit the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-templates/ Moodle templates] page or the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-javascript/ Moodle JavaScript] page.&lt;br /&gt;
&lt;br /&gt;
Each page in the library uses the current css from the default theme in your Moodle installation, if you have multiple themes installed and enabled the setting &amp;quot;Allow theme changes on url&amp;quot;, the component library will have a theme selector option.&lt;br /&gt;
&lt;br /&gt;
A hosted version of the Component Library can be found here. http://componentlibrary.moodle.com&lt;br /&gt;
=== Enabling the Component Library ===&lt;br /&gt;
Component library pages are written in the markdown language. These pages need to be compiled to HTML pages before the Component Library is visible. To compile the pages the server running Moodle needs to have the [[Javascript Modules#Install%20NVM%20and%20Node|JavaScript developer tools installed]] (nodeJs and Grunt)&lt;br /&gt;
&lt;br /&gt;
If your server meets all requirements you can enable the library running&lt;br /&gt;
 $ npm install&lt;br /&gt;
 $ grunt componentlibrary&lt;br /&gt;
Further installation instructions can be found in the Component Library itself.&lt;br /&gt;
=== Documenting new UI Components ===&lt;br /&gt;
There are no set rules for adding new pages in the component library yet. These rules will need to be written and adopted in the integration process for Moodle code.&lt;br /&gt;
&lt;br /&gt;
As a guideline for making this rules consideration are:&lt;br /&gt;
&lt;br /&gt;
The component library is not about single use components, for example the Moodle grade book (a huge component with many custom features). Or about very common components like buttons, these are already covered by the Bootstrap section of the component library.&lt;br /&gt;
&lt;br /&gt;
New features should be build keeping in mind the UI part needs to be customisable and if possible (and making sense) reusable. And example would be the new page drawers that we are introducing for the Navigation project. Or the custom primary navigation menus where overflowing items are pushed into a More section.&lt;br /&gt;
== Theme changes ==&lt;br /&gt;
=== Edit switch ===&lt;br /&gt;
On theme boost the “Turn editing on” and “Customise this page” buttons have been replaced by an edit switch in the top navbar. Theme Classic will keep using the old buttons. Child themes can choose to use the edit switch if the theme config.php is using this variable&lt;br /&gt;
 $THEME-&amp;gt;haseditswitch = true;&lt;br /&gt;
The languague menu, which used to be rendered in place of the custom menu has moved to the user dropdown when the user is logged in. If not logged in it will be placed next to the search / notification / messaging icon in the top navbar.&lt;br /&gt;
=== Login page ===&lt;br /&gt;
The login page has been redesigned and allows the admin to configure a background image for the login page only in the theme settings page. This change is available in both Boost and Classic. The login page still has all the features with an improved layout. &lt;br /&gt;
=== The page footer ===&lt;br /&gt;
In large screens, the page footer button is only visible when clicking a help button at the bottom right of the screen.&lt;br /&gt;
=== User initials as profile picture placeholder ===&lt;br /&gt;
If users do not upload a profile picture the user initials are displayed on a rounded gray background as a placeholder picture in the top navbar or any other page using a placeholder image. This change will be available in both Boost and Classic. &lt;br /&gt;
&lt;br /&gt;
With the introduction of this placeholder image the full username will no longer be displayed in the top navbar.&lt;br /&gt;
=== Removal of back to top link ===&lt;br /&gt;
The &amp;quot;back to top&amp;quot; link will be removed for theme boost since the new course index reduced the dependence on page scrolling. Also, the new footer is positioned where this component used to be.&lt;br /&gt;
=== Styling changes ===&lt;br /&gt;
By default rounded edges will be used for UI components, for the page header and main content area the borders will be removed. &lt;br /&gt;
=== New layout page ===&lt;br /&gt;
Theme boost now uses the drawers.php layout for the course index and blocks.&lt;br /&gt;
== The course format system ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
=== Mandatory renderer in course formats ===&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
=== New format base class ===&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
=== New course output classes and mustache files ===&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
=== Course editor javascript modules and frontend components ===&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
=== Other course related 4.0 changes ===&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. It is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] is integrated these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
Old behat steps that may now fail can be updated to the new steps.&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Core plugins review ===&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;br /&gt;
=== Site admin presets plugin ===&lt;br /&gt;
The third-party plugin [https://moodle.org/plugins/block_admin_presets Admin presets], created by David Monllaó and maintained by developers from [https://pimenko.com/ Pimenko] has been adapted and integrated into Moodle 4.0. It stores settings and plugins status (enabled/disabled) in what&#039;s called &amp;quot;presets&amp;quot; to let admins quickly switch between different configurations.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Site admin presets|Site admin presets plugin]] page.&lt;br /&gt;
=== JavaScript browser support changes ===&lt;br /&gt;
From Moodle 4.0, Internet Explorer is no longer supported. See MDL-73915 and MDLSITE-6109 for further information on this change.&lt;br /&gt;
&lt;br /&gt;
This change means that changes built on 4.0 onwards (including the master branch) will be different to older versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
For plugin developers supporting multiple versions of Moodle using a single plugin version, the compiled javascript files are backwards compatible and will _work_ on all supported versions, however if you run the `grunt` command on multiple versions you will see unbuilt changes. Running grunt on all versions of Moodle is not necessary and this check can be safely disabled for Moodle versions 3.9 - 4.0, as long as only at least you run `grunt` against at least one version of Moodle.&lt;br /&gt;
&lt;br /&gt;
If you need to support Internet Explorer and do not wish to fork your plugin for Moodle 4.0 onwards, then it is recommended that you run `grunt` on an older version of Moodle.&lt;br /&gt;
=== The course index element ===&lt;br /&gt;
The new course index feature can be themed using a set of scss variables. Use them to change the look and feel instead of adding custom css&lt;br /&gt;
 /theme/boost/scss/moodle/courseindex.scss&lt;br /&gt;
With the introduction of the course index component, the previous and next links shown underneath each activity are no longer needed and they will be removed.&lt;br /&gt;
=== Activity icons ===&lt;br /&gt;
The icons used for activities have been redesigned and updated for all core moodle activities.&lt;br /&gt;
&lt;br /&gt;
When viewing the new icons in a file manager, for example for the quiz activity, you will see a simple black monochrome icon with a transparent background.&lt;br /&gt;
&lt;br /&gt;
On the course page, or in the activity chooser, the icon will display as a white icon on a coloured background. Styling of the icons on the coursepage is controlled by the css in theme/boost/scss/moodle/icons.scss.&lt;br /&gt;
&lt;br /&gt;
The background colour for activity icons is set using a new variable in function [modname]_supports(). The quiz activity is of type assessment, so in function quiz_supports() there is a new line defining the purpose:&lt;br /&gt;
 case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;&lt;br /&gt;
Available purposes are:&lt;br /&gt;
* MOD_PURPOSE_COMMUNICATION&lt;br /&gt;
* MOD_PURPOSE_ASSESSMENT&lt;br /&gt;
* MOD_PURPOSE_COLLABORATION&lt;br /&gt;
* MOD_PURPOSE_CONTENT&lt;br /&gt;
* MOD_PURPOSE_ADMINISTRATION&lt;br /&gt;
* MOD_PURPOSE_INTERFACE&lt;br /&gt;
The background colours linked to these purposes are set in theme/boost/scss/moodle/variables.scss&lt;br /&gt;
 $activity-icon-colors: map-merge(&lt;br /&gt;
     (&lt;br /&gt;
         &amp;quot;administration&amp;quot;: #5d63f6,&lt;br /&gt;
         &amp;quot;assessment&amp;quot;: #eb66a2,&lt;br /&gt;
         &amp;quot;collaboration&amp;quot;: #f7634d,&lt;br /&gt;
         &amp;quot;communication&amp;quot;: #11a676,&lt;br /&gt;
         &amp;quot;content&amp;quot;: #399be2,&lt;br /&gt;
         &amp;quot;interface&amp;quot;: #a378ff&lt;br /&gt;
     ),&lt;br /&gt;
     $activity-icon-colors&lt;br /&gt;
 );&lt;br /&gt;
If activity plugins do not define FEATURE_MOD_PURPOSE the activity icon will be rendered against a light grey background. There is no requirement to define the purpose of activity plugins, it will only affect the icon styling.&lt;br /&gt;
&lt;br /&gt;
Plugins implementing the variable FEATURE_MOD_PURPOSE are only supported on Moodle 4.0 and newer.&lt;br /&gt;
&lt;br /&gt;
Customising the activity icon can be done in an alternative way. For example using the styles.css in mod/[pluginname/styles.css&lt;br /&gt;
&lt;br /&gt;
In the example below the activity plugin developer chooses to keep the coloured icon for the activity and render it as large as the coloured background on the core activities&lt;br /&gt;
 .modicon_subcourse.activityiconcontainer {&lt;br /&gt;
     background-color: transparent;&lt;br /&gt;
     padding: 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 .modicon_subcourse.activityiconcontainer img {&lt;br /&gt;
     width: 50px;&lt;br /&gt;
     height: 50px;&lt;br /&gt;
 }&lt;br /&gt;
To customize all icon colours use this scss array and add it to the ‘Raw initial SCSS’ in the theme Boost advanced settings page. The complete array of icon background colours can be overridden using the ‘Raw initial SCSS’ in the theme settings page. The example below changes the colours of each activity type.&lt;br /&gt;
 $activity-icon-colors: (&lt;br /&gt;
     &amp;quot;administration&amp;quot;: #5D63F6,&lt;br /&gt;
     &amp;quot;assessment&amp;quot;: #11A676,&lt;br /&gt;
     &amp;quot;collaboration&amp;quot;: #EB66A2,&lt;br /&gt;
     &amp;quot;communication&amp;quot;: #F7634D,&lt;br /&gt;
     &amp;quot;content&amp;quot;: #399BE2,&lt;br /&gt;
     &amp;quot;interface&amp;quot;: #A378FF&lt;br /&gt;
 )&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61761</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61761"/>
		<updated>2022-03-03T06:07:44Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* Behat changes -- removed MDLs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page highlights the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== Navigation changes ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
==== Primary navigation ====&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
====== Customising the primary navigation ======&lt;br /&gt;
Not yet implemented but we are looking at allowing the full addition and removal of any of the primary navigation tabs in the boost theme config file.&lt;br /&gt;
==== Secondary navigation ====&lt;br /&gt;
The main content area shows tabs for secondary navigation with a maximum of 5 items being rendered in this ‘more’ menu. A new UI component has been created to render menus like this. Files:&lt;br /&gt;
 /lib/templates/moremenu.mustache&lt;br /&gt;
====== Changing the order of tabs ======&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level. &lt;br /&gt;
==== Tertiary navigation ====&lt;br /&gt;
==== New API functions ====&lt;br /&gt;
====== Page API ======&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondary_nav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* has_secondary_navigation_setter - Sets the ‘_hassecondarynavigation’ to indicate whether a page should render the secondary navigation&lt;br /&gt;
====== Navigationlib ======&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
====== The activity header class ======&lt;br /&gt;
== Component library ==&lt;br /&gt;
Each Moodle installation now ships with a Moodle User Interface (UI) Component library, a documentation system used to describe all the Bootstrap components and the custom Moodle components. The component Library is a helper tool for developers when creating user interfaces, a testing tool for theme developers and a documentation tool for core developers. The ultimate goal of having a component library is to encourage developers to create consistent user interfaces to improve Moodle’s overall user experience.&lt;br /&gt;
&lt;br /&gt;
The library contains pages with documentation about User Interface components. It contains details on how to use the component, what variations are available and the JavaScript events / options are associated with the component.&lt;br /&gt;
&lt;br /&gt;
When writing on these pages it is possible to render core mustache templates using some custom syntax like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; mustache template=&amp;quot;core/notification_error&amp;quot; &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; /mustache &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also call core JavaScript or use HTML examples where the html code and the rendered result are visible in the Component Library. For more info visit the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-templates/ Moodle templates] page or the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-javascript/ Moodle JavaScript] page.&lt;br /&gt;
&lt;br /&gt;
Each page in the library uses the current css from the default theme in your Moodle installation, if you have multiple themes installed and enabled the setting &amp;quot;Allow theme changes on url&amp;quot;, the component library will have a theme selector option.&lt;br /&gt;
&lt;br /&gt;
A hosted version of the Component Library can be found here. http://componentlibrary.moodle.com&lt;br /&gt;
==== Enabling the Component Library ====&lt;br /&gt;
Component library pages are written in the markdown language. These pages need to be compiled to HTML pages before the Component Library is visible. To compile the pages the server running Moodle needs to have the [[Javascript Modules#Install%20NVM%20and%20Node|JavaScript developer tools installed]] (nodeJs and Grunt)&lt;br /&gt;
&lt;br /&gt;
If your server meets all requirements you can enable the library running&lt;br /&gt;
 $ npm install&lt;br /&gt;
 $ grunt componentlibrary&lt;br /&gt;
Further installation instructions can be found in the Component Library itself.&lt;br /&gt;
==== Documenting new UI Components ====&lt;br /&gt;
There are no set rules for adding new pages in the component library yet. These rules will need to be written and adopted in the integration process for Moodle code.&lt;br /&gt;
&lt;br /&gt;
As a guideline for making this rules consideration are:&lt;br /&gt;
&lt;br /&gt;
The component library is not about single use components, for example the Moodle grade book (a huge component with many custom features). Or about very common components like buttons, these are already covered by the Bootstrap section of the component library.&lt;br /&gt;
&lt;br /&gt;
New features should be build keeping in mind the UI part needs to be customisable and if possible (and making sense) reusable. And example would be the new page drawers that we are introducing for the Navigation project. Or the custom primary navigation menus where overflowing items are pushed into a More section.&lt;br /&gt;
== Theme changes ==&lt;br /&gt;
==== Edit switch ====&lt;br /&gt;
On theme boost the “Turn editing on” and “Customise this page” buttons have been replaced by an edit switch in the top navbar. Theme Classic will keep using the old buttons. Child themes can choose to use the edit switch if the theme config.php is using this variable&lt;br /&gt;
 $THEME-&amp;gt;haseditswitch = true;&lt;br /&gt;
The languague menu, which used to be rendered in place of the custom menu has moved to the user dropdown when the user is logged in. If not logged in it will be placed next to the search / notification / messaging icon in the top navbar.&lt;br /&gt;
==== Login page ====&lt;br /&gt;
The login page has been redesigned and allows the admin to configure a background image for the login page only in the theme settings page. This change is available in both Boost and Classic. The login page still has all the features with an improved layout. &lt;br /&gt;
==== The page footer ====&lt;br /&gt;
In large screens, the page footer button is only visible when clicking a help button at the bottom right of the screen.&lt;br /&gt;
==== User initials as profile picture placeholder ====&lt;br /&gt;
If users do not upload a profile picture the user initials are displayed on a rounded gray background as a placeholder picture in the top navbar or any other page using a placeholder image. This change will be available in both Boost and Classic. &lt;br /&gt;
&lt;br /&gt;
With the introduction of this placeholder image the full username will no longer be displayed in the top navbar.&lt;br /&gt;
==== Removal of back to top link ====&lt;br /&gt;
The &amp;quot;back to top&amp;quot; link will be removed for theme boost since the new course index reduced the dependence on page scrolling. Also, the new footer is positioned where this component used to be.&lt;br /&gt;
==== Styling changes ====&lt;br /&gt;
By default rounded edges will be used for UI components, for the page header and main content area the borders will be removed. &lt;br /&gt;
==== New layout page ====&lt;br /&gt;
Theme boost now uses the drawers.php layout for the course index and blocks.&lt;br /&gt;
== The course format system ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
==== Mandatory renderer in course formats ====&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
==== New format base class ====&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
==== New course output classes and mustache files ====&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
==== Course editor javascript modules and frontend components ====&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
==== Other course related 4.0 changes ====&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. It is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] is integrated these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
Old behat steps that may now fail can be updated to the new steps.&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
== Other ==&lt;br /&gt;
==== Core plugins review ====&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;br /&gt;
==== Site admin presets plugin ====&lt;br /&gt;
The third-party plugin [https://moodle.org/plugins/block_admin_presets Admin presets], created by David Monllaó and maintained by developers from [https://pimenko.com/ Pimenko] has been adapted and integrated into Moodle 4.0. It stores settings and plugins status (enabled/disabled) in what&#039;s called &amp;quot;presets&amp;quot; to let admins quickly switch between different configurations.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Site admin presets|Site admin presets plugin]] page.&lt;br /&gt;
==== JavaScript browser support changes ====&lt;br /&gt;
From Moodle 4.0, Internet Explorer is no longer supported. See MDL-73915 and MDLSITE-6109 for further information on this change.&lt;br /&gt;
&lt;br /&gt;
This change means that changes built on 4.0 onwards (including the master branch) will be different to older versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
For plugin developers supporting multiple versions of Moodle using a single plugin version, the compiled javascript files are backwards compatible and will _work_ on all supported versions, however if you run the `grunt` command on multiple versions you will see unbuilt changes. Running grunt on all versions of Moodle is not necessary and this check can be safely disabled for Moodle versions 3.9 - 4.0, as long as only at least you run `grunt` against at least one version of Moodle.&lt;br /&gt;
&lt;br /&gt;
If you need to support Internet Explorer and do not wish to fork your plugin for Moodle 4.0 onwards, then it is recommended that you run `grunt` on an older version of Moodle.&lt;br /&gt;
==== The course index element ====&lt;br /&gt;
The new course index feature can be themed using a set of scss variables. Use them to change the look and feel instead of adding custom css&lt;br /&gt;
 /theme/boost/scss/moodle/courseindex.scss&lt;br /&gt;
With the introduction of the course index component, the previous and next links shown underneath each activity are no longer needed and they will be removed.&lt;br /&gt;
==== Activity icons ====&lt;br /&gt;
The icons used for activities have been redesigned and updated for all core moodle activities.&lt;br /&gt;
&lt;br /&gt;
When viewing the new icons in a file manager, for example for the quiz activity, you will see a simple black monochrome icon with a transparent background.&lt;br /&gt;
&lt;br /&gt;
On the course page, or in the activity chooser, the icon will display as a white icon on a coloured background. Styling of the icons on the coursepage is controlled by the css in theme/boost/scss/moodle/icons.scss.&lt;br /&gt;
&lt;br /&gt;
The background colour for activity icons is set using a new variable in function [modname]_supports(). The quiz activity is of type assessment, so in function quiz_supports() there is a new line defining the purpose:&lt;br /&gt;
 case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;&lt;br /&gt;
Available purposes are:&lt;br /&gt;
* MOD_PURPOSE_COMMUNICATION&lt;br /&gt;
* MOD_PURPOSE_ASSESSMENT&lt;br /&gt;
* MOD_PURPOSE_COLLABORATION&lt;br /&gt;
* MOD_PURPOSE_CONTENT&lt;br /&gt;
* MOD_PURPOSE_ADMINISTRATION&lt;br /&gt;
* MOD_PURPOSE_INTERFACE&lt;br /&gt;
The background colours linked to these purposes are set in theme/boost/scss/moodle/variables.scss&lt;br /&gt;
 $activity-icon-colors: map-merge(&lt;br /&gt;
     (&lt;br /&gt;
         &amp;quot;administration&amp;quot;: #5d63f6,&lt;br /&gt;
         &amp;quot;assessment&amp;quot;: #eb66a2,&lt;br /&gt;
         &amp;quot;collaboration&amp;quot;: #f7634d,&lt;br /&gt;
         &amp;quot;communication&amp;quot;: #11a676,&lt;br /&gt;
         &amp;quot;content&amp;quot;: #399be2,&lt;br /&gt;
         &amp;quot;interface&amp;quot;: #a378ff&lt;br /&gt;
     ),&lt;br /&gt;
     $activity-icon-colors&lt;br /&gt;
 );&lt;br /&gt;
If activity plugins do not define FEATURE_MOD_PURPOSE the activity icon will be rendered against a light grey background. There is no requirement to define the purpose of activity plugins, it will only affect the icon styling.&lt;br /&gt;
&lt;br /&gt;
Plugins implementing the variable FEATURE_MOD_PURPOSE are only supported on Moodle 4.0 and newer.&lt;br /&gt;
&lt;br /&gt;
Customising the activity icon can be done in an alternative way. For example using the styles.css in mod/[pluginname/styles.css&lt;br /&gt;
&lt;br /&gt;
In the example below the activity plugin developer chooses to keep the coloured icon for the activity and render it as large as the coloured background on the core activities&lt;br /&gt;
 .modicon_subcourse.activityiconcontainer {&lt;br /&gt;
     background-color: transparent;&lt;br /&gt;
     padding: 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 .modicon_subcourse.activityiconcontainer img {&lt;br /&gt;
     width: 50px;&lt;br /&gt;
     height: 50px;&lt;br /&gt;
 }&lt;br /&gt;
To customize all icon colours use this scss array and add it to the ‘Raw initial SCSS’ in the theme Boost advanced settings page. The complete array of icon background colours can be overridden using the ‘Raw initial SCSS’ in the theme settings page. The example below changes the colours of each activity type.&lt;br /&gt;
 $activity-icon-colors: (&lt;br /&gt;
     &amp;quot;administration&amp;quot;: #5D63F6,&lt;br /&gt;
     &amp;quot;assessment&amp;quot;: #11A676,&lt;br /&gt;
     &amp;quot;collaboration&amp;quot;: #EB66A2,&lt;br /&gt;
     &amp;quot;communication&amp;quot;: #F7634D,&lt;br /&gt;
     &amp;quot;content&amp;quot;: #399BE2,&lt;br /&gt;
     &amp;quot;interface&amp;quot;: #A378FF&lt;br /&gt;
 )&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61760</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61760"/>
		<updated>2022-03-03T06:05:37Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Major rearrangement of page content&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page highlights the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
&lt;br /&gt;
== Navigation changes ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
&lt;br /&gt;
==== Primary navigation ====&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
&lt;br /&gt;
====== Customising the primary navigation ======&lt;br /&gt;
Not yet implemented but we are looking at allowing the full addition and removal of any of the primary navigation tabs in the boost theme config file.&lt;br /&gt;
&lt;br /&gt;
==== Secondary navigation ====&lt;br /&gt;
The main content area shows tabs for secondary navigation with a maximum of 5 items being rendered in this ‘more’ menu. A new UI component has been created to render menus like this. Files:&lt;br /&gt;
 /lib/templates/moremenu.mustache&lt;br /&gt;
&lt;br /&gt;
====== Changing the order of tabs ======&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level. &lt;br /&gt;
&lt;br /&gt;
==== Tertiary navigation ====&lt;br /&gt;
&lt;br /&gt;
==== New API functions ====&lt;br /&gt;
====== Page API ======&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondary_nav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* has_secondary_navigation_setter - Sets the ‘_hassecondarynavigation’ to indicate whether a page should render the secondary navigation&lt;br /&gt;
====== Navigationlib ======&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
====== The activity header class ======&lt;br /&gt;
&lt;br /&gt;
== Component library ==&lt;br /&gt;
Each Moodle installation now ships with a Moodle User Interface (UI) Component library, a documentation system used to describe all the Bootstrap components and the custom Moodle components. The component Library is a helper tool for developers when creating user interfaces, a testing tool for theme developers and a documentation tool for core developers. The ultimate goal of having a component library is to encourage developers to create consistent user interfaces to improve Moodle’s overall user experience.&lt;br /&gt;
&lt;br /&gt;
The library contains pages with documentation about User Interface components. It contains details on how to use the component, what variations are available and the JavaScript events / options are associated with the component.&lt;br /&gt;
&lt;br /&gt;
When writing on these pages it is possible to render core mustache templates using some custom syntax like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; mustache template=&amp;quot;core/notification_error&amp;quot; &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; /mustache &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also call core JavaScript or use HTML examples where the html code and the rendered result are visible in the Component Library. For more info visit the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-templates/ Moodle templates] page or the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-javascript/ Moodle JavaScript] page.&lt;br /&gt;
&lt;br /&gt;
Each page in the library uses the current css from the default theme in your Moodle installation, if you have multiple themes installed and enabled the setting &amp;quot;Allow theme changes on url&amp;quot;, the component library will have a theme selector option.&lt;br /&gt;
&lt;br /&gt;
A hosted version of the Component Library can be found here. http://componentlibrary.moodle.com&lt;br /&gt;
&lt;br /&gt;
==== Enabling the Component Library ====&lt;br /&gt;
Component library pages are written in the markdown language. These pages need to be compiled to HTML pages before the Component Library is visible. To compile the pages the server running Moodle needs to have the [[Javascript Modules#Install%20NVM%20and%20Node|JavaScript developer tools installed]] (nodeJs and Grunt)&lt;br /&gt;
&lt;br /&gt;
If your server meets all requirements you can enable the library running&lt;br /&gt;
 $ npm install&lt;br /&gt;
 $ grunt componentlibrary&lt;br /&gt;
Further installation instructions can be found in the Component Library itself.&lt;br /&gt;
&lt;br /&gt;
==== Documenting new UI Components ====&lt;br /&gt;
There are no set rules for adding new pages in the component library yet. These rules will need to be written and adopted in the integration process for Moodle code.&lt;br /&gt;
&lt;br /&gt;
As a guideline for making this rules consideration are:&lt;br /&gt;
&lt;br /&gt;
The component library is not about single use components, for example the Moodle grade book (a huge component with many custom features). Or about very common components like buttons, these are already covered by the Bootstrap section of the component library.&lt;br /&gt;
&lt;br /&gt;
New features should be build keeping in mind the UI part needs to be customisable and if possible (and making sense) reusable. And example would be the new page drawers that we are introducing for the Navigation project. Or the custom primary navigation menus where overflowing items are pushed into a More section.&lt;br /&gt;
&lt;br /&gt;
== Theme changes ==&lt;br /&gt;
==== Edit switch ====&lt;br /&gt;
On theme boost the “Turn editing on” and  “Customise this page” buttons have been replaced by an edit switch in the top navbar. Theme Classic will keep using the old buttons. Child themes can choose to use the edit switch if the theme config.php is using this variable&lt;br /&gt;
 $THEME-&amp;gt;haseditswitch = true;&lt;br /&gt;
The languague menu, which used to be rendered in place of the custom menu has moved to the user dropdown when the user is logged in. If not logged in it will be placed next to the search / notification / messaging icon in the top navbar.&lt;br /&gt;
&lt;br /&gt;
==== Login page ====&lt;br /&gt;
The login page has been redesigned and allows the admin to configure a background image for the login page only in the theme settings page. This change is available in both Boost and Classic. The login page still has all the features with an improved layout. &lt;br /&gt;
==== The page footer ====&lt;br /&gt;
In large screens, the page footer button is only visible when clicking a help button at the bottom right of the screen.&lt;br /&gt;
==== User initials as profile picture placeholder ====&lt;br /&gt;
If users do not upload a profile picture the user initials are displayed on a rounded gray background as a placeholder picture in the top navbar or any other page using a placeholder image. This change will be available in both Boost and Classic. &lt;br /&gt;
&lt;br /&gt;
With the introduction of this placeholder image the full username will no longer be displayed in the top navbar.&lt;br /&gt;
==== Removal of back to top link ====&lt;br /&gt;
The &amp;quot;back to top&amp;quot; link will be removed for theme boost since the new course index reduced the dependence on page scrolling. Also, the new footer is positioned where this component used to be.&lt;br /&gt;
==== Styling changes ====&lt;br /&gt;
By default rounded edges will be used for UI components, for the page header and main content area the borders will be removed. &lt;br /&gt;
==== New layout page ====&lt;br /&gt;
Theme boost now uses the drawers.php layout for the course index and blocks.&lt;br /&gt;
&lt;br /&gt;
== The course format system ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
==== Mandatory renderer in course formats ====&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
==== New format base class ====&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
==== New course output classes and mustache files ====&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
==== Course editor javascript modules and frontend components ====&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
==== Other course related 4.0 changes ====&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. So since MDL-66335 was integrated, and the step was improved in MDL-72179 is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] (MDL-71209) is integrated but the project is not stable, these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Old behat steps that may now fail can be updated to the new steps.&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
==== Core plugins review ====&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;br /&gt;
==== Site admin presets plugin ====&lt;br /&gt;
The third-party plugin [https://moodle.org/plugins/block_admin_presets Admin presets], created by David Monllaó and maintained by developers from [https://pimenko.com/ Pimenko] has been adapted and integrated into Moodle 4.0. It stores settings and plugins status (enabled/disabled) in what&#039;s called &amp;quot;presets&amp;quot; to let admins quickly switch between different configurations.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Site admin presets|Site admin presets plugin]] page.&lt;br /&gt;
==== JavaScript browser support changes ====&lt;br /&gt;
From Moodle 4.0, Internet Explorer is no longer supported. See MDL-73915 and MDLSITE-6109 for further information on this change.&lt;br /&gt;
&lt;br /&gt;
This change means that changes built on 4.0 onwards (including the master branch) will be different to older versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
For plugin developers supporting multiple versions of Moodle using a single plugin version, the compiled javascript files are backwards compatible and will _work_ on all supported versions, however if you run the `grunt` command on multiple versions you will see unbuilt changes. Running grunt on all versions of Moodle is not necessary and this check can be safely disabled for Moodle versions 3.9 - 4.0, as long as only at least you run `grunt` against at least one version of Moodle.&lt;br /&gt;
&lt;br /&gt;
If you need to support Internet Explorer and do not wish to fork your plugin for Moodle 4.0 onwards, then it is recommended that you run `grunt` on an older version of Moodle.&lt;br /&gt;
==== The course index element ====&lt;br /&gt;
The new course index feature can be themed using a set of scss variables. Use them to change the look and feel instead of adding custom css&lt;br /&gt;
 /theme/boost/scss/moodle/courseindex.scss&lt;br /&gt;
With the introduction of the course index component, the previous and next links shown underneath each activity are no longer needed and they will be removed.&lt;br /&gt;
==== Activity icons ====&lt;br /&gt;
The icons used for activities have been redesigned and updated for all core moodle activities.&lt;br /&gt;
&lt;br /&gt;
When viewing the new icons in a file manager, for example for the quiz activity, you will see a simple black monochrome icon with a transparent background.&lt;br /&gt;
&lt;br /&gt;
On the course page, or in the activity chooser, the icon will display as a white icon on a coloured background. Styling of the icons on the coursepage is controlled by the css in theme/boost/scss/moodle/icons.scss.&lt;br /&gt;
&lt;br /&gt;
The background colour for activity icons is set using a new variable in function [modname]_supports(). The quiz activity is of type assessment, so in function quiz_supports() there is a new line defining the purpose:&lt;br /&gt;
 case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;&lt;br /&gt;
Available purposes are:&lt;br /&gt;
* MOD_PURPOSE_COMMUNICATION&lt;br /&gt;
* MOD_PURPOSE_ASSESSMENT&lt;br /&gt;
* MOD_PURPOSE_COLLABORATION&lt;br /&gt;
* MOD_PURPOSE_CONTENT&lt;br /&gt;
* MOD_PURPOSE_ADMINISTRATION&lt;br /&gt;
* MOD_PURPOSE_INTERFACE&lt;br /&gt;
The background colours linked to these purposes are set in theme/boost/scss/moodle/variables.scss&lt;br /&gt;
 $activity-icon-colors: map-merge(&lt;br /&gt;
     (&lt;br /&gt;
         &amp;quot;administration&amp;quot;: #5d63f6,&lt;br /&gt;
         &amp;quot;assessment&amp;quot;: #eb66a2,&lt;br /&gt;
         &amp;quot;collaboration&amp;quot;: #f7634d,&lt;br /&gt;
         &amp;quot;communication&amp;quot;: #11a676,&lt;br /&gt;
         &amp;quot;content&amp;quot;: #399be2,&lt;br /&gt;
         &amp;quot;interface&amp;quot;: #a378ff&lt;br /&gt;
     ),&lt;br /&gt;
     $activity-icon-colors&lt;br /&gt;
 );&lt;br /&gt;
If activity plugins do not define FEATURE_MOD_PURPOSE the activity icon will be rendered against a light grey background. There is no requirement to define the purpose of activity plugins, it will only affect the icon styling.&lt;br /&gt;
&lt;br /&gt;
Plugins implementing the variable FEATURE_MOD_PURPOSE are only supported on Moodle 4.0 and newer.&lt;br /&gt;
&lt;br /&gt;
Customising the activity icon can be done in an alternative way. For example using the styles.css in mod/[pluginname/styles.css&lt;br /&gt;
&lt;br /&gt;
In the example below the activity plugin developer chooses to keep the coloured icon for the activity and render it as large as the coloured background on the core activities&lt;br /&gt;
 .modicon_subcourse.activityiconcontainer {&lt;br /&gt;
     background-color: transparent;&lt;br /&gt;
     padding: 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 .modicon_subcourse.activityiconcontainer img {&lt;br /&gt;
     width: 50px;&lt;br /&gt;
     height: 50px;&lt;br /&gt;
 }&lt;br /&gt;
To customize all icon colours use this scss array and add it to the ‘Raw initial SCSS’ in the theme Boost advanced settings page. The complete array of icon background colours can be overridden using the ‘Raw initial SCSS’ in the theme settings page. The example below changes the colours of each activity type.&lt;br /&gt;
 $activity-icon-colors: (&lt;br /&gt;
     &amp;quot;administration&amp;quot;: #5D63F6,&lt;br /&gt;
     &amp;quot;assessment&amp;quot;: #11A676,&lt;br /&gt;
     &amp;quot;collaboration&amp;quot;: #EB66A2,&lt;br /&gt;
     &amp;quot;communication&amp;quot;: #F7634D,&lt;br /&gt;
     &amp;quot;content&amp;quot;: #399BE2,&lt;br /&gt;
     &amp;quot;interface&amp;quot;: #A378FF&lt;br /&gt;
 )&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Prototypes&amp;diff=60505</id>
		<title>Prototypes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Prototypes&amp;diff=60505"/>
		<updated>2021-07-27T06:18:29Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* New projects and prototype site demonstrations */ Update to show the navigation prototype&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page provides links to prototype sites demonstrating new features that will be included in coming versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;We would love to hear what you think of these new features! After exploring the sites, please post your feedback in the [https://moodle.org/mod/forum/view.php?id=8052 Future major features forum].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== New projects and prototype site demonstrations ==&lt;br /&gt;
&lt;br /&gt;
=== Calendar usability improvements ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| As part of the UX improvements for Moodle 4.0, we are working on updates to the calendar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The main aims for this project are to make the calendar, calendar block and subscription management more intuitive, easier to use and improve accessibility.&lt;br /&gt;
|-&lt;br /&gt;
| Project Tracker&lt;br /&gt;
| [https://tracker.moodle.org/browse/MDL-71770 Tracker epic containing all related issues]&lt;br /&gt;
|-&lt;br /&gt;
| Prototype&lt;br /&gt;
| [https://calendartest.prototype.moodledemo.net/ Calendar usability improvements demo]&lt;br /&gt;
|-&lt;br /&gt;
| Target Version&lt;br /&gt;
| 4.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Course creation improvements ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| As part of the UX improvements for Moodle 4.0, we are working on making the like easier on creating and editing courses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The main aims for this project are to improve the user experience of creating and editing courses in Moodle helping teachers to create and organize their courses. Adding new cool features like course index will allow teachers an easy way to view course structure, add new sections and activities, reorganize them and so on.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Project Tracker&lt;br /&gt;
| [https://tracker.moodle.org/browse/MDL-70907 Tracker epic containing all related issues]&lt;br /&gt;
|-&lt;br /&gt;
| Prototype&lt;br /&gt;
| [https://createcourse.prototype.moodledemo.net/ Course creation improvements demo]&lt;br /&gt;
|-&lt;br /&gt;
| Target Version&lt;br /&gt;
| 4.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Navigation update ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| We are updating the navigation around Moodle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The main aim is to reduce the cognitive load associated with navigating around a Moodle site. For anyone that is new to using our LMS, there are a lot of settings that are immediately present and possibly not relevant. We are going through and improving the layout of the navigation from the front page all the way to how different activities are displaying settings and buttons.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Project Tracker&lt;br /&gt;
| [https://tracker.moodle.org/browse/MDL-69588 Tracker epic containing all related issues]&lt;br /&gt;
|-&lt;br /&gt;
| Prototype&lt;br /&gt;
| [https://navigation.prototype.moodledemo.net/ Navigation prototype demo]&lt;br /&gt;
|-&lt;br /&gt;
| Target Version&lt;br /&gt;
| 4.0&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;More prototype site links coming soon...&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to contribute ==&lt;br /&gt;
&lt;br /&gt;
=== [[File:logo moodle.png|frameless|100px]] &amp;lt;br /&amp;gt; Moodle User Experience (UX) Forums ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| As part of the UX 4.0 release, the UX team are establishing a presence on the Moodle.org platform in order to collaborate and communicate with the wider Moodle Community.&lt;br /&gt;
We&#039;re looking forward to working with you and sharing what we learn and what we do!&lt;br /&gt;
|-&lt;br /&gt;
| More&lt;br /&gt;
| User Experience Forum [https://moodle.org/course/view.php?id=17248 Want to shape the Moodle future with us?].&lt;br /&gt;
|-&lt;br /&gt;
| Project Tracker&lt;br /&gt;
| Moodle UX 4.0 [https://tracker.moodle.org/projects/UX/issues/ tracker issues and epics]&lt;br /&gt;
|-&lt;br /&gt;
| Prototypes&lt;br /&gt;
| [https://www.figma.com/proto/A4d9WOUVxCqS93mvXVCr8P/4.0-UX-Demo?node-id=2394%3A15559&amp;amp;viewport=727%2C769%2C0.07944665849208832&amp;amp;scaling=scale-down 4.0 Desktop Navigation UX Project]&lt;br /&gt;
[https://www.figma.com/proto/A4d9WOUVxCqS93mvXVCr8P/4.0-UX-Demo?node-id=2392%3A11210&amp;amp;viewport=1413%2C310%2C0.31215807795524597&amp;amp;scaling=scale-down 4.0 Mobile Navigation UX Project]&lt;br /&gt;
|-&lt;br /&gt;
| Target Version&lt;br /&gt;
| 4.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== [[File:logo_moodle_tracker.jpg|frameless|100px]] &amp;lt;br /&amp;gt; Moodle Tracker ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| This is where we record and manage all issues related to Moodle and related systems.&lt;br /&gt;
It&#039;s not just for developers! :-) All users should use this system to report problems or new ideas for Moodle and help us make it better.&lt;br /&gt;
|-&lt;br /&gt;
| More&lt;br /&gt;
| Moodle Tracker [https://tracker.moodle.org/secure/Dashboard.jspa Want to shape the Moodle future with us?].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== [[File:mua-logo-small-onblue.png|frameless|100px]] &amp;lt;br /&amp;gt; Moodle Users Association ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| MUA&#039;s mission is to support the growth of Moodle by providing a strong and united voice to users, giving direction and resources for new developments.&lt;br /&gt;
|-&lt;br /&gt;
| More&lt;br /&gt;
| Join MUA [https://moodle.org/course/view.php?id=17248 Shape the future of Moodle today.].&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[File:logo_moodle_dev.jpg|frameless|100px]] &amp;lt;br /&amp;gt; Other Moodle demo sites ==&lt;br /&gt;
&lt;br /&gt;
=== QA Moodle Demo ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| It is updated daily at 13:00 UTC with the latest fixes for testers to test and do a final check for any problems.&lt;br /&gt;
Every hour (on the hour) the database and files are reset.&lt;br /&gt;
|-&lt;br /&gt;
| Moodle Version&lt;br /&gt;
| The latest Moodle dev release!&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Site&lt;br /&gt;
| &#039;&#039;&#039;[https://qa.moodledemo.net/ qa.moodledemo.net/]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== School Moodle Demo ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| This demonstration site gives you the opportunity to explore Moodle in action as a manager, teacher, student, parent or privacy officer with realistic content.&lt;br /&gt;
This site is reset every hour on the hour so anything you &amp;quot;break&amp;quot; will get fixed.&lt;br /&gt;
|-&lt;br /&gt;
| Moodle Version&lt;br /&gt;
| The latest Moodle stable release!&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Site&lt;br /&gt;
| &#039;&#039;&#039;[https://school.moodledemo.net/ school.moodledemo.net/]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sandbox Moodle Demo ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| This site is a plain installation of Moodle using the Boost theme.&lt;br /&gt;
This site is reset to its blank state every hour, on the hour.&lt;br /&gt;
|-&lt;br /&gt;
| Moodle Version&lt;br /&gt;
| The latest Moodle stable release!&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Site&lt;br /&gt;
| &#039;&#039;&#039;[https://sandbox.moodledemo.net/ sandbox.moodledemo.net/]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Roadmap]] - for an overview of new features planned for the next release&lt;br /&gt;
* [[Releases]] - for all official releases of Moodle, grouped by branch in reverse chronological order&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Prototypes&amp;diff=56904</id>
		<title>Prototypes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Prototypes&amp;diff=56904"/>
		<updated>2020-02-04T06:03:45Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Update to show the activity chooser&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page provides links to prototype sites demonstrating new features that will be included in coming versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;We would love to hear what you think of these new features! After exploring the sites, please post your feedback in the [https://moodle.org/mod/forum/view.php?id=8052 Future major features forum].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 3.9 Activity Chooser ===&lt;br /&gt;
This project is to update the activity chooser and allow users to star / favourite the activities they use the most. More information can be found at [[Activity chooser]].&lt;br /&gt;
&lt;br /&gt;
[https://activitychooser.prototype.moodledemo.net Activity chooser prototype]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===3.8 Forum enhancements===&lt;br /&gt;
This project is collaborative project with and sponsored by the [https://moodleassociation.org/ Moodle User Association].&lt;br /&gt;
&lt;br /&gt;
The scope for Moodle 3.8 includes the ability to grade forum activity, student activity reports, exporting of forum content - and a new forum look and feel.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://forum.moodledemo.net Forum project 3.8 prototype site]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;More prototype site links coming soon...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Roadmap]] - for an overview of new features planned for the next release&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56808</id>
		<title>Activity chooser</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56808"/>
		<updated>2020-01-10T05:36:48Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Removed H5P as that no longer has it&amp;#039;s own tab.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|state = In progress&lt;br /&gt;
|name = Activity chooser&lt;br /&gt;
|tracker = MDL-67255 (epic), MDL-57828, MDL-61511&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=346664&lt;br /&gt;
|assignee = Team Alpha&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Through our road-map creation process of looking at highly voted tracker issues and relevant forum posts, as well as MUA interaction, an update to the activity chooser to simplify and make less intimidating, was chosen.&lt;br /&gt;
&lt;br /&gt;
MDL-57828 was created and worked on, but unfortunately stalled, and did not complete its way through the integration process. There is a substantial forum post [https://moodle.org/mod/forum/discuss.php?d=346664], with many suggestions and current pain points with the activity chooser. The MUA created a proposal issue (MDL-61511) to tackle the same issue.&lt;br /&gt;
&lt;br /&gt;
We have recently been analysing how course creation is achieved. Two main ideas were tested with focus groups to try and find the best away to approach course creation. With this information we are confident that we have a user focused design that will improve the activity chooser for everyone.&lt;br /&gt;
&lt;br /&gt;
We would like to invite everyone to express their opinion on this improvement. Course creation is a Moodle activity that is fundamental to teaching a course online, and we would like to ensure that the process is as easy and intuitive as possible.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
The following are changes that we are planning on making in this project. We have a demo that can be viewed and interacted with.&lt;br /&gt;
[https://projects.invisionapp.com/share/SVSREPYNBYG#/screens/388682478 Invisio mockup of the activity chooser].&lt;br /&gt;
&lt;br /&gt;
Our current work can be viewed at [https://activitychooser.prototype.moodledemo.net/ activity chooser prototype]. Please take a look.&lt;br /&gt;
&lt;br /&gt;
=== Larger display area ===&lt;br /&gt;
&lt;br /&gt;
The activity chooser will be wider and have the activities in a grid format. This allows for more activities to be seen at once.&lt;br /&gt;
&lt;br /&gt;
=== Activities and resources are now merged ===&lt;br /&gt;
&lt;br /&gt;
Our research found that the distinction been activities and resources was not useful to teachers and so now these two categories have been merged together.&lt;br /&gt;
&lt;br /&gt;
=== Starred / Favourites tab ===&lt;br /&gt;
&lt;br /&gt;
The user can now select activities to be added to the Starred tab. The starred tab is shown by default to users when pulling up the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-starred.png|The starred tab]]&lt;br /&gt;
&lt;br /&gt;
=== Recommended tab ===&lt;br /&gt;
&lt;br /&gt;
Site administrators will now be able to set a selection of activities as recommended. These recommended activities will show up in a tab in the activity chooser for the course creator to view. If no recommendations are made then this tab will not be displayed.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-recommend.png|The recommended tab]]&lt;br /&gt;
&lt;br /&gt;
=== Smart search bar ===&lt;br /&gt;
&lt;br /&gt;
To help find activities from the activity chooser, we will be adding a search bar, that will search through both the names of the activities, and also the information text, to try and find relevant activities that the user may want.&lt;br /&gt;
&lt;br /&gt;
=== Other activity types ===&lt;br /&gt;
&lt;br /&gt;
Other activity types such as LTI will be able to be added to the activity chooser for the user to select.&lt;br /&gt;
&lt;br /&gt;
=== Activity information hidden ===&lt;br /&gt;
&lt;br /&gt;
The information about an activity will be accessible through the &#039;i&#039; icon. Clicking the link will show additional information about the activity. This will free up space for other activities to be shown rather than always taking up half of the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-info.png|Additional information about an activity]]&lt;br /&gt;
&lt;br /&gt;
== Third party plugin developers == &lt;br /&gt;
&lt;br /&gt;
For developers who wish to add items to the activity chooser, this is still done through the {plugin}_get_shortcuts() callback which is placed in the plugin&#039;s lib.php file.&lt;br /&gt;
Developers who are currently using this callback are requested to now return an ID with each object. The ID has the following requirements:&lt;br /&gt;
* Must be unique to your component.&lt;br /&gt;
* Must not change.&lt;br /&gt;
* Must be of type integer.&lt;br /&gt;
&lt;br /&gt;
It is not mandatory to add this ID, but your items will not have the ability to be favourited or recommended.&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56807</id>
		<title>Activity chooser</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56807"/>
		<updated>2020-01-10T02:56:16Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: update to link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|state = In progress&lt;br /&gt;
|name = Activity chooser&lt;br /&gt;
|tracker = MDL-67255 (epic), MDL-57828, MDL-61511&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=346664&lt;br /&gt;
|assignee = Team Alpha&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Through our road-map creation process of looking at highly voted tracker issues and relevant forum posts, as well as MUA interaction, an update to the activity chooser to simplify and make less intimidating, was chosen.&lt;br /&gt;
&lt;br /&gt;
MDL-57828 was created and worked on, but unfortunately stalled, and did not complete its way through the integration process. There is a substantial forum post [https://moodle.org/mod/forum/discuss.php?d=346664], with many suggestions and current pain points with the activity chooser. The MUA created a proposal issue (MDL-61511) to tackle the same issue.&lt;br /&gt;
&lt;br /&gt;
We have recently been analysing how course creation is achieved. Two main ideas were tested with focus groups to try and find the best away to approach course creation. With this information we are confident that we have a user focused design that will improve the activity chooser for everyone.&lt;br /&gt;
&lt;br /&gt;
We would like to invite everyone to express their opinion on this improvement. Course creation is a Moodle activity that is fundamental to teaching a course online, and we would like to ensure that the process is as easy and intuitive as possible.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
The following are changes that we are planning on making in this project. We have a demo that can be viewed and interacted with.&lt;br /&gt;
[https://projects.invisionapp.com/share/SVSREPYNBYG#/screens/388682478 Invisio mockup of the activity chooser].&lt;br /&gt;
&lt;br /&gt;
Our current work can be viewed at [https://activitychooser.prototype.moodledemo.net/ activity chooser prototype]. Please take a look.&lt;br /&gt;
&lt;br /&gt;
=== Larger display area ===&lt;br /&gt;
&lt;br /&gt;
The activity chooser will be wider and have the activities in a grid format. This allows for more activities to be seen at once.&lt;br /&gt;
&lt;br /&gt;
=== Activities and resources are now merged ===&lt;br /&gt;
&lt;br /&gt;
Our research found that the distinction been activities and resources was not useful to teachers and so now these two categories have been merged together.&lt;br /&gt;
&lt;br /&gt;
=== Starred / Favourites tab ===&lt;br /&gt;
&lt;br /&gt;
The user can now select activities to be added to the Starred tab. The starred tab is shown by default to users when pulling up the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-starred.png|The starred tab]]&lt;br /&gt;
&lt;br /&gt;
=== Recommended tab ===&lt;br /&gt;
&lt;br /&gt;
Site administrators will now be able to set a selection of activities as recommended. These recommended activities will show up in a tab in the activity chooser for the course creator to view. If no recommendations are made then this tab will not be displayed.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-recommend.png|The recommended tab]]&lt;br /&gt;
&lt;br /&gt;
=== H5P activities included ===&lt;br /&gt;
&lt;br /&gt;
We are looking at adding the ability for users to select an H5P activity from the activity chooser.&lt;br /&gt;
&lt;br /&gt;
=== Smart search bar ===&lt;br /&gt;
&lt;br /&gt;
To help find activities from the activity chooser, we will be adding a search bar, that will search through both the names of the activities, and also the information text, to try and find relevant activities that the user may want.&lt;br /&gt;
&lt;br /&gt;
=== Other activity types ===&lt;br /&gt;
&lt;br /&gt;
Other activity types such as LTI will be able to be added to the activity chooser for the user to select.&lt;br /&gt;
&lt;br /&gt;
=== Activity information hidden ===&lt;br /&gt;
&lt;br /&gt;
The information about an activity will be accessible through the &#039;i&#039; icon. Clicking the link will show additional information about the activity. This will free up space for other activities to be shown rather than always taking up half of the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-info.png|Additional information about an activity]]&lt;br /&gt;
&lt;br /&gt;
== Third party plugin developers == &lt;br /&gt;
&lt;br /&gt;
For developers who wish to add items to the activity chooser, this is still done through the {plugin}_get_shortcuts() callback which is placed in the plugin&#039;s lib.php file.&lt;br /&gt;
Developers who are currently using this callback are requested to now return an ID with each object. The ID has the following requirements:&lt;br /&gt;
* Must be unique to your component.&lt;br /&gt;
* Must not change.&lt;br /&gt;
* Must be of type integer.&lt;br /&gt;
&lt;br /&gt;
It is not mandatory to add this ID, but your items will not have the ability to be favourited or recommended.&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56806</id>
		<title>Activity chooser</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56806"/>
		<updated>2020-01-10T02:54:54Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Prototype link and third party dev information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|state = In progress&lt;br /&gt;
|name = Activity chooser&lt;br /&gt;
|tracker = MDL-67255 (epic), MDL-57828, MDL-61511&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=346664&lt;br /&gt;
|assignee = Team Alpha&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Through our road-map creation process of looking at highly voted tracker issues and relevant forum posts, as well as MUA interaction, an update to the activity chooser to simplify and make less intimidating, was chosen.&lt;br /&gt;
&lt;br /&gt;
MDL-57828 was created and worked on, but unfortunately stalled, and did not complete its way through the integration process. There is a substantial forum post [https://moodle.org/mod/forum/discuss.php?d=346664], with many suggestions and current pain points with the activity chooser. The MUA created a proposal issue (MDL-61511) to tackle the same issue.&lt;br /&gt;
&lt;br /&gt;
We have recently been analysing how course creation is achieved. Two main ideas were tested with focus groups to try and find the best away to approach course creation. With this information we are confident that we have a user focused design that will improve the activity chooser for everyone.&lt;br /&gt;
&lt;br /&gt;
We would like to invite everyone to express their opinion on this improvement. Course creation is a Moodle activity that is fundamental to teaching a course online, and we would like to ensure that the process is as easy and intuitive as possible.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
The following are changes that we are planning on making in this project. We have a demo that can be viewed and interacted with.&lt;br /&gt;
[https://projects.invisionapp.com/share/SVSREPYNBYG#/screens/388682478 Invisio mockup of the activity chooser].&lt;br /&gt;
&lt;br /&gt;
Our current work can be viewed at [https://activitychooser.prototype.moodledemo.net/]. Please take a look.&lt;br /&gt;
&lt;br /&gt;
=== Larger display area ===&lt;br /&gt;
&lt;br /&gt;
The activity chooser will be wider and have the activities in a grid format. This allows for more activities to be seen at once.&lt;br /&gt;
&lt;br /&gt;
=== Activities and resources are now merged ===&lt;br /&gt;
&lt;br /&gt;
Our research found that the distinction been activities and resources was not useful to teachers and so now these two categories have been merged together.&lt;br /&gt;
&lt;br /&gt;
=== Starred / Favourites tab ===&lt;br /&gt;
&lt;br /&gt;
The user can now select activities to be added to the Starred tab. The starred tab is shown by default to users when pulling up the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-starred.png|The starred tab]]&lt;br /&gt;
&lt;br /&gt;
=== Recommended tab ===&lt;br /&gt;
&lt;br /&gt;
Site administrators will now be able to set a selection of activities as recommended. These recommended activities will show up in a tab in the activity chooser for the course creator to view. If no recommendations are made then this tab will not be displayed.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-recommend.png|The recommended tab]]&lt;br /&gt;
&lt;br /&gt;
=== H5P activities included ===&lt;br /&gt;
&lt;br /&gt;
We are looking at adding the ability for users to select an H5P activity from the activity chooser.&lt;br /&gt;
&lt;br /&gt;
=== Smart search bar ===&lt;br /&gt;
&lt;br /&gt;
To help find activities from the activity chooser, we will be adding a search bar, that will search through both the names of the activities, and also the information text, to try and find relevant activities that the user may want.&lt;br /&gt;
&lt;br /&gt;
=== Other activity types ===&lt;br /&gt;
&lt;br /&gt;
Other activity types such as LTI will be able to be added to the activity chooser for the user to select.&lt;br /&gt;
&lt;br /&gt;
=== Activity information hidden ===&lt;br /&gt;
&lt;br /&gt;
The information about an activity will be accessible through the &#039;i&#039; icon. Clicking the link will show additional information about the activity. This will free up space for other activities to be shown rather than always taking up half of the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-info.png|Additional information about an activity]]&lt;br /&gt;
&lt;br /&gt;
== Third party plugin developers == &lt;br /&gt;
&lt;br /&gt;
For developers who wish to add items to the activity chooser, this is still done through the {plugin}_get_shortcuts() callback which is placed in the plugin&#039;s lib.php file.&lt;br /&gt;
Developers who are currently using this callback are requested to now return an ID with each object. The ID has the following requirements:&lt;br /&gt;
* Must be unique to your component.&lt;br /&gt;
* Must not change.&lt;br /&gt;
* Must be of type integer.&lt;br /&gt;
&lt;br /&gt;
It is not mandatory to add this ID, but your items will not have the ability to be favourited or recommended.&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56668</id>
		<title>Activity chooser</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56668"/>
		<updated>2019-11-18T01:46:49Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Removal of plugins adding activities and related discussion.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|state = Open&lt;br /&gt;
|name = Activity chooser&lt;br /&gt;
|tracker = MDL-67255 (epic), MDL-57828, MDL-61511&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=346664&lt;br /&gt;
|assignee = Team Alpha&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Through our road-map creation process of looking at highly voted tracker issues and relevant forum posts, as well as MUA interaction, an update to the activity chooser to simplify and make less intimidating, was chosen.&lt;br /&gt;
&lt;br /&gt;
MDL-57828 was created and worked on, but unfortunately stalled, and did not complete its way through the integration process. There is a substantial forum post [https://moodle.org/mod/forum/discuss.php?d=346664], with many suggestions and current pain points with the activity chooser. The MUA created a proposal issue (MDL-61511) to tackle the same issue.&lt;br /&gt;
&lt;br /&gt;
We have recently been analysing how course creation is achieved. Two main ideas were tested with focus groups to try and find the best away to approach course creation. With this information we are confident that we have a user focused design that will improve the activity chooser for everyone.&lt;br /&gt;
&lt;br /&gt;
We would like to invite everyone to express their opinion on this improvement. Course creation is a Moodle activity that is fundamental to teaching a course online, and we would like to ensure that the process is as easy and intuitive as possible.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
The following are changes that we are planning on making in this project. We have a demo that can be viewed and interacted with.&lt;br /&gt;
[https://projects.invisionapp.com/share/SVSREPYNBYG#/screens/388682478 Invisio mockup of the activity chooser].&lt;br /&gt;
&lt;br /&gt;
=== Larger display area ===&lt;br /&gt;
&lt;br /&gt;
The activity chooser will be wider and have the activities in a grid format. This allows for more activities to be seen at once.&lt;br /&gt;
&lt;br /&gt;
=== Activities and resources are now merged ===&lt;br /&gt;
&lt;br /&gt;
Our research found that the distinction been activities and resources was not useful to teachers and so now these two categories have been merged together.&lt;br /&gt;
&lt;br /&gt;
=== Starred / Favourites tab ===&lt;br /&gt;
&lt;br /&gt;
The user can now select activities to be added to the Starred tab. The starred tab is shown by default to users when pulling up the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-starred.png|The starred tab]]&lt;br /&gt;
&lt;br /&gt;
=== Recommended tab ===&lt;br /&gt;
&lt;br /&gt;
Site administrators will now be able to set a selection of activities as recommended. These recommended activities will show up in a tab in the activity chooser for the course creator to view. If no recommendations are made then this tab will not be displayed.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-recommend.png|The recommended tab]]&lt;br /&gt;
&lt;br /&gt;
=== H5P activities included ===&lt;br /&gt;
&lt;br /&gt;
We are looking at adding the ability for users to select an H5P activity from the activity chooser.&lt;br /&gt;
&lt;br /&gt;
=== Smart search bar ===&lt;br /&gt;
&lt;br /&gt;
To help find activities from the activity chooser, we will be adding a search bar, that will search through both the names of the activities, and also the information text, to try and find relevant activities that the user may want.&lt;br /&gt;
&lt;br /&gt;
=== Other activity types ===&lt;br /&gt;
&lt;br /&gt;
Other activity types such as LTI will be able to be added to the activity chooser for the user to select.&lt;br /&gt;
&lt;br /&gt;
=== Activity information hidden ===&lt;br /&gt;
&lt;br /&gt;
The information about an activity will be accessible through the &#039;i&#039; icon. Clicking the link will show additional information about the activity. This will free up space for other activities to be shown rather than always taking up half of the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-info.png|Additional information about an activity]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Talk:Activity_chooser&amp;diff=56667</id>
		<title>Talk:Activity chooser</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Talk:Activity_chooser&amp;diff=56667"/>
		<updated>2019-11-18T01:46:07Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Start of discussion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;It is currently possible to include additional items to the activity picker (such as the external tools). We are looking at expanding this to allow any plugin to add items to the activity picker.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What do you mean by this? I can see it makes sense for mod_ plugins to be able to do this, but why any plugin type? Can you give an example that shows why this is a requirement. Thanks. --Tim. &lt;br /&gt;
&lt;br /&gt;
Thanks for your comment Tim. We have a couple of future projects that we are trying to make allowances for. One is Moodle net and how to get content from there into a course, and the second is an ability to add plugins into a course. These are not well defined. To avoid confusion I&#039;ll remove this section and we&#039;ll put on hold this idea until it is absolutely necessary. -- Adrian&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56653</id>
		<title>Activity chooser</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56653"/>
		<updated>2019-11-15T02:10:07Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Adding times via any plugin to the activity chooser.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|state = Open&lt;br /&gt;
|name = Activity chooser&lt;br /&gt;
|tracker = MDL-67255 (epic), MDL-57828, MDL-61511&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=346664&lt;br /&gt;
|assignee = Team Alpha&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Through our road-map creation process of looking at highly voted tracker issues and relevant forum posts, as well as MUA interaction, an update to the activity chooser to simplify and make less intimidating, was chosen.&lt;br /&gt;
&lt;br /&gt;
MDL-57828 was created and worked on, but unfortunately stalled, and did not complete its way through the integration process. There is a substantial forum post [https://moodle.org/mod/forum/discuss.php?d=346664], with many suggestions and current pain points with the activity chooser. The MUA created a proposal issue (MDL-61511) to tackle the same issue.&lt;br /&gt;
&lt;br /&gt;
We have recently been analysing how course creation is achieved. Two main ideas were tested with focus groups to try and find the best away to approach course creation. With this information we are confident that we have a user focused design that will improve the activity chooser for everyone.&lt;br /&gt;
&lt;br /&gt;
We would like to invite everyone to express their opinion on this improvement. Course creation is a Moodle activity that is fundamental to teaching a course online, and we would like to ensure that the process is as easy and intuitive as possible.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
The following are changes that we are planning on making in this project. We have a demo that can be viewed and interacted with.&lt;br /&gt;
[https://projects.invisionapp.com/share/SVSREPYNBYG#/screens/388682478 Invisio mockup of the activity chooser].&lt;br /&gt;
&lt;br /&gt;
=== Larger display area ===&lt;br /&gt;
&lt;br /&gt;
The activity chooser will be wider and have the activities in a grid format. This allows for more activities to be seen at once.&lt;br /&gt;
&lt;br /&gt;
=== Activities and resources are now merged ===&lt;br /&gt;
&lt;br /&gt;
Our research found that the distinction been activities and resources was not useful to teachers and so now these two categories have been merged together.&lt;br /&gt;
&lt;br /&gt;
=== Starred / Favourites tab ===&lt;br /&gt;
&lt;br /&gt;
The user can now select activities to be added to the Starred tab. The starred tab is shown by default to users when pulling up the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-starred.png|The starred tab]]&lt;br /&gt;
&lt;br /&gt;
=== Recommended tab ===&lt;br /&gt;
&lt;br /&gt;
Site administrators will now be able to set a selection of activities as recommended. These recommended activities will show up in a tab in the activity chooser for the course creator to view. If no recommendations are made then this tab will not be displayed.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-recommend.png|The recommended tab]]&lt;br /&gt;
&lt;br /&gt;
=== H5P activities included ===&lt;br /&gt;
&lt;br /&gt;
We are looking at adding the ability for users to select an H5P activity from the activity chooser.&lt;br /&gt;
&lt;br /&gt;
=== Smart search bar ===&lt;br /&gt;
&lt;br /&gt;
To help find activities from the activity chooser, we will be adding a search bar, that will search through both the names of the activities, and also the information text, to try and find relevant activities that the user may want.&lt;br /&gt;
&lt;br /&gt;
=== Other activity types ===&lt;br /&gt;
&lt;br /&gt;
Other activity types such as LTI will be able to be added to the activity chooser for the user to select.&lt;br /&gt;
&lt;br /&gt;
=== Activity information hidden ===&lt;br /&gt;
&lt;br /&gt;
The information about an activity will be accessible through the &#039;i&#039; icon. Clicking the link will show additional information about the activity. This will free up space for other activities to be shown rather than always taking up half of the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-info.png|Additional information about an activity]]&lt;br /&gt;
&lt;br /&gt;
=== Adding activity items to the chooser through plugins ===&lt;br /&gt;
&lt;br /&gt;
It is currently possible to include additional items to the activity picker (such as the external tools). We are looking at expanding this to allow any plugin to add items to the activity picker.&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56652</id>
		<title>Activity chooser</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56652"/>
		<updated>2019-11-15T01:31:55Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Very minor edit to add further detail to infobox.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|state = Open&lt;br /&gt;
|name = Activity chooser&lt;br /&gt;
|tracker = MDL-67255 (epic), MDL-57828, MDL-61511&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=346664&lt;br /&gt;
|assignee = Team Alpha&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Through our road-map creation process of looking at highly voted tracker issues and relevant forum posts, as well as MUA interaction, an update to the activity chooser to simplify and make less intimidating, was chosen.&lt;br /&gt;
&lt;br /&gt;
MDL-57828 was created and worked on, but unfortunately stalled, and did not complete its way through the integration process. There is a substantial forum post [https://moodle.org/mod/forum/discuss.php?d=346664], with many suggestions and current pain points with the activity chooser. The MUA created a proposal issue (MDL-61511) to tackle the same issue.&lt;br /&gt;
&lt;br /&gt;
We have recently been analysing how course creation is achieved. Two main ideas were tested with focus groups to try and find the best away to approach course creation. With this information we are confident that we have a user focused design that will improve the activity chooser for everyone.&lt;br /&gt;
&lt;br /&gt;
We would like to invite everyone to express their opinion on this improvement. Course creation is a Moodle activity that is fundamental to teaching a course online, and we would like to ensure that the process is as easy and intuitive as possible.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
The following are changes that we are planning on making in this project. We have a demo that can be viewed and interacted with.&lt;br /&gt;
[https://projects.invisionapp.com/share/SVSREPYNBYG#/screens/388682478 Invisio mockup of the activity chooser].&lt;br /&gt;
&lt;br /&gt;
=== Larger display area ===&lt;br /&gt;
&lt;br /&gt;
The activity chooser will be wider and have the activities in a grid format. This allows for more activities to be seen at once.&lt;br /&gt;
&lt;br /&gt;
=== Activities and resources are now merged ===&lt;br /&gt;
&lt;br /&gt;
Our research found that the distinction been activities and resources was not useful to teachers and so now these two categories have been merged together.&lt;br /&gt;
&lt;br /&gt;
=== Starred / Favourites tab ===&lt;br /&gt;
&lt;br /&gt;
The user can now select activities to be added to the Starred tab. The starred tab is shown by default to users when pulling up the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-starred.png|The starred tab]]&lt;br /&gt;
&lt;br /&gt;
=== Recommended tab ===&lt;br /&gt;
&lt;br /&gt;
Site administrators will now be able to set a selection of activities as recommended. These recommended activities will show up in a tab in the activity chooser for the course creator to view. If no recommendations are made then this tab will not be displayed.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-recommend.png|The recommended tab]]&lt;br /&gt;
&lt;br /&gt;
=== H5P activities included ===&lt;br /&gt;
&lt;br /&gt;
We are looking at adding the ability for users to select an H5P activity from the activity chooser.&lt;br /&gt;
&lt;br /&gt;
=== Smart search bar ===&lt;br /&gt;
&lt;br /&gt;
To help find activities from the activity chooser, we will be adding a search bar, that will search through both the names of the activities, and also the information text, to try and find relevant activities that the user may want.&lt;br /&gt;
&lt;br /&gt;
=== Other activity types ===&lt;br /&gt;
&lt;br /&gt;
Other activity types such as LTI will be able to be added to the activity chooser for the user to select.&lt;br /&gt;
&lt;br /&gt;
=== Activity information hidden ===&lt;br /&gt;
&lt;br /&gt;
The information about an activity will be accessible through the &#039;i&#039; icon. Clicking the link will show additional information about the activity. This will free up space for other activities to be shown rather than always taking up half of the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-info.png|Additional information about an activity]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56651</id>
		<title>Activity chooser</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56651"/>
		<updated>2019-11-15T01:30:58Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Minor update to add epic issue to project info box&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|state = Open&lt;br /&gt;
|name = Activity chooser&lt;br /&gt;
|tracker = MDL-67255, MDL-57828, MDL-61511&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=346664&lt;br /&gt;
|assignee = Team Alpha&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Through our road-map creation process of looking at highly voted tracker issues and relevant forum posts, as well as MUA interaction, an update to the activity chooser to simplify and make less intimidating, was chosen.&lt;br /&gt;
&lt;br /&gt;
MDL-57828 was created and worked on, but unfortunately stalled, and did not complete its way through the integration process. There is a substantial forum post [https://moodle.org/mod/forum/discuss.php?d=346664], with many suggestions and current pain points with the activity chooser. The MUA created a proposal issue (MDL-61511) to tackle the same issue.&lt;br /&gt;
&lt;br /&gt;
We have recently been analysing how course creation is achieved. Two main ideas were tested with focus groups to try and find the best away to approach course creation. With this information we are confident that we have a user focused design that will improve the activity chooser for everyone.&lt;br /&gt;
&lt;br /&gt;
We would like to invite everyone to express their opinion on this improvement. Course creation is a Moodle activity that is fundamental to teaching a course online, and we would like to ensure that the process is as easy and intuitive as possible.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
The following are changes that we are planning on making in this project. We have a demo that can be viewed and interacted with.&lt;br /&gt;
[https://projects.invisionapp.com/share/SVSREPYNBYG#/screens/388682478 Invisio mockup of the activity chooser].&lt;br /&gt;
&lt;br /&gt;
=== Larger display area ===&lt;br /&gt;
&lt;br /&gt;
The activity chooser will be wider and have the activities in a grid format. This allows for more activities to be seen at once.&lt;br /&gt;
&lt;br /&gt;
=== Activities and resources are now merged ===&lt;br /&gt;
&lt;br /&gt;
Our research found that the distinction been activities and resources was not useful to teachers and so now these two categories have been merged together.&lt;br /&gt;
&lt;br /&gt;
=== Starred / Favourites tab ===&lt;br /&gt;
&lt;br /&gt;
The user can now select activities to be added to the Starred tab. The starred tab is shown by default to users when pulling up the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-starred.png|The starred tab]]&lt;br /&gt;
&lt;br /&gt;
=== Recommended tab ===&lt;br /&gt;
&lt;br /&gt;
Site administrators will now be able to set a selection of activities as recommended. These recommended activities will show up in a tab in the activity chooser for the course creator to view. If no recommendations are made then this tab will not be displayed.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-recommend.png|The recommended tab]]&lt;br /&gt;
&lt;br /&gt;
=== H5P activities included ===&lt;br /&gt;
&lt;br /&gt;
We are looking at adding the ability for users to select an H5P activity from the activity chooser.&lt;br /&gt;
&lt;br /&gt;
=== Smart search bar ===&lt;br /&gt;
&lt;br /&gt;
To help find activities from the activity chooser, we will be adding a search bar, that will search through both the names of the activities, and also the information text, to try and find relevant activities that the user may want.&lt;br /&gt;
&lt;br /&gt;
=== Other activity types ===&lt;br /&gt;
&lt;br /&gt;
Other activity types such as LTI will be able to be added to the activity chooser for the user to select.&lt;br /&gt;
&lt;br /&gt;
=== Activity information hidden ===&lt;br /&gt;
&lt;br /&gt;
The information about an activity will be accessible through the &#039;i&#039; icon. Clicking the link will show additional information about the activity. This will free up space for other activities to be shown rather than always taking up half of the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-info.png|Additional information about an activity]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56564</id>
		<title>Activity chooser</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Activity_chooser&amp;diff=56564"/>
		<updated>2019-10-28T06:00:11Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Initial information.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|state = Open&lt;br /&gt;
|name = Activity chooser&lt;br /&gt;
|tracker = MDL-57828, MDL-61511&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=346664&lt;br /&gt;
|assignee = Team Alpha&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Through our road-map creation process of looking at highly voted tracker issues and relevant forum posts, as well as MUA interaction, an update to the activity chooser to simplify and make less intimidating, was chosen.&lt;br /&gt;
&lt;br /&gt;
MDL-57828 was created and worked on, but unfortunately stalled, and did not complete its way through the integration process. There is a substantial forum post [https://moodle.org/mod/forum/discuss.php?d=346664], with many suggestions and current pain points with the activity chooser. The MUA created a proposal issue (MDL-61511) to tackle the same issue.&lt;br /&gt;
&lt;br /&gt;
We have recently been analysing how course creation is achieved. Two main ideas were tested with focus groups to try and find the best away to approach course creation. With this information we are confident that we have a user focused design that will improve the activity chooser for everyone.&lt;br /&gt;
&lt;br /&gt;
We would like to invite everyone to express their opinion on this improvement. Course creation is a Moodle activity that is fundamental to teaching a course online, and we would like to ensure that the process is as easy and intuitive as possible.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
The following are changes that we are planning on making in this project. We have a demo that can be viewed and interacted with.&lt;br /&gt;
[https://projects.invisionapp.com/share/SVSREPYNBYG#/screens/388682478 Invisio mockup of the activity chooser].&lt;br /&gt;
&lt;br /&gt;
=== Larger display area ===&lt;br /&gt;
&lt;br /&gt;
The activity chooser will be wider and have the activities in a grid format. This allows for more activities to be seen at once.&lt;br /&gt;
&lt;br /&gt;
=== Activities and resources are now merged ===&lt;br /&gt;
&lt;br /&gt;
Our research found that the distinction been activities and resources was not useful to teachers and so now these two categories have been merged together.&lt;br /&gt;
&lt;br /&gt;
=== Starred / Favourites tab ===&lt;br /&gt;
&lt;br /&gt;
The user can now select activities to be added to the Starred tab. The starred tab is shown by default to users when pulling up the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-starred.png|The starred tab]]&lt;br /&gt;
&lt;br /&gt;
=== Recommended tab ===&lt;br /&gt;
&lt;br /&gt;
Site administrators will now be able to set a selection of activities as recommended. These recommended activities will show up in a tab in the activity chooser for the course creator to view. If no recommendations are made then this tab will not be displayed.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-recommend.png|The recommended tab]]&lt;br /&gt;
&lt;br /&gt;
=== H5P activities included ===&lt;br /&gt;
&lt;br /&gt;
We are looking at adding the ability for users to select an H5P activity from the activity chooser.&lt;br /&gt;
&lt;br /&gt;
=== Smart search bar ===&lt;br /&gt;
&lt;br /&gt;
To help find activities from the activity chooser, we will be adding a search bar, that will search through both the names of the activities, and also the information text, to try and find relevant activities that the user may want.&lt;br /&gt;
&lt;br /&gt;
=== Other activity types ===&lt;br /&gt;
&lt;br /&gt;
Other activity types such as LTI will be able to be added to the activity chooser for the user to select.&lt;br /&gt;
&lt;br /&gt;
=== Activity information hidden ===&lt;br /&gt;
&lt;br /&gt;
The information about an activity will be accessible through the &#039;i&#039; icon. Clicking the link will show additional information about the activity. This will free up space for other activities to be shown rather than always taking up half of the activity chooser.&lt;br /&gt;
&lt;br /&gt;
[[File:activity-chooser-info.png|Additional information about an activity]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=File:activity-chooser-starred.png&amp;diff=56563</id>
		<title>File:activity-chooser-starred.png</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=File:activity-chooser-starred.png&amp;diff=56563"/>
		<updated>2019-10-28T05:49:41Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Activity chooser starred / favourite tab.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Activity chooser starred / favourite tab.&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=File:activity-chooser-recommend.png&amp;diff=56562</id>
		<title>File:activity-chooser-recommend.png</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=File:activity-chooser-recommend.png&amp;diff=56562"/>
		<updated>2019-10-28T05:49:13Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Activity chooser recommended tab.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Activity chooser recommended tab.&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=File:activity-chooser-info.png&amp;diff=56561</id>
		<title>File:activity-chooser-info.png</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=File:activity-chooser-info.png&amp;diff=56561"/>
		<updated>2019-10-28T05:47:42Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Activity chooser information page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Activity chooser information page.&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Privacy_API&amp;diff=55144</id>
		<title>Privacy API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Privacy_API&amp;diff=55144"/>
		<updated>2018-11-30T01:26:04Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Quick fix to code example.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [https://en.wikipedia.org/wiki/General_Data_Protection_Regulation General Data Protection Regulation] (GDPR) is an EU directive that looks at providing users with more control over their data and how it is processed. This regulation will come into effect on 25th of May 2018 and covers any citizen or permanent resident of the European Union. The directive will be respected by a number of other countries outside of the European Union.&lt;br /&gt;
&lt;br /&gt;
To help institutions become compliant with this new regulation we are adding functionality to Moodle. This includes a number of components, amongst others these include a user’s right to:&lt;br /&gt;
&lt;br /&gt;
* request information on the types of personal data held, the instances of that data, and the deletion policy for each;&lt;br /&gt;
* access all of their data; and&lt;br /&gt;
* be forgotten.&lt;br /&gt;
&lt;br /&gt;
The compliance requirements also extend to installed plugins (including third party plugins). These need to also be able to report what information they store or process regarding users, and have the ability to provide and delete data for a user request.&lt;br /&gt;
&lt;br /&gt;
This document describes the proposed API changes required for plugins which will allow a Moodle installation to become GDPR compliant.&lt;br /&gt;
&lt;br /&gt;
Target Audience: The intended audience for this document is Moodle plugin developers, who are aiming to ensure their plugins are updated to comply with GDPR requirements coming into effect in the EU in May, 2018.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Personal data in Moodle==&lt;br /&gt;
&lt;br /&gt;
From the GDPR Spec, Article 4:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;‘personal data’ means any information relating to an identified or identifiable natural person (‘data subject’); an identifiable natural person is one who can be identified, directly or indirectly, in particular by reference to an identifier such as a name, an identification number, location data, an online identifier or to one or more factors specific to the physical, physiological, genetic, mental, economic, cultural or social identity of that natural person;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In Moodle, we need to consider two main types of personal data; information entered by the user and information stored about the user. The key difference being that information stored about the user will have come from a source other than the user themselves. Both types of data can be used to form a profile of the individual.&lt;br /&gt;
&lt;br /&gt;
The most obvious clue to finding personal data entered by the user is the presence of a userid on a database field. Any data on the record (or linked records) pertaining to that user may be deemed personal data for that user, including things like timestamps and record identification numbers. Additionally, any free text field which allows the user to enter information must also be considered to be the personal data of that user.&lt;br /&gt;
&lt;br /&gt;
Data stored about the user includes things like ratings and comments made on a student submission. These may have been made by an assessor or teacher, but are considered the personal data of the student, as they are considered a reflection of the user’s competency in the subject matter and can be used to form a profile of that individual. &lt;br /&gt;
&lt;br /&gt;
The sections that follow outline what you need to do as a plugin developer to ensure any personal data is advertised and can be accessed and deleted according to the GDPR requirements.&lt;br /&gt;
&lt;br /&gt;
==Background==&lt;br /&gt;
&lt;br /&gt;
===Architecture overview===&lt;br /&gt;
&lt;br /&gt;
[[File:MoodlePrivacyMetadataUML.png|thumb|UML diagram of the metadata part of the privacy subsystem]]&lt;br /&gt;
[[File:MoodlePrivacyRequestUML.png|thumb|UML diagram of the request providers part of the privacy subsystem]]&lt;br /&gt;
&lt;br /&gt;
A new system for Privacy has been created within Moodle. This is broken down into several main parts and forms the &#039;&#039;core_privacy&#039;&#039; subsystem:&lt;br /&gt;
&lt;br /&gt;
* Some metadata providers - a set of PHP interfaces to be implemented by components for that component to describe the kind of data that it stores, and the purpose for its storage;&lt;br /&gt;
* Some request providers - a set of PHP interfaces to be implemented by components to allow that component to act upon user requests such as the Right to be Forgotten, and a Subject Access Request; and&lt;br /&gt;
* A manager - a concrete class used to bridge components which implement the providers with tools which request their data.&lt;br /&gt;
&lt;br /&gt;
All plugins will implement one metadata provider, and zero, one or two request providers.&lt;br /&gt;
&lt;br /&gt;
The &#039;request&#039; providers are responsible for several separate areas:&lt;br /&gt;
&lt;br /&gt;
# Detecting in which Moodle contexts a specific user has any personal data;&lt;br /&gt;
# Exporting all personal data from each of those contexts for that user;&lt;br /&gt;
# Deleting all personal data from each of those contexts for that user;&lt;br /&gt;
# Detecting which users have personal data in a specific Moodle context;&lt;br /&gt;
# Deleting all personal data for each of those users in that context; and&lt;br /&gt;
# Deleting all personal data for all users in a specific context.&lt;br /&gt;
&lt;br /&gt;
The export and delete phases use data from the detection phase, which allows for the possibility to exclude all data from certain contexts, as required.&lt;br /&gt;
&lt;br /&gt;
Please refer to the inline phpdocs of the [https://github.com/moodle/moodle/blob/v3.5.0/privacy/classes/manager.php#L31 core_privacy::manager class] for detailed description of the interfaces, their hierarchy and meaning.&lt;br /&gt;
&lt;br /&gt;
Please note that support for locating and removing multiple users in a single context was added in MDL-62560 for Moodle 3.6, 3.5.3, and 3.4.6.&lt;br /&gt;
This functionality has been added to allow support for removal of user data for users subject to speific role criterion, and to support expiry of the same data by role too.&lt;br /&gt;
&lt;br /&gt;
===Implementing a provider===&lt;br /&gt;
&lt;br /&gt;
All plugins will need to create a concrete class which implements the relevant metadata and request providers. The exact providers you need to implement will depend on what data you store, and the type of plugin. This is covered in more detail in the following sections of the document.&lt;br /&gt;
&lt;br /&gt;
In order to do so:&lt;br /&gt;
&lt;br /&gt;
# You must create a class called &#039;&#039;provider&#039;&#039; within the namespace &#039;&#039;\your_pluginname\privacy&#039;&#039;.&lt;br /&gt;
# This class must be created at &#039;&#039;path/to/your/plugin/classes/privacy/provider.php&#039;&#039;.&lt;br /&gt;
# You must have your class implement the relevant metadata and request interfaces.&lt;br /&gt;
&lt;br /&gt;
==Plugins which do not store personal data==&lt;br /&gt;
&lt;br /&gt;
Many Moodle plugins do not store any personal data. This is usually the case for plugins which just add functionality, or which display the data already stored elsewhere in Moodle.&lt;br /&gt;
&lt;br /&gt;
Some examples of plugin types which might fit this criteria include themes, blocks, filters, editor plugins, etc.&lt;br /&gt;
&lt;br /&gt;
Plugins which cause data to be stored elsewhere in Moodle (e.g. via a subsystem call) are considered to store data.&lt;br /&gt;
&lt;br /&gt;
One examples of a plugin which does not store any data would be the Calendar month block which just displays a view of the user’s calendar. It does not store any data itself.&lt;br /&gt;
&lt;br /&gt;
An example of a plugin which must not use the null provider is the Comments block. The comments block is responsible for data subsequently being stored within Moodle. Although the block doesn’t store anything itself, it interacts with the comments subsystem and is the only component which knows how that data maps to a user.&lt;br /&gt;
&lt;br /&gt;
===Implementation requirements===&lt;br /&gt;
&lt;br /&gt;
In order to let Moodle know that you have audited your plugin, and that you do not store any personal user data, you must implement the &#039;&#039;\core_privacy\local\metadata\null_provider&#039;&#039; interface in your plugin’s provider.&lt;br /&gt;
&lt;br /&gt;
These null providers can only be implemented where a plugin has:&lt;br /&gt;
&lt;br /&gt;
* no external links (e.g. sends data to an external service like an LTI provider, repository plugin which you can search on)&lt;br /&gt;
* no database tables which store user data (including IP addresses)&lt;br /&gt;
* no user preferences&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;null_provider&#039;&#039; requires you to define one function &#039;&#039;get_reason()&#039;&#039; which returns the language string identifier within your component.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;blocks/calendar_month/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace block_calendar_month\privacy;&lt;br /&gt;
&lt;br /&gt;
class provider implements&lt;br /&gt;
    // This plugin does not store any personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\null_provider {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the language string identifier with the component&#039;s language&lt;br /&gt;
     * file to explain why this plugin stores no data.&lt;br /&gt;
     *&lt;br /&gt;
     * @return  string&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_reason() : string {&lt;br /&gt;
        return &#039;privacy:metadata&#039;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;blocks/calendar_month/lang/en/block_calendar_month.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
$string[&#039;privacy:metadata&#039;] = &#039;The Calendar block only displays existing calendar data.&#039;;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That’s it. Congratulations, your plugin now implements the Privacy API.&lt;br /&gt;
&lt;br /&gt;
==Plugins which store personal data==&lt;br /&gt;
&lt;br /&gt;
Many Moodle plugins do store some form of personal data.&lt;br /&gt;
&lt;br /&gt;
In some cases this will be stored within database tables in your plugin, and in other cases this will be in one of Moodle’s core subsystems - for example your plugin may store files, ratings, comments, or tags.&lt;br /&gt;
&lt;br /&gt;
Plugins which do store data will need to:&lt;br /&gt;
&lt;br /&gt;
* Describe the type of data that they store;&lt;br /&gt;
* Provide a way to export that data; and&lt;br /&gt;
* Provide a way to delete that data.&lt;br /&gt;
&lt;br /&gt;
Data is described via a &#039;&#039;metadata&#039;&#039; provider, and it is both exported and deleted via an implementation of a &#039;&#039;request&#039;&#039; provider.&lt;br /&gt;
&lt;br /&gt;
These are both explained in the sections below.&lt;br /&gt;
&lt;br /&gt;
===Describing the type of data you store===&lt;br /&gt;
&lt;br /&gt;
In order to describe the type of data that you store, you must implement the &#039;&#039;\core_privacy\local\metadata\provider&#039;&#039; interface.&lt;br /&gt;
&lt;br /&gt;
This interfaces requires that you define one function: &#039;&#039;get_metadata&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
There are several types of item to describe the data that you store. These are for:&lt;br /&gt;
&lt;br /&gt;
* Items in the Moodle database;&lt;br /&gt;
* Items stored by you in a Moodle subsystem - for example files, and ratings; and&lt;br /&gt;
* User preferences stored site-wide within Moodle for your plugin&lt;br /&gt;
&lt;br /&gt;
Note: All fields should include a description from a language string within your plugin.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace mod_forum\privacy;&lt;br /&gt;
use core_privacy\local\metadata\collection;&lt;br /&gt;
&lt;br /&gt;
class provider implements &lt;br /&gt;
        // This plugin does store personal user data.&lt;br /&gt;
        \core_privacy\local\metadata\provider {&lt;br /&gt;
&lt;br /&gt;
    public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
        // Here you will add more items into the collection.&lt;br /&gt;
&lt;br /&gt;
        return $collection;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you store content in a Moodle subsystem====&lt;br /&gt;
&lt;br /&gt;
Many plugins will use one of the core Moodle subsystems to store data.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer we do not expect you to describe those subsystems in detail, but we do need to know that you use them and to know what you use them for.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;add_subsystem_link()&#039;&#039; method on the &#039;&#039;collection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=====Relevant subsystems=====&lt;br /&gt;
&lt;br /&gt;
You are likely to need to indicate use of the following subsystems that store user data:&lt;br /&gt;
&lt;br /&gt;
* Ratings (if users are allowed to rate items within your plugin)&lt;br /&gt;
* Tags (if users can tag items within your plugin)&lt;br /&gt;
* Comments (if users can make comments on items in your plugin)&lt;br /&gt;
* Questions (if the plugin uses core question types)&lt;br /&gt;
* Filesystem (if users can attach files to items within your plugin)&lt;br /&gt;
* ...?&lt;br /&gt;
&lt;br /&gt;
Some subsystems which store user data do not need to be listed:&lt;br /&gt;
&lt;br /&gt;
* (TBC - how about global search? Nothing lists it that I could see.)&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;add_subsystem_link(&lt;br /&gt;
        &#039;core_files&#039;,&lt;br /&gt;
        [],&lt;br /&gt;
        &#039;privacy:metadata:core_files&#039;&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/lang/en/forum.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:core_files&#039;] = &#039;The forum stores files which have been uploaded by the user to form part of a forum post.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Describing data stored in database tables====&lt;br /&gt;
&lt;br /&gt;
Most Moodle plugins will store some form of user data in their own database tables.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer you will need to describe each database table, and each field which includes user data.&lt;br /&gt;
&lt;br /&gt;
It is a matter of judgement which fields contain user data and which don&#039;t. Anything entered by, or directly about, the user probably counts as user data but it may be useful to include additional fields that explain the context of the data.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;add_database_table(&lt;br /&gt;
        &#039;forum_discussion_subs&#039;,&lt;br /&gt;
         [&lt;br /&gt;
            &#039;userid&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:userid&#039;,&lt;br /&gt;
            &#039;discussionid&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:discussionid&#039;,&lt;br /&gt;
            &#039;preference&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:preference&#039;,&lt;br /&gt;
&lt;br /&gt;
         ],&lt;br /&gt;
        &#039;privacy:metadata:forum_discussion_subs&#039;&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/lang/en/forum.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs&#039;] = &#039;Information about the subscriptions to individual forum discussions. This includes when a user has chosen to subscribe to a discussion, or to unsubscribe from one where they would otherwise be subscribed.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:userid&#039;] = &#039;The ID of the user with this subscription preference.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:discussionid&#039;] = &#039;The ID of the discussion that was subscribed to.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:preference&#039;] = &#039;The start time of the subscription.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you store site-wide user preferences====&lt;br /&gt;
&lt;br /&gt;
Many plugins will include one or more user preferences. Unfortunately this is one of Moodle’s older components and many of the values stored are not pure user preferences. Each plugin should be aware of how it handles its own preferences and is best placed to determine whether they are site-wide preferences, or per-instance preferences.&lt;br /&gt;
&lt;br /&gt;
Whilst most of these will have a fixed name (e.g. &#039;&#039;filepicker_recentrepository&#039;&#039;), some will include a variable of some kind (e.g. &#039;&#039;tool_usertours_tour_completion_time_2&#039;&#039;). Only the general name (in this case &amp;quot;tool_usertours_tour_completion_time_&amp;quot;) needs to be indicated, rather than one copy for each possible value of the variable.&lt;br /&gt;
&lt;br /&gt;
Also, these should only be &#039;&#039;site-wide&#039;&#039; user preferences which do not belong to a specific Moodle context.&lt;br /&gt;
&lt;br /&gt;
In the above examples:&lt;br /&gt;
&lt;br /&gt;
* Preference &#039;&#039;filepicker_recentrepository&#039;&#039; belongs to the file subsystem, and is a site-wide preference affecting the user anywhere that they view the filepicker.&lt;br /&gt;
* Preference &#039;&#039;tool_usertours_tour_completion_time_2&#039;&#039; belongs to user tours. User tours are a site-wide feature which can affect many parts of Moodle and cross multiple contexts.&lt;br /&gt;
&lt;br /&gt;
In some cases a value may be stored in the preferences table but is known to belong to a specific context within Moodle. In these cases they should be stored as metadata against that context rather than as a site-wide user preference.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;add_user_preference()&#039;&#039; method on the &#039;&#039;collection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any plugin providing user preferences must also implement the &#039;&#039;\core_privacy\local\request\preference_provider&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;admin/tool/usertours/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;add_user_preference(&#039;tool_usertours_tour_completion_time&#039;,&lt;br /&gt;
        &#039;privacy:metadata:preference:tool_usertours_tour_completion_time&#039;);&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;admin/tool/usertours/lang/en/tool_usertours.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:tool_usertours_tour_completion_time&#039;] = &#039;The time that a specific user tour was last completed by a user.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you export data to an external location====&lt;br /&gt;
&lt;br /&gt;
Many plugins will interact with external systems - for example cloud-based services. Often this external location is configurable within the plugin either at the site or the instance level.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer you will need to describe each &#039;&#039;type&#039;&#039; of target destination, alongside a list of each exported field which includes user data.&lt;br /&gt;
The &#039;&#039;actual&#039;&#039; destination does not need to be described as this can change based on configuration.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;add_external_location_link()&#039;&#039; method on the collection.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/lti/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;add_external_location_link(&#039;lti_client&#039;, [&lt;br /&gt;
            &#039;userid&#039; =&amp;gt; &#039;privacy:metadata:lti_client:userid&#039;,&lt;br /&gt;
            &#039;fullname&#039; =&amp;gt; &#039;privacy:metadata:lti_client:fullname&#039;,&lt;br /&gt;
        ], &#039;privacy:metadata:lti_client&#039;);&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/lti/lang/en/lti.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client&#039;] = &#039;In order to integrate with a remote LTI service, user data needs to be exchanged with that service.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client:userid&#039;] = &#039;The userid is sent from Moodle to allow you to access your data on the remote system.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client:fullname&#039;] = &#039;Your full name is sent to the remote system to allow a better user experience.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Providing a way to export user data===&lt;br /&gt;
&lt;br /&gt;
In order to export the user data that you store, you must implement the relevant request provider.&lt;br /&gt;
&lt;br /&gt;
We have named these request providers because they are called in response to a specific request from a user to access their information, however they also deal with the removal of user data following it&#039;s expiry.&lt;br /&gt;
&lt;br /&gt;
There are several different types of request provider, and you may need to implement several of these, depending on the type and nature of your plugin.&lt;br /&gt;
&lt;br /&gt;
Broadly speaking plugins will fit into one of the following categories:&lt;br /&gt;
&lt;br /&gt;
* Plugins which are a subplugin of another plugin. Examples include &#039;&#039;assignsubmission&#039;&#039;, &#039;&#039;atto&#039;&#039;, and &#039;&#039;datafield&#039;&#039;;&lt;br /&gt;
* Plugins which are typically called by a Moodle subsystem. Examples include &#039;&#039;qtype&#039;&#039;, and &#039;&#039;profilefield&#039;&#039;;&lt;br /&gt;
* All other plugins which store data.&lt;br /&gt;
&lt;br /&gt;
Most plugins will fit into this final category, whilst other plugins may fall into several categories.&lt;br /&gt;
Plugins which &#039;&#039;define&#039;&#039; a subplugin will also be responsible for  collecting this data from their subplugins.&lt;br /&gt;
&lt;br /&gt;
A final category exists - plugins which store user preferences. In some cases this may be the &#039;&#039;only&#039;&#039; provider implemented.&lt;br /&gt;
&lt;br /&gt;
====Standard plugins which store data====&lt;br /&gt;
&lt;br /&gt;
A majority of Moodle plugins will fit into this category and will be required to implement the &#039;&#039;\core_privacy\local\request\plugin\provider&#039;&#039; interface. This interface requires that you define four functions (the first two of which are dealt with in this section):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;get_contexts_for_userid&#039;&#039; - to explain where data is held within Moodle for your plugin; and&lt;br /&gt;
* &#039;&#039;export_user_data&#039;&#039; - to export a user’s personal data from your plugin.&lt;br /&gt;
* &#039;&#039;delete_data_for_all_users_in_context&#039;&#039; - to delete all data for all users in the specified context.&lt;br /&gt;
* &#039;&#039;delete_data_for_user&#039;&#039; - to delete all user data for the specified user, in the specified contexts.&lt;br /&gt;
&lt;br /&gt;
These APIs make use of the Moodle &#039;&#039;context&#039;&#039; system to hierarchically store this data.&lt;br /&gt;
&lt;br /&gt;
In addition to these requirements, since Moodle 3.4.6, 3.5.3, any plugin which implements the plugin provider interface must also implement the &#039;&#039;\core_privacy\local\request\core_userlist_provider&#039;&#039; provider and implement functions:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;get_users_in_context&#039;&#039; - to locate the users who hold any personal data in a specific context; and&lt;br /&gt;
* &#039;&#039;delete_data_for_users&#039;&#039; - to delete data for multiple users in the specified context.&lt;br /&gt;
&lt;br /&gt;
A polyfill has not been provided for this new interface, but we recognise that developers who are maintaining older versions (Moodle 3.3) will hit problems with this new interface not existing. We recommend doing something similar to the following example.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace assignsubmission_example\privacy;&lt;br /&gt;
&lt;br /&gt;
if (interface_exists(&#039;\core_privacy\local\request\userlist&#039;)) {&lt;br /&gt;
    interface my_userlist extends \core_privacy\local\request\userlist{}&lt;br /&gt;
} else {&lt;br /&gt;
    interface my_userlist {};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class provider implements my_userlist {&lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * Get the list of users who have data within a context.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   userlist    $userlist   The userlist containing the list of users who have data in this context/plugin combination.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_users_in_context(userlist $userlist) {&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Delete multiple users within a single context.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   approved_userlist       $userlist The approved context and user information to delete information for.&lt;br /&gt;
     */&lt;br /&gt;
    public static function delete_data_for_users(approved_userlist $userlist) {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Retrieving the list of contexts=====&lt;br /&gt;
&lt;br /&gt;
You are required to return the list of contexts for which the plugin stores data about the user. These are the standard Moodle contexts - CONTEXT_COURSE, CONTEXT_USER, CONTEXT_MODULE and so on. In many cases the link between the module type and the context is self-evident (e.g. activity modules). In some cases it may be less so. For example, an enrolment plugin (that stores user data, which most don&#039;t) would link to course context (users enrol in courses). Other types of plugins may be less obvious but you need to pick something. One way might to consider what context you would use when checking role capabilities. Consider that this will be used to structure the exported data and define what data is deleted when a context is expired. &lt;br /&gt;
&lt;br /&gt;
Contexts are retrieved using the &#039;&#039;get_contexts_for_userid&#039;&#039; function which takes the ID of the user being fetched, and returns a list of contexts in which the user has any data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_contexts_for_userid(int $userid) : contextlist {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The function returns a &#039;&#039;\core_privacy\local\request\contextlist&#039;&#039; which is used to keep a set of contexts together in a fixed fashion.&lt;br /&gt;
&lt;br /&gt;
Because a Subject Access Request covers &#039;&#039;every&#039;&#039; piece of data that is held for a user within Moodle, efficiency and performance is highly important. As a result, contexts are added to the &#039;&#039;contextlist&#039;&#039; by defining one or more SQL queries which return just the contextid. Multiple SQL queries can be added as required. &lt;br /&gt;
&lt;br /&gt;
Many plugins will interact with specific subsystems and store data within them.&lt;br /&gt;
These subsystems will also provide a way in which to link the data that you have stored with your own database tables.&lt;br /&gt;
At present these are still a work in progress and only the &#039;&#039;core_ratings&#039;&#039; subsystem includes this.&lt;br /&gt;
&lt;br /&gt;
======Basic example======&lt;br /&gt;
&lt;br /&gt;
The following example simply fetches the contextid for all forums where a user has a single discussion (note: this is an incomplete example):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_contexts_for_userid(int $userid) : contextlist {&lt;br /&gt;
        $contextlist = new \core_privacy\local\request\contextlist();&lt;br /&gt;
&lt;br /&gt;
        $sql = &amp;quot;SELECT c.id&lt;br /&gt;
                 FROM {context} c&lt;br /&gt;
           INNER JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel&lt;br /&gt;
           INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname&lt;br /&gt;
           INNER JOIN {forum} f ON f.id = cm.instance&lt;br /&gt;
            LEFT JOIN {forum_discussions} d ON d.forum = f.id&lt;br /&gt;
                WHERE (&lt;br /&gt;
                d.userid        = :discussionuserid&lt;br /&gt;
                )&lt;br /&gt;
        &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        $params = [&lt;br /&gt;
            &#039;modname&#039;           =&amp;gt; &#039;forum&#039;,&lt;br /&gt;
            &#039;contextlevel&#039;      =&amp;gt; CONTEXT_MODULE,&lt;br /&gt;
            &#039;discussionuserid&#039;  =&amp;gt; $userid,&lt;br /&gt;
        ];&lt;br /&gt;
&lt;br /&gt;
        $contextlist-&amp;gt;add_from_sql($sql, $params);&lt;br /&gt;
&lt;br /&gt;
        return $contextlist;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======More complete example======&lt;br /&gt;
&lt;br /&gt;
The following example includes a link to core_rating. &lt;br /&gt;
It will find any forum, forum discussion, or forum post where the user has any data, including:&lt;br /&gt;
&lt;br /&gt;
* Per-forum digest preferences;&lt;br /&gt;
* Per-forum subscription preferences;&lt;br /&gt;
* Per-forum read tracking preferences;&lt;br /&gt;
* Per-discussion subscription preferences;&lt;br /&gt;
* Per-post read data (if a user has read a post or not); and&lt;br /&gt;
* Per-post rating data.&lt;br /&gt;
&lt;br /&gt;
In the case of the rating data, this will include any post where the user has rated the post of another user.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   int           $userid       The user to search.&lt;br /&gt;
 * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
 */&lt;br /&gt;
public static function get_contexts_for_userid(int $userid) : contextlist {&lt;br /&gt;
    $ratingsql = \core_rating\privacy\provider::get_sql_join(&#039;rat&#039;, &#039;mod_forum&#039;, &#039;post&#039;, &#039;p.id&#039;, $userid);&lt;br /&gt;
    // Fetch all forum discussions, and forum posts.&lt;br /&gt;
    $sql = &amp;quot;SELECT c.id&lt;br /&gt;
                FROM {context} c&lt;br /&gt;
        INNER JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel&lt;br /&gt;
        INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname&lt;br /&gt;
        INNER JOIN {forum} f ON f.id = cm.instance&lt;br /&gt;
            LEFT JOIN {forum_discussions} d ON d.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_posts} p ON p.discussion = d.id&lt;br /&gt;
            LEFT JOIN {forum_digests} dig ON dig.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_subscriptions} sub ON sub.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_track_prefs} pref ON pref.forumid = f.id&lt;br /&gt;
            LEFT JOIN {forum_read} hasread ON hasread.forumid = f.id&lt;br /&gt;
            LEFT JOIN {forum_discussion_subs} dsub ON dsub.forum = f.id&lt;br /&gt;
            {$ratingsql-&amp;gt;join}&lt;br /&gt;
                WHERE (&lt;br /&gt;
                p.userid        = :postuserid OR&lt;br /&gt;
                d.userid        = :discussionuserid OR&lt;br /&gt;
                dig.userid      = :digestuserid OR&lt;br /&gt;
                sub.userid      = :subuserid OR&lt;br /&gt;
                pref.userid     = :prefuserid OR&lt;br /&gt;
                hasread.userid  = :hasreaduserid OR&lt;br /&gt;
                dsub.userid     = :dsubuserid OR&lt;br /&gt;
                {$ratingsql-&amp;gt;userwhere}&lt;br /&gt;
            )&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    $params = [&lt;br /&gt;
        &#039;modname&#039;           =&amp;gt; &#039;forum&#039;,&lt;br /&gt;
        &#039;contextlevel&#039;      =&amp;gt; CONTEXT_MODULE,&lt;br /&gt;
        &#039;postuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
        &#039;discussionuserid&#039;  =&amp;gt; $userid,&lt;br /&gt;
        &#039;digestuserid&#039;      =&amp;gt; $userid,&lt;br /&gt;
        &#039;subuserid&#039;         =&amp;gt; $userid,&lt;br /&gt;
        &#039;prefuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
        &#039;hasreaduserid&#039;     =&amp;gt; $userid,&lt;br /&gt;
        &#039;dsubuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
    ];&lt;br /&gt;
    $params += $ratingsql-&amp;gt;params;&lt;br /&gt;
&lt;br /&gt;
    $contextlist = new \core_privacy\local\request\contextlist();&lt;br /&gt;
    $contextlist-&amp;gt;add_from_sql($sql, $params);&lt;br /&gt;
&lt;br /&gt;
    return $contextlist;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Retrieving the users in a context=====&lt;br /&gt;
&lt;br /&gt;
You are required to return the list of users holding personal data in a context for which the plugin stores data about the user.&lt;br /&gt;
This method is very similar to the &#039;&#039;get_contexts_for_userid&#039;&#039; function but has some important distinctions:&lt;br /&gt;
&lt;br /&gt;
* It takes a &#039;&#039;userlist&#039;&#039; as an argument and does not require that you, as a developer, create it yourself;&lt;br /&gt;
* There is no need to return any value; and&lt;br /&gt;
* The argument for the &#039;&#039;userlist::add_from_sql&#039;&#039; are different to those for &#039;&#039;contextlist::add_from_sql&#039;&#039; (this is because we learnt some important lessons after the initial implementation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Get the list of users who have data within a context.&lt;br /&gt;
 *&lt;br /&gt;
 * @param userlist $userlist The userlist containing the list of users who have data in this context/plugin combination.&lt;br /&gt;
 */&lt;br /&gt;
public static function get_users_in_context(userlist $userlist) {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Basic example======&lt;br /&gt;
&lt;br /&gt;
The following example simply fetches the userid for all users in a given forum context, who created a discussion or a post in that forum (note: this is an incomplete example):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Get the list of users who have data within a context.&lt;br /&gt;
 *&lt;br /&gt;
 * @param userlist $userlist The userlist containing the list of users who have data in this context/plugin combination.&lt;br /&gt;
 */&lt;br /&gt;
public static function get_users_in_context(userlist $userlist) {&lt;br /&gt;
&lt;br /&gt;
    $context = $userlist-&amp;gt;get_context();&lt;br /&gt;
&lt;br /&gt;
    if (!$context instanceof \context_module) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $params = [&lt;br /&gt;
        &#039;instanceid&#039;    =&amp;gt; $context-&amp;gt;instanceid,&lt;br /&gt;
        &#039;modulename&#039;    =&amp;gt; &#039;forum&#039;,&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    // Discussion authors.&lt;br /&gt;
    $sql = &amp;quot;SELECT d.userid&lt;br /&gt;
              FROM {course_modules} cm&lt;br /&gt;
              JOIN {modules} m ON m.id = cm.module AND m.name = :modulename&lt;br /&gt;
              JOIN {forum} f ON f.id = cm.instance&lt;br /&gt;
              JOIN {forum_discussions} d ON d.forum = f.id&lt;br /&gt;
             WHERE cm.id = :instanceid&amp;quot;;&lt;br /&gt;
    $userlist-&amp;gt;add_from_sql(&#039;userid&#039;, $sql, $params);&lt;br /&gt;
&lt;br /&gt;
     // Forum authors.&lt;br /&gt;
    $sql = &amp;quot;SELECT p.userid&lt;br /&gt;
              FROM {course_modules} cm&lt;br /&gt;
              JOIN {modules} m ON m.id = cm.module AND m.name = :modulename&lt;br /&gt;
              JOIN {forum} f ON f.id = cm.instance&lt;br /&gt;
              JOIN {forum_discussions} d ON d.forum = f.id&lt;br /&gt;
              JOIN {forum_posts} p ON d.id = p.discussion&lt;br /&gt;
             WHERE cm.id = :instanceid&amp;quot;;&lt;br /&gt;
    $userlist-&amp;gt;add_from_sql(&#039;userid&#039;, $sql, $params);&lt;br /&gt;
&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Exporting user data=====&lt;br /&gt;
&lt;br /&gt;
After determining where in Moodle your plugin holds data about a user, the &#039;&#039;\core_privacy\manager&#039;&#039; will then ask your plugin to export all user data for a subset of those locations.&lt;br /&gt;
&lt;br /&gt;
This is achieved through use of the &#039;&#039;export_user_data&#039;&#039; function which takes the list of approved contexts in a &#039;&#039;\core_privacy\local\request\approved_contextlist&#039;&#039; object.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Export all user data for the specified user, in the specified contexts, using the supplied exporter instance.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   approved_contextlist    $contextlist    The approved contexts to export information for.&lt;br /&gt;
 */&lt;br /&gt;
public static function export_user_data(approved_contextlist $contextlist) {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;approved_contextlist&#039;&#039; includes both the user record, and a list of contexts, which can be retrieved by either processing it as an Iterator, or by calling &#039;&#039;get_contextids()&#039;&#039; or &#039;&#039;get_contexts()&#039;&#039; as required.&lt;br /&gt;
&lt;br /&gt;
Data is exported using a &#039;&#039;\core_privacy\local\request\content_writer&#039;&#039;, which is described in further detail below.&lt;br /&gt;
&lt;br /&gt;
====Plugins which store user preferences====&lt;br /&gt;
&lt;br /&gt;
Many plugins store a variety of user preferences, and must therefore export them.&lt;br /&gt;
&lt;br /&gt;
Since user preferences are a site-wide preference, these are exported separately to other user data.&lt;br /&gt;
In some cases the only data present is user preference data, whilst in others there is a combination of user-provided data, and user preferences.&lt;br /&gt;
&lt;br /&gt;
Storing of user preferences is achieved through implementation of the &#039;&#039;\core_privacy\local\request\user_preference_provider&#039;&#039; interface which defines one required function -- &#039;&#039;export_user_preferences&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
You need to provide a description of the value of the user preference. (This description is particularly useful in cases where the value might be, say, 3, but it actually means &#039;Alphabetical order&#039;.) Most likely you can use an existing language string from your plugin.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Export all user preferences for the plugin.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   int         $userid The userid of the user whose data is to be exported.&lt;br /&gt;
 */&lt;br /&gt;
public static function export_user_preferences(int $userid) {&lt;br /&gt;
    $markasreadonnotification = get_user_preference(&#039;markasreadonnotification&#039;, null, $userid);&lt;br /&gt;
    if (null !== $markasreadonnotification) {&lt;br /&gt;
        switch ($markasreadonnotification) {&lt;br /&gt;
            case 0:&lt;br /&gt;
                $markasreadonnotificationdescription = get_string(&#039;markasreadonnotificationno&#039;, &#039;mod_forum&#039;);&lt;br /&gt;
                break;&lt;br /&gt;
            case 1:&lt;br /&gt;
            default:&lt;br /&gt;
                $markasreadonnotificationdescription = get_string(&#039;markasreadonnotificationyes&#039;, &#039;mod_forum&#039;);&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
        writer::export_user_preference(&#039;mod_forum&#039;, &#039;markasreadonnotification&#039;, $markasreadonnotification, $markasreadonnotificationdescription);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Plugins which can have own subplugins ====&lt;br /&gt;
&lt;br /&gt;
Many plugin types are also able to define their own subplugins and will need to define a contract between themselves and their subplugins in order to fetch their data.&lt;br /&gt;
&lt;br /&gt;
This is required as the parent plugin and the child subplugin should be separate entities and the parent plugin must be able to function if one or more of its subplugins are uninstalled.&lt;br /&gt;
&lt;br /&gt;
The parent plugin is responsible for defining the contract,  and for interacting with its subplugins, though we intend to create helpers to make this easier.&lt;br /&gt;
&lt;br /&gt;
The parent plugin should define a new interface for each type of subplugin that it defines. This interface should extend the &#039;&#039;\core_privacy\local\request\plugin\subplugin_provider&#039;&#039; interface.&lt;br /&gt;
&lt;br /&gt;
===== When a parent plugin should and should not provide the interface for its subplugins =====&lt;br /&gt;
&lt;br /&gt;
There can be cases when there is no point for a plugin to provide the &amp;quot;subplugin_provider&amp;quot; based interface, even if it has own subplugins. See the Atto or TinyMCE editors as real examples.&lt;br /&gt;
&lt;br /&gt;
If the parent plugin has no data passed through to the subplugins, there is no benefit in defining a subplugin provider. For example, Atto subplugins are just used to enhance the functionality and they never receive anything like a context. Most of the time we need to define a subplugin provider, but in cases where there is no data passed from the plugin to its subplugins, there is no need to define the subplugin provider. If the subplugins still do store personal data that are not related to the parent plugin in any way, then subplugins should define their own standard provider.&lt;br /&gt;
&lt;br /&gt;
Compare with something like mod_assign where the subplugins store data for the parent and that data is contextually relevant to the parent plugin. In those cases the subplugin stores data for the plugin and it only makes sense to do so in the context of its parent plugin.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
The following example defines the contract that assign submission subplugins may be required to implement.&lt;br /&gt;
&lt;br /&gt;
The assignment module is responsible for returning the contexts of all assignments where a user has data, but in some cases it is unaware of all of those cases - for example if a Teacher comments on a student submission it may not be aware of these as the information about this interaction may not be stored within its own tables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/assign/privacy/assignsubmission_provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace mod_assign\privacy;&lt;br /&gt;
use \core_privacy\local\metadata\collection;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
interface assignsubmission_provider extends&lt;br /&gt;
    // This Interface defines a subplugin.&lt;br /&gt;
    \core_privacy\local\request\plugin\subplugin_provider {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the SQL required to find all submission items where this user has had any involvements. &lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  \stdClass                   Object containing the join, params, and where used to select a these records from the database.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_items_with_user_interaction(int $userid) : \stdClass ;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Export all relevant user submissions information which match the combination of userid and attemptid.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @param   \context      $context      The context to export this submission against.&lt;br /&gt;
     * @param   array         $subcontext   The subcontext within the context to export this information&lt;br /&gt;
     * @param   int           $attid        The id of the submission to export.&lt;br /&gt;
     */&lt;br /&gt;
    public static function export_user_submissions(int $userid, \context $context, array $subcontext, int $attid) ;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Plugins which are subplugins to another plugin====&lt;br /&gt;
&lt;br /&gt;
If you are developing a sub-plugin of another plugin, then you will have to look at the relevant plugin in order to determine the exact contract.&lt;br /&gt;
&lt;br /&gt;
Each subplugin type should define a new interface which extends the &#039;&#039;\core_privacy\local\request\plugin\subplugin_provider&#039;&#039; interface and it is up to the parent plugin to define how they will interact with their children.&lt;br /&gt;
&lt;br /&gt;
The principles remain the same, but the exact implementation will differ depending upon requirements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/pluginname/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
namespace assignsubmission\onlinetext;&lt;br /&gt;
&lt;br /&gt;
class provider implements&lt;br /&gt;
    // This plugin does store personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
&lt;br /&gt;
    // This plugin is a subplugin of assign and must meet that contract.&lt;br /&gt;
    \mod_assign\privacy\assignsubmission_provider {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Plugins which are typically called by a Moodle subsystem====&lt;br /&gt;
&lt;br /&gt;
There are a number of plugintypes in Moodle which are typically called by a specific Moodle subsystem.&lt;br /&gt;
&lt;br /&gt;
Some of these are &#039;&#039;only&#039;&#039; called by that subsystem, for example plugins which are of the &#039;&#039;plagiarism&#039;&#039; plugintype should never be called directly, but are always invoked via the &#039;&#039;core_plagiarism&#039;&#039; subsystem.&lt;br /&gt;
&lt;br /&gt;
Conversely, there maybe other plugintypes which can be called both via a subsystem, and in some other fashion. We are still determining whether any plugintypes currently fit this pattern.&lt;br /&gt;
&lt;br /&gt;
If you are developing a plugin which belongs to a specific subsystem, then you will have to look at the relevant plugin in order to determine the exact contract.&lt;br /&gt;
&lt;br /&gt;
Each subsystem will define a new interface which extends the &#039;&#039;\core_privacy\local\request\plugin\subsystem_provider&#039;&#039; interface and it is up to that subsystem to define how they will interact with those plugins.&lt;br /&gt;
&lt;br /&gt;
The principles remain the same, but the exact implementation will differ depending upon requirements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;plagiarism/detectorator/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
namespace plagiarism_detectorator\privacy;&lt;br /&gt;
&lt;br /&gt;
class provider implements&lt;br /&gt;
    // This plugin does export personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
&lt;br /&gt;
    // This plugin is always linked against another activity module via the Plagiarism API.&lt;br /&gt;
    \core_plagiarism\privacy\plugin_provider {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exporting data====&lt;br /&gt;
&lt;br /&gt;
Any plugin which stores data must also export it.&lt;br /&gt;
&lt;br /&gt;
To cater for this the privacy API includes a &#039;&#039;\core_privacy\local\request\content_writer&#039;&#039;, which defines a set of functions to store different types of data.&lt;br /&gt;
&lt;br /&gt;
Broadly speaking data is broken into the following types:&lt;br /&gt;
&lt;br /&gt;
* Data - this is the object being described. For example the post content in a forum post;&lt;br /&gt;
* Related data - this is data related to the object being stored. For example, ratings of a forum post;&lt;br /&gt;
* Metadata - This is metadata about the main object. For example whether you are subscribed to a forum discussion;&lt;br /&gt;
* User preferences - this is data about a site-wide preference;&lt;br /&gt;
* Files - Any files that you are stored within Moodle on behalf of this plugin; and&lt;br /&gt;
* Custom files - For custom file formats - e.g. a calendar feed for calendar data. These should be used sparingly.&lt;br /&gt;
&lt;br /&gt;
Each piece of data is stored against a specific Moodle &#039;&#039;context&#039;&#039;, which will define how the data is structured within the exporter.&lt;br /&gt;
Data, and Related data only accept the &#039;&#039;stdClass&#039;&#039; object, whilst metadata should be stored as a set of key/value pairs which include a description.&lt;br /&gt;
&lt;br /&gt;
In some cases the data being stored belongs within an implicit structure. For example, one forum has many forum discussions, which each have a number of forum posts. This structure is represented by an &#039;&#039;array&#039;&#039; referred to as a &#039;&#039;subcontext&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;content_writer&#039;&#039; must &#039;&#039;always&#039;&#039; be called with a specific context, and can be called as follows:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
use \core_privacy\local\request\writer;&lt;br /&gt;
&lt;br /&gt;
writer::with_context($context)&lt;br /&gt;
    -&amp;gt;export_data($subcontext, $post)&lt;br /&gt;
    -&amp;gt;export_area_files($subcontext, &#039;mod_forum&#039;, &#039;post&#039;, $post-&amp;gt;id)&lt;br /&gt;
    -&amp;gt;export_metadata($subcontext, &#039;postread&#039;, (object) [&#039;firstread&#039; =&amp;gt; $firstread], new \lang_string(&#039;privacy:export:post:postread&#039;));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any text field which supports Moodle files must also be rewritten:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
use \core_privacy\local\request\writer;&lt;br /&gt;
&lt;br /&gt;
$post-&amp;gt;message = writer::with_context($context)&lt;br /&gt;
    -&amp;gt;rewrite_pluginfile_urls($subcontext, &#039;mod_forum&#039;, &#039;post&#039;, $post-&amp;gt;id, $post-&amp;gt;message);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Providing a way to delete user data===&lt;br /&gt;
&lt;br /&gt;
Deleting user data is also implemented in the request interface. There are two methods that need to be created. The first one to remove all user data from a context, the other to remove user data for a specific user in a list of contexts.&lt;br /&gt;
&lt;br /&gt;
====Delete for a context====&lt;br /&gt;
&lt;br /&gt;
A context is given and all user data (for all users) is to be deleted from the plugin. This will be called when the retention period for the context has expired to adhere to the privacy by design requirement. Retention periods are set in the Data registry.&lt;br /&gt;
&lt;br /&gt;
Note that this will be called for &#039;&#039;&#039;any&#039;&#039;&#039; context being expired, not only those the plugin holds data for (as returned by get_contexts_for_userid()), so you must carefully check the contexts given.&lt;br /&gt;
&lt;br /&gt;
When expiring content for a high-level context such as a course context, the function will be called not only with the course context but also with each context within the course: each module context, each block context, etc. At each level you should only expire data specifically related to that exact context. For a module plugin, this generally means you should only take action for CONTEXT_MODULE contexts and only if they relate to an instance of your module, as shown in the following example. (In the rare case where your module also stores user data related to the course, and not just for a module instance, then you do need to implement CONTEXT_COURSE level contexts to expire that course-level data.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Delete all personal data for all users in the specified context.&lt;br /&gt;
 *&lt;br /&gt;
 * @param context $context Context to delete data from.&lt;br /&gt;
 */&lt;br /&gt;
public static function delete_data_for_all_users_in_context(\context $context) {&lt;br /&gt;
    global $DB;&lt;br /&gt;
&lt;br /&gt;
    if ($context-&amp;gt;contextlevel != CONTEXT_MODULE) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $cm = get_coursemodule_from_id(&#039;choice&#039;, $context-&amp;gt;instanceid);&lt;br /&gt;
    if (!$cm) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $DB-&amp;gt;delete_records(&#039;choice_answers&#039;, [&#039;choiceid&#039; =&amp;gt; $cm-&amp;gt;instance]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Delete personal information for a specific user and context(s)====&lt;br /&gt;
&lt;br /&gt;
An &#039;&#039;approved_contextlist&#039;&#039; is given and user data related to that user should either be completely deleted, or overwritten if a structure needs to be maintained. This will be called when a user has requested the right to be forgotten. All attempts should be made to delete this data where practical while still allowing the plugin to be used by other users.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/choice/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function delete_data_for_user(approved_contextlist $contextlist) {&lt;br /&gt;
    global $DB;&lt;br /&gt;
    &lt;br /&gt;
    if (empty($contextlist-&amp;gt;count())) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    $userid = $contextlist-&amp;gt;get_user()-&amp;gt;id;&lt;br /&gt;
    foreach ($contextlist-&amp;gt;get_contexts() as $context) {&lt;br /&gt;
        $instanceid = $DB-&amp;gt;get_field(&#039;course_modules&#039;, &#039;instance&#039;, [&#039;id&#039; =&amp;gt; $context-&amp;gt;instanceid], MUST_EXIST);&lt;br /&gt;
        $DB-&amp;gt;delete_records(&#039;choice_answers&#039;, [&#039;choiceid&#039; =&amp;gt; $instanceid, &#039;userid&#039; =&amp;gt; $userid]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Delete personal information for several users in a specific context====&lt;br /&gt;
&lt;br /&gt;
An &#039;&#039;approved_userlist&#039;&#039; is given and user data related to all users in the specified context should either be completely deleted, or overwritten if a structure needs to be maintained. This will be called when a user has requested the right to be forgotten when per-role overrides exist, or when performing a per-role expiry of a context. All attempts should be made to delete this data where practical while still allowing the plugin to be used by other users.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/chat/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Delete multiple users within a single context.&lt;br /&gt;
 *&lt;br /&gt;
 * @param approved_userlist $userlist The approved context and user information to delete information for.&lt;br /&gt;
 */&lt;br /&gt;
public static function delete_data_for_users(approved_userlist $userlist) {&lt;br /&gt;
    global $DB;&lt;br /&gt;
&lt;br /&gt;
    $context = $userlist-&amp;gt;get_context();&lt;br /&gt;
    $cm = $DB-&amp;gt;get_record(&#039;course_modules&#039;, [&#039;id&#039; =&amp;gt; $context-&amp;gt;instanceid]);&lt;br /&gt;
    $chat = $DB-&amp;gt;get_record(&#039;chat&#039;, [&#039;id&#039; =&amp;gt; $cm-&amp;gt;instance]);&lt;br /&gt;
&lt;br /&gt;
    list($userinsql, $userinparams) = $DB-&amp;gt;get_in_or_equal($userlist-&amp;gt;get_userids(), SQL_PARAMS_NAMED);&lt;br /&gt;
    $params = array_merge([&#039;chatid&#039; =&amp;gt; $chat-&amp;gt;id], $userinparams);&lt;br /&gt;
    $sql = &amp;quot;chatid = :chatid AND userid {$userinsql}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    $DB-&amp;gt;delete_records_select(&#039;chat_messages&#039;, $sql, $params);&lt;br /&gt;
    $DB-&amp;gt;delete_records_select(&#039;chat_messages_current&#039;, $sql, $params);&lt;br /&gt;
    $DB-&amp;gt;delete_records_select(&#039;chat_users&#039;, $sql, $params);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Difference between Moodle 3.3 and more recent versions==&lt;br /&gt;
Moodle 3.3 has a minimum requirement of php 5.6 and so type hinting and return type declarations are not supported in this version. &lt;br /&gt;
Consequently the privacy API for this version does not have these features.&lt;br /&gt;
==Common Questions==&lt;br /&gt;
===What to do if you have one plugin that supports multiple branches===&lt;br /&gt;
This is something that we have considered and we have put in place a polyfill. This gets around the restrictions of one version having type hinting and return type declarations while another does not.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
To use the polyfill include the legacy polyfill trait and create the necessary static methods but with an underscore (shown below).&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
class provider implements&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
    \core_privacy\local\request\plugin\provider {&lt;br /&gt;
&lt;br /&gt;
    // This trait must be included.&lt;br /&gt;
    use \core_privacy\local\legacy_polyfill;&lt;br /&gt;
&lt;br /&gt;
    // The required methods must be in this format starting with an underscore.&lt;br /&gt;
    public static function _get_metadata(collection $collection) {&lt;br /&gt;
        // Code for returning metadata goes here.&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===What to do if your plugin must implement a subplugin or subsystem plugin provider===&lt;br /&gt;
For subplugins (e.g. assignsubmission, assignfeedback, quiz report, quiz access rules), or subsystems which have a plugintype relationship (portfolio, plagiarism, and others), they will also define their own legacy polyfill.&lt;br /&gt;
&lt;br /&gt;
In this instance you will need to include the trait for both the core polyfill, and the provider polyfill as appropriate.&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
class provider implements&lt;br /&gt;
    // This plugin has data and must therefore define the metadata provider in order to describe it.&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
&lt;br /&gt;
    // This is a plagiarism plugin. It interacts with the plagiarism subsystem rather than with core.&lt;br /&gt;
    \core_plagiarism\privacy\plagiarism_provider {&lt;br /&gt;
&lt;br /&gt;
    // This trait must be included to provide the relevant polyfill for the metadata provider.&lt;br /&gt;
    use \core_privacy\local\legacy_polyfill;&lt;br /&gt;
&lt;br /&gt;
    // This trait must be included to provide the relevant polyfill for the plagirism provider.&lt;br /&gt;
    use \core_plagiarism\privacy\plagiarism_provider\legacy_polyfill;&lt;br /&gt;
&lt;br /&gt;
    // The required methods must be in this format starting with an underscore.&lt;br /&gt;
    public static function _get_metadata(collection $collection) {&lt;br /&gt;
        // Code for returning metadata goes here.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // This is one of the polyfilled methods from the plagiarism provider.&lt;br /&gt;
    public static function _export_plagiarism_user_data($userid, \context $context, array $subcontext, array $linkarray) {&lt;br /&gt;
        // ...&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tips for development ==&lt;br /&gt;
&lt;br /&gt;
* While implementing the privacy API into your plugin, there are CLI scripts that can help you to test things on the fly. Just don&#039;t forget these are not supposed to replace proper unit tests. See [[Privacy API/Utilities]] for details.&lt;br /&gt;
* Inherit Unit tests from the &amp;lt;code php&amp;gt;core_privacy\tests\provider_testcase&amp;lt;/code&amp;gt;, not &amp;lt;code php&amp;gt;advanced_testcase&amp;lt;/code&amp;gt;. Advanced test case doesn&#039;t reset the Privacy content_writer between tests!&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Subject Access Request FAQ]]&lt;br /&gt;
* [[:en:GDPR|GDPR]] in the user documentation&lt;br /&gt;
* [[Privacy API/Utilities]] provides CLI scripts that are helpful during development&lt;br /&gt;
&lt;br /&gt;
[[Category:Privacy]]&lt;br /&gt;
[[Category:GDPR]]&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Privacy_API&amp;diff=55143</id>
		<title>Privacy API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Privacy_API&amp;diff=55143"/>
		<updated>2018-11-30T00:44:54Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: New interface code example for developers supporting 3.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [https://en.wikipedia.org/wiki/General_Data_Protection_Regulation General Data Protection Regulation] (GDPR) is an EU directive that looks at providing users with more control over their data and how it is processed. This regulation will come into effect on 25th of May 2018 and covers any citizen or permanent resident of the European Union. The directive will be respected by a number of other countries outside of the European Union.&lt;br /&gt;
&lt;br /&gt;
To help institutions become compliant with this new regulation we are adding functionality to Moodle. This includes a number of components, amongst others these include a user’s right to:&lt;br /&gt;
&lt;br /&gt;
* request information on the types of personal data held, the instances of that data, and the deletion policy for each;&lt;br /&gt;
* access all of their data; and&lt;br /&gt;
* be forgotten.&lt;br /&gt;
&lt;br /&gt;
The compliance requirements also extend to installed plugins (including third party plugins). These need to also be able to report what information they store or process regarding users, and have the ability to provide and delete data for a user request.&lt;br /&gt;
&lt;br /&gt;
This document describes the proposed API changes required for plugins which will allow a Moodle installation to become GDPR compliant.&lt;br /&gt;
&lt;br /&gt;
Target Audience: The intended audience for this document is Moodle plugin developers, who are aiming to ensure their plugins are updated to comply with GDPR requirements coming into effect in the EU in May, 2018.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Personal data in Moodle==&lt;br /&gt;
&lt;br /&gt;
From the GDPR Spec, Article 4:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;‘personal data’ means any information relating to an identified or identifiable natural person (‘data subject’); an identifiable natural person is one who can be identified, directly or indirectly, in particular by reference to an identifier such as a name, an identification number, location data, an online identifier or to one or more factors specific to the physical, physiological, genetic, mental, economic, cultural or social identity of that natural person;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In Moodle, we need to consider two main types of personal data; information entered by the user and information stored about the user. The key difference being that information stored about the user will have come from a source other than the user themselves. Both types of data can be used to form a profile of the individual.&lt;br /&gt;
&lt;br /&gt;
The most obvious clue to finding personal data entered by the user is the presence of a userid on a database field. Any data on the record (or linked records) pertaining to that user may be deemed personal data for that user, including things like timestamps and record identification numbers. Additionally, any free text field which allows the user to enter information must also be considered to be the personal data of that user.&lt;br /&gt;
&lt;br /&gt;
Data stored about the user includes things like ratings and comments made on a student submission. These may have been made by an assessor or teacher, but are considered the personal data of the student, as they are considered a reflection of the user’s competency in the subject matter and can be used to form a profile of that individual. &lt;br /&gt;
&lt;br /&gt;
The sections that follow outline what you need to do as a plugin developer to ensure any personal data is advertised and can be accessed and deleted according to the GDPR requirements.&lt;br /&gt;
&lt;br /&gt;
==Background==&lt;br /&gt;
&lt;br /&gt;
===Architecture overview===&lt;br /&gt;
&lt;br /&gt;
[[File:MoodlePrivacyMetadataUML.png|thumb|UML diagram of the metadata part of the privacy subsystem]]&lt;br /&gt;
[[File:MoodlePrivacyRequestUML.png|thumb|UML diagram of the request providers part of the privacy subsystem]]&lt;br /&gt;
&lt;br /&gt;
A new system for Privacy has been created within Moodle. This is broken down into several main parts and forms the &#039;&#039;core_privacy&#039;&#039; subsystem:&lt;br /&gt;
&lt;br /&gt;
* Some metadata providers - a set of PHP interfaces to be implemented by components for that component to describe the kind of data that it stores, and the purpose for its storage;&lt;br /&gt;
* Some request providers - a set of PHP interfaces to be implemented by components to allow that component to act upon user requests such as the Right to be Forgotten, and a Subject Access Request; and&lt;br /&gt;
* A manager - a concrete class used to bridge components which implement the providers with tools which request their data.&lt;br /&gt;
&lt;br /&gt;
All plugins will implement one metadata provider, and zero, one or two request providers.&lt;br /&gt;
&lt;br /&gt;
The &#039;request&#039; providers are responsible for several separate areas:&lt;br /&gt;
&lt;br /&gt;
# Detecting in which Moodle contexts a specific user has any personal data;&lt;br /&gt;
# Exporting all personal data from each of those contexts for that user;&lt;br /&gt;
# Deleting all personal data from each of those contexts for that user;&lt;br /&gt;
# Detecting which users have personal data in a specific Moodle context;&lt;br /&gt;
# Deleting all personal data for each of those users in that context; and&lt;br /&gt;
# Deleting all personal data for all users in a specific context.&lt;br /&gt;
&lt;br /&gt;
The export and delete phases use data from the detection phase, which allows for the possibility to exclude all data from certain contexts, as required.&lt;br /&gt;
&lt;br /&gt;
Please refer to the inline phpdocs of the [https://github.com/moodle/moodle/blob/v3.5.0/privacy/classes/manager.php#L31 core_privacy::manager class] for detailed description of the interfaces, their hierarchy and meaning.&lt;br /&gt;
&lt;br /&gt;
Please note that support for locating and removing multiple users in a single context was added in MDL-62560 for Moodle 3.6, 3.5.3, and 3.4.6.&lt;br /&gt;
This functionality has been added to allow support for removal of user data for users subject to speific role criterion, and to support expiry of the same data by role too.&lt;br /&gt;
&lt;br /&gt;
===Implementing a provider===&lt;br /&gt;
&lt;br /&gt;
All plugins will need to create a concrete class which implements the relevant metadata and request providers. The exact providers you need to implement will depend on what data you store, and the type of plugin. This is covered in more detail in the following sections of the document.&lt;br /&gt;
&lt;br /&gt;
In order to do so:&lt;br /&gt;
&lt;br /&gt;
# You must create a class called &#039;&#039;provider&#039;&#039; within the namespace &#039;&#039;\your_pluginname\privacy&#039;&#039;.&lt;br /&gt;
# This class must be created at &#039;&#039;path/to/your/plugin/classes/privacy/provider.php&#039;&#039;.&lt;br /&gt;
# You must have your class implement the relevant metadata and request interfaces.&lt;br /&gt;
&lt;br /&gt;
==Plugins which do not store personal data==&lt;br /&gt;
&lt;br /&gt;
Many Moodle plugins do not store any personal data. This is usually the case for plugins which just add functionality, or which display the data already stored elsewhere in Moodle.&lt;br /&gt;
&lt;br /&gt;
Some examples of plugin types which might fit this criteria include themes, blocks, filters, editor plugins, etc.&lt;br /&gt;
&lt;br /&gt;
Plugins which cause data to be stored elsewhere in Moodle (e.g. via a subsystem call) are considered to store data.&lt;br /&gt;
&lt;br /&gt;
One examples of a plugin which does not store any data would be the Calendar month block which just displays a view of the user’s calendar. It does not store any data itself.&lt;br /&gt;
&lt;br /&gt;
An example of a plugin which must not use the null provider is the Comments block. The comments block is responsible for data subsequently being stored within Moodle. Although the block doesn’t store anything itself, it interacts with the comments subsystem and is the only component which knows how that data maps to a user.&lt;br /&gt;
&lt;br /&gt;
===Implementation requirements===&lt;br /&gt;
&lt;br /&gt;
In order to let Moodle know that you have audited your plugin, and that you do not store any personal user data, you must implement the &#039;&#039;\core_privacy\local\metadata\null_provider&#039;&#039; interface in your plugin’s provider.&lt;br /&gt;
&lt;br /&gt;
These null providers can only be implemented where a plugin has:&lt;br /&gt;
&lt;br /&gt;
* no external links (e.g. sends data to an external service like an LTI provider, repository plugin which you can search on)&lt;br /&gt;
* no database tables which store user data (including IP addresses)&lt;br /&gt;
* no user preferences&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;null_provider&#039;&#039; requires you to define one function &#039;&#039;get_reason()&#039;&#039; which returns the language string identifier within your component.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;blocks/calendar_month/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace block_calendar_month\privacy;&lt;br /&gt;
&lt;br /&gt;
class provider implements&lt;br /&gt;
    // This plugin does not store any personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\null_provider {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the language string identifier with the component&#039;s language&lt;br /&gt;
     * file to explain why this plugin stores no data.&lt;br /&gt;
     *&lt;br /&gt;
     * @return  string&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_reason() : string {&lt;br /&gt;
        return &#039;privacy:metadata&#039;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;blocks/calendar_month/lang/en/block_calendar_month.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
$string[&#039;privacy:metadata&#039;] = &#039;The Calendar block only displays existing calendar data.&#039;;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That’s it. Congratulations, your plugin now implements the Privacy API.&lt;br /&gt;
&lt;br /&gt;
==Plugins which store personal data==&lt;br /&gt;
&lt;br /&gt;
Many Moodle plugins do store some form of personal data.&lt;br /&gt;
&lt;br /&gt;
In some cases this will be stored within database tables in your plugin, and in other cases this will be in one of Moodle’s core subsystems - for example your plugin may store files, ratings, comments, or tags.&lt;br /&gt;
&lt;br /&gt;
Plugins which do store data will need to:&lt;br /&gt;
&lt;br /&gt;
* Describe the type of data that they store;&lt;br /&gt;
* Provide a way to export that data; and&lt;br /&gt;
* Provide a way to delete that data.&lt;br /&gt;
&lt;br /&gt;
Data is described via a &#039;&#039;metadata&#039;&#039; provider, and it is both exported and deleted via an implementation of a &#039;&#039;request&#039;&#039; provider.&lt;br /&gt;
&lt;br /&gt;
These are both explained in the sections below.&lt;br /&gt;
&lt;br /&gt;
===Describing the type of data you store===&lt;br /&gt;
&lt;br /&gt;
In order to describe the type of data that you store, you must implement the &#039;&#039;\core_privacy\local\metadata\provider&#039;&#039; interface.&lt;br /&gt;
&lt;br /&gt;
This interfaces requires that you define one function: &#039;&#039;get_metadata&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
There are several types of item to describe the data that you store. These are for:&lt;br /&gt;
&lt;br /&gt;
* Items in the Moodle database;&lt;br /&gt;
* Items stored by you in a Moodle subsystem - for example files, and ratings; and&lt;br /&gt;
* User preferences stored site-wide within Moodle for your plugin&lt;br /&gt;
&lt;br /&gt;
Note: All fields should include a description from a language string within your plugin.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace mod_forum\privacy;&lt;br /&gt;
use core_privacy\local\metadata\collection;&lt;br /&gt;
&lt;br /&gt;
class provider implements &lt;br /&gt;
        // This plugin does store personal user data.&lt;br /&gt;
        \core_privacy\local\metadata\provider {&lt;br /&gt;
&lt;br /&gt;
    public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
        // Here you will add more items into the collection.&lt;br /&gt;
&lt;br /&gt;
        return $collection;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you store content in a Moodle subsystem====&lt;br /&gt;
&lt;br /&gt;
Many plugins will use one of the core Moodle subsystems to store data.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer we do not expect you to describe those subsystems in detail, but we do need to know that you use them and to know what you use them for.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;add_subsystem_link()&#039;&#039; method on the &#039;&#039;collection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=====Relevant subsystems=====&lt;br /&gt;
&lt;br /&gt;
You are likely to need to indicate use of the following subsystems that store user data:&lt;br /&gt;
&lt;br /&gt;
* Ratings (if users are allowed to rate items within your plugin)&lt;br /&gt;
* Tags (if users can tag items within your plugin)&lt;br /&gt;
* Comments (if users can make comments on items in your plugin)&lt;br /&gt;
* Questions (if the plugin uses core question types)&lt;br /&gt;
* Filesystem (if users can attach files to items within your plugin)&lt;br /&gt;
* ...?&lt;br /&gt;
&lt;br /&gt;
Some subsystems which store user data do not need to be listed:&lt;br /&gt;
&lt;br /&gt;
* (TBC - how about global search? Nothing lists it that I could see.)&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;add_subsystem_link(&lt;br /&gt;
        &#039;core_files&#039;,&lt;br /&gt;
        [],&lt;br /&gt;
        &#039;privacy:metadata:core_files&#039;&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/lang/en/forum.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:core_files&#039;] = &#039;The forum stores files which have been uploaded by the user to form part of a forum post.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Describing data stored in database tables====&lt;br /&gt;
&lt;br /&gt;
Most Moodle plugins will store some form of user data in their own database tables.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer you will need to describe each database table, and each field which includes user data.&lt;br /&gt;
&lt;br /&gt;
It is a matter of judgement which fields contain user data and which don&#039;t. Anything entered by, or directly about, the user probably counts as user data but it may be useful to include additional fields that explain the context of the data.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;add_database_table(&lt;br /&gt;
        &#039;forum_discussion_subs&#039;,&lt;br /&gt;
         [&lt;br /&gt;
            &#039;userid&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:userid&#039;,&lt;br /&gt;
            &#039;discussionid&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:discussionid&#039;,&lt;br /&gt;
            &#039;preference&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:preference&#039;,&lt;br /&gt;
&lt;br /&gt;
         ],&lt;br /&gt;
        &#039;privacy:metadata:forum_discussion_subs&#039;&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/lang/en/forum.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs&#039;] = &#039;Information about the subscriptions to individual forum discussions. This includes when a user has chosen to subscribe to a discussion, or to unsubscribe from one where they would otherwise be subscribed.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:userid&#039;] = &#039;The ID of the user with this subscription preference.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:discussionid&#039;] = &#039;The ID of the discussion that was subscribed to.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:preference&#039;] = &#039;The start time of the subscription.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you store site-wide user preferences====&lt;br /&gt;
&lt;br /&gt;
Many plugins will include one or more user preferences. Unfortunately this is one of Moodle’s older components and many of the values stored are not pure user preferences. Each plugin should be aware of how it handles its own preferences and is best placed to determine whether they are site-wide preferences, or per-instance preferences.&lt;br /&gt;
&lt;br /&gt;
Whilst most of these will have a fixed name (e.g. &#039;&#039;filepicker_recentrepository&#039;&#039;), some will include a variable of some kind (e.g. &#039;&#039;tool_usertours_tour_completion_time_2&#039;&#039;). Only the general name (in this case &amp;quot;tool_usertours_tour_completion_time_&amp;quot;) needs to be indicated, rather than one copy for each possible value of the variable.&lt;br /&gt;
&lt;br /&gt;
Also, these should only be &#039;&#039;site-wide&#039;&#039; user preferences which do not belong to a specific Moodle context.&lt;br /&gt;
&lt;br /&gt;
In the above examples:&lt;br /&gt;
&lt;br /&gt;
* Preference &#039;&#039;filepicker_recentrepository&#039;&#039; belongs to the file subsystem, and is a site-wide preference affecting the user anywhere that they view the filepicker.&lt;br /&gt;
* Preference &#039;&#039;tool_usertours_tour_completion_time_2&#039;&#039; belongs to user tours. User tours are a site-wide feature which can affect many parts of Moodle and cross multiple contexts.&lt;br /&gt;
&lt;br /&gt;
In some cases a value may be stored in the preferences table but is known to belong to a specific context within Moodle. In these cases they should be stored as metadata against that context rather than as a site-wide user preference.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;add_user_preference()&#039;&#039; method on the &#039;&#039;collection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any plugin providing user preferences must also implement the &#039;&#039;\core_privacy\local\request\preference_provider&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;admin/tool/usertours/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;add_user_preference(&#039;tool_usertours_tour_completion_time&#039;,&lt;br /&gt;
        &#039;privacy:metadata:preference:tool_usertours_tour_completion_time&#039;);&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;admin/tool/usertours/lang/en/tool_usertours.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:tool_usertours_tour_completion_time&#039;] = &#039;The time that a specific user tour was last completed by a user.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you export data to an external location====&lt;br /&gt;
&lt;br /&gt;
Many plugins will interact with external systems - for example cloud-based services. Often this external location is configurable within the plugin either at the site or the instance level.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer you will need to describe each &#039;&#039;type&#039;&#039; of target destination, alongside a list of each exported field which includes user data.&lt;br /&gt;
The &#039;&#039;actual&#039;&#039; destination does not need to be described as this can change based on configuration.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;add_external_location_link()&#039;&#039; method on the collection.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/lti/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;add_external_location_link(&#039;lti_client&#039;, [&lt;br /&gt;
            &#039;userid&#039; =&amp;gt; &#039;privacy:metadata:lti_client:userid&#039;,&lt;br /&gt;
            &#039;fullname&#039; =&amp;gt; &#039;privacy:metadata:lti_client:fullname&#039;,&lt;br /&gt;
        ], &#039;privacy:metadata:lti_client&#039;);&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/lti/lang/en/lti.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client&#039;] = &#039;In order to integrate with a remote LTI service, user data needs to be exchanged with that service.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client:userid&#039;] = &#039;The userid is sent from Moodle to allow you to access your data on the remote system.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client:fullname&#039;] = &#039;Your full name is sent to the remote system to allow a better user experience.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Providing a way to export user data===&lt;br /&gt;
&lt;br /&gt;
In order to export the user data that you store, you must implement the relevant request provider.&lt;br /&gt;
&lt;br /&gt;
We have named these request providers because they are called in response to a specific request from a user to access their information, however they also deal with the removal of user data following it&#039;s expiry.&lt;br /&gt;
&lt;br /&gt;
There are several different types of request provider, and you may need to implement several of these, depending on the type and nature of your plugin.&lt;br /&gt;
&lt;br /&gt;
Broadly speaking plugins will fit into one of the following categories:&lt;br /&gt;
&lt;br /&gt;
* Plugins which are a subplugin of another plugin. Examples include &#039;&#039;assignsubmission&#039;&#039;, &#039;&#039;atto&#039;&#039;, and &#039;&#039;datafield&#039;&#039;;&lt;br /&gt;
* Plugins which are typically called by a Moodle subsystem. Examples include &#039;&#039;qtype&#039;&#039;, and &#039;&#039;profilefield&#039;&#039;;&lt;br /&gt;
* All other plugins which store data.&lt;br /&gt;
&lt;br /&gt;
Most plugins will fit into this final category, whilst other plugins may fall into several categories.&lt;br /&gt;
Plugins which &#039;&#039;define&#039;&#039; a subplugin will also be responsible for  collecting this data from their subplugins.&lt;br /&gt;
&lt;br /&gt;
A final category exists - plugins which store user preferences. In some cases this may be the &#039;&#039;only&#039;&#039; provider implemented.&lt;br /&gt;
&lt;br /&gt;
====Standard plugins which store data====&lt;br /&gt;
&lt;br /&gt;
A majority of Moodle plugins will fit into this category and will be required to implement the &#039;&#039;\core_privacy\local\request\plugin\provider&#039;&#039; interface. This interface requires that you define four functions (the first two of which are dealt with in this section):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;get_contexts_for_userid&#039;&#039; - to explain where data is held within Moodle for your plugin; and&lt;br /&gt;
* &#039;&#039;export_user_data&#039;&#039; - to export a user’s personal data from your plugin.&lt;br /&gt;
* &#039;&#039;delete_data_for_all_users_in_context&#039;&#039; - to delete all data for all users in the specified context.&lt;br /&gt;
* &#039;&#039;delete_data_for_user&#039;&#039; - to delete all user data for the specified user, in the specified contexts.&lt;br /&gt;
&lt;br /&gt;
These APIs make use of the Moodle &#039;&#039;context&#039;&#039; system to hierarchically store this data.&lt;br /&gt;
&lt;br /&gt;
In addition to these requirements, since Moodle 3.4.6, 3.5.3, any plugin which implements the plugin provider interface must also implement the &#039;&#039;\core_privacy\local\request\core_userlist_provider&#039;&#039; provider and implement functions:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;get_users_in_context&#039;&#039; - to locate the users who hold any personal data in a specific context; and&lt;br /&gt;
* &#039;&#039;delete_data_for_users&#039;&#039; - to delete data for multiple users in the specified context.&lt;br /&gt;
&lt;br /&gt;
A polyfill has not been provided for this new interface, but we recognise that developers who are maintaining older versions (Moodle 3.3) will hit problems with this new interface not existing. We recommend doing something similar to the following example.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace assignsubmission_example\privacy;&lt;br /&gt;
&lt;br /&gt;
if (class_exists(&#039;\core_privacy\local\request\userlist&#039;)) {&lt;br /&gt;
    interface my_userlist extends \core_privacy\local\request\userlist{}&lt;br /&gt;
} else {&lt;br /&gt;
    interface my_userlist {};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class provider implements my_userlist {&lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * Get the list of users who have data within a context.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   userlist    $userlist   The userlist containing the list of users who have data in this context/plugin combination.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_users_in_context(userlist $userlist) {&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Delete multiple users within a single context.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   approved_userlist       $userlist The approved context and user information to delete information for.&lt;br /&gt;
     */&lt;br /&gt;
    public static function delete_data_for_users(approved_userlist $userlist) {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Retrieving the list of contexts=====&lt;br /&gt;
&lt;br /&gt;
You are required to return the list of contexts for which the plugin stores data about the user. These are the standard Moodle contexts - CONTEXT_COURSE, CONTEXT_USER, CONTEXT_MODULE and so on. In many cases the link between the module type and the context is self-evident (e.g. activity modules). In some cases it may be less so. For example, an enrolment plugin (that stores user data, which most don&#039;t) would link to course context (users enrol in courses). Other types of plugins may be less obvious but you need to pick something. One way might to consider what context you would use when checking role capabilities. Consider that this will be used to structure the exported data and define what data is deleted when a context is expired. &lt;br /&gt;
&lt;br /&gt;
Contexts are retrieved using the &#039;&#039;get_contexts_for_userid&#039;&#039; function which takes the ID of the user being fetched, and returns a list of contexts in which the user has any data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_contexts_for_userid(int $userid) : contextlist {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The function returns a &#039;&#039;\core_privacy\local\request\contextlist&#039;&#039; which is used to keep a set of contexts together in a fixed fashion.&lt;br /&gt;
&lt;br /&gt;
Because a Subject Access Request covers &#039;&#039;every&#039;&#039; piece of data that is held for a user within Moodle, efficiency and performance is highly important. As a result, contexts are added to the &#039;&#039;contextlist&#039;&#039; by defining one or more SQL queries which return just the contextid. Multiple SQL queries can be added as required. &lt;br /&gt;
&lt;br /&gt;
Many plugins will interact with specific subsystems and store data within them.&lt;br /&gt;
These subsystems will also provide a way in which to link the data that you have stored with your own database tables.&lt;br /&gt;
At present these are still a work in progress and only the &#039;&#039;core_ratings&#039;&#039; subsystem includes this.&lt;br /&gt;
&lt;br /&gt;
======Basic example======&lt;br /&gt;
&lt;br /&gt;
The following example simply fetches the contextid for all forums where a user has a single discussion (note: this is an incomplete example):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_contexts_for_userid(int $userid) : contextlist {&lt;br /&gt;
        $contextlist = new \core_privacy\local\request\contextlist();&lt;br /&gt;
&lt;br /&gt;
        $sql = &amp;quot;SELECT c.id&lt;br /&gt;
                 FROM {context} c&lt;br /&gt;
           INNER JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel&lt;br /&gt;
           INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname&lt;br /&gt;
           INNER JOIN {forum} f ON f.id = cm.instance&lt;br /&gt;
            LEFT JOIN {forum_discussions} d ON d.forum = f.id&lt;br /&gt;
                WHERE (&lt;br /&gt;
                d.userid        = :discussionuserid&lt;br /&gt;
                )&lt;br /&gt;
        &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        $params = [&lt;br /&gt;
            &#039;modname&#039;           =&amp;gt; &#039;forum&#039;,&lt;br /&gt;
            &#039;contextlevel&#039;      =&amp;gt; CONTEXT_MODULE,&lt;br /&gt;
            &#039;discussionuserid&#039;  =&amp;gt; $userid,&lt;br /&gt;
        ];&lt;br /&gt;
&lt;br /&gt;
        $contextlist-&amp;gt;add_from_sql($sql, $params);&lt;br /&gt;
&lt;br /&gt;
        return $contextlist;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======More complete example======&lt;br /&gt;
&lt;br /&gt;
The following example includes a link to core_rating. &lt;br /&gt;
It will find any forum, forum discussion, or forum post where the user has any data, including:&lt;br /&gt;
&lt;br /&gt;
* Per-forum digest preferences;&lt;br /&gt;
* Per-forum subscription preferences;&lt;br /&gt;
* Per-forum read tracking preferences;&lt;br /&gt;
* Per-discussion subscription preferences;&lt;br /&gt;
* Per-post read data (if a user has read a post or not); and&lt;br /&gt;
* Per-post rating data.&lt;br /&gt;
&lt;br /&gt;
In the case of the rating data, this will include any post where the user has rated the post of another user.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   int           $userid       The user to search.&lt;br /&gt;
 * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
 */&lt;br /&gt;
public static function get_contexts_for_userid(int $userid) : contextlist {&lt;br /&gt;
    $ratingsql = \core_rating\privacy\provider::get_sql_join(&#039;rat&#039;, &#039;mod_forum&#039;, &#039;post&#039;, &#039;p.id&#039;, $userid);&lt;br /&gt;
    // Fetch all forum discussions, and forum posts.&lt;br /&gt;
    $sql = &amp;quot;SELECT c.id&lt;br /&gt;
                FROM {context} c&lt;br /&gt;
        INNER JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel&lt;br /&gt;
        INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname&lt;br /&gt;
        INNER JOIN {forum} f ON f.id = cm.instance&lt;br /&gt;
            LEFT JOIN {forum_discussions} d ON d.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_posts} p ON p.discussion = d.id&lt;br /&gt;
            LEFT JOIN {forum_digests} dig ON dig.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_subscriptions} sub ON sub.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_track_prefs} pref ON pref.forumid = f.id&lt;br /&gt;
            LEFT JOIN {forum_read} hasread ON hasread.forumid = f.id&lt;br /&gt;
            LEFT JOIN {forum_discussion_subs} dsub ON dsub.forum = f.id&lt;br /&gt;
            {$ratingsql-&amp;gt;join}&lt;br /&gt;
                WHERE (&lt;br /&gt;
                p.userid        = :postuserid OR&lt;br /&gt;
                d.userid        = :discussionuserid OR&lt;br /&gt;
                dig.userid      = :digestuserid OR&lt;br /&gt;
                sub.userid      = :subuserid OR&lt;br /&gt;
                pref.userid     = :prefuserid OR&lt;br /&gt;
                hasread.userid  = :hasreaduserid OR&lt;br /&gt;
                dsub.userid     = :dsubuserid OR&lt;br /&gt;
                {$ratingsql-&amp;gt;userwhere}&lt;br /&gt;
            )&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    $params = [&lt;br /&gt;
        &#039;modname&#039;           =&amp;gt; &#039;forum&#039;,&lt;br /&gt;
        &#039;contextlevel&#039;      =&amp;gt; CONTEXT_MODULE,&lt;br /&gt;
        &#039;postuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
        &#039;discussionuserid&#039;  =&amp;gt; $userid,&lt;br /&gt;
        &#039;digestuserid&#039;      =&amp;gt; $userid,&lt;br /&gt;
        &#039;subuserid&#039;         =&amp;gt; $userid,&lt;br /&gt;
        &#039;prefuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
        &#039;hasreaduserid&#039;     =&amp;gt; $userid,&lt;br /&gt;
        &#039;dsubuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
    ];&lt;br /&gt;
    $params += $ratingsql-&amp;gt;params;&lt;br /&gt;
&lt;br /&gt;
    $contextlist = new \core_privacy\local\request\contextlist();&lt;br /&gt;
    $contextlist-&amp;gt;add_from_sql($sql, $params);&lt;br /&gt;
&lt;br /&gt;
    return $contextlist;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Retrieving the users in a context=====&lt;br /&gt;
&lt;br /&gt;
You are required to return the list of users holding personal data in a context for which the plugin stores data about the user.&lt;br /&gt;
This method is very similar to the &#039;&#039;get_contexts_for_userid&#039;&#039; function but has some important distinctions:&lt;br /&gt;
&lt;br /&gt;
* It takes a &#039;&#039;userlist&#039;&#039; as an argument and does not require that you, as a developer, create it yourself;&lt;br /&gt;
* There is no need to return any value; and&lt;br /&gt;
* The argument for the &#039;&#039;userlist::add_from_sql&#039;&#039; are different to those for &#039;&#039;contextlist::add_from_sql&#039;&#039; (this is because we learnt some important lessons after the initial implementation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Get the list of users who have data within a context.&lt;br /&gt;
 *&lt;br /&gt;
 * @param userlist $userlist The userlist containing the list of users who have data in this context/plugin combination.&lt;br /&gt;
 */&lt;br /&gt;
public static function get_users_in_context(userlist $userlist) {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Basic example======&lt;br /&gt;
&lt;br /&gt;
The following example simply fetches the userid for all users in a given forum context, who created a discussion or a post in that forum (note: this is an incomplete example):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Get the list of users who have data within a context.&lt;br /&gt;
 *&lt;br /&gt;
 * @param userlist $userlist The userlist containing the list of users who have data in this context/plugin combination.&lt;br /&gt;
 */&lt;br /&gt;
public static function get_users_in_context(userlist $userlist) {&lt;br /&gt;
&lt;br /&gt;
    $context = $userlist-&amp;gt;get_context();&lt;br /&gt;
&lt;br /&gt;
    if (!$context instanceof \context_module) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $params = [&lt;br /&gt;
        &#039;instanceid&#039;    =&amp;gt; $context-&amp;gt;instanceid,&lt;br /&gt;
        &#039;modulename&#039;    =&amp;gt; &#039;forum&#039;,&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    // Discussion authors.&lt;br /&gt;
    $sql = &amp;quot;SELECT d.userid&lt;br /&gt;
              FROM {course_modules} cm&lt;br /&gt;
              JOIN {modules} m ON m.id = cm.module AND m.name = :modulename&lt;br /&gt;
              JOIN {forum} f ON f.id = cm.instance&lt;br /&gt;
              JOIN {forum_discussions} d ON d.forum = f.id&lt;br /&gt;
             WHERE cm.id = :instanceid&amp;quot;;&lt;br /&gt;
    $userlist-&amp;gt;add_from_sql(&#039;userid&#039;, $sql, $params);&lt;br /&gt;
&lt;br /&gt;
     // Forum authors.&lt;br /&gt;
    $sql = &amp;quot;SELECT p.userid&lt;br /&gt;
              FROM {course_modules} cm&lt;br /&gt;
              JOIN {modules} m ON m.id = cm.module AND m.name = :modulename&lt;br /&gt;
              JOIN {forum} f ON f.id = cm.instance&lt;br /&gt;
              JOIN {forum_discussions} d ON d.forum = f.id&lt;br /&gt;
              JOIN {forum_posts} p ON d.id = p.discussion&lt;br /&gt;
             WHERE cm.id = :instanceid&amp;quot;;&lt;br /&gt;
    $userlist-&amp;gt;add_from_sql(&#039;userid&#039;, $sql, $params);&lt;br /&gt;
&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Exporting user data=====&lt;br /&gt;
&lt;br /&gt;
After determining where in Moodle your plugin holds data about a user, the &#039;&#039;\core_privacy\manager&#039;&#039; will then ask your plugin to export all user data for a subset of those locations.&lt;br /&gt;
&lt;br /&gt;
This is achieved through use of the &#039;&#039;export_user_data&#039;&#039; function which takes the list of approved contexts in a &#039;&#039;\core_privacy\local\request\approved_contextlist&#039;&#039; object.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Export all user data for the specified user, in the specified contexts, using the supplied exporter instance.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   approved_contextlist    $contextlist    The approved contexts to export information for.&lt;br /&gt;
 */&lt;br /&gt;
public static function export_user_data(approved_contextlist $contextlist) {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;approved_contextlist&#039;&#039; includes both the user record, and a list of contexts, which can be retrieved by either processing it as an Iterator, or by calling &#039;&#039;get_contextids()&#039;&#039; or &#039;&#039;get_contexts()&#039;&#039; as required.&lt;br /&gt;
&lt;br /&gt;
Data is exported using a &#039;&#039;\core_privacy\local\request\content_writer&#039;&#039;, which is described in further detail below.&lt;br /&gt;
&lt;br /&gt;
====Plugins which store user preferences====&lt;br /&gt;
&lt;br /&gt;
Many plugins store a variety of user preferences, and must therefore export them.&lt;br /&gt;
&lt;br /&gt;
Since user preferences are a site-wide preference, these are exported separately to other user data.&lt;br /&gt;
In some cases the only data present is user preference data, whilst in others there is a combination of user-provided data, and user preferences.&lt;br /&gt;
&lt;br /&gt;
Storing of user preferences is achieved through implementation of the &#039;&#039;\core_privacy\local\request\user_preference_provider&#039;&#039; interface which defines one required function -- &#039;&#039;export_user_preferences&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
You need to provide a description of the value of the user preference. (This description is particularly useful in cases where the value might be, say, 3, but it actually means &#039;Alphabetical order&#039;.) Most likely you can use an existing language string from your plugin.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Export all user preferences for the plugin.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   int         $userid The userid of the user whose data is to be exported.&lt;br /&gt;
 */&lt;br /&gt;
public static function export_user_preferences(int $userid) {&lt;br /&gt;
    $markasreadonnotification = get_user_preference(&#039;markasreadonnotification&#039;, null, $userid);&lt;br /&gt;
    if (null !== $markasreadonnotification) {&lt;br /&gt;
        switch ($markasreadonnotification) {&lt;br /&gt;
            case 0:&lt;br /&gt;
                $markasreadonnotificationdescription = get_string(&#039;markasreadonnotificationno&#039;, &#039;mod_forum&#039;);&lt;br /&gt;
                break;&lt;br /&gt;
            case 1:&lt;br /&gt;
            default:&lt;br /&gt;
                $markasreadonnotificationdescription = get_string(&#039;markasreadonnotificationyes&#039;, &#039;mod_forum&#039;);&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
        writer::export_user_preference(&#039;mod_forum&#039;, &#039;markasreadonnotification&#039;, $markasreadonnotification, $markasreadonnotificationdescription);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Plugins which can have own subplugins ====&lt;br /&gt;
&lt;br /&gt;
Many plugin types are also able to define their own subplugins and will need to define a contract between themselves and their subplugins in order to fetch their data.&lt;br /&gt;
&lt;br /&gt;
This is required as the parent plugin and the child subplugin should be separate entities and the parent plugin must be able to function if one or more of its subplugins are uninstalled.&lt;br /&gt;
&lt;br /&gt;
The parent plugin is responsible for defining the contract,  and for interacting with its subplugins, though we intend to create helpers to make this easier.&lt;br /&gt;
&lt;br /&gt;
The parent plugin should define a new interface for each type of subplugin that it defines. This interface should extend the &#039;&#039;\core_privacy\local\request\plugin\subplugin_provider&#039;&#039; interface.&lt;br /&gt;
&lt;br /&gt;
===== When a parent plugin should and should not provide the interface for its subplugins =====&lt;br /&gt;
&lt;br /&gt;
There can be cases when there is no point for a plugin to provide the &amp;quot;subplugin_provider&amp;quot; based interface, even if it has own subplugins. See the Atto or TinyMCE editors as real examples.&lt;br /&gt;
&lt;br /&gt;
If the parent plugin has no data passed through to the subplugins, there is no benefit in defining a subplugin provider. For example, Atto subplugins are just used to enhance the functionality and they never receive anything like a context. Most of the time we need to define a subplugin provider, but in cases where there is no data passed from the plugin to its subplugins, there is no need to define the subplugin provider. If the subplugins still do store personal data that are not related to the parent plugin in any way, then subplugins should define their own standard provider.&lt;br /&gt;
&lt;br /&gt;
Compare with something like mod_assign where the subplugins store data for the parent and that data is contextually relevant to the parent plugin. In those cases the subplugin stores data for the plugin and it only makes sense to do so in the context of its parent plugin.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
The following example defines the contract that assign submission subplugins may be required to implement.&lt;br /&gt;
&lt;br /&gt;
The assignment module is responsible for returning the contexts of all assignments where a user has data, but in some cases it is unaware of all of those cases - for example if a Teacher comments on a student submission it may not be aware of these as the information about this interaction may not be stored within its own tables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/assign/privacy/assignsubmission_provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace mod_assign\privacy;&lt;br /&gt;
use \core_privacy\local\metadata\collection;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
interface assignsubmission_provider extends&lt;br /&gt;
    // This Interface defines a subplugin.&lt;br /&gt;
    \core_privacy\local\request\plugin\subplugin_provider {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the SQL required to find all submission items where this user has had any involvements. &lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  \stdClass                   Object containing the join, params, and where used to select a these records from the database.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_items_with_user_interaction(int $userid) : \stdClass ;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Export all relevant user submissions information which match the combination of userid and attemptid.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @param   \context      $context      The context to export this submission against.&lt;br /&gt;
     * @param   array         $subcontext   The subcontext within the context to export this information&lt;br /&gt;
     * @param   int           $attid        The id of the submission to export.&lt;br /&gt;
     */&lt;br /&gt;
    public static function export_user_submissions(int $userid, \context $context, array $subcontext, int $attid) ;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Plugins which are subplugins to another plugin====&lt;br /&gt;
&lt;br /&gt;
If you are developing a sub-plugin of another plugin, then you will have to look at the relevant plugin in order to determine the exact contract.&lt;br /&gt;
&lt;br /&gt;
Each subplugin type should define a new interface which extends the &#039;&#039;\core_privacy\local\request\plugin\subplugin_provider&#039;&#039; interface and it is up to the parent plugin to define how they will interact with their children.&lt;br /&gt;
&lt;br /&gt;
The principles remain the same, but the exact implementation will differ depending upon requirements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/pluginname/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
namespace assignsubmission\onlinetext;&lt;br /&gt;
&lt;br /&gt;
class provider implements&lt;br /&gt;
    // This plugin does store personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
&lt;br /&gt;
    // This plugin is a subplugin of assign and must meet that contract.&lt;br /&gt;
    \mod_assign\privacy\assignsubmission_provider {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Plugins which are typically called by a Moodle subsystem====&lt;br /&gt;
&lt;br /&gt;
There are a number of plugintypes in Moodle which are typically called by a specific Moodle subsystem.&lt;br /&gt;
&lt;br /&gt;
Some of these are &#039;&#039;only&#039;&#039; called by that subsystem, for example plugins which are of the &#039;&#039;plagiarism&#039;&#039; plugintype should never be called directly, but are always invoked via the &#039;&#039;core_plagiarism&#039;&#039; subsystem.&lt;br /&gt;
&lt;br /&gt;
Conversely, there maybe other plugintypes which can be called both via a subsystem, and in some other fashion. We are still determining whether any plugintypes currently fit this pattern.&lt;br /&gt;
&lt;br /&gt;
If you are developing a plugin which belongs to a specific subsystem, then you will have to look at the relevant plugin in order to determine the exact contract.&lt;br /&gt;
&lt;br /&gt;
Each subsystem will define a new interface which extends the &#039;&#039;\core_privacy\local\request\plugin\subsystem_provider&#039;&#039; interface and it is up to that subsystem to define how they will interact with those plugins.&lt;br /&gt;
&lt;br /&gt;
The principles remain the same, but the exact implementation will differ depending upon requirements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;plagiarism/detectorator/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
namespace plagiarism_detectorator\privacy;&lt;br /&gt;
&lt;br /&gt;
class provider implements&lt;br /&gt;
    // This plugin does export personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
&lt;br /&gt;
    // This plugin is always linked against another activity module via the Plagiarism API.&lt;br /&gt;
    \core_plagiarism\privacy\plugin_provider {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exporting data====&lt;br /&gt;
&lt;br /&gt;
Any plugin which stores data must also export it.&lt;br /&gt;
&lt;br /&gt;
To cater for this the privacy API includes a &#039;&#039;\core_privacy\local\request\content_writer&#039;&#039;, which defines a set of functions to store different types of data.&lt;br /&gt;
&lt;br /&gt;
Broadly speaking data is broken into the following types:&lt;br /&gt;
&lt;br /&gt;
* Data - this is the object being described. For example the post content in a forum post;&lt;br /&gt;
* Related data - this is data related to the object being stored. For example, ratings of a forum post;&lt;br /&gt;
* Metadata - This is metadata about the main object. For example whether you are subscribed to a forum discussion;&lt;br /&gt;
* User preferences - this is data about a site-wide preference;&lt;br /&gt;
* Files - Any files that you are stored within Moodle on behalf of this plugin; and&lt;br /&gt;
* Custom files - For custom file formats - e.g. a calendar feed for calendar data. These should be used sparingly.&lt;br /&gt;
&lt;br /&gt;
Each piece of data is stored against a specific Moodle &#039;&#039;context&#039;&#039;, which will define how the data is structured within the exporter.&lt;br /&gt;
Data, and Related data only accept the &#039;&#039;stdClass&#039;&#039; object, whilst metadata should be stored as a set of key/value pairs which include a description.&lt;br /&gt;
&lt;br /&gt;
In some cases the data being stored belongs within an implicit structure. For example, one forum has many forum discussions, which each have a number of forum posts. This structure is represented by an &#039;&#039;array&#039;&#039; referred to as a &#039;&#039;subcontext&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;content_writer&#039;&#039; must &#039;&#039;always&#039;&#039; be called with a specific context, and can be called as follows:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
use \core_privacy\local\request\writer;&lt;br /&gt;
&lt;br /&gt;
writer::with_context($context)&lt;br /&gt;
    -&amp;gt;export_data($subcontext, $post)&lt;br /&gt;
    -&amp;gt;export_area_files($subcontext, &#039;mod_forum&#039;, &#039;post&#039;, $post-&amp;gt;id)&lt;br /&gt;
    -&amp;gt;export_metadata($subcontext, &#039;postread&#039;, (object) [&#039;firstread&#039; =&amp;gt; $firstread], new \lang_string(&#039;privacy:export:post:postread&#039;));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any text field which supports Moodle files must also be rewritten:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
use \core_privacy\local\request\writer;&lt;br /&gt;
&lt;br /&gt;
$post-&amp;gt;message = writer::with_context($context)&lt;br /&gt;
    -&amp;gt;rewrite_pluginfile_urls($subcontext, &#039;mod_forum&#039;, &#039;post&#039;, $post-&amp;gt;id, $post-&amp;gt;message);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Providing a way to delete user data===&lt;br /&gt;
&lt;br /&gt;
Deleting user data is also implemented in the request interface. There are two methods that need to be created. The first one to remove all user data from a context, the other to remove user data for a specific user in a list of contexts.&lt;br /&gt;
&lt;br /&gt;
====Delete for a context====&lt;br /&gt;
&lt;br /&gt;
A context is given and all user data (for all users) is to be deleted from the plugin. This will be called when the retention period for the context has expired to adhere to the privacy by design requirement. Retention periods are set in the Data registry.&lt;br /&gt;
&lt;br /&gt;
Note that this will be called for &#039;&#039;&#039;any&#039;&#039;&#039; context being expired, not only those the plugin holds data for (as returned by get_contexts_for_userid()), so you must carefully check the contexts given.&lt;br /&gt;
&lt;br /&gt;
When expiring content for a high-level context such as a course context, the function will be called not only with the course context but also with each context within the course: each module context, each block context, etc. At each level you should only expire data specifically related to that exact context. For a module plugin, this generally means you should only take action for CONTEXT_MODULE contexts and only if they relate to an instance of your module, as shown in the following example. (In the rare case where your module also stores user data related to the course, and not just for a module instance, then you do need to implement CONTEXT_COURSE level contexts to expire that course-level data.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Delete all personal data for all users in the specified context.&lt;br /&gt;
 *&lt;br /&gt;
 * @param context $context Context to delete data from.&lt;br /&gt;
 */&lt;br /&gt;
public static function delete_data_for_all_users_in_context(\context $context) {&lt;br /&gt;
    global $DB;&lt;br /&gt;
&lt;br /&gt;
    if ($context-&amp;gt;contextlevel != CONTEXT_MODULE) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $cm = get_coursemodule_from_id(&#039;choice&#039;, $context-&amp;gt;instanceid);&lt;br /&gt;
    if (!$cm) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $DB-&amp;gt;delete_records(&#039;choice_answers&#039;, [&#039;choiceid&#039; =&amp;gt; $cm-&amp;gt;instance]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Delete personal information for a specific user and context(s)====&lt;br /&gt;
&lt;br /&gt;
An &#039;&#039;approved_contextlist&#039;&#039; is given and user data related to that user should either be completely deleted, or overwritten if a structure needs to be maintained. This will be called when a user has requested the right to be forgotten. All attempts should be made to delete this data where practical while still allowing the plugin to be used by other users.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/choice/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function delete_data_for_user(approved_contextlist $contextlist) {&lt;br /&gt;
    global $DB;&lt;br /&gt;
    &lt;br /&gt;
    if (empty($contextlist-&amp;gt;count())) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    $userid = $contextlist-&amp;gt;get_user()-&amp;gt;id;&lt;br /&gt;
    foreach ($contextlist-&amp;gt;get_contexts() as $context) {&lt;br /&gt;
        $instanceid = $DB-&amp;gt;get_field(&#039;course_modules&#039;, &#039;instance&#039;, [&#039;id&#039; =&amp;gt; $context-&amp;gt;instanceid], MUST_EXIST);&lt;br /&gt;
        $DB-&amp;gt;delete_records(&#039;choice_answers&#039;, [&#039;choiceid&#039; =&amp;gt; $instanceid, &#039;userid&#039; =&amp;gt; $userid]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Delete personal information for several users in a specific context====&lt;br /&gt;
&lt;br /&gt;
An &#039;&#039;approved_userlist&#039;&#039; is given and user data related to all users in the specified context should either be completely deleted, or overwritten if a structure needs to be maintained. This will be called when a user has requested the right to be forgotten when per-role overrides exist, or when performing a per-role expiry of a context. All attempts should be made to delete this data where practical while still allowing the plugin to be used by other users.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/chat/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Delete multiple users within a single context.&lt;br /&gt;
 *&lt;br /&gt;
 * @param approved_userlist $userlist The approved context and user information to delete information for.&lt;br /&gt;
 */&lt;br /&gt;
public static function delete_data_for_users(approved_userlist $userlist) {&lt;br /&gt;
    global $DB;&lt;br /&gt;
&lt;br /&gt;
    $context = $userlist-&amp;gt;get_context();&lt;br /&gt;
    $cm = $DB-&amp;gt;get_record(&#039;course_modules&#039;, [&#039;id&#039; =&amp;gt; $context-&amp;gt;instanceid]);&lt;br /&gt;
    $chat = $DB-&amp;gt;get_record(&#039;chat&#039;, [&#039;id&#039; =&amp;gt; $cm-&amp;gt;instance]);&lt;br /&gt;
&lt;br /&gt;
    list($userinsql, $userinparams) = $DB-&amp;gt;get_in_or_equal($userlist-&amp;gt;get_userids(), SQL_PARAMS_NAMED);&lt;br /&gt;
    $params = array_merge([&#039;chatid&#039; =&amp;gt; $chat-&amp;gt;id], $userinparams);&lt;br /&gt;
    $sql = &amp;quot;chatid = :chatid AND userid {$userinsql}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    $DB-&amp;gt;delete_records_select(&#039;chat_messages&#039;, $sql, $params);&lt;br /&gt;
    $DB-&amp;gt;delete_records_select(&#039;chat_messages_current&#039;, $sql, $params);&lt;br /&gt;
    $DB-&amp;gt;delete_records_select(&#039;chat_users&#039;, $sql, $params);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Difference between Moodle 3.3 and more recent versions==&lt;br /&gt;
Moodle 3.3 has a minimum requirement of php 5.6 and so type hinting and return type declarations are not supported in this version. &lt;br /&gt;
Consequently the privacy API for this version does not have these features.&lt;br /&gt;
==Common Questions==&lt;br /&gt;
===What to do if you have one plugin that supports multiple branches===&lt;br /&gt;
This is something that we have considered and we have put in place a polyfill. This gets around the restrictions of one version having type hinting and return type declarations while another does not.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
To use the polyfill include the legacy polyfill trait and create the necessary static methods but with an underscore (shown below).&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
class provider implements&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
    \core_privacy\local\request\plugin\provider {&lt;br /&gt;
&lt;br /&gt;
    // This trait must be included.&lt;br /&gt;
    use \core_privacy\local\legacy_polyfill;&lt;br /&gt;
&lt;br /&gt;
    // The required methods must be in this format starting with an underscore.&lt;br /&gt;
    public static function _get_metadata(collection $collection) {&lt;br /&gt;
        // Code for returning metadata goes here.&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===What to do if your plugin must implement a subplugin or subsystem plugin provider===&lt;br /&gt;
For subplugins (e.g. assignsubmission, assignfeedback, quiz report, quiz access rules), or subsystems which have a plugintype relationship (portfolio, plagiarism, and others), they will also define their own legacy polyfill.&lt;br /&gt;
&lt;br /&gt;
In this instance you will need to include the trait for both the core polyfill, and the provider polyfill as appropriate.&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
class provider implements&lt;br /&gt;
    // This plugin has data and must therefore define the metadata provider in order to describe it.&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
&lt;br /&gt;
    // This is a plagiarism plugin. It interacts with the plagiarism subsystem rather than with core.&lt;br /&gt;
    \core_plagiarism\privacy\plagiarism_provider {&lt;br /&gt;
&lt;br /&gt;
    // This trait must be included to provide the relevant polyfill for the metadata provider.&lt;br /&gt;
    use \core_privacy\local\legacy_polyfill;&lt;br /&gt;
&lt;br /&gt;
    // This trait must be included to provide the relevant polyfill for the plagirism provider.&lt;br /&gt;
    use \core_plagiarism\privacy\plagiarism_provider\legacy_polyfill;&lt;br /&gt;
&lt;br /&gt;
    // The required methods must be in this format starting with an underscore.&lt;br /&gt;
    public static function _get_metadata(collection $collection) {&lt;br /&gt;
        // Code for returning metadata goes here.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // This is one of the polyfilled methods from the plagiarism provider.&lt;br /&gt;
    public static function _export_plagiarism_user_data($userid, \context $context, array $subcontext, array $linkarray) {&lt;br /&gt;
        // ...&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tips for development ==&lt;br /&gt;
&lt;br /&gt;
* While implementing the privacy API into your plugin, there are CLI scripts that can help you to test things on the fly. Just don&#039;t forget these are not supposed to replace proper unit tests. See [[Privacy API/Utilities]] for details.&lt;br /&gt;
* Inherit Unit tests from the &amp;lt;code php&amp;gt;core_privacy\tests\provider_testcase&amp;lt;/code&amp;gt;, not &amp;lt;code php&amp;gt;advanced_testcase&amp;lt;/code&amp;gt;. Advanced test case doesn&#039;t reset the Privacy content_writer between tests!&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Subject Access Request FAQ]]&lt;br /&gt;
* [[:en:GDPR|GDPR]] in the user documentation&lt;br /&gt;
* [[Privacy API/Utilities]] provides CLI scripts that are helpful during development&lt;br /&gt;
&lt;br /&gt;
[[Category:Privacy]]&lt;br /&gt;
[[Category:GDPR]]&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Message_API&amp;diff=54985</id>
		<title>Message API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Message_API&amp;diff=54985"/>
		<updated>2018-11-12T02:49:26Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Deprecation of using a stdClass for creating a message mentioned.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==What is this document?==&lt;br /&gt;
&lt;br /&gt;
This document describes how to make use of the Moodle Messaging API to send messages to Moodle users.&lt;br /&gt;
&lt;br /&gt;
If you are after a general introduction on using the Moodle Messaging system go to [[:en:Messaging|messaging user documentation]].&lt;br /&gt;
&lt;br /&gt;
If you are looking for details of how the Messaging system&#039;s internal structure was implemented, go to [[Messaging 2.0]].&lt;br /&gt;
&lt;br /&gt;
If you are looking for instructions on the implementation of a custom message processor (a component that receives messages sent to a user), go to [[Messaging custom components]].&lt;br /&gt;
&lt;br /&gt;
If you are looking for instructions on sending messages programatically within Moodle then read on...&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
Moodle components have the ability to send messages to users via the Moodle messaging system. Any type of component, for example a plugin or block, can register as a message producer then send messages to users.&lt;br /&gt;
&lt;br /&gt;
==File locations==&lt;br /&gt;
&lt;br /&gt;
The Message API code is contained within lib/messagelib.php and is automatically included for you during page setup.&lt;br /&gt;
&lt;br /&gt;
==Functions==&lt;br /&gt;
&lt;br /&gt;
message_send() is the primary point of contact for the message API. Call it to send a message to a user. You can find a full description of the arguments that must be supplied at (link to phpdocs). There is also an example below.&lt;br /&gt;
&lt;br /&gt;
==Message popup==&lt;br /&gt;
{{Moodle_2.9}}&lt;br /&gt;
A Javascript popup can be displayed through a link to invite a user to message another. In order to use this feature, you need to require the Javascript libraries using &#039;&#039;message_messenger_requirejs()&#039;&#039; and create a link with the attributes returned by &#039;&#039;message_messenger_sendmessage_link_params()&#039;&#039;. More in the examples.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
&lt;br /&gt;
===How to register as a message producer===&lt;br /&gt;
&lt;br /&gt;
The messages produced by a message provider is defined in the /db/messages.php file of a component. Below is code from the quiz module&#039;s messages.php file, shown as an example.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
defined(&#039;MOODLE_INTERNAL&#039;) || die();&lt;br /&gt;
$messageproviders = array (&lt;br /&gt;
    // Notify teacher that a student has submitted a quiz attempt&lt;br /&gt;
    &#039;submission&#039; =&amp;gt; array (&lt;br /&gt;
        &#039;capability&#039;  =&amp;gt; &#039;mod/quiz:emailnotifysubmission&#039;&lt;br /&gt;
    ),&lt;br /&gt;
    // Confirm a student&#039;s quiz attempt&lt;br /&gt;
    &#039;confirmation&#039; =&amp;gt; array (&lt;br /&gt;
        &#039;capability&#039;  =&amp;gt; &#039;mod/quiz:emailconfirmsubmission&#039;&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The quiz can send two kinds of messages, quiz &amp;quot;submission&amp;quot; and &amp;quot;confirmation&amp;quot; notifications. Each message type is only available to users with the appropriate capability. Please note that the capability is checked at the system level context. Users who have this capability will have this message listed in their messaging preferences. You can omit the capability section if your message should be visible for all users. For example forum post notifications are available to all users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$messageproviders = array (&lt;br /&gt;
    // Ordinary single forum posts&lt;br /&gt;
    &#039;posts&#039; =&amp;gt; array (&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When displaying your message types in a user&#039;s messaging preferences it will use a string from your component&#039;s language file called &amp;quot;messageprovider:messagename&amp;quot;. For example here are the relevant strings from the quiz&#039;s language file.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$string[&#039;messageprovider:confirmation&#039;] = &#039;Confirmation of your own quiz submissions&#039;;&lt;br /&gt;
$string[&#039;messageprovider:submission&#039;] = &#039;Notification of quiz submissions&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once your messages.php is complete you need to increase the version number of your component in its version.php. That will cause Moodle to check messages.php looking for new or changed message definitions. Log in as an admin and go to /admin/index.php (the Notifications page) to start the upgrade process.&lt;br /&gt;
===Setting defaults===&lt;br /&gt;
The default processor can be set using an element of the array &lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
 &#039;mynotification&#039; =&amp;gt; [&lt;br /&gt;
         &#039;defaults&#039; =&amp;gt; [&lt;br /&gt;
              &#039;popup&#039; =&amp;gt; MESSAGE_PERMITTED + MESSAGE_DEFAULT_LOGGEDIN + MESSAGE_DEFAULT_LOGGEDOFF,&lt;br /&gt;
              &#039;email&#039; =&amp;gt; MESSAGE_PERMITTED &lt;br /&gt;
          ],&lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
With that setting email will be permitted but disabled for each user by default. It  can be turned on by each user through the preferences/notification preferences options (/message/notificationpreferences.php?userid=X)&lt;br /&gt;
The possible values are recorded in the lib.php file of messaging&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Define contants for messaging default settings population. For unambiguity of&lt;br /&gt;
 * plugin developer intentions we use 4-bit value (LSB numbering):&lt;br /&gt;
 * bit 0 - whether to send message when user is loggedin (MESSAGE_DEFAULT_LOGGEDIN)&lt;br /&gt;
 * bit 1 - whether to send message when user is loggedoff (MESSAGE_DEFAULT_LOGGEDOFF)&lt;br /&gt;
 * bit 2..3 - messaging permission (MESSAGE_DISALLOWED|MESSAGE_PERMITTED|MESSAGE_FORCED)&lt;br /&gt;
 *&lt;br /&gt;
 * MESSAGE_PERMITTED_MASK contains the mask we use to distinguish permission setting&lt;br /&gt;
 */&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Note that if you change the values in message.php and then upgrade the plugin the values will not automatically be changed in the config_plugins table where they are stored.&lt;br /&gt;
&lt;br /&gt;
===How to send a message===&lt;br /&gt;
{{Moodle_2.9}}&lt;br /&gt;
Here is example code showing you how to actually send a message. The example shows the construction of a object with specific properties, which is then passed to the message_send() function that uses the information to send a message.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$message = new \core\message\message();&lt;br /&gt;
$message-&amp;gt;component = &#039;moodle&#039;;&lt;br /&gt;
$message-&amp;gt;name = &#039;instantmessage&#039;;&lt;br /&gt;
$message-&amp;gt;userfrom = $USER;&lt;br /&gt;
$message-&amp;gt;userto = $user;&lt;br /&gt;
$message-&amp;gt;subject = &#039;message subject 1&#039;;&lt;br /&gt;
$message-&amp;gt;fullmessage = &#039;message body&#039;;&lt;br /&gt;
$message-&amp;gt;fullmessageformat = FORMAT_MARKDOWN;&lt;br /&gt;
$message-&amp;gt;fullmessagehtml = &#039;&amp;lt;p&amp;gt;message body&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
$message-&amp;gt;smallmessage = &#039;small message&#039;;&lt;br /&gt;
$message-&amp;gt;notification = &#039;0&#039;;&lt;br /&gt;
$message-&amp;gt;contexturl = &#039;http://GalaxyFarFarAway.com&#039;;&lt;br /&gt;
$message-&amp;gt;contexturlname = &#039;Context name&#039;;&lt;br /&gt;
$message-&amp;gt;replyto = &amp;quot;random@example.com&amp;quot;;&lt;br /&gt;
$content = array(&#039;*&#039; =&amp;gt; array(&#039;header&#039; =&amp;gt; &#039; test &#039;, &#039;footer&#039; =&amp;gt; &#039; test &#039;)); // Extra content for specific processor&lt;br /&gt;
$message-&amp;gt;set_additional_content(&#039;email&#039;, $content);&lt;br /&gt;
$message-&amp;gt;courseid = $course-&amp;gt;id; // This is required in recent versions, use it from 3.2 on https://tracker.moodle.org/browse/MDL-47162&lt;br /&gt;
&lt;br /&gt;
// Create a file instance.&lt;br /&gt;
$usercontext = context_user::instance($user-&amp;gt;id);&lt;br /&gt;
$file = new stdClass;&lt;br /&gt;
$file-&amp;gt;contextid = $usercontext-&amp;gt;id;&lt;br /&gt;
$file-&amp;gt;component = &#039;user&#039;;&lt;br /&gt;
$file-&amp;gt;filearea  = &#039;private&#039;;&lt;br /&gt;
$file-&amp;gt;itemid    = 0;&lt;br /&gt;
$file-&amp;gt;filepath  = &#039;/&#039;;&lt;br /&gt;
$file-&amp;gt;filename  = &#039;1.txt&#039;;&lt;br /&gt;
$file-&amp;gt;source    = &#039;test&#039;;&lt;br /&gt;
&lt;br /&gt;
$fs = get_file_storage();&lt;br /&gt;
$file = $fs-&amp;gt;create_file_from_string($file, &#039;file1 content&#039;);&lt;br /&gt;
$message-&amp;gt;attachment = $file;&lt;br /&gt;
&lt;br /&gt;
$messageid = message_send($message);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before 2.9 message data used to be a stdClass object as shown below (This formation of a message will no longer work as of Moodle 3.6. Only a message object will be accepted):-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$message = new stdClass();&lt;br /&gt;
$message-&amp;gt;component         = &#039;mod_quiz&#039;; //your component name&lt;br /&gt;
$message-&amp;gt;name              = &#039;submission&#039;; //this is the message name from messages.php&lt;br /&gt;
$message-&amp;gt;userfrom          = $USER;&lt;br /&gt;
$message-&amp;gt;userto            = $touser;&lt;br /&gt;
$message-&amp;gt;subject           = $subject;&lt;br /&gt;
$message-&amp;gt;fullmessage       = $message;&lt;br /&gt;
$message-&amp;gt;fullmessageformat = FORMAT_PLAIN;&lt;br /&gt;
$message-&amp;gt;fullmessagehtml   = &#039;&#039;;&lt;br /&gt;
$message-&amp;gt;smallmessage      = &#039;&#039;;&lt;br /&gt;
$message-&amp;gt;notification      = 1; //this is only set to 0 for personal messages between users&lt;br /&gt;
message_send($message);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===How to set-up the message popup===&lt;br /&gt;
&lt;br /&gt;
Here is example code showing you how to set-up the Javascript popup link.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
require_once(&#039;message/lib.php&#039;);&lt;br /&gt;
$userid = 2;&lt;br /&gt;
$userto = $DB-&amp;gt;get_record(&#039;user&#039;, array(&#039;id&#039; =&amp;gt; $userid));&lt;br /&gt;
&lt;br /&gt;
message_messenger_requirejs();&lt;br /&gt;
$url = new moodle_url(&#039;message/index.php&#039;, array(&#039;id&#039; =&amp;gt; $userto-&amp;gt;id));&lt;br /&gt;
$attributes = message_messenger_sendmessage_link_params($userto);&lt;br /&gt;
echo html_writer::link($url, &#039;Send a message&#039;, $attributes);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Core APIs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;br /&gt;
[[Category:Tutorial]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Messaging]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Privacy_API&amp;diff=54013</id>
		<title>Privacy API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Privacy_API&amp;diff=54013"/>
		<updated>2018-04-10T08:02:13Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* Example - fix up for my bad English */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [https://en.wikipedia.org/wiki/General_Data_Protection_Regulation General Data Protection Regulation] (GDPR) is an EU directive that looks at providing users with more control over their data and how it is processed. This regulation will come into effect on 25th of May 2018 and covers any citizen or permanent resident of the European Union. The directive will be respected by a number of other countries outside of the European Union.&lt;br /&gt;
&lt;br /&gt;
To help institutions become compliant with this new regulation we are adding functionality to Moodle. This includes a number of components, amongst others these include a user’s right to:&lt;br /&gt;
&lt;br /&gt;
* request information on the types of personal data held, the instances of that data, and the deletion policy for each;&lt;br /&gt;
* access all of their data; and&lt;br /&gt;
* be forgotten.&lt;br /&gt;
&lt;br /&gt;
The compliance requirements also extend to installed plugins (including third party plugins). These need to also be able to report what information they store or process regarding users, and have the ability to provide and delete data for a user request.&lt;br /&gt;
&lt;br /&gt;
This document describes the proposed API changes required for plugins which will allow a Moodle installation to become GDPR compliant.&lt;br /&gt;
&lt;br /&gt;
Target Audience: The intended audience for this document is Moodle plugin developers, who are aiming to ensure their plugins are updated to comply with GDPR requirements coming into effect in the EU in May, 2018.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Personal data in Moodle==&lt;br /&gt;
&lt;br /&gt;
From the GDPR Spec, Article 4:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;‘personal data’ means any information relating to an identified or identifiable natural person (‘data subject’); an identifiable natural person is one who can be identified, directly or indirectly, in particular by reference to an identifier such as a name, an identification number, location data, an online identifier or to one or more factors specific to the physical, physiological, genetic, mental, economic, cultural or social identity of that natural person;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In Moodle, we need to consider two main types of personal data; information entered by the user and information stored about the user. The key difference being that information stored about the user will have come from a source other than the user themselves. Both types of data can be used to form a profile of the individual.&lt;br /&gt;
&lt;br /&gt;
The most obvious clue to finding personal data entered by the user is the presence of a userid on a database field. Any data on the record (or linked records) pertaining to that user may be deemed personal data for that user, including things like timestamps and record identification numbers. Additionally, any free text field which allows the user to enter information must also be considered to be the personal data of that user.&lt;br /&gt;
&lt;br /&gt;
Data stored about the user includes things like ratings and comments made on a student submission. These may have been made by an assessor or teacher, but are considered the personal data of the student, as they are considered a reflection of the user’s competency in the subject matter and can be used to form a profile of that individual. &lt;br /&gt;
&lt;br /&gt;
The sections that follow outline what you need to do as a plugin developer to ensure any personal data is advertised and can be accessed and deleted according to the GDPR requirements.&lt;br /&gt;
&lt;br /&gt;
==Background==&lt;br /&gt;
&lt;br /&gt;
===Architecture overview===&lt;br /&gt;
&lt;br /&gt;
A new system for Privacy has been created within Moodle. This is broken down into several main parts and forms the &#039;&#039;core_privacy&#039;&#039; subsystem:&lt;br /&gt;
&lt;br /&gt;
* Some metadata providers - a set of PHP interfaces to be implemented by components for that component to describe the kind of data that it stores, and the purpose for its storage;&lt;br /&gt;
* Some request providers - a set of PHP interfaces to be implemented by components to allow that component to act upon user requests such as the Right to be Forgotten, and a Subject Access Request; and&lt;br /&gt;
* A manager - a concrete class used to bridge components which implement the providers with tools which request their data.&lt;br /&gt;
&lt;br /&gt;
All plugins will implement one metadata provider, and zero, one or two request providers.&lt;br /&gt;
&lt;br /&gt;
The fetching of data is broken into two separate steps:&lt;br /&gt;
&lt;br /&gt;
# Detecting in which Moodle contexts the user has any data; and&lt;br /&gt;
# Exporting all data from each of those contexts.&lt;br /&gt;
&lt;br /&gt;
This has been broken into two steps to later allow administrators to exclude certain contexts from an export - e.g. for courses currently in progress.&lt;br /&gt;
&lt;br /&gt;
A third component will later be added to facilitate the deletion of data within these contexts which will help to satisfy the Right to be Forgotten. This will also use the first step.&lt;br /&gt;
&lt;br /&gt;
===Implementing a provider===&lt;br /&gt;
&lt;br /&gt;
All plugins will need to create a concrete class which implements the relevant metadata and request providers. The exact providers you need to implement will depend on what data you store, and the type of plugin. This is covered in more detail in the following sections of the document.&lt;br /&gt;
&lt;br /&gt;
In order to do so:&lt;br /&gt;
&lt;br /&gt;
# You must create a class called &#039;&#039;provider&#039;&#039; within the namespace &#039;&#039;\your_pluginname\privacy&#039;&#039;.&lt;br /&gt;
# This class must be created at &#039;&#039;path/to/your/plugin/classes/privacy/provider.php&#039;&#039;.&lt;br /&gt;
# You must have your class implement the relevant metadata and request interfaces.&lt;br /&gt;
&lt;br /&gt;
==Plugins which do not store personal data==&lt;br /&gt;
&lt;br /&gt;
Many Moodle plugins do not store any personal data. This is usually the case for plugins which just add functionality, or which display the data already stored elsewhere in Moodle.&lt;br /&gt;
&lt;br /&gt;
Some examples of plugin types which might fit this criteria include themes, blocks, filters, editor plugins, etc.&lt;br /&gt;
&lt;br /&gt;
Plugins which cause data to be stored elsewhere in Moodle (e.g. via a subsystem call) are considered to store data.&lt;br /&gt;
&lt;br /&gt;
One examples of a plugin which does not store any data would be the Calendar month block which just displays a view of the user’s calendar. It does not store any data itself.&lt;br /&gt;
&lt;br /&gt;
An example of a plugin which must not use the null provider is the Comments block. The comments block is responsible for data subsequently being stored within Moodle. Although the block doesn’t store anything itself, it interacts with the comments subsystem and is the only component which knows how that data maps to a user.&lt;br /&gt;
&lt;br /&gt;
===Implementation requirements===&lt;br /&gt;
&lt;br /&gt;
In order to let Moodle know that you have audited your plugin, and that you do not store any personal user data, you must implement the &#039;&#039;\core_privacy\local\metadata\null_provider&#039;&#039; interface in your plugin’s provider.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;null_provider&#039;&#039; requires you to define one function &#039;&#039;get_reason()&#039;&#039; which returns the language string identifier within your component.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;block/calendar_month/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace block_calendar_month\privacy;&lt;br /&gt;
&lt;br /&gt;
class provider implements &lt;br /&gt;
    // This plugin does not store any personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\null_provider {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the language string identifier with the component&#039;s language&lt;br /&gt;
     * file to explain why this plugin stores no data.&lt;br /&gt;
     *&lt;br /&gt;
     * @return  string&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_reason() : string {&lt;br /&gt;
        return &#039;privacy:null_reason&#039;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;block/calendar_month/lang/en/block_calendar_month.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:null_reason&#039;] = &#039;The calendar month block displays information from the Calendar, but does not effect or store any data itself. All changes are made via the Calendar.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That’s it. Congratulations, your plugin now implements the Privacy API.&lt;br /&gt;
&lt;br /&gt;
==Plugins which store personal data==&lt;br /&gt;
&lt;br /&gt;
Many Moodle plugins do store some form of personal data.&lt;br /&gt;
&lt;br /&gt;
In some cases this will be stored within database tables in your plugin, and in other cases this will be in one of Moodle’s core subsystems - for example your plugin may store files, ratings, comments, or tags.&lt;br /&gt;
&lt;br /&gt;
Plugins which do store data will need to:&lt;br /&gt;
&lt;br /&gt;
* Describe the type of data that they store; &lt;br /&gt;
* Provide a way to export that data; and&lt;br /&gt;
* Provide a way to delete that data.&lt;br /&gt;
&lt;br /&gt;
Data is described via a &#039;&#039;metadata&#039;&#039; provider, and it is both exported and deleted via an implementation of a &#039;&#039;request&#039;&#039; provider.&lt;br /&gt;
&lt;br /&gt;
These are both explained in the sections below.&lt;br /&gt;
&lt;br /&gt;
===Describing the type of data you store===&lt;br /&gt;
&lt;br /&gt;
In order to describe the type of data that you store, you must implement the &#039;&#039;\core_privacy\local\metadata\provider&#039;&#039; interface.&lt;br /&gt;
&lt;br /&gt;
This interfaces requires that you define one function: &#039;&#039;get_metadata&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
There are several types of item to describe the data that you store. These are for:&lt;br /&gt;
&lt;br /&gt;
* Items in the Moodle database;&lt;br /&gt;
* Items stored by you in a Moodle subsystem - for example files, and ratings; and&lt;br /&gt;
* User preferences stored site-wide within Moodle for your plugin&lt;br /&gt;
&lt;br /&gt;
Note: All fields should include a description from a language string within your plugin.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace mod_forum\privacy;&lt;br /&gt;
use \core_privacy\local\metadata\collection;&lt;br /&gt;
&lt;br /&gt;
class provider implements &lt;br /&gt;
    // This plugin does store personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\provider {&lt;br /&gt;
    public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
        return $collection;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you store content in a Moodle subsystem====&lt;br /&gt;
&lt;br /&gt;
Many plugins will use one of the core Moodle subsystems to store data.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer we do not expect you to describe those subsystems in detail, but we do need to know that you use them and to know what you use them for.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;link_subsystem()&#039;&#039; method on the &#039;&#039;collection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;link_subsystem(&lt;br /&gt;
        &#039;core_files&#039;,&lt;br /&gt;
        &#039;privacy:metadata:core_files&#039;&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/lang/en/forum.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:core_files&#039;] = &#039;The forum stores files which have been uploaded by the user to form part of a forum post.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Describing data stored in database tables====&lt;br /&gt;
&lt;br /&gt;
Most Moodle plugins will store some form of user data in their own database tables.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer you will need to describe each database table, and each field which includes user data.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;add_database_table(&lt;br /&gt;
        &#039;forum_discussion_subs&#039;,&lt;br /&gt;
         [&lt;br /&gt;
            &#039;userid&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:userid&#039;,&lt;br /&gt;
            &#039;discussionid&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:discussionid&#039;,&lt;br /&gt;
            &#039;preference&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:preference&#039;,&lt;br /&gt;
&lt;br /&gt;
         ],&lt;br /&gt;
        &#039;privacy:metadata:forum_discussion_subs&#039;&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/lang/en/forum.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs&#039;] = &#039;Information about the subscriptions to individual forum discussions. This includes when a user has chosen to subscribe to a discussion, or to unsubscribe from one where they would otherwise be subscribed.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:userid&#039;] = &#039;The ID of the user with this subscription preference.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:discussionid&#039;] = &#039;The ID of the discussion that was subscribed to.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:preference&#039;] = &#039;The start time of the subscription.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you store site-wide user preferences====&lt;br /&gt;
&lt;br /&gt;
Many plugins will include one or more user preferences. Unfortunately this is one of Moodle’s older components and many of the values stored are not pure user preferences. Each plugin should be aware of how it handles its own preferences and is best placed to determine whether they are site-wide preferences, or per-instance preferences.&lt;br /&gt;
&lt;br /&gt;
Whilst most of these will have a fixed name (e.g. &#039;&#039;filepicker_recentrepository&#039;&#039;), some will include a variable of some kind (e.g. &#039;&#039;tool_usertours_tour_completion_time_2&#039;&#039;). Only the general name needs to be indicated rather than one copy for each preference.&lt;br /&gt;
&lt;br /&gt;
Also, these should only be &#039;&#039;site-wide&#039;&#039; user preferences which do not belong to a specific Moodle context.&lt;br /&gt;
&lt;br /&gt;
In the above examples:&lt;br /&gt;
&lt;br /&gt;
* Preference &#039;&#039;filepicker_recentrepository&#039;&#039; belongs to the file subsystem, and is a site-wide preference affecting the user anywhere that they view the filepicker.&lt;br /&gt;
* Preference &#039;&#039;tool_usertours_tour_completion_time_2&#039;&#039; belongs to user tours. User tours are a site-wide feature which can affect many parts of Moodle and cross multiple contexts.&lt;br /&gt;
&lt;br /&gt;
In some cases a value may be stored in the preferences table but is known to belong to a specific context within Moodle. In these cases they should be stored as metadata against that context rather than as a site-wide user preference.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;add_user_preference()&#039;&#039; method on the &#039;&#039;collection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any plugin providing user preferences must also implement the &#039;&#039;\core_privacy\local\request\preference_provider&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;admin/tool/usertours/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;add_user_preference(&#039;tool_usertours_tour_completion_time,&lt;br /&gt;
        &#039;privacy:metadata:preference:tool_usertours_tour_completion_time&#039;);&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;admin/tool/usertours/lang/en/tool_usertours.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:tool_usertours_tour_completion_time&#039;] = &#039;The time that a specific user tour was last completed by a user.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you export data to an external location====&lt;br /&gt;
&lt;br /&gt;
Many plugins will interact with external systems - for example cloud-based services. Often this external location is configurable within the plugin either at the site or the instance level.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer you will need to describe each &#039;&#039;type&#039;&#039; of target destination, alongside a list of each exported field which includes user data.&lt;br /&gt;
The &#039;&#039;actual&#039;&#039; destination does not need to be described as this can change based on configuration.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;link_external_location()&#039;&#039; method on the collection.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/lti/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;link_external_location(&#039;lti_client&#039;, [&lt;br /&gt;
            &#039;userid&#039; =&amp;gt; &#039;privacy:metadata:lti_client:userid&#039;,&lt;br /&gt;
            &#039;fullname&#039; =&amp;gt; &#039;privacy:metadata:lti_client:fullname&#039;,&lt;br /&gt;
        ], &#039;privacy:metadata:lti_client&#039;);&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/lti/lang/en/lti.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client&#039;] = &#039;In order to integrate with a remote LTI service, user data needs to be exchanged with that service.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client:userid&#039;] = &#039;The userid is sent from Moodle to allow you to access your data on the remote system.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client:fullname&#039;] = &#039;Your full name is sent to the remote system to allow a better user experience.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Providing a way to export user data===&lt;br /&gt;
&lt;br /&gt;
In order to export the user data that you store, you must implement the relevant request provider.&lt;br /&gt;
&lt;br /&gt;
We have named these request providers because they are called in response to a specific request from a user to access their information.&lt;br /&gt;
&lt;br /&gt;
There are several different types of request provider, and you may need to implement several of these, depending on the type and nature of your plugin.&lt;br /&gt;
&lt;br /&gt;
Broadly speaking plugins will fit into one of the following categories:&lt;br /&gt;
&lt;br /&gt;
* Plugins which are a subplugin of another plugin. Examples include &#039;&#039;assignsubmission&#039;&#039;, &#039;&#039;atto&#039;&#039;, and &#039;&#039;datafield&#039;&#039;;&lt;br /&gt;
* Plugins which are typically called by a Moodle subsystem. Examples include &#039;&#039;qtype&#039;&#039;, and &#039;&#039;profilefield&#039;&#039;;&lt;br /&gt;
* All other plugins which store data.&lt;br /&gt;
&lt;br /&gt;
Most plugins will fit into this final category, whilst other plugins may fall into several categories.&lt;br /&gt;
Plugins which &#039;&#039;define&#039;&#039; a subplugin will also be responsible for  collecting this data from their subplugins.&lt;br /&gt;
&lt;br /&gt;
A final category exists - plugins which store user preferences. In some cases this may be the &#039;&#039;only&#039;&#039; provider implemented.&lt;br /&gt;
&lt;br /&gt;
====Standard plugins which store data====&lt;br /&gt;
&lt;br /&gt;
A majority of Moodle plugins will fit into this category and will be required to implement the &#039;&#039;\core_privacy\local\request\plugin\provider&#039;&#039; interface. This interface requires that you define two functions:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;get_contexts_for_userid&#039;&#039; - to explain where data is held within Moodle for your plugin; and&lt;br /&gt;
* &#039;&#039;export_user_data&#039;&#039; - to export a user’s personal data from your plugin.&lt;br /&gt;
&lt;br /&gt;
These APIs make use of the Moodle &#039;&#039;context&#039;&#039; system to hierarchically store this data.&lt;br /&gt;
&lt;br /&gt;
====Retrieving the list of contexts====&lt;br /&gt;
&lt;br /&gt;
Contexts are retrieved using the &#039;&#039;get_contexts_for_userid&#039;&#039; function which takes the ID of the user being fetched, and returns a list of contexts in which the user has any data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_contexts_for_userid(int $userid) : contextlist {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The function returns a &#039;&#039;\core_privacy\local\request\contextlist&#039;&#039; which is used to keep a set of contexts together in a fixed fashion.&lt;br /&gt;
&lt;br /&gt;
Because a Subject Access Request covers &#039;&#039;every&#039;&#039; piece of data that is held for a user within Moodle, efficiency and performance is highly important. As a result, contexts are added to the &#039;&#039;contextlist&#039;&#039; by defining one or more SQL queries which return just the contextid. Multiple SQL queries can be added as required.&lt;br /&gt;
&lt;br /&gt;
Many plugins will interact with specific subsystems and store data within them.&lt;br /&gt;
These subsystems will also provide a way in which to link the data that you have stored with your own database tables.&lt;br /&gt;
At present these are still a work in progress and only the &#039;&#039;core_ratings&#039;&#039; subsystem includes this.&lt;br /&gt;
&lt;br /&gt;
=====Basic example=====&lt;br /&gt;
&lt;br /&gt;
The following example simply fetches the contextid for all forums where a user has a single discussion (note: this is an incomplete example):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_contexts_for_userid(int $userid) : contextlist {&lt;br /&gt;
        $contextlist = new \core_privacy\local\request\contextlist();&lt;br /&gt;
&lt;br /&gt;
        $sql = &amp;quot;SELECT c.id&lt;br /&gt;
                 FROM {context} c&lt;br /&gt;
           INNER JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel&lt;br /&gt;
           INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname&lt;br /&gt;
           INNER JOIN {forum} f ON f.id = cm.instance&lt;br /&gt;
            LEFT JOIN {forum_discussions} d ON d.forum = f.id&lt;br /&gt;
                WHERE (&lt;br /&gt;
                d.userid        = :discussionuserid&lt;br /&gt;
                )&lt;br /&gt;
        &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        $params = [&lt;br /&gt;
            &#039;modname&#039;           =&amp;gt; &#039;forum&#039;,&lt;br /&gt;
            &#039;contextlevel&#039;      =&amp;gt; CONTEXT_MODULE,&lt;br /&gt;
            &#039;discussionuserid&#039;  =&amp;gt; $userid,&lt;br /&gt;
        ];&lt;br /&gt;
&lt;br /&gt;
        $contextlist-&amp;gt;add_from_sql($sql, $params);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====More complete example=====&lt;br /&gt;
&lt;br /&gt;
The following example includes a link to core_rating. &lt;br /&gt;
It will find any forum, forum discussion, or forum post where the user has any data, including:&lt;br /&gt;
&lt;br /&gt;
* Per-forum digest preferences;&lt;br /&gt;
* Per-forum subscription preferences;&lt;br /&gt;
* Per-forum read tracking preferences;&lt;br /&gt;
* Per-discussion subscription preferences;&lt;br /&gt;
* Per-post read data (if a user has read a post or not); and&lt;br /&gt;
* Per-post rating data.&lt;br /&gt;
&lt;br /&gt;
In the case of the rating data, this will include any post where the user has rated the post of another user.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   int           $userid       The user to search.&lt;br /&gt;
 * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
 */&lt;br /&gt;
public static function get_contexts_for_userid(int $userid) : contextlist {&lt;br /&gt;
    $ratingsql = \core_rating\privacy\provider::get_sql_join(&#039;rat&#039;, &#039;mod_forum&#039;, &#039;post&#039;, &#039;p.id&#039;, $userid);&lt;br /&gt;
    // Fetch all forum discussions, and forum posts.&lt;br /&gt;
    $sql = &amp;quot;SELECT c.id&lt;br /&gt;
                FROM {context} c&lt;br /&gt;
        INNER JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel&lt;br /&gt;
        INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname&lt;br /&gt;
        INNER JOIN {forum} f ON f.id = cm.instance&lt;br /&gt;
            LEFT JOIN {forum_discussions} d ON d.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_posts} p ON p.discussion = d.id&lt;br /&gt;
            LEFT JOIN {forum_digests} dig ON dig.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_subscriptions} sub ON sub.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_track_prefs} pref ON pref.forumid = f.id&lt;br /&gt;
            LEFT JOIN {forum_read} hasread ON hasread.forumid = f.id&lt;br /&gt;
            LEFT JOIN {forum_discussion_subs} dsub ON dsub.forum = f.id&lt;br /&gt;
            {$ratingsql-&amp;gt;join}&lt;br /&gt;
                WHERE (&lt;br /&gt;
                p.userid        = :postuserid OR&lt;br /&gt;
                d.userid        = :discussionuserid OR&lt;br /&gt;
                dig.userid      = :digestuserid OR&lt;br /&gt;
                sub.userid      = :subuserid OR&lt;br /&gt;
                pref.userid     = :prefuserid OR&lt;br /&gt;
                hasread.userid  = :hasreaduserid OR&lt;br /&gt;
                dsub.userid     = :dsubuserid OR&lt;br /&gt;
                {$ratingsql-&amp;gt;userwhere}&lt;br /&gt;
            )&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    $params = [&lt;br /&gt;
        &#039;modname&#039;           =&amp;gt; &#039;forum&#039;,&lt;br /&gt;
        &#039;contextlevel&#039;      =&amp;gt; CONTEXT_MODULE,&lt;br /&gt;
        &#039;postuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
        &#039;discussionuserid&#039;  =&amp;gt; $userid,&lt;br /&gt;
        &#039;digestuserid&#039;      =&amp;gt; $userid,&lt;br /&gt;
        &#039;subuserid&#039;         =&amp;gt; $userid,&lt;br /&gt;
        &#039;prefuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
        &#039;hasreaduserid&#039;     =&amp;gt; $userid,&lt;br /&gt;
        &#039;dsubuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
    ];&lt;br /&gt;
    $params += $ratingsql-&amp;gt;params;&lt;br /&gt;
&lt;br /&gt;
    $contextlist = new \core_privacy\local\request\contextlist();&lt;br /&gt;
    $contextlist-&amp;gt;add_from_sql($sql, $params);&lt;br /&gt;
&lt;br /&gt;
    return $contextlist;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exporting user data====&lt;br /&gt;
&lt;br /&gt;
After determining where in Moodle your plugin holds data about a user, the &#039;&#039;\core_privacy\manager&#039;&#039; will then ask your plugin to export all user data for a subset of those locations.&lt;br /&gt;
&lt;br /&gt;
This is achieved through use of the &#039;&#039;export_user_data&#039;&#039; function which takes the list of approved contexts in a &#039;&#039;\core_privacy\local\request\approved_contextlist&#039;&#039; object.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Export all user data for the specified user, in the specified contexts, using the supplied exporter instance.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   approved_contextlist    $contextlist    The approved contexts to export information for.&lt;br /&gt;
 */&lt;br /&gt;
public static function export_user_data(approved_contextlist $contextlist) {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;approved_contextlist&#039;&#039; includes both the user record, and a list of contexts, which can be retrieved by either processing it as an Iterator, or by calling &#039;&#039;get_contextids()&#039;&#039; or &#039;&#039;get_contexts()&#039;&#039; as required.&lt;br /&gt;
&lt;br /&gt;
Data is exported using a &#039;&#039;\core_privacy\local\request\content_writer&#039;&#039;, which is described in further detail below.&lt;br /&gt;
&lt;br /&gt;
===Plugins which store user preferences===&lt;br /&gt;
&lt;br /&gt;
Many plugins store a variety of user preferences, and must therefore export them.&lt;br /&gt;
&lt;br /&gt;
Since user preferences are a site-wide preference, these are exported separately to other user data.&lt;br /&gt;
In some cases the only data present is user preference data, whilst in others there is a combination of user-provided data, and user preferences.&lt;br /&gt;
&lt;br /&gt;
Storing of user preferences is achieved through implementation of the &#039;&#039;\core_privacy\local\request\preference_provider&#039;&#039; interface which defines one required function -- &#039;&#039;export_user_preferences&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Export all user preferences for the plugin.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   int         $userid The userid of the user whose data is to be exported.&lt;br /&gt;
 */&lt;br /&gt;
public static function export_user_preferences(int $userid) {&lt;br /&gt;
    $markasreadonnotification = get_user_preference(&#039;markasreadonnotification&#039;, null, $userid);&lt;br /&gt;
    if (null !== $markasreadonnotification) {&lt;br /&gt;
        switch ($markasreadonnotification) {&lt;br /&gt;
            case 0:&lt;br /&gt;
                $markasreadonnotificationdescription = get_string(&#039;markasreadonnotificationno&#039;, &#039;mod_forum&#039;);&lt;br /&gt;
                break;&lt;br /&gt;
            case 1:&lt;br /&gt;
            default:&lt;br /&gt;
                $markasreadonnotificationdescription = get_string(&#039;markasreadonnotificationyes&#039;, &#039;mod_forum&#039;);&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
        writer::export_user_preference(&#039;mod_forum&#039;, &#039;markasreadonnotification&#039;, $markasreadonnotification, $markasreadonnotificationdescription);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Plugins which define a subplugin===&lt;br /&gt;
&lt;br /&gt;
Many plugin types are also able to define their own subplugins and will need to define a contract between themselves and their subplugins in order to fetch their data.&lt;br /&gt;
&lt;br /&gt;
This is required as the parent plugin and the child subplugin should be separate entities and the parent plugin must be able to function if one or more of its subplugins are uninstalled.&lt;br /&gt;
&lt;br /&gt;
The parent plugin is responsible for defining the contract,  and for interacting with its subplugins, though we intend to create helpers to make this easier.&lt;br /&gt;
&lt;br /&gt;
The parent plugin should define a new interface for each type of subplugin that it defines. This interface should extend the &#039;&#039;\core_privacy\local\request\plugin\subplugin_provider&#039;&#039; interface.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
The following example defines the contract that assign submission subplugins may be required to implement.&lt;br /&gt;
&lt;br /&gt;
The assignment module is responsible for returning the contexts of all assignments where a user has data, but in some cases it is unaware of all of those cases - for example if a Teacher comments on a student submission it may not be aware of these as the information about this interaction may not be stored within its own tables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/assign/privacy/assignsubmission_provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace mod_assign\privacy;&lt;br /&gt;
use \core_privacy\local\metadata\collection;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
interface assignsubmission_provider extends&lt;br /&gt;
    // This Interface defines a subplugin.&lt;br /&gt;
    \core_privacy\local\request\subplugin_provider {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the SQL required to find all submission items where this user has had any involvements. &lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  \stdClass                   Object containing the join, params, and where used to select a these records from the database.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_items_with_user_interaction(int $userid) : \stdClass ;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Export all relevant user submissions information which match the combination of userid and attemptid.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @param   \context      $context      The context to export this submission against.&lt;br /&gt;
     * @param   array         $subcontext   The subcontext within the context to export this information&lt;br /&gt;
     * @param   int           $attid        The id of the submission to export.&lt;br /&gt;
     */&lt;br /&gt;
    public static function export_user_submissions(int $userid, \context $context, array $subcontext, int $attid) ;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Plugins which are subplugins to another plugin===&lt;br /&gt;
&lt;br /&gt;
If you are developing a sub-plugin of another plugin, then you will have to look at the relevant plugin in order to determine the exact contract.&lt;br /&gt;
&lt;br /&gt;
Each subplugin type should define a new interface which extends the &#039;&#039;\core_privacy\local\request\plugin\subplugin_provider&#039;&#039; interface and it is up to the parent plugin to define how they will interact with their children.&lt;br /&gt;
&lt;br /&gt;
The principles remain the same, but the exact implementation will differ depending upon requirements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/pluginname/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
namespace assignsubmission\onlinetext;&lt;br /&gt;
&lt;br /&gt;
class provider implements&lt;br /&gt;
    // This plugin does store personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
&lt;br /&gt;
    // This plugin is a subplugin of assign and must meet that contract.&lt;br /&gt;
    \mod_assign\privacy\assignsubmission_provider {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Plugins which are typically called by a Moodle subsystem===&lt;br /&gt;
&lt;br /&gt;
There are a number of plugintypes in Moodle which are typically called by a specific Moodle subsystem.&lt;br /&gt;
&lt;br /&gt;
Some of these are &#039;&#039;only&#039;&#039; called by that subsystem, for example plugins which are of the &#039;&#039;plagiarism&#039;&#039; plugintype should never be called directly, but are always invoked via the &#039;&#039;core_plagiarism&#039;&#039; subsystem.&lt;br /&gt;
&lt;br /&gt;
Conversely, there maybe other plugintypes which can be called both via a subsystem, and in some other fashion. We are still determining whether any plugintypes currently fit this pattern.&lt;br /&gt;
&lt;br /&gt;
If you are developing a plugin which belongs to a specific subsystem, then you will have to look at the relevant plugin in order to determine the exact contract.&lt;br /&gt;
&lt;br /&gt;
Each subsystem will define a new interface which extends the &#039;&#039;\core_privacy\local\request\plugin\subsystem_provider&#039;&#039; interface and it is up to that subsystem to define how they will interact with those plugins.&lt;br /&gt;
&lt;br /&gt;
The principles remain the same, but the exact implementation will differ depending upon requirements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;plagiarism/detectorator/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
namespace plagiarism_detectorator\privacy;&lt;br /&gt;
&lt;br /&gt;
class provider implements&lt;br /&gt;
    // This plugin does export personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
&lt;br /&gt;
    // This plugin is always linked against another activity module via the Plagiarism API.&lt;br /&gt;
    \core_plagiarism\privacy\plugin_provider {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exporting data===&lt;br /&gt;
&lt;br /&gt;
Any plugin which stores data must also export it.&lt;br /&gt;
&lt;br /&gt;
To cater for this the privacy API includes a &#039;&#039;\core_privacy\local\request\content_writer&#039;&#039;, which defines a set of functions to store different types of data.&lt;br /&gt;
&lt;br /&gt;
Broadly speaking data is broken into the following types:&lt;br /&gt;
&lt;br /&gt;
* Data - this is the object being described. For example the post content in a forum post;&lt;br /&gt;
* Related data - this is data related to the object being stored. For example, ratings of a forum post;&lt;br /&gt;
* Metadata - This is metadata about the main object. For example whether you are subscribed to a forum discussion;&lt;br /&gt;
* User preferences - this is data about a site-wide preference;&lt;br /&gt;
* Files - Any files that you are stored within Moodle on behalf of this plugin; and&lt;br /&gt;
* Custom files - For custom file formats - e.g. a calendar feed for calendar data. These should be used sparingly.&lt;br /&gt;
&lt;br /&gt;
Each piece of data is stored against a specific Moodle &#039;&#039;context&#039;&#039;, which will define how the data is structured within the exporter.&lt;br /&gt;
Data, and Related data only accept the &#039;&#039;stdClass&#039;&#039; object, whilst metadata should be stored as a set of key/value pairs which include a description.&lt;br /&gt;
&lt;br /&gt;
In some cases the data being stored belongs within an implicit structure. For example, one forum has many forum discussions, which each have a number of forum posts. This structure is represented by an &#039;&#039;array&#039;&#039; referred to as a &#039;&#039;subcontext&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;content_writer&#039;&#039; must &#039;&#039;always&#039;&#039; be called with a specific context, and can be called as follows:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
use \core_privacy\local\request\writer;&lt;br /&gt;
&lt;br /&gt;
writer::with_context($context)&lt;br /&gt;
    -&amp;gt;export_data($subcontext, $post)&lt;br /&gt;
    -&amp;gt;export_area_files($subcontext, &#039;mod_forum&#039;, &#039;post&#039;, $post-&amp;gt;id)&lt;br /&gt;
    -&amp;gt;export_metadata($subcontext, &#039;postread&#039;, (object) [&#039;firstread&#039; =&amp;gt; $firstread], new \lang_string(&#039;privacy:export:post:postread&#039;));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any text field which supports Moodle files must also be rewritten:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
use \core_privacy\local\request\writer;&lt;br /&gt;
&lt;br /&gt;
writer::with_context($context)&lt;br /&gt;
    -&amp;gt;rewrite_pluginfile_urls($postarea, &#039;mod_forum&#039;, &#039;post&#039;, $post-&amp;gt;id, $post-&amp;gt;message);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Providing a way to delete user data===&lt;br /&gt;
&lt;br /&gt;
Deleting user data is also implemented in the request interface. There are two methods that need to be created. The first one to remove all user data from a context, the other to remove user data for a specific user in a list of contexts.&lt;br /&gt;
&lt;br /&gt;
====Delete for a context====&lt;br /&gt;
&lt;br /&gt;
A context is given and all user data (for all users) is to be deleted from the plugin. This will be called when the retention period for the plugin has expired to adhere to the privacy by design requirement.�&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/choice/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function delete_data_for_all_users_in_context(deletion_criteria $criteria) {&lt;br /&gt;
    global $DB;&lt;br /&gt;
    $context = $criteria-&amp;gt;get_context();&lt;br /&gt;
    if (empty($context)) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    $instanceid = $DB-&amp;gt;get_field(&#039;course_modules&#039;, &#039;instance&#039;, [&#039;id&#039; =&amp;gt; $context-&amp;gt;instanceid], MUST_EXIST);&lt;br /&gt;
    $DB-&amp;gt;delete_records(&#039;choice_answers&#039;, [&#039;choiceid&#039; =&amp;gt; $instanceid]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Delete personal information for a specific user and context(s)====&lt;br /&gt;
&lt;br /&gt;
An &#039;&#039;approved_contextlist&#039;&#039; is given and user data related to that user should either be completely deleted, or overwritten if a structure needs to be maintained. This will be called when a user has requested the right to be forgotten. All attempts should be made to delete this data where practical while still allowing the plugin to be used by other users.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/choice/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function delete_data_for_user(approved_contextlist $contextlist) {&lt;br /&gt;
    global $DB;&lt;br /&gt;
    &lt;br /&gt;
    if (empty($contextlist-&amp;gt;count())) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    $userid = $contextlist-&amp;gt;get_user()-&amp;gt;id;&lt;br /&gt;
    foreach ($contextlist-&amp;gt;get_contexts() as $context) {&lt;br /&gt;
        $instanceid = $DB-&amp;gt;get_field(&#039;course_modules&#039;, &#039;instance&#039;, [&#039;id&#039; =&amp;gt; $context-&amp;gt;instanceid], MUST_EXIST);&lt;br /&gt;
        $DB-&amp;gt;delete_records(&#039;choice_answers&#039;, [&#039;choiceid&#039; =&amp;gt; $instanceid, &#039;userid&#039; =&amp;gt; $userid]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Difference between Moodle 3.3 and more recent versions===&lt;br /&gt;
Moodle 3.3 has a minimum requirement of php 5.6 and so type hinting and return type declarations are not supported in this version. Consequently the privacy API for this version does not have these features.&lt;br /&gt;
====What to do if you have one plugin that supports multiple branches====&lt;br /&gt;
This is something that we have considered and we have put in place a polyfill. This gets around the restrictions of one version having type hinting and return type declarations while another does not.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
To use the polyfill include the legacy polyfill trait and create the necessary static methods but with an underscore (shown below).&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
class provider implements&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
    \core_privacy\local\request\plugin\provider {&lt;br /&gt;
&lt;br /&gt;
    // This trait must be included.&lt;br /&gt;
    use \core_privacy\local\legacy_polyfill;&lt;br /&gt;
&lt;br /&gt;
    // The required methods must be in this format starting with an underscore.&lt;br /&gt;
    public static function _get_metadata(collection $collection) {&lt;br /&gt;
        // Code for returning metadata goes here.&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Subject Access Request FAQ]]&lt;br /&gt;
* [[:en:GDPR|GDPR]] in the user documentation&lt;br /&gt;
&lt;br /&gt;
[[Category:GDPR]]&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Privacy_API&amp;diff=54012</id>
		<title>Privacy API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Privacy_API&amp;diff=54012"/>
		<updated>2018-04-10T06:53:29Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* What to do if you have one plugin that supports multiple features  - minor update to title*/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [https://en.wikipedia.org/wiki/General_Data_Protection_Regulation General Data Protection Regulation] (GDPR) is an EU directive that looks at providing users with more control over their data and how it is processed. This regulation will come into effect on 25th of May 2018 and covers any citizen or permanent resident of the European Union. The directive will be respected by a number of other countries outside of the European Union.&lt;br /&gt;
&lt;br /&gt;
To help institutions become compliant with this new regulation we are adding functionality to Moodle. This includes a number of components, amongst others these include a user’s right to:&lt;br /&gt;
&lt;br /&gt;
* request information on the types of personal data held, the instances of that data, and the deletion policy for each;&lt;br /&gt;
* access all of their data; and&lt;br /&gt;
* be forgotten.&lt;br /&gt;
&lt;br /&gt;
The compliance requirements also extend to installed plugins (including third party plugins). These need to also be able to report what information they store or process regarding users, and have the ability to provide and delete data for a user request.&lt;br /&gt;
&lt;br /&gt;
This document describes the proposed API changes required for plugins which will allow a Moodle installation to become GDPR compliant.&lt;br /&gt;
&lt;br /&gt;
Target Audience: The intended audience for this document is Moodle plugin developers, who are aiming to ensure their plugins are updated to comply with GDPR requirements coming into effect in the EU in May, 2018.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Personal data in Moodle==&lt;br /&gt;
&lt;br /&gt;
From the GDPR Spec, Article 4:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;‘personal data’ means any information relating to an identified or identifiable natural person (‘data subject’); an identifiable natural person is one who can be identified, directly or indirectly, in particular by reference to an identifier such as a name, an identification number, location data, an online identifier or to one or more factors specific to the physical, physiological, genetic, mental, economic, cultural or social identity of that natural person;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In Moodle, we need to consider two main types of personal data; information entered by the user and information stored about the user. The key difference being that information stored about the user will have come from a source other than the user themselves. Both types of data can be used to form a profile of the individual.&lt;br /&gt;
&lt;br /&gt;
The most obvious clue to finding personal data entered by the user is the presence of a userid on a database field. Any data on the record (or linked records) pertaining to that user may be deemed personal data for that user, including things like timestamps and record identification numbers. Additionally, any free text field which allows the user to enter information must also be considered to be the personal data of that user.&lt;br /&gt;
&lt;br /&gt;
Data stored about the user includes things like ratings and comments made on a student submission. These may have been made by an assessor or teacher, but are considered the personal data of the student, as they are considered a reflection of the user’s competency in the subject matter and can be used to form a profile of that individual. &lt;br /&gt;
&lt;br /&gt;
The sections that follow outline what you need to do as a plugin developer to ensure any personal data is advertised and can be accessed and deleted according to the GDPR requirements.&lt;br /&gt;
&lt;br /&gt;
==Background==&lt;br /&gt;
&lt;br /&gt;
===Architecture overview===&lt;br /&gt;
&lt;br /&gt;
A new system for Privacy has been created within Moodle. This is broken down into several main parts and forms the &#039;&#039;core_privacy&#039;&#039; subsystem:&lt;br /&gt;
&lt;br /&gt;
* Some metadata providers - a set of PHP interfaces to be implemented by components for that component to describe the kind of data that it stores, and the purpose for its storage;&lt;br /&gt;
* Some request providers - a set of PHP interfaces to be implemented by components to allow that component to act upon user requests such as the Right to be Forgotten, and a Subject Access Request; and&lt;br /&gt;
* A manager - a concrete class used to bridge components which implement the providers with tools which request their data.&lt;br /&gt;
&lt;br /&gt;
All plugins will implement one metadata provider, and zero, one or two request providers.&lt;br /&gt;
&lt;br /&gt;
The fetching of data is broken into two separate steps:&lt;br /&gt;
&lt;br /&gt;
# Detecting in which Moodle contexts the user has any data; and&lt;br /&gt;
# Exporting all data from each of those contexts.&lt;br /&gt;
&lt;br /&gt;
This has been broken into two steps to later allow administrators to exclude certain contexts from an export - e.g. for courses currently in progress.&lt;br /&gt;
&lt;br /&gt;
A third component will later be added to facilitate the deletion of data within these contexts which will help to satisfy the Right to be Forgotten. This will also use the first step.&lt;br /&gt;
&lt;br /&gt;
===Implementing a provider===&lt;br /&gt;
&lt;br /&gt;
All plugins will need to create a concrete class which implements the relevant metadata and request providers. The exact providers you need to implement will depend on what data you store, and the type of plugin. This is covered in more detail in the following sections of the document.&lt;br /&gt;
&lt;br /&gt;
In order to do so:&lt;br /&gt;
&lt;br /&gt;
# You must create a class called &#039;&#039;provider&#039;&#039; within the namespace &#039;&#039;\your_pluginname\privacy&#039;&#039;.&lt;br /&gt;
# This class must be created at &#039;&#039;path/to/your/plugin/classes/privacy/provider.php&#039;&#039;.&lt;br /&gt;
# You must have your class implement the relevant metadata and request interfaces.&lt;br /&gt;
&lt;br /&gt;
==Plugins which do not store personal data==&lt;br /&gt;
&lt;br /&gt;
Many Moodle plugins do not store any personal data. This is usually the case for plugins which just add functionality, or which display the data already stored elsewhere in Moodle.&lt;br /&gt;
&lt;br /&gt;
Some examples of plugin types which might fit this criteria include themes, blocks, filters, editor plugins, etc.&lt;br /&gt;
&lt;br /&gt;
Plugins which cause data to be stored elsewhere in Moodle (e.g. via a subsystem call) are considered to store data.&lt;br /&gt;
&lt;br /&gt;
One examples of a plugin which does not store any data would be the Calendar month block which just displays a view of the user’s calendar. It does not store any data itself.&lt;br /&gt;
&lt;br /&gt;
An example of a plugin which must not use the null provider is the Comments block. The comments block is responsible for data subsequently being stored within Moodle. Although the block doesn’t store anything itself, it interacts with the comments subsystem and is the only component which knows how that data maps to a user.&lt;br /&gt;
&lt;br /&gt;
===Implementation requirements===&lt;br /&gt;
&lt;br /&gt;
In order to let Moodle know that you have audited your plugin, and that you do not store any personal user data, you must implement the &#039;&#039;\core_privacy\local\metadata\null_provider&#039;&#039; interface in your plugin’s provider.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;null_provider&#039;&#039; requires you to define one function &#039;&#039;get_reason()&#039;&#039; which returns the language string identifier within your component.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;block/calendar_month/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace block_calendar_month\privacy;&lt;br /&gt;
&lt;br /&gt;
class provider implements &lt;br /&gt;
    // This plugin does not store any personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\null_provider {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the language string identifier with the component&#039;s language&lt;br /&gt;
     * file to explain why this plugin stores no data.&lt;br /&gt;
     *&lt;br /&gt;
     * @return  string&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_reason() : string {&lt;br /&gt;
        return &#039;privacy:null_reason&#039;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;block/calendar_month/lang/en/block_calendar_month.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:null_reason&#039;] = &#039;The calendar month block displays information from the Calendar, but does not effect or store any data itself. All changes are made via the Calendar.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That’s it. Congratulations, your plugin now implements the Privacy API.&lt;br /&gt;
&lt;br /&gt;
==Plugins which store personal data==&lt;br /&gt;
&lt;br /&gt;
Many Moodle plugins do store some form of personal data.&lt;br /&gt;
&lt;br /&gt;
In some cases this will be stored within database tables in your plugin, and in other cases this will be in one of Moodle’s core subsystems - for example your plugin may store files, ratings, comments, or tags.&lt;br /&gt;
&lt;br /&gt;
Plugins which do store data will need to:&lt;br /&gt;
&lt;br /&gt;
* Describe the type of data that they store; &lt;br /&gt;
* Provide a way to export that data; and&lt;br /&gt;
* Provide a way to delete that data.&lt;br /&gt;
&lt;br /&gt;
Data is described via a &#039;&#039;metadata&#039;&#039; provider, and it is both exported and deleted via an implementation of a &#039;&#039;request&#039;&#039; provider.&lt;br /&gt;
&lt;br /&gt;
These are both explained in the sections below.&lt;br /&gt;
&lt;br /&gt;
===Describing the type of data you store===&lt;br /&gt;
&lt;br /&gt;
In order to describe the type of data that you store, you must implement the &#039;&#039;\core_privacy\local\metadata\provider&#039;&#039; interface.&lt;br /&gt;
&lt;br /&gt;
This interfaces requires that you define one function: &#039;&#039;get_metadata&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
There are several types of item to describe the data that you store. These are for:&lt;br /&gt;
&lt;br /&gt;
* Items in the Moodle database;&lt;br /&gt;
* Items stored by you in a Moodle subsystem - for example files, and ratings; and&lt;br /&gt;
* User preferences stored site-wide within Moodle for your plugin&lt;br /&gt;
&lt;br /&gt;
Note: All fields should include a description from a language string within your plugin.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace mod_forum\privacy;&lt;br /&gt;
use \core_privacy\local\metadata\collection;&lt;br /&gt;
&lt;br /&gt;
class provider implements &lt;br /&gt;
    // This plugin does store personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\provider {&lt;br /&gt;
    public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
        return $collection;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you store content in a Moodle subsystem====&lt;br /&gt;
&lt;br /&gt;
Many plugins will use one of the core Moodle subsystems to store data.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer we do not expect you to describe those subsystems in detail, but we do need to know that you use them and to know what you use them for.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;link_subsystem()&#039;&#039; method on the &#039;&#039;collection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;link_subsystem(&lt;br /&gt;
        &#039;core_files&#039;,&lt;br /&gt;
        &#039;privacy:metadata:core_files&#039;&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/lang/en/forum.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:core_files&#039;] = &#039;The forum stores files which have been uploaded by the user to form part of a forum post.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Describing data stored in database tables====&lt;br /&gt;
&lt;br /&gt;
Most Moodle plugins will store some form of user data in their own database tables.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer you will need to describe each database table, and each field which includes user data.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;add_database_table(&lt;br /&gt;
        &#039;forum_discussion_subs&#039;,&lt;br /&gt;
         [&lt;br /&gt;
            &#039;userid&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:userid&#039;,&lt;br /&gt;
            &#039;discussionid&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:discussionid&#039;,&lt;br /&gt;
            &#039;preference&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:preference&#039;,&lt;br /&gt;
&lt;br /&gt;
         ],&lt;br /&gt;
        &#039;privacy:metadata:forum_discussion_subs&#039;&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/lang/en/forum.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs&#039;] = &#039;Information about the subscriptions to individual forum discussions. This includes when a user has chosen to subscribe to a discussion, or to unsubscribe from one where they would otherwise be subscribed.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:userid&#039;] = &#039;The ID of the user with this subscription preference.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:discussionid&#039;] = &#039;The ID of the discussion that was subscribed to.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:preference&#039;] = &#039;The start time of the subscription.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you store site-wide user preferences====&lt;br /&gt;
&lt;br /&gt;
Many plugins will include one or more user preferences. Unfortunately this is one of Moodle’s older components and many of the values stored are not pure user preferences. Each plugin should be aware of how it handles its own preferences and is best placed to determine whether they are site-wide preferences, or per-instance preferences.&lt;br /&gt;
&lt;br /&gt;
Whilst most of these will have a fixed name (e.g. &#039;&#039;filepicker_recentrepository&#039;&#039;), some will include a variable of some kind (e.g. &#039;&#039;tool_usertours_tour_completion_time_2&#039;&#039;). Only the general name needs to be indicated rather than one copy for each preference.&lt;br /&gt;
&lt;br /&gt;
Also, these should only be &#039;&#039;site-wide&#039;&#039; user preferences which do not belong to a specific Moodle context.&lt;br /&gt;
&lt;br /&gt;
In the above examples:&lt;br /&gt;
&lt;br /&gt;
* Preference &#039;&#039;filepicker_recentrepository&#039;&#039; belongs to the file subsystem, and is a site-wide preference affecting the user anywhere that they view the filepicker.&lt;br /&gt;
* Preference &#039;&#039;tool_usertours_tour_completion_time_2&#039;&#039; belongs to user tours. User tours are a site-wide feature which can affect many parts of Moodle and cross multiple contexts.&lt;br /&gt;
&lt;br /&gt;
In some cases a value may be stored in the preferences table but is known to belong to a specific context within Moodle. In these cases they should be stored as metadata against that context rather than as a site-wide user preference.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;add_user_preference()&#039;&#039; method on the &#039;&#039;collection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any plugin providing user preferences must also implement the &#039;&#039;\core_privacy\local\request\preference_provider&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;admin/tool/usertours/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;add_user_preference(&#039;tool_usertours_tour_completion_time,&lt;br /&gt;
        &#039;privacy:metadata:preference:tool_usertours_tour_completion_time&#039;);&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;admin/tool/usertours/lang/en/tool_usertours.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:tool_usertours_tour_completion_time&#039;] = &#039;The time that a specific user tour was last completed by a user.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you export data to an external location====&lt;br /&gt;
&lt;br /&gt;
Many plugins will interact with external systems - for example cloud-based services. Often this external location is configurable within the plugin either at the site or the instance level.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer you will need to describe each &#039;&#039;type&#039;&#039; of target destination, alongside a list of each exported field which includes user data.&lt;br /&gt;
The &#039;&#039;actual&#039;&#039; destination does not need to be described as this can change based on configuration.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;link_external_location()&#039;&#039; method on the collection.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/lti/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;link_external_location(&#039;lti_client&#039;, [&lt;br /&gt;
            &#039;userid&#039; =&amp;gt; &#039;privacy:metadata:lti_client:userid&#039;,&lt;br /&gt;
            &#039;fullname&#039; =&amp;gt; &#039;privacy:metadata:lti_client:fullname&#039;,&lt;br /&gt;
        ], &#039;privacy:metadata:lti_client&#039;);&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/lti/lang/en/lti.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client&#039;] = &#039;In order to integrate with a remote LTI service, user data needs to be exchanged with that service.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client:userid&#039;] = &#039;The userid is sent from Moodle to allow you to access your data on the remote system.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client:fullname&#039;] = &#039;Your full name is sent to the remote system to allow a better user experience.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Providing a way to export user data===&lt;br /&gt;
&lt;br /&gt;
In order to export the user data that you store, you must implement the relevant request provider.&lt;br /&gt;
&lt;br /&gt;
We have named these request providers because they are called in response to a specific request from a user to access their information.&lt;br /&gt;
&lt;br /&gt;
There are several different types of request provider, and you may need to implement several of these, depending on the type and nature of your plugin.&lt;br /&gt;
&lt;br /&gt;
Broadly speaking plugins will fit into one of the following categories:&lt;br /&gt;
&lt;br /&gt;
* Plugins which are a subplugin of another plugin. Examples include &#039;&#039;assignsubmission&#039;&#039;, &#039;&#039;atto&#039;&#039;, and &#039;&#039;datafield&#039;&#039;;&lt;br /&gt;
* Plugins which are typically called by a Moodle subsystem. Examples include &#039;&#039;qtype&#039;&#039;, and &#039;&#039;profilefield&#039;&#039;;&lt;br /&gt;
* All other plugins which store data.&lt;br /&gt;
&lt;br /&gt;
Most plugins will fit into this final category, whilst other plugins may fall into several categories.&lt;br /&gt;
Plugins which &#039;&#039;define&#039;&#039; a subplugin will also be responsible for  collecting this data from their subplugins.&lt;br /&gt;
&lt;br /&gt;
A final category exists - plugins which store user preferences. In some cases this may be the &#039;&#039;only&#039;&#039; provider implemented.&lt;br /&gt;
&lt;br /&gt;
====Standard plugins which store data====&lt;br /&gt;
&lt;br /&gt;
A majority of Moodle plugins will fit into this category and will be required to implement the &#039;&#039;\core_privacy\local\request\plugin\provider&#039;&#039; interface. This interface requires that you define two functions:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;get_contexts_for_userid&#039;&#039; - to explain where data is held within Moodle for your plugin; and&lt;br /&gt;
* &#039;&#039;export_user_data&#039;&#039; - to export a user’s personal data from your plugin.&lt;br /&gt;
&lt;br /&gt;
These APIs make use of the Moodle &#039;&#039;context&#039;&#039; system to hierarchically store this data.&lt;br /&gt;
&lt;br /&gt;
====Retrieving the list of contexts====&lt;br /&gt;
&lt;br /&gt;
Contexts are retrieved using the &#039;&#039;get_contexts_for_userid&#039;&#039; function which takes the ID of the user being fetched, and returns a list of contexts in which the user has any data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_contexts_for_userid(int $userid) : contextlist {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The function returns a &#039;&#039;\core_privacy\local\request\contextlist&#039;&#039; which is used to keep a set of contexts together in a fixed fashion.&lt;br /&gt;
&lt;br /&gt;
Because a Subject Access Request covers &#039;&#039;every&#039;&#039; piece of data that is held for a user within Moodle, efficiency and performance is highly important. As a result, contexts are added to the &#039;&#039;contextlist&#039;&#039; by defining one or more SQL queries which return just the contextid. Multiple SQL queries can be added as required.&lt;br /&gt;
&lt;br /&gt;
Many plugins will interact with specific subsystems and store data within them.&lt;br /&gt;
These subsystems will also provide a way in which to link the data that you have stored with your own database tables.&lt;br /&gt;
At present these are still a work in progress and only the &#039;&#039;core_ratings&#039;&#039; subsystem includes this.&lt;br /&gt;
&lt;br /&gt;
=====Basic example=====&lt;br /&gt;
&lt;br /&gt;
The following example simply fetches the contextid for all forums where a user has a single discussion (note: this is an incomplete example):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_contexts_for_userid(int $userid) : contextlist {&lt;br /&gt;
        $contextlist = new \core_privacy\local\request\contextlist();&lt;br /&gt;
&lt;br /&gt;
        $sql = &amp;quot;SELECT c.id&lt;br /&gt;
                 FROM {context} c&lt;br /&gt;
           INNER JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel&lt;br /&gt;
           INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname&lt;br /&gt;
           INNER JOIN {forum} f ON f.id = cm.instance&lt;br /&gt;
            LEFT JOIN {forum_discussions} d ON d.forum = f.id&lt;br /&gt;
                WHERE (&lt;br /&gt;
                d.userid        = :discussionuserid&lt;br /&gt;
                )&lt;br /&gt;
        &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        $params = [&lt;br /&gt;
            &#039;modname&#039;           =&amp;gt; &#039;forum&#039;,&lt;br /&gt;
            &#039;contextlevel&#039;      =&amp;gt; CONTEXT_MODULE,&lt;br /&gt;
            &#039;discussionuserid&#039;  =&amp;gt; $userid,&lt;br /&gt;
        ];&lt;br /&gt;
&lt;br /&gt;
        $contextlist-&amp;gt;add_from_sql($sql, $params);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====More complete example=====&lt;br /&gt;
&lt;br /&gt;
The following example includes a link to core_rating. &lt;br /&gt;
It will find any forum, forum discussion, or forum post where the user has any data, including:&lt;br /&gt;
&lt;br /&gt;
* Per-forum digest preferences;&lt;br /&gt;
* Per-forum subscription preferences;&lt;br /&gt;
* Per-forum read tracking preferences;&lt;br /&gt;
* Per-discussion subscription preferences;&lt;br /&gt;
* Per-post read data (if a user has read a post or not); and&lt;br /&gt;
* Per-post rating data.&lt;br /&gt;
&lt;br /&gt;
In the case of the rating data, this will include any post where the user has rated the post of another user.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   int           $userid       The user to search.&lt;br /&gt;
 * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
 */&lt;br /&gt;
public static function get_contexts_for_userid(int $userid) : contextlist {&lt;br /&gt;
    $ratingsql = \core_rating\privacy\provider::get_sql_join(&#039;rat&#039;, &#039;mod_forum&#039;, &#039;post&#039;, &#039;p.id&#039;, $userid);&lt;br /&gt;
    // Fetch all forum discussions, and forum posts.&lt;br /&gt;
    $sql = &amp;quot;SELECT c.id&lt;br /&gt;
                FROM {context} c&lt;br /&gt;
        INNER JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel&lt;br /&gt;
        INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname&lt;br /&gt;
        INNER JOIN {forum} f ON f.id = cm.instance&lt;br /&gt;
            LEFT JOIN {forum_discussions} d ON d.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_posts} p ON p.discussion = d.id&lt;br /&gt;
            LEFT JOIN {forum_digests} dig ON dig.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_subscriptions} sub ON sub.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_track_prefs} pref ON pref.forumid = f.id&lt;br /&gt;
            LEFT JOIN {forum_read} hasread ON hasread.forumid = f.id&lt;br /&gt;
            LEFT JOIN {forum_discussion_subs} dsub ON dsub.forum = f.id&lt;br /&gt;
            {$ratingsql-&amp;gt;join}&lt;br /&gt;
                WHERE (&lt;br /&gt;
                p.userid        = :postuserid OR&lt;br /&gt;
                d.userid        = :discussionuserid OR&lt;br /&gt;
                dig.userid      = :digestuserid OR&lt;br /&gt;
                sub.userid      = :subuserid OR&lt;br /&gt;
                pref.userid     = :prefuserid OR&lt;br /&gt;
                hasread.userid  = :hasreaduserid OR&lt;br /&gt;
                dsub.userid     = :dsubuserid OR&lt;br /&gt;
                {$ratingsql-&amp;gt;userwhere}&lt;br /&gt;
            )&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    $params = [&lt;br /&gt;
        &#039;modname&#039;           =&amp;gt; &#039;forum&#039;,&lt;br /&gt;
        &#039;contextlevel&#039;      =&amp;gt; CONTEXT_MODULE,&lt;br /&gt;
        &#039;postuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
        &#039;discussionuserid&#039;  =&amp;gt; $userid,&lt;br /&gt;
        &#039;digestuserid&#039;      =&amp;gt; $userid,&lt;br /&gt;
        &#039;subuserid&#039;         =&amp;gt; $userid,&lt;br /&gt;
        &#039;prefuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
        &#039;hasreaduserid&#039;     =&amp;gt; $userid,&lt;br /&gt;
        &#039;dsubuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
    ];&lt;br /&gt;
    $params += $ratingsql-&amp;gt;params;&lt;br /&gt;
&lt;br /&gt;
    $contextlist = new \core_privacy\local\request\contextlist();&lt;br /&gt;
    $contextlist-&amp;gt;add_from_sql($sql, $params);&lt;br /&gt;
&lt;br /&gt;
    return $contextlist;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exporting user data====&lt;br /&gt;
&lt;br /&gt;
After determining where in Moodle your plugin holds data about a user, the &#039;&#039;\core_privacy\manager&#039;&#039; will then ask your plugin to export all user data for a subset of those locations.&lt;br /&gt;
&lt;br /&gt;
This is achieved through use of the &#039;&#039;export_user_data&#039;&#039; function which takes the list of approved contexts in a &#039;&#039;\core_privacy\local\request\approved_contextlist&#039;&#039; object.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Export all user data for the specified user, in the specified contexts, using the supplied exporter instance.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   approved_contextlist    $contextlist    The approved contexts to export information for.&lt;br /&gt;
 */&lt;br /&gt;
public static function export_user_data(approved_contextlist $contextlist) {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;approved_contextlist&#039;&#039; includes both the user record, and a list of contexts, which can be retrieved by either processing it as an Iterator, or by calling &#039;&#039;get_contextids()&#039;&#039; or &#039;&#039;get_contexts()&#039;&#039; as required.&lt;br /&gt;
&lt;br /&gt;
Data is exported using a &#039;&#039;\core_privacy\local\request\content_writer&#039;&#039;, which is described in further detail below.&lt;br /&gt;
&lt;br /&gt;
===Plugins which store user preferences===&lt;br /&gt;
&lt;br /&gt;
Many plugins store a variety of user preferences, and must therefore export them.&lt;br /&gt;
&lt;br /&gt;
Since user preferences are a site-wide preference, these are exported separately to other user data.&lt;br /&gt;
In some cases the only data present is user preference data, whilst in others there is a combination of user-provided data, and user preferences.&lt;br /&gt;
&lt;br /&gt;
Storing of user preferences is achieved through implementation of the &#039;&#039;\core_privacy\local\request\preference_provider&#039;&#039; interface which defines one required function -- &#039;&#039;export_user_preferences&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Export all user preferences for the plugin.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   int         $userid The userid of the user whose data is to be exported.&lt;br /&gt;
 */&lt;br /&gt;
public static function export_user_preferences(int $userid) {&lt;br /&gt;
    $markasreadonnotification = get_user_preference(&#039;markasreadonnotification&#039;, null, $userid);&lt;br /&gt;
    if (null !== $markasreadonnotification) {&lt;br /&gt;
        switch ($markasreadonnotification) {&lt;br /&gt;
            case 0:&lt;br /&gt;
                $markasreadonnotificationdescription = get_string(&#039;markasreadonnotificationno&#039;, &#039;mod_forum&#039;);&lt;br /&gt;
                break;&lt;br /&gt;
            case 1:&lt;br /&gt;
            default:&lt;br /&gt;
                $markasreadonnotificationdescription = get_string(&#039;markasreadonnotificationyes&#039;, &#039;mod_forum&#039;);&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
        writer::export_user_preference(&#039;mod_forum&#039;, &#039;markasreadonnotification&#039;, $markasreadonnotification, $markasreadonnotificationdescription);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Plugins which define a subplugin===&lt;br /&gt;
&lt;br /&gt;
Many plugin types are also able to define their own subplugins and will need to define a contract between themselves and their subplugins in order to fetch their data.&lt;br /&gt;
&lt;br /&gt;
This is required as the parent plugin and the child subplugin should be separate entities and the parent plugin must be able to function if one or more of its subplugins are uninstalled.&lt;br /&gt;
&lt;br /&gt;
The parent plugin is responsible for defining the contract,  and for interacting with its subplugins, though we intend to create helpers to make this easier.&lt;br /&gt;
&lt;br /&gt;
The parent plugin should define a new interface for each type of subplugin that it defines. This interface should extend the &#039;&#039;\core_privacy\local\request\plugin\subplugin_provider&#039;&#039; interface.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
The following example defines the contract that assign submission subplugins may be required to implement.&lt;br /&gt;
&lt;br /&gt;
The assignment module is responsible for returning the contexts of all assignments where a user has data, but in some cases it is unaware of all of those cases - for example if a Teacher comments on a student submission it may not be aware of these as the information about this interaction may not be stored within its own tables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/assign/privacy/assignsubmission_provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace mod_assign\privacy;&lt;br /&gt;
use \core_privacy\local\metadata\collection;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
interface assignsubmission_provider extends&lt;br /&gt;
    // This Interface defines a subplugin.&lt;br /&gt;
    \core_privacy\local\request\subplugin_provider {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the SQL required to find all submission items where this user has had any involvements. &lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  \stdClass                   Object containing the join, params, and where used to select a these records from the database.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_items_with_user_interaction(int $userid) : \stdClass ;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Export all relevant user submissions information which match the combination of userid and attemptid.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @param   \context      $context      The context to export this submission against.&lt;br /&gt;
     * @param   array         $subcontext   The subcontext within the context to export this information&lt;br /&gt;
     * @param   int           $attid        The id of the submission to export.&lt;br /&gt;
     */&lt;br /&gt;
    public static function export_user_submissions(int $userid, \context $context, array $subcontext, int $attid) ;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Plugins which are subplugins to another plugin===&lt;br /&gt;
&lt;br /&gt;
If you are developing a sub-plugin of another plugin, then you will have to look at the relevant plugin in order to determine the exact contract.&lt;br /&gt;
&lt;br /&gt;
Each subplugin type should define a new interface which extends the &#039;&#039;\core_privacy\local\request\plugin\subplugin_provider&#039;&#039; interface and it is up to the parent plugin to define how they will interact with their children.&lt;br /&gt;
&lt;br /&gt;
The principles remain the same, but the exact implementation will differ depending upon requirements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/pluginname/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
namespace assignsubmission\onlinetext;&lt;br /&gt;
&lt;br /&gt;
class provider implements&lt;br /&gt;
    // This plugin does store personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
&lt;br /&gt;
    // This plugin is a subplugin of assign and must meet that contract.&lt;br /&gt;
    \mod_assign\privacy\assignsubmission_provider {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Plugins which are typically called by a Moodle subsystem===&lt;br /&gt;
&lt;br /&gt;
There are a number of plugintypes in Moodle which are typically called by a specific Moodle subsystem.&lt;br /&gt;
&lt;br /&gt;
Some of these are &#039;&#039;only&#039;&#039; called by that subsystem, for example plugins which are of the &#039;&#039;plagiarism&#039;&#039; plugintype should never be called directly, but are always invoked via the &#039;&#039;core_plagiarism&#039;&#039; subsystem.&lt;br /&gt;
&lt;br /&gt;
Conversely, there maybe other plugintypes which can be called both via a subsystem, and in some other fashion. We are still determining whether any plugintypes currently fit this pattern.&lt;br /&gt;
&lt;br /&gt;
If you are developing a plugin which belongs to a specific subsystem, then you will have to look at the relevant plugin in order to determine the exact contract.&lt;br /&gt;
&lt;br /&gt;
Each subsystem will define a new interface which extends the &#039;&#039;\core_privacy\local\request\plugin\subsystem_provider&#039;&#039; interface and it is up to that subsystem to define how they will interact with those plugins.&lt;br /&gt;
&lt;br /&gt;
The principles remain the same, but the exact implementation will differ depending upon requirements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;plagiarism/detectorator/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
namespace plagiarism_detectorator\privacy;&lt;br /&gt;
&lt;br /&gt;
class provider implements&lt;br /&gt;
    // This plugin does export personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
&lt;br /&gt;
    // This plugin is always linked against another activity module via the Plagiarism API.&lt;br /&gt;
    \core_plagiarism\privacy\plugin_provider {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exporting data===&lt;br /&gt;
&lt;br /&gt;
Any plugin which stores data must also export it.&lt;br /&gt;
&lt;br /&gt;
To cater for this the privacy API includes a &#039;&#039;\core_privacy\local\request\content_writer&#039;&#039;, which defines a set of functions to store different types of data.&lt;br /&gt;
&lt;br /&gt;
Broadly speaking data is broken into the following types:&lt;br /&gt;
&lt;br /&gt;
* Data - this is the object being described. For example the post content in a forum post;&lt;br /&gt;
* Related data - this is data related to the object being stored. For example, ratings of a forum post;&lt;br /&gt;
* Metadata - This is metadata about the main object. For example whether you are subscribed to a forum discussion;&lt;br /&gt;
* User preferences - this is data about a site-wide preference;&lt;br /&gt;
* Files - Any files that you are stored within Moodle on behalf of this plugin; and&lt;br /&gt;
* Custom files - For custom file formats - e.g. a calendar feed for calendar data. These should be used sparingly.&lt;br /&gt;
&lt;br /&gt;
Each piece of data is stored against a specific Moodle &#039;&#039;context&#039;&#039;, which will define how the data is structured within the exporter.&lt;br /&gt;
Data, and Related data only accept the &#039;&#039;stdClass&#039;&#039; object, whilst metadata should be stored as a set of key/value pairs which include a description.&lt;br /&gt;
&lt;br /&gt;
In some cases the data being stored belongs within an implicit structure. For example, one forum has many forum discussions, which each have a number of forum posts. This structure is represented by an &#039;&#039;array&#039;&#039; referred to as a &#039;&#039;subcontext&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;content_writer&#039;&#039; must &#039;&#039;always&#039;&#039; be called with a specific context, and can be called as follows:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
use \core_privacy\local\request\writer;&lt;br /&gt;
&lt;br /&gt;
writer::with_context($context)&lt;br /&gt;
    -&amp;gt;export_data($subcontext, $post)&lt;br /&gt;
    -&amp;gt;export_area_files($subcontext, &#039;mod_forum&#039;, &#039;post&#039;, $post-&amp;gt;id)&lt;br /&gt;
    -&amp;gt;export_metadata($subcontext, &#039;postread&#039;, (object) [&#039;firstread&#039; =&amp;gt; $firstread], new \lang_string(&#039;privacy:export:post:postread&#039;));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any text field which supports Moodle files must also be rewritten:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
use \core_privacy\local\request\writer;&lt;br /&gt;
&lt;br /&gt;
writer::with_context($context)&lt;br /&gt;
    -&amp;gt;rewrite_pluginfile_urls($postarea, &#039;mod_forum&#039;, &#039;post&#039;, $post-&amp;gt;id, $post-&amp;gt;message);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Providing a way to delete user data===&lt;br /&gt;
&lt;br /&gt;
Deleting user data is also implemented in the request interface. There are two methods that need to be created. The first one to remove all user data from a context, the other to remove user data for a specific user in a list of contexts.&lt;br /&gt;
&lt;br /&gt;
====Delete for a context====&lt;br /&gt;
&lt;br /&gt;
A context is given and all user data (for all users) is to be deleted from the plugin. This will be called when the retention period for the plugin has expired to adhere to the privacy by design requirement.�&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/choice/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function delete_data_for_all_users_in_context(deletion_criteria $criteria) {&lt;br /&gt;
    global $DB;&lt;br /&gt;
    $context = $criteria-&amp;gt;get_context();&lt;br /&gt;
    if (empty($context)) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    $instanceid = $DB-&amp;gt;get_field(&#039;course_modules&#039;, &#039;instance&#039;, [&#039;id&#039; =&amp;gt; $context-&amp;gt;instanceid], MUST_EXIST);&lt;br /&gt;
    $DB-&amp;gt;delete_records(&#039;choice_answers&#039;, [&#039;choiceid&#039; =&amp;gt; $instanceid]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Delete personal information for a specific user and context(s)====&lt;br /&gt;
&lt;br /&gt;
An &#039;&#039;approved_contextlist&#039;&#039; is given and user data related to that user should either be completely deleted, or overwritten if a structure needs to be maintained. This will be called when a user has requested the right to be forgotten. All attempts should be made to delete this data where practical while still allowing the plugin to be used by other users.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/choice/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function delete_data_for_user(approved_contextlist $contextlist) {&lt;br /&gt;
    global $DB;&lt;br /&gt;
    &lt;br /&gt;
    if (empty($contextlist-&amp;gt;count())) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    $userid = $contextlist-&amp;gt;get_user()-&amp;gt;id;&lt;br /&gt;
    foreach ($contextlist-&amp;gt;get_contexts() as $context) {&lt;br /&gt;
        $instanceid = $DB-&amp;gt;get_field(&#039;course_modules&#039;, &#039;instance&#039;, [&#039;id&#039; =&amp;gt; $context-&amp;gt;instanceid], MUST_EXIST);&lt;br /&gt;
        $DB-&amp;gt;delete_records(&#039;choice_answers&#039;, [&#039;choiceid&#039; =&amp;gt; $instanceid, &#039;userid&#039; =&amp;gt; $userid]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Difference between Moodle 3.3 and more recent versions===&lt;br /&gt;
Moodle 3.3 has a minimum requirement of php 5.6 and so type hinting and return type declarations are not supported in this version. Consequently the privacy API for this version does not have these features.&lt;br /&gt;
====What to do if you have one plugin that supports multiple branches====&lt;br /&gt;
This is something that we have considered and we have put in place a polyfill. This gets around the restrictions of one version having type hinting and return type declarations while another does not.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
To use the polyfill include the legacy polyfill trait and create the necessary static methods but with an underscore (shown below).&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
class provider implements&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
    \core_privacy\local\request\plugin\provider {&lt;br /&gt;
&lt;br /&gt;
    // This is a trait must be included.&lt;br /&gt;
    use \core_privacy\local\legacy_polyfill;&lt;br /&gt;
&lt;br /&gt;
    // The required methods must be in this format starting with an underscore.&lt;br /&gt;
    public static function _get_metadata(collection $collection) {&lt;br /&gt;
        // Code for returning metadata goes here.&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Subject Access Request FAQ]]&lt;br /&gt;
* [[:en:GDPR|GDPR]] in the user documentation&lt;br /&gt;
&lt;br /&gt;
[[Category:GDPR]]&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Privacy_API&amp;diff=54011</id>
		<title>Privacy API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Privacy_API&amp;diff=54011"/>
		<updated>2018-04-10T06:52:28Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: Polyfill details entered.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [https://en.wikipedia.org/wiki/General_Data_Protection_Regulation General Data Protection Regulation] (GDPR) is an EU directive that looks at providing users with more control over their data and how it is processed. This regulation will come into effect on 25th of May 2018 and covers any citizen or permanent resident of the European Union. The directive will be respected by a number of other countries outside of the European Union.&lt;br /&gt;
&lt;br /&gt;
To help institutions become compliant with this new regulation we are adding functionality to Moodle. This includes a number of components, amongst others these include a user’s right to:&lt;br /&gt;
&lt;br /&gt;
* request information on the types of personal data held, the instances of that data, and the deletion policy for each;&lt;br /&gt;
* access all of their data; and&lt;br /&gt;
* be forgotten.&lt;br /&gt;
&lt;br /&gt;
The compliance requirements also extend to installed plugins (including third party plugins). These need to also be able to report what information they store or process regarding users, and have the ability to provide and delete data for a user request.&lt;br /&gt;
&lt;br /&gt;
This document describes the proposed API changes required for plugins which will allow a Moodle installation to become GDPR compliant.&lt;br /&gt;
&lt;br /&gt;
Target Audience: The intended audience for this document is Moodle plugin developers, who are aiming to ensure their plugins are updated to comply with GDPR requirements coming into effect in the EU in May, 2018.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Personal data in Moodle==&lt;br /&gt;
&lt;br /&gt;
From the GDPR Spec, Article 4:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;‘personal data’ means any information relating to an identified or identifiable natural person (‘data subject’); an identifiable natural person is one who can be identified, directly or indirectly, in particular by reference to an identifier such as a name, an identification number, location data, an online identifier or to one or more factors specific to the physical, physiological, genetic, mental, economic, cultural or social identity of that natural person;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In Moodle, we need to consider two main types of personal data; information entered by the user and information stored about the user. The key difference being that information stored about the user will have come from a source other than the user themselves. Both types of data can be used to form a profile of the individual.&lt;br /&gt;
&lt;br /&gt;
The most obvious clue to finding personal data entered by the user is the presence of a userid on a database field. Any data on the record (or linked records) pertaining to that user may be deemed personal data for that user, including things like timestamps and record identification numbers. Additionally, any free text field which allows the user to enter information must also be considered to be the personal data of that user.&lt;br /&gt;
&lt;br /&gt;
Data stored about the user includes things like ratings and comments made on a student submission. These may have been made by an assessor or teacher, but are considered the personal data of the student, as they are considered a reflection of the user’s competency in the subject matter and can be used to form a profile of that individual. &lt;br /&gt;
&lt;br /&gt;
The sections that follow outline what you need to do as a plugin developer to ensure any personal data is advertised and can be accessed and deleted according to the GDPR requirements.&lt;br /&gt;
&lt;br /&gt;
==Background==&lt;br /&gt;
&lt;br /&gt;
===Architecture overview===&lt;br /&gt;
&lt;br /&gt;
A new system for Privacy has been created within Moodle. This is broken down into several main parts and forms the &#039;&#039;core_privacy&#039;&#039; subsystem:&lt;br /&gt;
&lt;br /&gt;
* Some metadata providers - a set of PHP interfaces to be implemented by components for that component to describe the kind of data that it stores, and the purpose for its storage;&lt;br /&gt;
* Some request providers - a set of PHP interfaces to be implemented by components to allow that component to act upon user requests such as the Right to be Forgotten, and a Subject Access Request; and&lt;br /&gt;
* A manager - a concrete class used to bridge components which implement the providers with tools which request their data.&lt;br /&gt;
&lt;br /&gt;
All plugins will implement one metadata provider, and zero, one or two request providers.&lt;br /&gt;
&lt;br /&gt;
The fetching of data is broken into two separate steps:&lt;br /&gt;
&lt;br /&gt;
# Detecting in which Moodle contexts the user has any data; and&lt;br /&gt;
# Exporting all data from each of those contexts.&lt;br /&gt;
&lt;br /&gt;
This has been broken into two steps to later allow administrators to exclude certain contexts from an export - e.g. for courses currently in progress.&lt;br /&gt;
&lt;br /&gt;
A third component will later be added to facilitate the deletion of data within these contexts which will help to satisfy the Right to be Forgotten. This will also use the first step.&lt;br /&gt;
&lt;br /&gt;
===Implementing a provider===&lt;br /&gt;
&lt;br /&gt;
All plugins will need to create a concrete class which implements the relevant metadata and request providers. The exact providers you need to implement will depend on what data you store, and the type of plugin. This is covered in more detail in the following sections of the document.&lt;br /&gt;
&lt;br /&gt;
In order to do so:&lt;br /&gt;
&lt;br /&gt;
# You must create a class called &#039;&#039;provider&#039;&#039; within the namespace &#039;&#039;\your_pluginname\privacy&#039;&#039;.&lt;br /&gt;
# This class must be created at &#039;&#039;path/to/your/plugin/classes/privacy/provider.php&#039;&#039;.&lt;br /&gt;
# You must have your class implement the relevant metadata and request interfaces.&lt;br /&gt;
&lt;br /&gt;
==Plugins which do not store personal data==&lt;br /&gt;
&lt;br /&gt;
Many Moodle plugins do not store any personal data. This is usually the case for plugins which just add functionality, or which display the data already stored elsewhere in Moodle.&lt;br /&gt;
&lt;br /&gt;
Some examples of plugin types which might fit this criteria include themes, blocks, filters, editor plugins, etc.&lt;br /&gt;
&lt;br /&gt;
Plugins which cause data to be stored elsewhere in Moodle (e.g. via a subsystem call) are considered to store data.&lt;br /&gt;
&lt;br /&gt;
One examples of a plugin which does not store any data would be the Calendar month block which just displays a view of the user’s calendar. It does not store any data itself.&lt;br /&gt;
&lt;br /&gt;
An example of a plugin which must not use the null provider is the Comments block. The comments block is responsible for data subsequently being stored within Moodle. Although the block doesn’t store anything itself, it interacts with the comments subsystem and is the only component which knows how that data maps to a user.&lt;br /&gt;
&lt;br /&gt;
===Implementation requirements===&lt;br /&gt;
&lt;br /&gt;
In order to let Moodle know that you have audited your plugin, and that you do not store any personal user data, you must implement the &#039;&#039;\core_privacy\local\metadata\null_provider&#039;&#039; interface in your plugin’s provider.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;null_provider&#039;&#039; requires you to define one function &#039;&#039;get_reason()&#039;&#039; which returns the language string identifier within your component.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;block/calendar_month/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace block_calendar_month\privacy;&lt;br /&gt;
&lt;br /&gt;
class provider implements &lt;br /&gt;
    // This plugin does not store any personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\null_provider {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the language string identifier with the component&#039;s language&lt;br /&gt;
     * file to explain why this plugin stores no data.&lt;br /&gt;
     *&lt;br /&gt;
     * @return  string&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_reason() : string {&lt;br /&gt;
        return &#039;privacy:null_reason&#039;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;block/calendar_month/lang/en/block_calendar_month.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:null_reason&#039;] = &#039;The calendar month block displays information from the Calendar, but does not effect or store any data itself. All changes are made via the Calendar.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That’s it. Congratulations, your plugin now implements the Privacy API.&lt;br /&gt;
&lt;br /&gt;
==Plugins which store personal data==&lt;br /&gt;
&lt;br /&gt;
Many Moodle plugins do store some form of personal data.&lt;br /&gt;
&lt;br /&gt;
In some cases this will be stored within database tables in your plugin, and in other cases this will be in one of Moodle’s core subsystems - for example your plugin may store files, ratings, comments, or tags.&lt;br /&gt;
&lt;br /&gt;
Plugins which do store data will need to:&lt;br /&gt;
&lt;br /&gt;
* Describe the type of data that they store; &lt;br /&gt;
* Provide a way to export that data; and&lt;br /&gt;
* Provide a way to delete that data.&lt;br /&gt;
&lt;br /&gt;
Data is described via a &#039;&#039;metadata&#039;&#039; provider, and it is both exported and deleted via an implementation of a &#039;&#039;request&#039;&#039; provider.&lt;br /&gt;
&lt;br /&gt;
These are both explained in the sections below.&lt;br /&gt;
&lt;br /&gt;
===Describing the type of data you store===&lt;br /&gt;
&lt;br /&gt;
In order to describe the type of data that you store, you must implement the &#039;&#039;\core_privacy\local\metadata\provider&#039;&#039; interface.&lt;br /&gt;
&lt;br /&gt;
This interfaces requires that you define one function: &#039;&#039;get_metadata&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
There are several types of item to describe the data that you store. These are for:&lt;br /&gt;
&lt;br /&gt;
* Items in the Moodle database;&lt;br /&gt;
* Items stored by you in a Moodle subsystem - for example files, and ratings; and&lt;br /&gt;
* User preferences stored site-wide within Moodle for your plugin&lt;br /&gt;
&lt;br /&gt;
Note: All fields should include a description from a language string within your plugin.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace mod_forum\privacy;&lt;br /&gt;
use \core_privacy\local\metadata\collection;&lt;br /&gt;
&lt;br /&gt;
class provider implements &lt;br /&gt;
    // This plugin does store personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\provider {&lt;br /&gt;
    public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
        return $collection;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you store content in a Moodle subsystem====&lt;br /&gt;
&lt;br /&gt;
Many plugins will use one of the core Moodle subsystems to store data.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer we do not expect you to describe those subsystems in detail, but we do need to know that you use them and to know what you use them for.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;link_subsystem()&#039;&#039; method on the &#039;&#039;collection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;link_subsystem(&lt;br /&gt;
        &#039;core_files&#039;,&lt;br /&gt;
        &#039;privacy:metadata:core_files&#039;&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/lang/en/forum.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:core_files&#039;] = &#039;The forum stores files which have been uploaded by the user to form part of a forum post.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Describing data stored in database tables====&lt;br /&gt;
&lt;br /&gt;
Most Moodle plugins will store some form of user data in their own database tables.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer you will need to describe each database table, and each field which includes user data.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;add_database_table(&lt;br /&gt;
        &#039;forum_discussion_subs&#039;,&lt;br /&gt;
         [&lt;br /&gt;
            &#039;userid&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:userid&#039;,&lt;br /&gt;
            &#039;discussionid&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:discussionid&#039;,&lt;br /&gt;
            &#039;preference&#039; =&amp;gt; &#039;privacy:metadata:forum_discussion_subs:preference&#039;,&lt;br /&gt;
&lt;br /&gt;
         ],&lt;br /&gt;
        &#039;privacy:metadata:forum_discussion_subs&#039;&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/lang/en/forum.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs&#039;] = &#039;Information about the subscriptions to individual forum discussions. This includes when a user has chosen to subscribe to a discussion, or to unsubscribe from one where they would otherwise be subscribed.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:userid&#039;] = &#039;The ID of the user with this subscription preference.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:discussionid&#039;] = &#039;The ID of the discussion that was subscribed to.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:forum_discussion_subs:preference&#039;] = &#039;The start time of the subscription.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you store site-wide user preferences====&lt;br /&gt;
&lt;br /&gt;
Many plugins will include one or more user preferences. Unfortunately this is one of Moodle’s older components and many of the values stored are not pure user preferences. Each plugin should be aware of how it handles its own preferences and is best placed to determine whether they are site-wide preferences, or per-instance preferences.&lt;br /&gt;
&lt;br /&gt;
Whilst most of these will have a fixed name (e.g. &#039;&#039;filepicker_recentrepository&#039;&#039;), some will include a variable of some kind (e.g. &#039;&#039;tool_usertours_tour_completion_time_2&#039;&#039;). Only the general name needs to be indicated rather than one copy for each preference.&lt;br /&gt;
&lt;br /&gt;
Also, these should only be &#039;&#039;site-wide&#039;&#039; user preferences which do not belong to a specific Moodle context.&lt;br /&gt;
&lt;br /&gt;
In the above examples:&lt;br /&gt;
&lt;br /&gt;
* Preference &#039;&#039;filepicker_recentrepository&#039;&#039; belongs to the file subsystem, and is a site-wide preference affecting the user anywhere that they view the filepicker.&lt;br /&gt;
* Preference &#039;&#039;tool_usertours_tour_completion_time_2&#039;&#039; belongs to user tours. User tours are a site-wide feature which can affect many parts of Moodle and cross multiple contexts.&lt;br /&gt;
&lt;br /&gt;
In some cases a value may be stored in the preferences table but is known to belong to a specific context within Moodle. In these cases they should be stored as metadata against that context rather than as a site-wide user preference.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;add_user_preference()&#039;&#039; method on the &#039;&#039;collection&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Any plugin providing user preferences must also implement the &#039;&#039;\core_privacy\local\request\preference_provider&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;admin/tool/usertours/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;add_user_preference(&#039;tool_usertours_tour_completion_time,&lt;br /&gt;
        &#039;privacy:metadata:preference:tool_usertours_tour_completion_time&#039;);&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;admin/tool/usertours/lang/en/tool_usertours.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:tool_usertours_tour_completion_time&#039;] = &#039;The time that a specific user tour was last completed by a user.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Indicating that you export data to an external location====&lt;br /&gt;
&lt;br /&gt;
Many plugins will interact with external systems - for example cloud-based services. Often this external location is configurable within the plugin either at the site or the instance level.&lt;br /&gt;
&lt;br /&gt;
As a plugin developer you will need to describe each &#039;&#039;type&#039;&#039; of target destination, alongside a list of each exported field which includes user data.&lt;br /&gt;
The &#039;&#039;actual&#039;&#039; destination does not need to be described as this can change based on configuration.&lt;br /&gt;
&lt;br /&gt;
You can indicate this by calling the &#039;&#039;link_external_location()&#039;&#039; method on the collection.&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/lti/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function get_metadata(collection $collection) : collection {&lt;br /&gt;
&lt;br /&gt;
    $collection-&amp;gt;link_external_location(&#039;lti_client&#039;, [&lt;br /&gt;
            &#039;userid&#039; =&amp;gt; &#039;privacy:metadata:lti_client:userid&#039;,&lt;br /&gt;
            &#039;fullname&#039; =&amp;gt; &#039;privacy:metadata:lti_client:fullname&#039;,&lt;br /&gt;
        ], &#039;privacy:metadata:lti_client&#039;);&lt;br /&gt;
&lt;br /&gt;
    return $collection;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/lti/lang/en/lti.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client&#039;] = &#039;In order to integrate with a remote LTI service, user data needs to be exchanged with that service.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client:userid&#039;] = &#039;The userid is sent from Moodle to allow you to access your data on the remote system.&#039;;&lt;br /&gt;
$string[&#039;privacy:metadata:lti_client:fullname&#039;] = &#039;Your full name is sent to the remote system to allow a better user experience.&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Providing a way to export user data===&lt;br /&gt;
&lt;br /&gt;
In order to export the user data that you store, you must implement the relevant request provider.&lt;br /&gt;
&lt;br /&gt;
We have named these request providers because they are called in response to a specific request from a user to access their information.&lt;br /&gt;
&lt;br /&gt;
There are several different types of request provider, and you may need to implement several of these, depending on the type and nature of your plugin.&lt;br /&gt;
&lt;br /&gt;
Broadly speaking plugins will fit into one of the following categories:&lt;br /&gt;
&lt;br /&gt;
* Plugins which are a subplugin of another plugin. Examples include &#039;&#039;assignsubmission&#039;&#039;, &#039;&#039;atto&#039;&#039;, and &#039;&#039;datafield&#039;&#039;;&lt;br /&gt;
* Plugins which are typically called by a Moodle subsystem. Examples include &#039;&#039;qtype&#039;&#039;, and &#039;&#039;profilefield&#039;&#039;;&lt;br /&gt;
* All other plugins which store data.&lt;br /&gt;
&lt;br /&gt;
Most plugins will fit into this final category, whilst other plugins may fall into several categories.&lt;br /&gt;
Plugins which &#039;&#039;define&#039;&#039; a subplugin will also be responsible for  collecting this data from their subplugins.&lt;br /&gt;
&lt;br /&gt;
A final category exists - plugins which store user preferences. In some cases this may be the &#039;&#039;only&#039;&#039; provider implemented.&lt;br /&gt;
&lt;br /&gt;
====Standard plugins which store data====&lt;br /&gt;
&lt;br /&gt;
A majority of Moodle plugins will fit into this category and will be required to implement the &#039;&#039;\core_privacy\local\request\plugin\provider&#039;&#039; interface. This interface requires that you define two functions:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;get_contexts_for_userid&#039;&#039; - to explain where data is held within Moodle for your plugin; and&lt;br /&gt;
* &#039;&#039;export_user_data&#039;&#039; - to export a user’s personal data from your plugin.&lt;br /&gt;
&lt;br /&gt;
These APIs make use of the Moodle &#039;&#039;context&#039;&#039; system to hierarchically store this data.&lt;br /&gt;
&lt;br /&gt;
====Retrieving the list of contexts====&lt;br /&gt;
&lt;br /&gt;
Contexts are retrieved using the &#039;&#039;get_contexts_for_userid&#039;&#039; function which takes the ID of the user being fetched, and returns a list of contexts in which the user has any data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_contexts_for_userid(int $userid) : contextlist {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The function returns a &#039;&#039;\core_privacy\local\request\contextlist&#039;&#039; which is used to keep a set of contexts together in a fixed fashion.&lt;br /&gt;
&lt;br /&gt;
Because a Subject Access Request covers &#039;&#039;every&#039;&#039; piece of data that is held for a user within Moodle, efficiency and performance is highly important. As a result, contexts are added to the &#039;&#039;contextlist&#039;&#039; by defining one or more SQL queries which return just the contextid. Multiple SQL queries can be added as required.&lt;br /&gt;
&lt;br /&gt;
Many plugins will interact with specific subsystems and store data within them.&lt;br /&gt;
These subsystems will also provide a way in which to link the data that you have stored with your own database tables.&lt;br /&gt;
At present these are still a work in progress and only the &#039;&#039;core_ratings&#039;&#039; subsystem includes this.&lt;br /&gt;
&lt;br /&gt;
=====Basic example=====&lt;br /&gt;
&lt;br /&gt;
The following example simply fetches the contextid for all forums where a user has a single discussion (note: this is an incomplete example):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_contexts_for_userid(int $userid) : contextlist {&lt;br /&gt;
        $contextlist = new \core_privacy\local\request\contextlist();&lt;br /&gt;
&lt;br /&gt;
        $sql = &amp;quot;SELECT c.id&lt;br /&gt;
                 FROM {context} c&lt;br /&gt;
           INNER JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel&lt;br /&gt;
           INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname&lt;br /&gt;
           INNER JOIN {forum} f ON f.id = cm.instance&lt;br /&gt;
            LEFT JOIN {forum_discussions} d ON d.forum = f.id&lt;br /&gt;
                WHERE (&lt;br /&gt;
                d.userid        = :discussionuserid&lt;br /&gt;
                )&lt;br /&gt;
        &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        $params = [&lt;br /&gt;
            &#039;modname&#039;           =&amp;gt; &#039;forum&#039;,&lt;br /&gt;
            &#039;contextlevel&#039;      =&amp;gt; CONTEXT_MODULE,&lt;br /&gt;
            &#039;discussionuserid&#039;  =&amp;gt; $userid,&lt;br /&gt;
        ];&lt;br /&gt;
&lt;br /&gt;
        $contextlist-&amp;gt;add_from_sql($sql, $params);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====More complete example=====&lt;br /&gt;
&lt;br /&gt;
The following example includes a link to core_rating. &lt;br /&gt;
It will find any forum, forum discussion, or forum post where the user has any data, including:&lt;br /&gt;
&lt;br /&gt;
* Per-forum digest preferences;&lt;br /&gt;
* Per-forum subscription preferences;&lt;br /&gt;
* Per-forum read tracking preferences;&lt;br /&gt;
* Per-discussion subscription preferences;&lt;br /&gt;
* Per-post read data (if a user has read a post or not); and&lt;br /&gt;
* Per-post rating data.&lt;br /&gt;
&lt;br /&gt;
In the case of the rating data, this will include any post where the user has rated the post of another user.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Get the list of contexts that contain user information for the specified user.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   int           $userid       The user to search.&lt;br /&gt;
 * @return  contextlist   $contextlist  The list of contexts used in this plugin.&lt;br /&gt;
 */&lt;br /&gt;
public static function get_contexts_for_userid(int $userid) : contextlist {&lt;br /&gt;
    $ratingsql = \core_rating\privacy\provider::get_sql_join(&#039;rat&#039;, &#039;mod_forum&#039;, &#039;post&#039;, &#039;p.id&#039;, $userid);&lt;br /&gt;
    // Fetch all forum discussions, and forum posts.&lt;br /&gt;
    $sql = &amp;quot;SELECT c.id&lt;br /&gt;
                FROM {context} c&lt;br /&gt;
        INNER JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel&lt;br /&gt;
        INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname&lt;br /&gt;
        INNER JOIN {forum} f ON f.id = cm.instance&lt;br /&gt;
            LEFT JOIN {forum_discussions} d ON d.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_posts} p ON p.discussion = d.id&lt;br /&gt;
            LEFT JOIN {forum_digests} dig ON dig.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_subscriptions} sub ON sub.forum = f.id&lt;br /&gt;
            LEFT JOIN {forum_track_prefs} pref ON pref.forumid = f.id&lt;br /&gt;
            LEFT JOIN {forum_read} hasread ON hasread.forumid = f.id&lt;br /&gt;
            LEFT JOIN {forum_discussion_subs} dsub ON dsub.forum = f.id&lt;br /&gt;
            {$ratingsql-&amp;gt;join}&lt;br /&gt;
                WHERE (&lt;br /&gt;
                p.userid        = :postuserid OR&lt;br /&gt;
                d.userid        = :discussionuserid OR&lt;br /&gt;
                dig.userid      = :digestuserid OR&lt;br /&gt;
                sub.userid      = :subuserid OR&lt;br /&gt;
                pref.userid     = :prefuserid OR&lt;br /&gt;
                hasread.userid  = :hasreaduserid OR&lt;br /&gt;
                dsub.userid     = :dsubuserid OR&lt;br /&gt;
                {$ratingsql-&amp;gt;userwhere}&lt;br /&gt;
            )&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    $params = [&lt;br /&gt;
        &#039;modname&#039;           =&amp;gt; &#039;forum&#039;,&lt;br /&gt;
        &#039;contextlevel&#039;      =&amp;gt; CONTEXT_MODULE,&lt;br /&gt;
        &#039;postuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
        &#039;discussionuserid&#039;  =&amp;gt; $userid,&lt;br /&gt;
        &#039;digestuserid&#039;      =&amp;gt; $userid,&lt;br /&gt;
        &#039;subuserid&#039;         =&amp;gt; $userid,&lt;br /&gt;
        &#039;prefuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
        &#039;hasreaduserid&#039;     =&amp;gt; $userid,&lt;br /&gt;
        &#039;dsubuserid&#039;        =&amp;gt; $userid,&lt;br /&gt;
    ];&lt;br /&gt;
    $params += $ratingsql-&amp;gt;params;&lt;br /&gt;
&lt;br /&gt;
    $contextlist = new \core_privacy\local\request\contextlist();&lt;br /&gt;
    $contextlist-&amp;gt;add_from_sql($sql, $params);&lt;br /&gt;
&lt;br /&gt;
    return $contextlist;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exporting user data====&lt;br /&gt;
&lt;br /&gt;
After determining where in Moodle your plugin holds data about a user, the &#039;&#039;\core_privacy\manager&#039;&#039; will then ask your plugin to export all user data for a subset of those locations.&lt;br /&gt;
&lt;br /&gt;
This is achieved through use of the &#039;&#039;export_user_data&#039;&#039; function which takes the list of approved contexts in a &#039;&#039;\core_privacy\local\request\approved_contextlist&#039;&#039; object.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Export all user data for the specified user, in the specified contexts, using the supplied exporter instance.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   approved_contextlist    $contextlist    The approved contexts to export information for.&lt;br /&gt;
 */&lt;br /&gt;
public static function export_user_data(approved_contextlist $contextlist) {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;approved_contextlist&#039;&#039; includes both the user record, and a list of contexts, which can be retrieved by either processing it as an Iterator, or by calling &#039;&#039;get_contextids()&#039;&#039; or &#039;&#039;get_contexts()&#039;&#039; as required.&lt;br /&gt;
&lt;br /&gt;
Data is exported using a &#039;&#039;\core_privacy\local\request\content_writer&#039;&#039;, which is described in further detail below.&lt;br /&gt;
&lt;br /&gt;
===Plugins which store user preferences===&lt;br /&gt;
&lt;br /&gt;
Many plugins store a variety of user preferences, and must therefore export them.&lt;br /&gt;
&lt;br /&gt;
Since user preferences are a site-wide preference, these are exported separately to other user data.&lt;br /&gt;
In some cases the only data present is user preference data, whilst in others there is a combination of user-provided data, and user preferences.&lt;br /&gt;
&lt;br /&gt;
Storing of user preferences is achieved through implementation of the &#039;&#039;\core_privacy\local\request\preference_provider&#039;&#039; interface which defines one required function -- &#039;&#039;export_user_preferences&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Export all user preferences for the plugin.&lt;br /&gt;
 *&lt;br /&gt;
 * @param   int         $userid The userid of the user whose data is to be exported.&lt;br /&gt;
 */&lt;br /&gt;
public static function export_user_preferences(int $userid) {&lt;br /&gt;
    $markasreadonnotification = get_user_preference(&#039;markasreadonnotification&#039;, null, $userid);&lt;br /&gt;
    if (null !== $markasreadonnotification) {&lt;br /&gt;
        switch ($markasreadonnotification) {&lt;br /&gt;
            case 0:&lt;br /&gt;
                $markasreadonnotificationdescription = get_string(&#039;markasreadonnotificationno&#039;, &#039;mod_forum&#039;);&lt;br /&gt;
                break;&lt;br /&gt;
            case 1:&lt;br /&gt;
            default:&lt;br /&gt;
                $markasreadonnotificationdescription = get_string(&#039;markasreadonnotificationyes&#039;, &#039;mod_forum&#039;);&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
        writer::export_user_preference(&#039;mod_forum&#039;, &#039;markasreadonnotification&#039;, $markasreadonnotification, $markasreadonnotificationdescription);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Plugins which define a subplugin===&lt;br /&gt;
&lt;br /&gt;
Many plugin types are also able to define their own subplugins and will need to define a contract between themselves and their subplugins in order to fetch their data.&lt;br /&gt;
&lt;br /&gt;
This is required as the parent plugin and the child subplugin should be separate entities and the parent plugin must be able to function if one or more of its subplugins are uninstalled.&lt;br /&gt;
&lt;br /&gt;
The parent plugin is responsible for defining the contract,  and for interacting with its subplugins, though we intend to create helpers to make this easier.&lt;br /&gt;
&lt;br /&gt;
The parent plugin should define a new interface for each type of subplugin that it defines. This interface should extend the &#039;&#039;\core_privacy\local\request\plugin\subplugin_provider&#039;&#039; interface.&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
The following example defines the contract that assign submission subplugins may be required to implement.&lt;br /&gt;
&lt;br /&gt;
The assignment module is responsible for returning the contexts of all assignments where a user has data, but in some cases it is unaware of all of those cases - for example if a Teacher comments on a student submission it may not be aware of these as the information about this interaction may not be stored within its own tables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/assign/privacy/assignsubmission_provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
&lt;br /&gt;
namespace mod_assign\privacy;&lt;br /&gt;
use \core_privacy\local\metadata\collection;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
interface assignsubmission_provider extends&lt;br /&gt;
    // This Interface defines a subplugin.&lt;br /&gt;
    \core_privacy\local\request\subplugin_provider {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the SQL required to find all submission items where this user has had any involvements. &lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @return  \stdClass                   Object containing the join, params, and where used to select a these records from the database.&lt;br /&gt;
     */&lt;br /&gt;
    public static function get_items_with_user_interaction(int $userid) : \stdClass ;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Export all relevant user submissions information which match the combination of userid and attemptid.&lt;br /&gt;
     *&lt;br /&gt;
     * @param   int           $userid       The user to search.&lt;br /&gt;
     * @param   \context      $context      The context to export this submission against.&lt;br /&gt;
     * @param   array         $subcontext   The subcontext within the context to export this information&lt;br /&gt;
     * @param   int           $attid        The id of the submission to export.&lt;br /&gt;
     */&lt;br /&gt;
    public static function export_user_submissions(int $userid, \context $context, array $subcontext, int $attid) ;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Plugins which are subplugins to another plugin===&lt;br /&gt;
&lt;br /&gt;
If you are developing a sub-plugin of another plugin, then you will have to look at the relevant plugin in order to determine the exact contract.&lt;br /&gt;
&lt;br /&gt;
Each subplugin type should define a new interface which extends the &#039;&#039;\core_privacy\local\request\plugin\subplugin_provider&#039;&#039; interface and it is up to the parent plugin to define how they will interact with their children.&lt;br /&gt;
&lt;br /&gt;
The principles remain the same, but the exact implementation will differ depending upon requirements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/pluginname/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
namespace assignsubmission\onlinetext;&lt;br /&gt;
&lt;br /&gt;
class provider implements&lt;br /&gt;
    // This plugin does store personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
&lt;br /&gt;
    // This plugin is a subplugin of assign and must meet that contract.&lt;br /&gt;
    \mod_assign\privacy\assignsubmission_provider {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Plugins which are typically called by a Moodle subsystem===&lt;br /&gt;
&lt;br /&gt;
There are a number of plugintypes in Moodle which are typically called by a specific Moodle subsystem.&lt;br /&gt;
&lt;br /&gt;
Some of these are &#039;&#039;only&#039;&#039; called by that subsystem, for example plugins which are of the &#039;&#039;plagiarism&#039;&#039; plugintype should never be called directly, but are always invoked via the &#039;&#039;core_plagiarism&#039;&#039; subsystem.&lt;br /&gt;
&lt;br /&gt;
Conversely, there maybe other plugintypes which can be called both via a subsystem, and in some other fashion. We are still determining whether any plugintypes currently fit this pattern.&lt;br /&gt;
&lt;br /&gt;
If you are developing a plugin which belongs to a specific subsystem, then you will have to look at the relevant plugin in order to determine the exact contract.&lt;br /&gt;
&lt;br /&gt;
Each subsystem will define a new interface which extends the &#039;&#039;\core_privacy\local\request\plugin\subsystem_provider&#039;&#039; interface and it is up to that subsystem to define how they will interact with those plugins.&lt;br /&gt;
&lt;br /&gt;
The principles remain the same, but the exact implementation will differ depending upon requirements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;plagiarism/detectorator/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
namespace plagiarism_detectorator\privacy;&lt;br /&gt;
&lt;br /&gt;
class provider implements&lt;br /&gt;
    // This plugin does export personal user data.&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
&lt;br /&gt;
    // This plugin is always linked against another activity module via the Plagiarism API.&lt;br /&gt;
    \core_plagiarism\privacy\plugin_provider {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exporting data===&lt;br /&gt;
&lt;br /&gt;
Any plugin which stores data must also export it.&lt;br /&gt;
&lt;br /&gt;
To cater for this the privacy API includes a &#039;&#039;\core_privacy\local\request\content_writer&#039;&#039;, which defines a set of functions to store different types of data.&lt;br /&gt;
&lt;br /&gt;
Broadly speaking data is broken into the following types:&lt;br /&gt;
&lt;br /&gt;
* Data - this is the object being described. For example the post content in a forum post;&lt;br /&gt;
* Related data - this is data related to the object being stored. For example, ratings of a forum post;&lt;br /&gt;
* Metadata - This is metadata about the main object. For example whether you are subscribed to a forum discussion;&lt;br /&gt;
* User preferences - this is data about a site-wide preference;&lt;br /&gt;
* Files - Any files that you are stored within Moodle on behalf of this plugin; and&lt;br /&gt;
* Custom files - For custom file formats - e.g. a calendar feed for calendar data. These should be used sparingly.&lt;br /&gt;
&lt;br /&gt;
Each piece of data is stored against a specific Moodle &#039;&#039;context&#039;&#039;, which will define how the data is structured within the exporter.&lt;br /&gt;
Data, and Related data only accept the &#039;&#039;stdClass&#039;&#039; object, whilst metadata should be stored as a set of key/value pairs which include a description.&lt;br /&gt;
&lt;br /&gt;
In some cases the data being stored belongs within an implicit structure. For example, one forum has many forum discussions, which each have a number of forum posts. This structure is represented by an &#039;&#039;array&#039;&#039; referred to as a &#039;&#039;subcontext&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;content_writer&#039;&#039; must &#039;&#039;always&#039;&#039; be called with a specific context, and can be called as follows:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
use \core_privacy\local\request\writer;&lt;br /&gt;
&lt;br /&gt;
writer::with_context($context)&lt;br /&gt;
    -&amp;gt;export_data($subcontext, $post)&lt;br /&gt;
    -&amp;gt;export_area_files($subcontext, &#039;mod_forum&#039;, &#039;post&#039;, $post-&amp;gt;id)&lt;br /&gt;
    -&amp;gt;export_metadata($subcontext, &#039;postread&#039;, (object) [&#039;firstread&#039; =&amp;gt; $firstread], new \lang_string(&#039;privacy:export:post:postread&#039;));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any text field which supports Moodle files must also be rewritten:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/forum/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// …&lt;br /&gt;
use \core_privacy\local\request\writer;&lt;br /&gt;
&lt;br /&gt;
writer::with_context($context)&lt;br /&gt;
    -&amp;gt;rewrite_pluginfile_urls($postarea, &#039;mod_forum&#039;, &#039;post&#039;, $post-&amp;gt;id, $post-&amp;gt;message);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Providing a way to delete user data===&lt;br /&gt;
&lt;br /&gt;
Deleting user data is also implemented in the request interface. There are two methods that need to be created. The first one to remove all user data from a context, the other to remove user data for a specific user in a list of contexts.&lt;br /&gt;
&lt;br /&gt;
====Delete for a context====&lt;br /&gt;
&lt;br /&gt;
A context is given and all user data (for all users) is to be deleted from the plugin. This will be called when the retention period for the plugin has expired to adhere to the privacy by design requirement.�&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/choice/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function delete_data_for_all_users_in_context(deletion_criteria $criteria) {&lt;br /&gt;
    global $DB;&lt;br /&gt;
    $context = $criteria-&amp;gt;get_context();&lt;br /&gt;
    if (empty($context)) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    $instanceid = $DB-&amp;gt;get_field(&#039;course_modules&#039;, &#039;instance&#039;, [&#039;id&#039; =&amp;gt; $context-&amp;gt;instanceid], MUST_EXIST);&lt;br /&gt;
    $DB-&amp;gt;delete_records(&#039;choice_answers&#039;, [&#039;choiceid&#039; =&amp;gt; $instanceid]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Delete personal information for a specific user and context(s)====&lt;br /&gt;
&lt;br /&gt;
An &#039;&#039;approved_contextlist&#039;&#039; is given and user data related to that user should either be completely deleted, or overwritten if a structure needs to be maintained. This will be called when a user has requested the right to be forgotten. All attempts should be made to delete this data where practical while still allowing the plugin to be used by other users.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mod/choice/classes/privacy/provider.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
public static function delete_data_for_user(approved_contextlist $contextlist) {&lt;br /&gt;
    global $DB;&lt;br /&gt;
    &lt;br /&gt;
    if (empty($contextlist-&amp;gt;count())) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    $userid = $contextlist-&amp;gt;get_user()-&amp;gt;id;&lt;br /&gt;
    foreach ($contextlist-&amp;gt;get_contexts() as $context) {&lt;br /&gt;
        $instanceid = $DB-&amp;gt;get_field(&#039;course_modules&#039;, &#039;instance&#039;, [&#039;id&#039; =&amp;gt; $context-&amp;gt;instanceid], MUST_EXIST);&lt;br /&gt;
        $DB-&amp;gt;delete_records(&#039;choice_answers&#039;, [&#039;choiceid&#039; =&amp;gt; $instanceid, &#039;userid&#039; =&amp;gt; $userid]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Difference between Moodle 3.3 and more recent versions===&lt;br /&gt;
Moodle 3.3 has a minimum requirement of php 5.6 and so type hinting and return type declarations are not supported in this version. Consequently the privacy API for this version does not have these features.&lt;br /&gt;
====What to do if you have one plugin that supports multiple features====&lt;br /&gt;
This is something that we have considered and we have put in place a polyfill. This gets around the restrictions of one version having type hinting and return type declarations while another does not.&lt;br /&gt;
====Example====&lt;br /&gt;
To use the polyfill include the legacy polyfill trait and create the necessary static methods but with an underscore (shown below).&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
class provider implements&lt;br /&gt;
    \core_privacy\local\metadata\provider,&lt;br /&gt;
    \core_privacy\local\request\plugin\provider {&lt;br /&gt;
&lt;br /&gt;
    // This is a trait must be included.&lt;br /&gt;
    use \core_privacy\local\legacy_polyfill;&lt;br /&gt;
&lt;br /&gt;
    // The required methods must be in this format starting with an underscore.&lt;br /&gt;
    public static function _get_metadata(collection $collection) {&lt;br /&gt;
        // Code for returning metadata goes here.&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Subject Access Request FAQ]]&lt;br /&gt;
* [[:en:GDPR|GDPR]] in the user documentation&lt;br /&gt;
&lt;br /&gt;
[[Category:GDPR]]&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Plugin_contribution_checklist&amp;diff=53550</id>
		<title>Plugin contribution checklist</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Plugin_contribution_checklist&amp;diff=53550"/>
		<updated>2017-12-27T03:05:45Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* Namespace collisions - module exception */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Plugins development}}&lt;br /&gt;
&lt;br /&gt;
Before approaching the [https://moodle.org/plugins Moodle plugins directory] and submitting your plugin (or a new plugin version), you are encouraged to go through the checklists below and fix eventual issues with your plugin. Doing so will make the reviewer of your plugin happy :-) and may have impact on how long your plugin has to spend in the approval queue before it lands smoothly.&lt;br /&gt;
&lt;br /&gt;
== Meta-data ==&lt;br /&gt;
&lt;br /&gt;
=== Plugin descriptions ===&lt;br /&gt;
&lt;br /&gt;
* Have a meaningful description of your plugin prepared in English.&lt;br /&gt;
* You will need a short concise description (just a sentence or two) for the short description field, and another elaborated one for the full description field.&lt;br /&gt;
* It is encouraged to have the same info at the plugin record page and in its &amp;lt;tt&amp;gt;README&amp;lt;/tt&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Supported Moodle versions ===&lt;br /&gt;
&lt;br /&gt;
* New plugins submitted into the plugins directory must support at least one of the currently maintained Moodle version.&lt;br /&gt;
* See [[Releases]] for the list of currently maintained Moodle versions (policy issue MDL-47579).&lt;br /&gt;
&lt;br /&gt;
=== Code repository name ===&lt;br /&gt;
&lt;br /&gt;
* Provide a consistent experience for other Moodle developers and site administrators - follow the repository naming convention for Moodle plugins:&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;moodle-{plugintype}_{pluginname}&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Source control URL ===&lt;br /&gt;
&lt;br /&gt;
* Facilitate sharing and further development of your open-source plugin - provide publicly accessible URL of your code repository.&lt;br /&gt;
* Github is a choice of most Moodle plugin developers.&lt;br /&gt;
&lt;br /&gt;
=== Bug tracker URL ===&lt;br /&gt;
&lt;br /&gt;
* Encourage participation and have a place to report issues, bugs, make feature requests, or suggest other types of improvements.&lt;br /&gt;
* Both [[Tracker guide|Moodle tracker]] and [https://guides.github.com/features/issues/ Github issues] are common.&lt;br /&gt;
* See [[Plugin_contribution#Tracker]] if you want to use the Moodle tracker.&lt;br /&gt;
&lt;br /&gt;
=== Documentation URL ===&lt;br /&gt;
&lt;br /&gt;
* Have a place where further documentation of your plugin will be located.&lt;br /&gt;
* [[Plugin documentation|Moodle docs]] is preferred location, [https://guides.github.com/features/wikis/ Github wikis] or your own website will work, too.&lt;br /&gt;
&lt;br /&gt;
=== Illustrative screenshots ===&lt;br /&gt;
&lt;br /&gt;
* Capture some screenshots of your plugin to help folks get an idea of what it looks like when installed.&lt;br /&gt;
* We will use these screenshots at more places in the plugins directory in the future.&lt;br /&gt;
&lt;br /&gt;
=== Licensing ===&lt;br /&gt;
&lt;br /&gt;
* All files that implement the interface between the Moodle core and the plugin must be licensed under GNU GPL v3 (or later).&lt;br /&gt;
* Additional files contained in the plugin ZIP package (such as third party libraries used by the plugin, or included media) may eventually use other license as long as it is [http://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses GPL compatible]. See [[Plugin files#thirdpartylibs.xml]] for how to do it.&lt;br /&gt;
* Note that binary files violate GPL unless the source code is also included or available (e.g. Java classes or Flash).&lt;br /&gt;
&lt;br /&gt;
=== Subscription needed ===&lt;br /&gt;
&lt;br /&gt;
* If the plugin requires a third-party subscription based service, make sure the description states it very clearly.&lt;br /&gt;
* To allow the testing of the plugin functionality, prepare demo credentials (such as API keys etc) so that the approval team can use them to see the plugin in action.&lt;br /&gt;
&lt;br /&gt;
== Usability ==&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
* Make sure the plugin installs smoothly from the ZIP package using the in-build plugin installation interface.&lt;br /&gt;
* If any non-standard post-installation steps are needed, make sure they are clearly listed in both plugin description and the &amp;lt;tt&amp;gt;README&amp;lt;/tt&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
* If the plugin depends on another additional plugin, make sure it is clearly stated in the description and in the &amp;lt;tt&amp;gt;README&amp;lt;/tt&amp;gt; file.&lt;br /&gt;
* Also declare the dependency explicitly in the plugin&#039;s [[version.php]] file.&lt;br /&gt;
&lt;br /&gt;
=== Functionality ===&lt;br /&gt;
&lt;br /&gt;
* Test the plugin functionality with full developer debugging enabled.&lt;br /&gt;
* Make sure the code does not throw unexpected PHP warnings, notices or even errors.&lt;br /&gt;
&lt;br /&gt;
=== Cross-DB compatibility ===&lt;br /&gt;
&lt;br /&gt;
* Test the plugin with multiple database engines supported by Moodle.&lt;br /&gt;
* At very least, the plugin is supposed to work with MySQL and PostgreSQL unless reasons are clearly explained in the description and the &amp;lt;tt&amp;gt;README&amp;lt;/tt&amp;gt; file (such as the plugin is a wrapper for third-party DB specific utility).&lt;br /&gt;
* [[Data manipulation API]] helps you to ensure cross-db compatibility.&lt;br /&gt;
&lt;br /&gt;
== Coding ==&lt;br /&gt;
&lt;br /&gt;
=== Coding style ===&lt;br /&gt;
&lt;br /&gt;
* It is encouraged to follow [[Coding style|Moodle coding style]] and other [[Coding|coding guidelines]].&lt;br /&gt;
* It&#039;s not always possible to achieve &amp;quot;all greens&amp;quot; in automated syntax checks (especially when third party libraries are involved) but you should aim to it.&lt;br /&gt;
* Consistent style helps others to read and understand your code (not only during the approval review).&lt;br /&gt;
&lt;br /&gt;
=== English ===&lt;br /&gt;
&lt;br /&gt;
* Moodle is an international project. To facilitate sharing, reviews of and contributions to your code, all comments, variable names, function names etc. should be in English.&lt;br /&gt;
&lt;br /&gt;
=== Boilerplate ===&lt;br /&gt;
&lt;br /&gt;
* All files should contain the common boilerplate at the beginning with explicit GPL license statement.&lt;br /&gt;
* See the section [[Coding_style#Files]] for the template.&lt;br /&gt;
&lt;br /&gt;
=== Copyrights ===&lt;br /&gt;
&lt;br /&gt;
* All files should contain the &amp;lt;tt&amp;gt;@copyright&amp;lt;/tt&amp;gt; tag with your name.&lt;br /&gt;
* If you are re-using someone else&#039;s file, keep the original copyrights reference to the previous author and add your name as a copyright holder.&lt;br /&gt;
* Both things should be clear: (1) that it is you to be blamed for the file code and (2) that your work is based on someone else&#039;s work.&lt;br /&gt;
&lt;br /&gt;
=== CSS styles ===&lt;br /&gt;
&lt;br /&gt;
* Make sure to use properly namespaced selectors so that your style sheets can be safely concatenated with the ones provided by other plugins.&lt;br /&gt;
* Plugin specific CSS selectors are needed to make sure that your styling does not accidentally affect other parts of Moodle outside your plugin scope.&lt;br /&gt;
* For example, instead of the selector &amp;lt;tt&amp;gt;.contentarea&amp;lt;/tt&amp;gt; it is better to use something like &amp;lt;tt&amp;gt;.path-mod-mymodule .contentarea&amp;lt;/tt&amp;gt; as the .path-* classes are automatically added by the Moodle core renderers to the HTML &amp;lt;body&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
=== Namespace collisions ===&lt;br /&gt;
&lt;br /&gt;
* Check that all your DB tables, settings, functions, classes, constants and variables are named correctly. In most cases their names must start with the plugin type and plugin name, as in &amp;lt;tt&amp;gt;block_yourname_something&amp;lt;/tt&amp;gt; (so called [[Frankenstyle|frankenstyle]] prefix). Modules are an exception to this rule as functions such as get_coursemodule_from_id() rely on there being no preface of &#039;mod&#039;.&lt;br /&gt;
* Do not define own classes, functions, variables or constants in the global PHP scope without the valid frankenstyle prefix.&lt;br /&gt;
* See [[Coding style#Functions and Methods]] for details.&lt;br /&gt;
&lt;br /&gt;
=== Settings storage ===&lt;br /&gt;
&lt;br /&gt;
* Check that your settings are stored in the table &amp;lt;tt&amp;gt;config_plugins&amp;lt;/tt&amp;gt; and not in the main &amp;lt;tt&amp;gt;config&amp;lt;/tt&amp;gt; table.&lt;br /&gt;
* This helps to avoid &amp;lt;tt&amp;gt;$CFG&amp;lt;/tt&amp;gt; bloat and potential collisions.&lt;br /&gt;
* Use &amp;lt;tt&amp;gt;get_config()&amp;lt;/tt&amp;gt; to pull the settings data out of the &amp;lt;tt&amp;gt;config_plugins&amp;lt;/tt&amp;gt; table.&lt;br /&gt;
* In the file &amp;lt;tt&amp;gt;settings.php&amp;lt;/tt&amp;gt;, the setting names are supposed to be &amp;lt;tt&amp;gt;plugintype_pluginname/settingname&amp;lt;/tt&amp;gt; (note the slash) and not &amp;lt;tt&amp;gt;plugintype_pluginname_settingname&amp;lt;/tt&amp;gt; or even just &amp;lt;tt&amp;gt;settingname&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* If you eventually need to change the settings yourself, use &amp;lt;tt&amp;gt;set_config()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Strings ===&lt;br /&gt;
&lt;br /&gt;
* Avoid hard-code texts in the code, always use &amp;lt;tt&amp;gt;get_string()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Just the English strings should ship with the plugin. All other translations are supposed to be submitted as contributions at [https://lang.moodle.org https://lang.moodle.org] once your plugin is approved - see [[Translating plugins]].&lt;br /&gt;
* Your code must not rely on trailing and leading whitespace in strings.&lt;br /&gt;
* The string file must be considered as pure data file with the syntax &amp;lt;tt&amp;gt;$string[&#039;id&#039;] = &#039;value&#039;;&amp;lt;/tt&amp;gt;. No other PHP syntax such as [http://php.net/manual/en/language.operators.string.php concatenation],  [http://php.net/manual/en/language.types.string.php heredoc and nowdoc] is supported by the tools that we use when processing your strings (even if it may work in Moodle itself).&lt;br /&gt;
* The English language pack (lang/en/) in Moodle does not use &amp;quot;Capitalised Titles&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
* Never trust the user input.&lt;br /&gt;
* Do not access superglobals like &amp;lt;tt&amp;gt;$_REQUEST&amp;lt;/tt&amp;gt; directly, use wrappers like &amp;lt;tt&amp;gt;required_param()&amp;lt;/tt&amp;gt; with correct type declared to sanitize input.&lt;br /&gt;
* Always use placeholders in custom SQL queries (&amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;:named&amp;lt;/tt&amp;gt;).&lt;br /&gt;
* Always check for the &amp;lt;tt&amp;gt;sesskey&amp;lt;/tt&amp;gt; before taking an action on submitted data.&lt;br /&gt;
* Check for &amp;lt;tt&amp;gt;require_login()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Always check that the user has appropriate capabilities before displaying the widgets &#039;&#039;and&#039;&#039; before taking the actual action.&lt;br /&gt;
* Avoid using malicious functions like &amp;lt;tt&amp;gt;call_user_func()&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;eval()&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;unserialize()&amp;lt;/tt&amp;gt; and so on, especially when they would be called with user-supplied data.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [https://moodle.org/mod/forum/discuss.php?d=263614 Some common issues in submitted plugins] post at the Plugins traffic forum at moodle.org&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_3.3_release_notes&amp;diff=53549</id>
		<title>Moodle 3.3 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_3.3_release_notes&amp;diff=53549"/>
		<updated>2017-12-22T00:34:32Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* Server requirements - utf8mb4 is not a requirement for 3.3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Releases]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
 &lt;br /&gt;
Release date: 15 May 2017&lt;br /&gt;
 &lt;br /&gt;
Here is [https://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=project+%3D+mdl+AND+resolution+%3D+fixed+AND+fixVersion+in+%28%223.3%22%29+ORDER+BY+priority+DESC&amp;amp;runQuery=true&amp;amp;clear=true the full list of fixed issues in 3.3].&lt;br /&gt;
&lt;br /&gt;
See our [https://docs.moodle.org/33/en/New_features New Features page] for a more user-friendly introduction to Moodle 3.3 with screenshots.&lt;br /&gt;
&lt;br /&gt;
If you are upgrading from previous version, make sure you read the [https://docs.moodle.org/33/en/Upgrading Upgrading] documentation. &lt;br /&gt;
&lt;br /&gt;
==Server requirements==&lt;br /&gt;
&lt;br /&gt;
These are just the minimum supported versions. We recommend keeping all of your software up-to-date.&lt;br /&gt;
&lt;br /&gt;
* Moodle upgrade:  Moodle 2.7 or later (if upgrading from earlier versions, you must upgrade to 2.7.14 as a first step)&lt;br /&gt;
* PHP version: minimum PHP 5.6.5. &#039;&#039;Note: minimum PHP version has increased since Moodle 3.1&#039;&#039;. PHP 7.0.x and 7.1.x are supported but have some [https://docs.moodle.org/dev/Moodle_and_PHP7#Can_I_use_PHP7_yet.3F engine limitations]. &lt;br /&gt;
* PHP extensions &#039;&#039;&#039;openssl&#039;&#039;&#039; and &#039;&#039;&#039;fileinfo&#039;&#039;&#039; are now required in Moodle 3.3 (they were recommended in 3.2)&lt;br /&gt;
* If you use PostgreSQL the minimum supported version is now 9.3 (was 9.1 in Moodle 3.2)&lt;br /&gt;
* (Recommendation only) If you use MySQL or MariaDB, make sure your database supports full UTF-8 (utf8mb4) if you install a new instance of Moodle. CLI script may be used to convert to utf8mb4 if you&#039;re upgrading. You may choose to keep using &#039;utf8_*&#039;, but then a warning will show that the database isn&#039;t using full UTF-8 support and suggest moving to &#039;utf8mb4_unicode_ci&#039;. See [[:en:MySQL full unicode support|MySQL full unicode support]] for details. &lt;br /&gt;
&lt;br /&gt;
=== Database requirements ===&lt;br /&gt;
&lt;br /&gt;
Moodle supports the following database servers. Again, version numbers are just the minimum supported version. We recommend running the latest stable version of any software.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Database&lt;br /&gt;
! Minimum version&lt;br /&gt;
! Recommended&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
| 9.3&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mysql.com/ MySQL]&lt;br /&gt;
| 5.5.31&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [https://mariadb.org/ MariaDB]&lt;br /&gt;
| 5.5.31&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microsoft.com/en-us/server-cloud/products/sql-server/ Microsoft SQL Server]&lt;br /&gt;
| 2008&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.oracle.com/us/products/database/overview/index.html Oracle Database]&lt;br /&gt;
| 10.2&lt;br /&gt;
| Latest&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Client requirements==&lt;br /&gt;
&lt;br /&gt;
=== Browser support ===&lt;br /&gt;
Moodle is compatible with any standards compliant web browser. We regularly test Moodle with the following browsers:&lt;br /&gt;
&lt;br /&gt;
Desktop:&lt;br /&gt;
* Chrome&lt;br /&gt;
* Firefox&lt;br /&gt;
* Safari&lt;br /&gt;
* Edge&lt;br /&gt;
* Internet Explorer&lt;br /&gt;
&lt;br /&gt;
Mobile:&lt;br /&gt;
* MobileSafari&lt;br /&gt;
* Google Chrome&lt;br /&gt;
&lt;br /&gt;
For the best experience and optimum security, we recommend that you keep your browser up to date. https://whatbrowser.org&lt;br /&gt;
&lt;br /&gt;
Note: Legacy browsers with known compatibility issues with Moodle 3.3:&lt;br /&gt;
* Internet Explorer 10 and below&lt;br /&gt;
* Safari 7 and below&lt;br /&gt;
&lt;br /&gt;
==Major features==&lt;br /&gt;
&lt;br /&gt;
=== Highlights ===&lt;br /&gt;
&lt;br /&gt;
* MDL-55611 - New [https://docs.moodle.org/33/en/Course_overview Course overview] dashboard block featuring timeline of events&lt;br /&gt;
* MDL-58220 - Make use of [https://docs.moodle.org/33/en/OAuth_2_services OAuth 2 services] to allow users to [https://docs.moodle.org/33/en/OAuth_2_authentication authenticate with Google G-Suite or Microsoft Office accounts] and manage files from associated drives&lt;br /&gt;
* MDL-39913 - New [https://docs.moodle.org/33/en/Assignment_settings Assignment setting] for restricting submission file types&lt;br /&gt;
* MDL-4782 - [https://docs.moodle.org/33/en/Stealth_activities &amp;quot;Stealth mode&amp;quot;] for resources/activities in a course - not displayed on the course page but available for students&lt;br /&gt;
* MDL-40759 - New Font Awesome icon font for all icons in Moodle&lt;br /&gt;
&lt;br /&gt;
=== For teachers ===&lt;br /&gt;
&lt;br /&gt;
* MDL-58138 - [https://docs.moodle.org/33/en/Activity_completion_settings Activity completion settings] for setting activity completion defaults and bulk editing of completion requirements&lt;br /&gt;
* MDL-48771 - [https://docs.moodle.org/33/en/Building_Quiz Quiz activity]: Option to delete multiple questions&lt;br /&gt;
* MDL-53814 - Quiz activity: Question type icons are displayed in the quiz manual grading overview&lt;br /&gt;
* MDL-55459 - [https://docs.moodle.org/33/en/Assignment_settings Assignment activity]: Annotated PDF comments are collapsible&lt;br /&gt;
* MDL-23919 - [https://docs.moodle.org/33/en/Database_activity_settings Database activity]: The setting &amp;quot;Required entries&amp;quot; is now an activity completion condition&lt;br /&gt;
* MDL-57769 - Topic and weeks course formats: After a course is created, sections can be added and removed only from the course page (it is no longer possible to have &amp;quot;orphaned&amp;quot; activities)&lt;br /&gt;
* MDL-46929, MDL-57456, MDL-57457 - [https://docs.moodle.org/33/en/Using_Forum Forum posts], [https://docs.moodle.org/33/en/Using_Glossary glossary entries] and [https://docs.moodle.org/33/en/Book_settings book chapters] may be tagged&lt;br /&gt;
* MDL-56251 - For courses in weekly format, a new [https://docs.moodle.org/33/en/Course_settings course setting] allows for the course end date to be calculated automatically&lt;br /&gt;
* MDL-47354 - Allow the page size in the Single view report to be configurable&lt;br /&gt;
&lt;br /&gt;
=== Backup and restore ===&lt;br /&gt;
&lt;br /&gt;
* MDL-34859 - Add site defaults for all restore settings, improve UI around &amp;quot;Overwrite course configuration&amp;quot; select&lt;br /&gt;
* MDL-40838 - Allow to restore non-default enrollment methods without restoring users&lt;br /&gt;
* MDL-57769 - When restoring/importing big courses in Weeks and Topics formats into small existing courses ajust the number of sections automatically&lt;br /&gt;
&lt;br /&gt;
=== For administrators ===&lt;br /&gt;
&lt;br /&gt;
Please read carefully: [https://docs.moodle.org/33/en/Upgrading#Possible_issues_that_may_affect_you_in_Moodle_3.3 Possible issues that may affect you in Moodle 3.3]&lt;br /&gt;
&lt;br /&gt;
* MDL-46375 - Support for storing files not on the local drive (there are no open-source solutions at the moment, developer&#039;s help is required to implement custom cloud storage)&lt;br /&gt;
* MDL-55528, MDL-58280 - New [https://docs.moodle.org/33/en/Document_converters document converter] plugin type allows alternatives to unoconv, such as the [https://docs.moodle.org/33/en/Google_Drive_converter Google Drive converter]&lt;br /&gt;
* MDL-55980 - Run individual scheduled tasks from web interface&lt;br /&gt;
* MDL-57896 - CLI wrapper for get_config() and set_config() methods&lt;br /&gt;
* MDL-57789 - Use Cache-Control: immutable when serving files&lt;br /&gt;
* MDL-37765 - New capability to bypass access restrictions, separated from capability to view hidden activities&lt;br /&gt;
* MDL-57913 - Convert external database authentication synchronisation to scheduled task&lt;br /&gt;
&lt;br /&gt;
==== Plugins removal and deprecation ====&lt;br /&gt;
&lt;br /&gt;
* The repository Skydrive is deprecated; please migrate to the newer [https://docs.moodle.org/33/en/OneDrive_repository OneDrive repository]&lt;br /&gt;
* The Dashboard block Course overview is replaced with a new block [https://docs.moodle.org/33/en/Course_overview Course overview] which is a different plugin. If you want to use the old block, you need to download and install it from https://moodle.org/plugins/block_course_overview&lt;br /&gt;
&lt;br /&gt;
=== Mobile app support ===&lt;br /&gt;
&lt;br /&gt;
* MDL-57410 - Allow admins to add new external links to pages in the main menu of the Mobile app&lt;br /&gt;
* MDL-57408 - Add new settings for allowing renaming strings in the Mobile app&lt;br /&gt;
* MDL-49423 - Add new settings for disabling Mobile app functionalities&lt;br /&gt;
* MDL-57759 - Allow offline attempts via the Mobile app in the lesson module&lt;br /&gt;
* MDL-57162 - Support Native App install banners for Android as well as iOS for the mobile app&lt;br /&gt;
&lt;br /&gt;
=== Other improvements ===&lt;br /&gt;
&lt;br /&gt;
* MDL-33483 - Google Docs repository: Save Doc files in different formats to RTF&lt;br /&gt;
* MDL-42266 - Improve the list of maximum file size options for file uploads&lt;br /&gt;
* MDL-51853 - Calendar subscriptions from imported files should be editable&lt;br /&gt;
* MDL-41729 - Add ability to change passwords for users using Shibboleth&lt;br /&gt;
* MDL-57572, MDL-57570, MDL-57355 - Redis and static caches performance improvements if igbinary library is installed&lt;br /&gt;
* MDL-56808 - SCORM module: Performance improvements when running SCORM 1.2 packages&lt;br /&gt;
* MDL-57686 - Add support for PDO databases in external database authentication&lt;br /&gt;
* MDL-57638 - RSS Block: RSS feeds are more heavily cached and correctly respect skip values&lt;br /&gt;
&lt;br /&gt;
===For developers===&lt;br /&gt;
&lt;br /&gt;
* MDL-55528 - New plugin type &#039;fileconverter&#039; for file conversions, unoconv is now a plugin that can be replaced with scalable commercial solutions (see [[File Converters]])&lt;br /&gt;
* MDL-40759 - Font Awesome icon font is used for all icons in Moodle (see [[Moodle_icons#Font_awesome_icons|Moodle icons]])&lt;br /&gt;
* MDL-46375 - Support for storing files not on the local drive is implemented by allowing to override functionality of file_storage and stored_file classes (see [[File System API]])&lt;br /&gt;
* MDL-12689 - Convert all authentication plugins to use settings.php (see [https://github.com/moodle/moodle/blob/master/auth/upgrade.txt upgrade.txt])&lt;br /&gt;
* MDL-53978 - Add extra plugin callbacks for every major stage of page render (see [https://github.com/moodle/moodle/commit/5ebd1fb9768969956c9131df4274f9cdff7f0134 commit])&lt;br /&gt;
* MDL-58138 - Course modules may provide additional callbacks to participate in bulk editing of activities completion rules in a course&lt;br /&gt;
* MDL-58220 - Better office integration&lt;br /&gt;
* MDL-45584 - Multiple caches can be instantiated with the same definition but with different identifiers&lt;br /&gt;
* MDL-57769 - Course formats: Attribute &#039;numsections&#039; was removed from topics and weeks, other course formats may want to implement similar changes&lt;br /&gt;
* MDL-55956 - Priority field for the calendar events allowing to specify the priority of overrides&lt;br /&gt;
* MDL-58566 - New methods for retrieving calendar events&lt;br /&gt;
* MDL-55941 - New element to select first name of first/last names is implemented in tablelib or can be used by developers elsewhere ([https://github.com/moodle/moodle/blob/master/lib/templates/initials_bar.mustache template])&lt;br /&gt;
* MDL-56519 - Lint behat .feature files&lt;br /&gt;
* MDL-57273 - New classes (core\persistent, core\form\persistent, core\external\exporter, \core\external\persistent_exporter) used to represent a data-model and export that data in a standard format for webservices (previously was used in competencies) (see [[Persistent form]], [[Persistent]], [[Exporter]])&lt;br /&gt;
* MDL-57490 - Removed several legacy JS functions from javascript-static.js&lt;br /&gt;
* MDL-57690 - mcore YUI rollup is no longer included on every single Moodle page (see [[https://moodle.org/mod/forum/discuss.php?d=346520 forum post]])&lt;br /&gt;
&lt;br /&gt;
==== Upgrading plugins ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Check for changes in core APIs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read lib/upgrade.txt to check for the deprecations and core API changes, make sure you applied them to your plugin. Note that entries there are not sorted by priority but rather by integration time. Below is the list of upgrade.txt files that contain information about upgrading from Moodle 3.2 to Moodle 3.3 (note that if you upgrade from earlier versions there may be more files):&lt;br /&gt;
&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/lib/upgrade.txt lib/upgrade.txt] changes to various core APIs, deprecations, functions removal&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/admin/upgrade.txt admin/upgrade.txt] changes to administration-related functions&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/cache/upgrade.txt cache/upgrade.txt] changes to Cache API&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/calendar/upgrade.txt calendar/upgrade.txt] changes to Calendar API&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/competency/upgrade.txt competency/upgrade.txt] changes to Competency API&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/course/upgrade.txt course/upgrade.txt] changes to course-related functions&lt;br /&gt;
&lt;br /&gt;
For the next releases we are thinking about improving the format of upgrade.txt notes, please have your say on policy issue MDL-58879&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Check for changes in the API of your plugin type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Below is the list of plugin types that had API changes between Moodle 3.2 and 3.3:&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/auth/upgrade.txt auth/upgrade.txt] Authentication plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/blocks/upgrade.txt blocks/upgrade.txt] Block plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/course/format/upgrade.txt course/format/upgrade.txt] Course format plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/enrol/upgrade.txt enrol/upgrade.txt] Enrolment method plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/media/upgrade.txt media/upgrade.txt] Media player plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/mod/upgrade.txt mod/upgrade.txt] Activity module plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/question/type/upgrade.txt question/type/upgrade.txt] Question types plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/repository/upgrade.txt repository/upgrade.txt] Repository plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/theme/upgrade.txt theme/upgrade.txt] Themes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Check for changes in the depended plugins&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If your plugin depends on another plugin or calls methods from another plugin, read upgrade.txt in this plugin directory (if it exists). Below is the list of standard plugins that had changes between Moodle 3.2 and 3.3:&lt;br /&gt;
&lt;br /&gt;
Due to changes in Authentication plugins settings all standard auth plugins were updated: [https://raw.githubusercontent.com/moodle/moodle/master/auth/cas/upgrade.txt auth_cas], [https://raw.githubusercontent.com/moodle/moodle/master/auth/db/upgrade.txt auth_db], [https://raw.githubusercontent.com/moodle/moodle/master/auth/email/upgrade.txt auth_email], [https://raw.githubusercontent.com/moodle/moodle/master/auth/fc/upgrade.txt auth_fc], [https://raw.githubusercontent.com/moodle/moodle/master/auth/imap/upgrade.txt auth_imap], [https://raw.githubusercontent.com/moodle/moodle/master/auth/ldap/upgrade.txt auth_ldap], [https://raw.githubusercontent.com/moodle/moodle/master/auth/manual/upgrade.txt auth_manual], [https://raw.githubusercontent.com/moodle/moodle/master/auth/mnet/upgrade.txt auth_mnet], [https://raw.githubusercontent.com/moodle/moodle/master/auth/nntp/upgrade.txt auth_nntp], [https://raw.githubusercontent.com/moodle/moodle/master/auth/none/upgrade.txt auth_none], [https://raw.githubusercontent.com/moodle/moodle/master/auth/pam/upgrade.txt auth_pam], [https://raw.githubusercontent.com/moodle/moodle/master/auth/pop3/upgrade.txt auth_pop3], [https://raw.githubusercontent.com/moodle/moodle/master/auth/shibboleth/upgrade.txt auth_shibboleth]&lt;br /&gt;
&lt;br /&gt;
Other standard plugins that were updated in 3.3: [https://raw.githubusercontent.com/moodle/moodle/master/admin/tool/lp/upgrade.txt tool_lp], [https://raw.githubusercontent.com/moodle/moodle/master/admin/tool/mobile/upgrade.txt tool_mobile], [https://raw.githubusercontent.com/moodle/moodle/master/enrol/ldap/upgrade.txt enrol_ldap], [https://raw.githubusercontent.com/moodle/moodle/master/mod/assign/upgrade.txt mod_assign], [https://raw.githubusercontent.com/moodle/moodle/master/mod/data/upgrade.txt mod_data], [https://raw.githubusercontent.com/moodle/moodle/master/mod/feedback/upgrade.txt mod_feedback], [https://raw.githubusercontent.com/moodle/moodle/master/mod/forum/upgrade.txt mod_forum], [https://raw.githubusercontent.com/moodle/moodle/master/mod/lesson/upgrade.txt mod_lesson]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Do a smoke test of your plugin with developer debugging mode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Run all behat and phpunit tests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Moodle 3.2 release notes]]&lt;br /&gt;
 &lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Moodle 3.3]]&lt;br /&gt;
 &lt;br /&gt;
[[fr:Notes de mise à jour de Moodle 3.3]]&lt;br /&gt;
[[es:Notas de Moodle 3.3]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=53157</id>
		<title>Moodle libraries credits</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=53157"/>
		<updated>2017-11-01T01:19:11Z</updated>

		<summary type="html">&lt;p&gt;Abgreeve: /* HTML Purifier - update of version */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some of Moodle&#039;s libraries were written by other people, and are being redistributed as part of Moodle under their respective open source licenses that thankfully allow us to do so. Thanks to the authors of all these excellent products - without them Moodle would be missing important functionality. Copyright information for each package is included below:&lt;br /&gt;
&lt;br /&gt;
==ADOdb==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/adodb&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Database abstraction library for MySQL, PostgreSQL, MSSQL, Oracle, Interbase, Foxpro, Access, ADO, Sybase, DB2 and ODBC.&lt;br /&gt;
&lt;br /&gt;
Version: 5.20.9&lt;br /&gt;
&lt;br /&gt;
@copyright (c) 2000-2013 John Lim (jlim#natsoft.com). All rights reserved.&lt;br /&gt;
&lt;br /&gt;
@copyright (c) 2014      Damien Regad, Mark Newnham and the ADOdb community&lt;br /&gt;
&lt;br /&gt;
License: Dual LGPL and BSD-style&lt;br /&gt;
&lt;br /&gt;
http://adodb.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
==Bennu==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/bennu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bennu is an object-oriented library written in PHP that implements the iCalendar standard (RFC 2445).&lt;br /&gt;
&lt;br /&gt;
Version: 0.1 (customized since then)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2005, Jon Papaioannou&lt;br /&gt;
&lt;br /&gt;
License: LGPL 2.1+&lt;br /&gt;
&lt;br /&gt;
http://bennu.sourceforge.net/&lt;br /&gt;
&lt;br /&gt;
==Amazon S3==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;repository/s3/S3.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A standalone Amazon S3 (REST) client for PHP 5.2.x using CURL that does not require PEAR. &lt;br /&gt;
&lt;br /&gt;
Version: 0.5.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2013, Donovan Schönknecht&lt;br /&gt;
&lt;br /&gt;
License: BSD 2-Clause&lt;br /&gt;
&lt;br /&gt;
https://github.com/tpyo/amazon-s3-php-class/releases&lt;br /&gt;
&lt;br /&gt;
==CAS==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;auth/cas/CAS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
phpCAS library to support CAS authentication plugin&lt;br /&gt;
&lt;br /&gt;
Copyright Jasig&lt;br /&gt;
&lt;br /&gt;
License: Apache License 2.0&lt;br /&gt;
&lt;br /&gt;
https://wiki.jasig.org/display/CASC/phpCAS&lt;br /&gt;
&lt;br /&gt;
==Chart.js==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/amd/src/chartjs-lazy.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Simple yet flexible JavaScript charting for designers &amp;amp; developers&lt;br /&gt;
&lt;br /&gt;
Version: 2.7.0&lt;br /&gt;
&lt;br /&gt;
Copyright 2016 Nick Downie&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://www.chartjs.org&lt;br /&gt;
&lt;br /&gt;
==EvalMath==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/evalmath&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to safely evaluate math expressions&lt;br /&gt;
&lt;br /&gt;
Copyright Miles Kaufmann&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
http://www.twmagic.com/&lt;br /&gt;
&lt;br /&gt;
==FLV player==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;filter/mediaplugin/flvplayer.swf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Flash movie to play FLV files&lt;br /&gt;
&lt;br /&gt;
Copyright Jeroen Wijering &lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.jeroenwijering.com&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==FPDF Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/fpdf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to generate PDF files&lt;br /&gt;
&lt;br /&gt;
Version: 1.54&lt;br /&gt;
&lt;br /&gt;
Copyright Olivier PLATHEY&lt;br /&gt;
&lt;br /&gt;
License: Freeware&lt;br /&gt;
&lt;br /&gt;
http://www.setasign.com/products/fpdi/downloads&lt;br /&gt;
&lt;br /&gt;
== GeoIp2 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/maxmind/GeoIp2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for precessing of GeoIP data files&lt;br /&gt;
&lt;br /&gt;
Version: 2.6.0&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/maxmind/GeoIP2-php&lt;br /&gt;
&lt;br /&gt;
==Google APIs==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/google&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Library Google APIs Client Library for PHP&lt;br /&gt;
&lt;br /&gt;
Version: 1.1.7&lt;br /&gt;
&lt;br /&gt;
License: Apache License Version 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/google/google-api-php-client&lt;br /&gt;
&lt;br /&gt;
==Graph Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/graphlib.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to draw line, point, bar, and area graphs, including numeric x-axis and double y-axis.&lt;br /&gt;
&lt;br /&gt;
Version: 1.6.3 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2000  Herman Veluwenkamp (&#039;&#039;hermanV AT mindless DOT com&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
==Horde==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/horde&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library used by the inbound e-mail handling system.&lt;br /&gt;
&lt;br /&gt;
Version: 5.2.7&lt;br /&gt;
&lt;br /&gt;
Copyright © Horde LLC&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://www.horde.org/&lt;br /&gt;
&lt;br /&gt;
==html2text==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/html2text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP script to convert HTML into an approximate text equivalent&lt;br /&gt;
&lt;br /&gt;
Version: 4.1.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2005-2007 Jon Abernathy &amp;lt;jon@chuggnutt.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/mtibben/html2text.git&lt;br /&gt;
&lt;br /&gt;
==htmlArea==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/editor&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Javascript/HTML script to put a GUI editor in textareas on Internet Explorer and Mozilla&lt;br /&gt;
&lt;br /&gt;
Version: 3.0 beta (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002  interactivetools.com, inc.&lt;br /&gt;
&lt;br /&gt;
License: htmlArea License (based on BSD license)&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==HTML Purifier==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/htmlpurifier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Filters HTML.&lt;br /&gt;
&lt;br /&gt;
Version: 4.9.3&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
==IP-Atlas==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/ipatlas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP scripts to show the location of an IP address on a map.&lt;br /&gt;
&lt;br /&gt;
Version: 1.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002   Ivan Kozik&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.xpenguin.com/ip-atlas.php&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==jQuery==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
jQuery is a fast, small, and feature-rich JavaScript library widely used on moodle.&lt;br /&gt;
&lt;br /&gt;
Version: 3.2.1&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://jquery.com&lt;br /&gt;
&lt;br /&gt;
==jQuery migrate==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery/jquery-migrate-1.4.0.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library used migrate older jQuery code to jQuery 3.0.&lt;br /&gt;
&lt;br /&gt;
Version: 1.4.0&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation and other contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/jquery/jquery-migrate&lt;br /&gt;
&lt;br /&gt;
==jQuery UI==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery/ui-1.12.1/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
jQuery UI is a set of user interface interactions, effects, widgets, and themes built on top of the jQuery library.&lt;br /&gt;
&lt;br /&gt;
Version: 1.12.1&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation and other contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/jquery/jquery-migrate&lt;br /&gt;
&lt;br /&gt;
==Services_JSON==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/json&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Allows PHP-&amp;gt;JS communication via JSON&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Michal Migurski&lt;br /&gt;
&lt;br /&gt;
License: Modified BSD (GPL-compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/pepr/pepr-proposal-show.php?id=198&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==kses==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/kses.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HTML/XHTML filter that only allows some elements and attributes&lt;br /&gt;
&lt;br /&gt;
Version: 0.2.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002, 2003, 2005   Ulf Harnhammar&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://sourceforge.net/projects/kses&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==less.php==&lt;br /&gt;
&lt;br /&gt;
The less.php is a PHP port of the official LESS processor used by moodle themes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/lessphp&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Version: 1.7.0.10&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
http://lessphp.typesettercms.com/&lt;br /&gt;
&lt;br /&gt;
Copyright:  Matt Agar and Martin Jantošovič&lt;br /&gt;
==loglevel.js==&lt;br /&gt;
&lt;br /&gt;
Minimal lightweight simple logging for JavaScript.&lt;br /&gt;
&lt;br /&gt;
Version 1.5.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2013 Tim Perry&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/pimterry/loglevel/&lt;br /&gt;
&lt;br /&gt;
==MathJax==&lt;br /&gt;
&lt;br /&gt;
JavaScript filter library for displaying LaTeX, AsciiMath notation, and MathML.&lt;br /&gt;
&lt;br /&gt;
Not actually included in Moodle. Instead, Moodle [[:en:MathJax filter|has a setting]] for where the library is located to be loaded from. It is currently pointing to the Cloudflare CDN by default.&lt;br /&gt;
&lt;br /&gt;
© Copyright 2009 - 2017 The MathJax Consortium&lt;br /&gt;
&lt;br /&gt;
* Default MathJax version: 2.7.2 (Moodle 3.4)&lt;br /&gt;
* License: Apache 2.0&lt;br /&gt;
* Homepage: https://www.mathjax.org/&lt;br /&gt;
&lt;br /&gt;
==MatthiasMullie\Minify==&lt;br /&gt;
CSS &amp;amp; JavaScript minifier, in PHP&lt;br /&gt;
&lt;br /&gt;
Version 1.3.37&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/matthiasmullie/minify&lt;br /&gt;
&lt;br /&gt;
==mimeTeX==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;filter/tex&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Compiled C program to convert TeX into GIFs&lt;br /&gt;
&lt;br /&gt;
Version: 1.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002-2004   John Forkosh Associates, Inc&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.forkosh.com/mimetex.html&lt;br /&gt;
&lt;br /&gt;
==Mustache.js==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/amd/src/mustache.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
JS library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 2.3.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2009 Chris Wanstrath (Ruby)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2014 Jan Lehnardt (JavaScript)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2015 The mustache.js community&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/janl/mustache.js/releases&lt;br /&gt;
&lt;br /&gt;
==Mustache==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/mustache&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 2.12.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2016 Justin Hileman&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/bobthecow/mustache.php/releases&lt;br /&gt;
&lt;br /&gt;
==mp3player==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/mp3player&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Flash movie to play streaming MP3s&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005   Andrew Walker&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==overlibmws==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/overlib.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Javascript library to enable DHTML popups, floating windows, events etc&lt;br /&gt;
&lt;br /&gt;
Version: July 2004&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002-2004   Foteos Macrides&lt;br /&gt;
&lt;br /&gt;
Copyright © 1998-2004   Erik Bosrup&lt;br /&gt;
&lt;br /&gt;
License: Artistic Open Source License&lt;br /&gt;
&lt;br /&gt;
http://www.macridesweb.com/oltest/&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PclZip==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pclzip&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to create, manage and unpack zip files.&lt;br /&gt;
&lt;br /&gt;
Version: 2.4 RC1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Vincent Blavet (&#039;&#039;vincent AT phpconcept DOT net&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.phpconcept.net&lt;br /&gt;
&lt;br /&gt;
==PEAR OLE Classes==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write Excel files&lt;br /&gt;
&lt;br /&gt;
Version: 0.5&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Xavier Noguer&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/OLE&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR Spreadsheet_Excel_Writer==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write Excel files&lt;br /&gt;
&lt;br /&gt;
Version: 0.9.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Xavier Noguer and Mika Tuupola&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/Spreadsheet_Excel_Writer&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Quickform==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write forms&lt;br /&gt;
&lt;br /&gt;
Version: 3.2.6&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Bertrand Mansion, Adam Daniel, Alexey Borzov&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Quickform&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Quickform_Renderer_Tableless==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to render forms without tables&lt;br /&gt;
&lt;br /&gt;
Version: 0.3.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Mark Wiesemann&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Quickform_Renderer_Tableless&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_QuickForm_DHTMLRulesTableless==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to render validation notices with dhtml&lt;br /&gt;
&lt;br /&gt;
Version: 0.1.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Alexey Borzov, Adam Daniel, Bertrand Mansion, Justin Patrin, Mark Wiesemann&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_QuickForm_DHTMLRulesTableless&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Common==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class with many common HTML functions (used by HTML Quickform)&lt;br /&gt;
&lt;br /&gt;
Version: 0.3.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Adam Daniel, Bertrand Mansion, Klaus Guenther, Alexey Borzov&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Common&lt;br /&gt;
&lt;br /&gt;
==PEAR XML_Parser==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class implementing one handy (sax-expat) XML parser&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004-2008 The PHP Group &amp;amp; Stephan Schmidt&lt;br /&gt;
&lt;br /&gt;
License: New BSD License&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/XML_Parser&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PHP-CSS-Parser==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-css-parser&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A Parser for CSS Files written in PHP.&lt;br /&gt;
&lt;br /&gt;
Version: 8.1.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2011 Raphael Schweikert, http://sabberworm.com/&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/sabberworm/PHP-CSS-Parser&lt;br /&gt;
&lt;br /&gt;
==PHPExcel==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/phpexcel/PHPExcel.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to read, write and create spreadsheet documents in PHP.&lt;br /&gt;
&lt;br /&gt;
Version 1.8.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2006 - 2015 PHPExcel&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/PHPOffice/PHPExcel&lt;br /&gt;
&lt;br /&gt;
==PHP mailer==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/class.phpmailer.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class for sending email using either sendmail, PHP mail(), or SMTP.  Methods are based upon the standard AspEmail(tm) classes.&lt;br /&gt;
&lt;br /&gt;
Version 6.0.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003 Brent R. Matzelle (&#039;&#039;bmatzelle AT yahoo DOT com&#039;&#039;)&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://phpmailer.sourceforge.net&lt;br /&gt;
https://github.com/PHPMailer/PHPMailer/releases&lt;br /&gt;
&lt;br /&gt;
==PHP Markdown==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/markdown.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Functions to convert from the Markdown text format into clean XHTML.&lt;br /&gt;
&lt;br /&gt;
Version: 1.7.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
 * @copyright 2004-2016 Michel Fortin &amp;lt;https://michelf.com/projects/php-markdown/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 * @copyright (Original Markdown) 2004-2006 John Gruber &amp;lt;https://daringfireball.net/projects/markdown/&amp;gt;&lt;br /&gt;
All rights reserved.&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
http://www.michelf.com/projects/php-markdown/&lt;br /&gt;
&lt;br /&gt;
==RequireJS==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/lib/requirejs/&#039;&#039;	&lt;br /&gt;
&lt;br /&gt;
RequireJS is a JavaScript file and module loader.&lt;br /&gt;
&lt;br /&gt;
Version 2.3.5&lt;br /&gt;
&lt;br /&gt;
License: new BSD or MIT&lt;br /&gt;
&lt;br /&gt;
http://requirejs.org/&lt;br /&gt;
&lt;br /&gt;
==scssphp==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/lib/scssphp/&#039;&#039;	&lt;br /&gt;
&lt;br /&gt;
scssphp is a compiler for SCSS written in PHP.&lt;br /&gt;
&lt;br /&gt;
Version: 0.6.5&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 Leaf Corcoran&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://leafo.github.io/scssphp&lt;br /&gt;
&lt;br /&gt;
==SimplePie==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/lib/simplepie&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Simple Pie helps with blogs.&lt;br /&gt;
&lt;br /&gt;
Version 1.5&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
https://github.com/simplepie/simplepie&lt;br /&gt;
&lt;br /&gt;
==Snoopy==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/snoopy&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A PHP net client&lt;br /&gt;
&lt;br /&gt;
Version: 1.0&lt;br /&gt;
&lt;br /&gt;
Copyright © 1999-2000 Monte Ohrt (&#039;&#039;monte AT ispi DOT net&#039;&#039;)&lt;br /&gt;
License: GNU LGPL&lt;br /&gt;
&lt;br /&gt;
http://snoopy.sourceforge.com&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==SMTP class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/class.smtp.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class that can be used to connect and communicate with any SMTP server. It implements all the SMTP functions defined in RFC821 except TURN.&lt;br /&gt;
&lt;br /&gt;
Version: 03/26/2001&lt;br /&gt;
&lt;br /&gt;
Copyright © 2001  Chris Ryan (&#039;&#039;chris AT greatbridge DOT com&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Spike PHPCoverage==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/spikephpcoverage&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP code coverage reporting tool&lt;br /&gt;
&lt;br /&gt;
Version: 0.8.2 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 SpikeSource Inc&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://developer.spikesource.com/projects/phpcoverage&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Spout==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/spout&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Library for importing and exporting csv / excel / ODS files.&lt;br /&gt;
&lt;br /&gt;
Version 2.7.3&lt;br /&gt;
&lt;br /&gt;
License: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/box/spout/&lt;br /&gt;
&lt;br /&gt;
==Typo3 Character Set Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/typo3&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class for conversion between charsets and multibyte-savy operations with strings.&lt;br /&gt;
&lt;br /&gt;
Version: 4.7.19&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003-2005 Kasper Skaarhoj&lt;br /&gt;
&lt;br /&gt;
Licence: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/&lt;br /&gt;
&lt;br /&gt;
==Yahoo User Interface==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/yui&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Yahoo! User Interface Library is a set of utilities and controls, in JavaScript, for building richly interactive web applications using techniques such as DOM scripting, DHTML and AJAX. The YUI Library also includes several core CSS resources.Set of user-interface components using AJAX, DHTML etc.  We use it for all our AJAX-related stuff.&lt;br /&gt;
&lt;br /&gt;
CVS version: 2.3.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2006, Yahoo! Inc.&lt;br /&gt;
&lt;br /&gt;
Licence: BSD&lt;br /&gt;
&lt;br /&gt;
http://developer.yahoo.com/yui/&lt;br /&gt;
&lt;br /&gt;
==Mustache.js==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/amd/src/mustache.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
JS library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 2.2.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2009 Chris Wanstrath (Ruby)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2014 Jan Lehnardt (JavaScript)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2015 The mustache.js community&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/janl/mustache.js/releases&lt;br /&gt;
&lt;br /&gt;
==LTI Tool Provider Library for PHP==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/ltiprovider/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP library for communicating with learning tools as per the LTI specification.&lt;br /&gt;
&lt;br /&gt;
Version: 3.0.2&lt;br /&gt;
&lt;br /&gt;
© 2016 IMS Global Learning Consortium Inc. All Rights Reserved. Trademark Policy - (www.imsglobal.org/trademarks)&lt;br /&gt;
&lt;br /&gt;
License: Apache 2&lt;br /&gt;
&lt;br /&gt;
https://github.com/IMSGlobal/LTI-Tool-Provider-Library-PHP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Popper.js==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;admin/tool/usertours/amd/src/popper.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A kickass library used to created Poppers in web applications&lt;br /&gt;
&lt;br /&gt;
© 2016 Federico Zivolo and contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/FezVrasta/popper.js&lt;br /&gt;
&lt;br /&gt;
==Flexitour==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;admin/tool/usertours/amd/src/tour.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A JS library for tours&lt;br /&gt;
&lt;br /&gt;
© 2016 Andrew Nicols and contributors&lt;br /&gt;
&lt;br /&gt;
License: GPLv3&lt;br /&gt;
&lt;br /&gt;
https://github.com/andrewnicols/flexitour&lt;br /&gt;
&lt;br /&gt;
[[Category:Credits]]&lt;/div&gt;</summary>
		<author><name>Abgreeve</name></author>
	</entry>
</feed>