diff --git a/README.md b/README.md
index 9ecd3ea..fb09965 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,7 @@
| **BIPP** | budgetcode kiezen en zien in het winkelmandje | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/bipp-budgetcode/bipp-budgetcode.user.js) |
| **BIPP** | "Inclusief niet-raamcontractartikelen" standaard aan | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/bipp-raamcontract/bipp-raamcontract.user.js) |
| **BIPP** | budgetverantwoordelijke en aanvrager standaard op jezelf | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/bipp-budgetverantwoordelijke/bipp-budgetverantwoordelijke.user.js) |
+| **BIPP** | Ctrl+B voor Bevestigen, met zichtbare hint | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/bipp-sneltoetsen/bipp-sneltoetsen.user.js) |
| **iExpense** | alle onkostenrapporten in één doorzoekbare tabel | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/iexpense-search/iexpense-search.user.js) |
| **PeopleSoft** | werkende knop "Downloaden naar Excel" | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/peoplesoft-excel-download/peoplesoft-excel-download.user.js) |
diff --git a/scripts/bipp-sneltoetsen/README.md b/scripts/bipp-sneltoetsen/README.md
new file mode 100644
index 0000000..5e83ff7
--- /dev/null
+++ b/scripts/bipp-sneltoetsen/README.md
@@ -0,0 +1,17 @@
+# bipp-sneltoetsen
+
+Ctrl+B drukt in BIPP op *Bevestigen*. Op de knop is de B onderstreept, de tooltip toont *Ctrl+B*, en zolang je Ctrl ingedrukt houdt verschijnt *Ctrl+B* boven de knop.
+
+[**Installeren**](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/bipp-sneltoetsen/bipp-sneltoetsen.user.js)
+· gebeurt er niets, zie de [installatie-uitleg](../../README.md).
+
+## Hoe het werkt
+
+- Het script zoekt op elke pagina onder `/web/` de eerste zichtbare, actieve knop met het label *Bevestigen*. Is er geen, dan doet Ctrl+B niets.
+- Ctrl+B werkt ook in tekstvelden. Op macOS betekent het daar normaal "cursor één teken terug" (Emacs-binding), die je dan niet meer hebt.
+- De onderstreping en de hint verschuiven niets: ze staan `position:absolute` buiten de flow. Bij een `` kan de letter niet onderstreept worden met HTML, dus komt er een lijntje over, berekend uit de lettermaat.
+- Pagina's die hun knoppen later opbouwen krijgen tot 15 seconden de tijd.
+
+## Licentie
+
+[GPL-3.0-or-later](../../LICENSE).
diff --git a/scripts/bipp-sneltoetsen/bipp-sneltoetsen.user.js b/scripts/bipp-sneltoetsen/bipp-sneltoetsen.user.js
new file mode 100644
index 0000000..5c91c01
--- /dev/null
+++ b/scripts/bipp-sneltoetsen/bipp-sneltoetsen.user.js
@@ -0,0 +1,115 @@
+// ==UserScript==
+// @name BIPP: sneltoets Ctrl+B voor Bevestigen
+// @namespace https://github.com/glgoose/ua-userscripts
+// @version 1.0.0
+// @description Ctrl+B drukt op Bevestigen. De B in de knop is onderstreept en bij ingedrukte Ctrl verschijnt Ctrl+B boven de knop.
+// @author glgoose
+// @license GPL-3.0-or-later
+// @homepageURL https://github.com/glgoose/ua-userscripts/tree/main/scripts/bipp-sneltoetsen
+// @supportURL https://github.com/glgoose/ua-userscripts/issues
+// @downloadURL https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/bipp-sneltoetsen/bipp-sneltoetsen.user.js
+// @updateURL https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/bipp-sneltoetsen/bipp-sneltoetsen.user.js
+// @match https://bipp.biotechpartner.be/web/*
+// @run-at document-idle
+// @grant none
+// ==/UserScript==
+(function () {
+ 'use strict';
+
+ var LABEL = 'bevestigen';
+ var HINT = 'Ctrl+B';
+ var MARK = 'data-bipp-sneltoets';
+
+ function norm(s) { return (s || '').replace(/\s+/g, ' ').trim().toLowerCase(); }
+
+ function visible(el) { return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length); }
+
+ // Eerste zichtbare, actieve knop met dit label. Een postback-pagina kan er verborgen kopieën van hebben.
+ function findButton() {
+ var btns = document.querySelectorAll('input[type="submit"], input[type="button"], button');
+ for (var i = 0; i < btns.length; i++) {
+ var b = btns[i];
+ if (norm(b.value || b.textContent) === LABEL && !b.disabled && visible(b)) return b;
+ }
+ return null;
+ }
+
+ //