diff --git a/devices/Bluetooth.md b/devices/Bluetooth.md
index eb8a0df06..e24643a40 100644
--- a/devices/Bluetooth.md
+++ b/devices/Bluetooth.md
@@ -2,7 +2,7 @@
Bluetooth
=========
-* KEYWORDS: Bluetooth,Wireless,BT,HC-05,HC05
+* KEYWORDS: Bluetooth,Wireless,BT,HC-05,HC05,Built-In
![HC-05 front](HC05_front.jpg)
![HC-05 back](HC05_back.jpg)
diff --git a/devices/CC3000.md b/devices/CC3000.md
index d053ddc77..9fa72e13c 100644
--- a/devices/CC3000.md
+++ b/devices/CC3000.md
@@ -2,7 +2,7 @@
CC3000 WiFi Module
================
-* KEYWORDS: Wireless,CC3000,CC 3000,WiFi,Internet,WLAN,Web Server,HTTP
+* KEYWORDS: Wireless,CC3000,CC 3000,WiFi,Internet,WLAN,Web Server,HTTP,Built-In
![AdaFruit CC3000](adafruit.jpg)
diff --git a/devices/Servo Motors.md b/devices/Servo Motors.md
index b3352bcda..eb2981e85 100644
--- a/devices/Servo Motors.md
+++ b/devices/Servo Motors.md
@@ -2,7 +2,7 @@
Servo Motors
===========
-* KEYWORDS: Servo,Motor,Servomotor,Servo motor,RC
+* KEYWORDS: Servo,Motor,Servomotor,Servo motor,RC,Built-In
![9g Servo Motor](9g.jpg)
diff --git a/devices/WIZnet.md b/devices/WIZnet.md
index 4fa18e464..799dfb612 100644
--- a/devices/WIZnet.md
+++ b/devices/WIZnet.md
@@ -2,7 +2,7 @@
WIZnet WIZ550io/W5500 Ethernet module
================================
-* KEYWORDS: Wireless,WIZnet,WIZ550io,W5500,Ethernet,Internet,LAN,Web Server,HTTP
+* KEYWORDS: Wireless,WIZnet,WIZ550io,W5500,Ethernet,Internet,LAN,Web Server,HTTP,Built-In
![WIZnet WIZ550io module](module.jpg)
diff --git a/devices/WS2811.md b/devices/WS2811.md
index 04aa1347b..4e2f91fcd 100644
--- a/devices/WS2811.md
+++ b/devices/WS2811.md
@@ -2,7 +2,7 @@
WS2811/WS2812 LED String/Strip
===============================
-* KEYWORDS: Individually Addressable LEDs,Light,Lights,LED,LEDs,WS2811,WS2812,WS2812B,Multicolour,Fairy,String,Strip
+* KEYWORDS: Individually Addressable LEDs,Light,Lights,LED,LEDs,WS2811,WS2812,WS2812B,Multicolour,Fairy,String,Strip,Built-In
![WS2811 LED](25.jpg)
diff --git a/info/Assembler.md b/info/Assembler.md
index 0db06becc..f4baa7478 100644
--- a/info/Assembler.md
+++ b/info/Assembler.md
@@ -2,7 +2,7 @@
Inline Assembler
=============
-* KEYWORDS: Assembler,Asm,ARM,Thumb,Thumb2,Thumb-2,C code,inline C
+* KEYWORDS: Assembler,Asm,ARM,Thumb,Thumb2,Thumb-2,C code,inline C,Built-In
The new Web IDE allows you to write inline assembler in the right-hand pane.
diff --git a/peripherals/ADC.md b/peripherals/ADC.md
index 60e819a4a..1f69689e3 100644
--- a/peripherals/ADC.md
+++ b/peripherals/ADC.md
@@ -2,7 +2,7 @@
Analog to Digital Converter
=======================
-* KEYWORDS: Analog,ADC,A2D
+* KEYWORDS: Analog,ADC,A2D,Built-In
Analog inputs are easy to read in Espruino:
diff --git a/peripherals/Analog.md b/peripherals/Analog.md
index e1f079a0e..f45836590 100644
--- a/peripherals/Analog.md
+++ b/peripherals/Analog.md
@@ -2,7 +2,7 @@
Analog IO
========
-* KEYWORDS: Analog,ADC,DAC,A2D,D2A
+* KEYWORDS: Analog,ADC,DAC,A2D,D2A,Built-In
Espruino contains both Analog Inputs ([[ADC]]) and Analog Outputs ([[DAC]]).
diff --git a/peripherals/DAC.md b/peripherals/DAC.md
index d4aa728af..9b0a246e6 100644
--- a/peripherals/DAC.md
+++ b/peripherals/DAC.md
@@ -2,7 +2,7 @@
Digital to Analog Converter
=======================
-* KEYWORDS: Analog,DAC,D2A
+* KEYWORDS: Analog,DAC,D2A,Built-In
**Note:** Very few pins (usually only 2) are capable of Analog Output. See the [[Reference]] for your board and look for ```DAC```.
diff --git a/peripherals/I2C.md b/peripherals/I2C.md
index 7327378ac..e69665da9 100644
--- a/peripherals/I2C.md
+++ b/peripherals/I2C.md
@@ -2,7 +2,7 @@
I2C
===
-* KEYWORDS: I2C,I squared C,IIC
+* KEYWORDS: I2C,I squared C,IIC,Built-In
[I2C Class](/Reference#I2C) in the Reference.
diff --git a/peripherals/OneWire.md b/peripherals/OneWire.md
index 65fb68f0e..6daf0675f 100644
--- a/peripherals/OneWire.md
+++ b/peripherals/OneWire.md
@@ -2,6 +2,8 @@
OneWire
======
+* KEYWORDS: One Wire,1-Wire,Built-In
+
[OneWire Class](/Reference#OneWire) in the Reference.
Espruino's [1-Wire](http://en.wikipedia.org/wiki/1-Wire) API is designed to be similar to Arduino's OneWire library. Simply instantiate it with the pin to use, search for devices, and start communicating:
diff --git a/peripherals/PWM.md b/peripherals/PWM.md
index 99fd65e7c..aa123dba0 100644
--- a/peripherals/PWM.md
+++ b/peripherals/PWM.md
@@ -2,7 +2,7 @@
Pulse Width Modulation
===================
-* KEYWORDS: Pulse Width Modulation,PWM,Pulse,Analog
+* KEYWORDS: Pulse Width Modulation,PWM,Pulse,Analog,Built-In
[Pulse Width Modulation](http://en.wikipedia.org/wiki/Pulse-width_modulation) allows you to create an 'average' analog value using only a digital output. It does this by outputting a square wave, where the pulse is high for the a certain proportion of the time. If you want a 'real' analog output, see [[DAC]].
diff --git a/peripherals/SPI.md b/peripherals/SPI.md
index 4052c041b..04cbd38bf 100644
--- a/peripherals/SPI.md
+++ b/peripherals/SPI.md
@@ -2,7 +2,7 @@
Serial Peripheral Interface (SPI)
=============================
-* KEYWORDS: Serial Peripheral Interface,SPI
+* KEYWORDS: Serial Peripheral Interface,SPI,Built-In
The [Serial Peripheral Interface](http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus) is a Serial Bus for peripherals that uses Clock, Data In, and Data Out (and often a Chip Select pin).
diff --git a/peripherals/USART.md b/peripherals/USART.md
index f7ae956bb..7cfe777e7 100644
--- a/peripherals/USART.md
+++ b/peripherals/USART.md
@@ -2,7 +2,7 @@
USART / UART / Serial Port
=======================
-* KEYWORDS: Serial,USART,UART,RS232
+* KEYWORDS: Serial,USART,UART,RS232,Built-In
[Serial Class](/Reference#Serial) in the Reference.
diff --git a/peripherals/Waveform.md b/peripherals/Waveform.md
index 8c91de25c..916cebb95 100644
--- a/peripherals/Waveform.md
+++ b/peripherals/Waveform.md
@@ -2,7 +2,7 @@
Waveforms
========
-* KEYWORDS: Analog,ADC,DAC,A2D,D2A
+* KEYWORDS: Analog,ADC,DAC,A2D,D2A,Built-In
Espruino contains both [[Analog]] Inputs ([[ADC]]) and [[Analog Outputs]] ([[DAC]]). Functions such as `analogRead` and `analogWrite` can be used for IO up to around 0.5kHz but Espruino isn't fast enough for Audio.
diff --git a/tasks/Fonts.md b/tasks/Fonts.md
index 81f15d5a2..0dbcd9a52 100644
--- a/tasks/Fonts.md
+++ b/tasks/Fonts.md
@@ -2,7 +2,7 @@
Fonts
====
-* KEYWORDS: Graphics,Font,Fonts,Text,Typeface
+* KEYWORDS: Graphics,Font,Fonts,Text,Typeface,Module
Espruino has two main fonts built-in. A vector font, and a bitmap font.
diff --git a/tasks/Graphics.md b/tasks/Graphics.md
index 076ac5530..441bf49e4 100644
--- a/tasks/Graphics.md
+++ b/tasks/Graphics.md
@@ -2,7 +2,7 @@
Graphics Library
================
-* KEYWORDS: Graphics,LCD,Draw,Line,Fill,Color,Circle
+* KEYWORDS: Graphics,LCD,Draw,Line,Fill,Color,Circle,Built-In
Espruino has a built-in graphics library (however on less powerful devices this may have been removed to save on Flash memory).
diff --git a/tasks/Internet.md b/tasks/Internet.md
index ddb5c287d..be90dae9e 100644
--- a/tasks/Internet.md
+++ b/tasks/Internet.md
@@ -2,7 +2,7 @@
Internet (HTTP)
===============
-* KEYWORDS: Internet,HTTP,Web,TCPIP,TCP/IP,TCP-IP,IP,TCP,Server,Client,Webserver
+* KEYWORDS: Internet,HTTP,Web,TCPIP,TCP/IP,TCP-IP,IP,TCP,Server,Client,Webserver,Built-In
To use the internet in Espruino you need an internet connection. If you're using Espruino under Linux (for example Raspberry Pi or OpenWRT) then you're sorted and can use the examples below directly, otherwise you'll need a module to connect to the internet. Currently your only choice is the TI [[CC3000]], however hopefully this will change in the future.
diff --git a/tasks/Modules.md b/tasks/Modules.md
index 752b8ed5e..b275314a1 100644
--- a/tasks/Modules.md
+++ b/tasks/Modules.md
@@ -28,11 +28,32 @@ Existing Modules
* APPEND_KEYWORD: Module
+Built-in Functionality
+-------------------
+
+Espruino also contains many built-in modules and classes that provide a lot of functionality:
+
+* APPEND_KEYWORD: Built-In
+
+
Frequently Asked Questions
-----------------------
-* Why don't modules work when typing `require` on the left-hand side of the Web IDE (or from a terminal window)?
-When you type ```require("modulename")``` on the right-hand side and click *Send to Espruino*, the Espruino Web IDE scans your code for `require` statements and loads the relevant modules off the internet. Because the left-hand side of the Web IDE (or a terminal window) sends each character direct to Espruino, by the time you have pressed enter to exeture your command, it's then too late to load the module.
+### Why don't modules work when typing `require` on the left-hand side of the Web IDE (or from a terminal window)?
+
+When you type ```require("modulename")``` on the right-hand side and click *Send to Espruino*, the Espruino Web IDE scans your code for `require` statements and loads the relevant modules off the internet. Because the left-hand side of the Web IDE (or a terminal window) sends each character direct to Espruino, by the time you have pressed enter to execute your command, it's then too late to load the module.
Instead, Espruino defaults to what is mentioned under the **Stand-alone Espruino** heading above - it looks on an SD card (if inserted) for the module. This is why you might get a `ERROR: Unable to read file : NOT_READY` error written to the console.
+
+### If I load modules from an SD card, will the SD card always need to be inserted?
+
+No. As long as you have used `require('module')` at least once for each module before you type `save()`, all the information that is needed will be cached inside Espruino.
+
+### Can I dynamically load (and unload) modules?
+
+Yes. By default each module that is loaded will be cached (to avoid loading modules twice). However you can call [`Modules.removeCached('modulename')`](/Reference#l_Modules_removeCached) which will remove the module from the cache and free the memory that it uses.
+
+### How do I make my own modules?
+
+It's easy! See the [[Writing Modules]] page...