diff --git a/html/en/fragments.html b/html/en/fragments.html
index 11ffc9a..517397a 100644
--- a/html/en/fragments.html
+++ b/html/en/fragments.html
@@ -445,9 +445,7 @@
     </button>
     <br/>
     <label>Loan length:</label>
-    <button onClick="JavaScript:loanLength(event, 7, 'day')">1 week</button>
-    <button onClick="JavaScript:loanLength(event, 1, 'year')">1 year</button>
-    <button onClick="JavaScript:loanLength(event, 3, 'year')">3 years</button>
+    ¤loan_presets¤
     <br/>
     <label for="end">End date:</label>
     <input type="text"
@@ -794,7 +792,6 @@
   </button>
 </form>
 
-
 ¤¤ checkout_page ¤¤
 <div id="user-select">
   <h2>Choose borrower</h2>
@@ -874,9 +871,7 @@
     </button>
     <br/>
     <label>Loan length:</label>
-    <button onClick="JavaScript:loanLength(event, 7, 'day')">1 week</button>
-    <button onClick="JavaScript:loanLength(event, 1, 'year')">1 year</button>
-    <button onClick="JavaScript:loanLength(event, 3, 'year')">3 years</button>
+    ¤loan_presets¤
     <br/>
     <label for="end">End date:</label>
     <input type="text"
@@ -890,6 +885,11 @@
   ¤loan_table¤
 </div>
 
+¤¤ loan_preset_button ¤¤
+<button onClick="JavaScript:loanLength(event, ¤count¤, '¤type¤')">
+  ¤description¤
+</button>
+
 ¤¤ inventory_start ¤¤
 <form class="dark"
       onSubmit="JavaScript:startInventory(event)">
@@ -899,7 +899,6 @@
 </form>
 
 ¤¤ inventory_do ¤¤
-
 <div id="inventory-overview"
      class="dark">
   <span class="label">
diff --git a/html/sv/fragments.html b/html/sv/fragments.html
index 0b0d8b6..edd1016 100644
--- a/html/sv/fragments.html
+++ b/html/sv/fragments.html
@@ -445,9 +445,7 @@
     </button>
     <br/>
     <label>Löptid:</label>
-    <button onClick="JavaScript:loanLength(event, 7, 'day')">1 vecka</button>
-    <button onClick="JavaScript:loanLength(event, 1, 'year')">1 år</button>
-    <button onClick="JavaScript:loanLength(event, 3, 'year')">3 år</button>
+    ¤loan_presets¤
     <br/>
     <label for="end">Slutdatum:</label>
     <input type="text"
@@ -874,9 +872,7 @@
     </button>
     <br/>
     <label>Löptid:</label>
-    <button onClick="JavaScript:loanLength(event, 7, 'day')">1 vecka</button>
-    <button onClick="JavaScript:loanLength(event, 1, 'year')">1 år</button>
-    <button onClick="JavaScript:loanLength(event, 3, 'year')">3 år</button>
+    ¤loan_presets¤
     <br/>
     <label for="end">Slutdatum:</label>
     <input type="text"
@@ -890,6 +886,11 @@
   ¤loan_table¤
 </div>
 
+¤¤ loan_preset_button ¤¤
+<button onClick="JavaScript:loanLength(event, ¤count¤, '¤type¤')">
+  ¤description¤
+</button>
+
 ¤¤ inventory_start ¤¤
 <form class="dark"
       onSubmit="JavaScript:startInventory(event)">
diff --git a/include/CheckoutPage.php b/include/CheckoutPage.php
index 17cdd2a..2296f6f 100644
--- a/include/CheckoutPage.php
+++ b/include/CheckoutPage.php
@@ -95,6 +95,7 @@ class CheckoutPage extends Page {
             $subhead = replace(array('title' => i18n('Borrowed products')),
                                $this->fragments['subtitle']);
         }
+        $loan_presets = $this->build_loan_preset_buttons();
         print(replace(array('user' => $username,
                             'email' => $email,
                             'displayname' => $displayname,
@@ -102,7 +103,8 @@ class CheckoutPage extends Page {
                             'end' => $enddate,
                             'subtitle' => $subhead,
                             'disabled' => $disabled,
-                            'loan_table' => $loan_table),
+                            'loan_table' => $loan_table,
+                            'loan_presets' => $loan_presets),
                       $this->fragments['checkout_page']));
     }
 }
diff --git a/include/Page.php b/include/Page.php
index c4227ec..a23b4bc 100644
--- a/include/Page.php
+++ b/include/Page.php
@@ -132,6 +132,19 @@ abstract class Page extends Responder {
                        $this->fragments['user_table']);
     }
 
+    final protected function build_loan_preset_buttons() {
+        global $loan_length_presets;
+        $buttons = '';
+        foreach($loan_length_presets as $preset) {
+            [$count, $type] = explode(' ', $preset);
+            $buttons .= replace(array('count' => $count,
+                                      'type' => $type,
+                                      'description' => $count." ".i18n($type)),
+                                $this->fragments['loan_preset_button']);
+        }
+        return $buttons;
+    }
+
     final protected function build_product_table($products) {
         usort($products, ['Product', 'compare']);
 
diff --git a/include/ProductPage.php b/include/ProductPage.php
index c22c72e..9e06728 100644
--- a/include/ProductPage.php
+++ b/include/ProductPage.php
@@ -70,6 +70,7 @@ class ProductPage extends Page {
         $history = $this->build_history_table($this->product->get_history());
         $attachments = $this->build_attachment_list(
             $this->product->get_attachments());
+        $presets = $this->build_loan_preset_buttons();
         $fields = array('id'          => $this->product->get_id(),
                         'brand'       => $this->product->get_brand(),
                         'name'        => $this->product->get_name(),
@@ -84,6 +85,7 @@ class ProductPage extends Page {
                         'service'     => i18n('Start service'),
                         'history'     => $history,
                         'attachments' => $attachments,
+                        'loan_presets' => $presets,
                         'end'         => format_date(default_loan_end()));
         if(class_exists('QRcode')) {
             $fields['label'] = replace($fields,
diff --git a/include/functions.php b/include/functions.php
index be4eae9..727da89 100644
--- a/include/functions.php
+++ b/include/functions.php
@@ -295,6 +295,15 @@ function default_loan_end() {
     return $end->getTimestamp();
 }
 
+function str_ends_with($haystack, $needle) {
+    if(strlen($needle) === 0) {
+        return true;
+    }
+    if(strlen($haystack) === 0) {
+        return false;
+    }
+    return substr($haystack, -strlen($needle)) === $needle;
+}
 
 ### Database interaction functions ###
 
diff --git a/include/translations.php b/include/translations.php
index 5b0d0b8..12a84da 100644
--- a/include/translations.php
+++ b/include/translations.php
@@ -41,6 +41,38 @@ $i18n = array(
         "en" => function() { return "Search"; },
         "sv" => function() { return "Sök"; },
     ),
+    "day" => array(
+        "en" => function() { return "day"; },
+        "sv" => function() { return "dag"; },
+    ),
+    "days" => array(
+        "en" => function() { return "days"; },
+        "sv" => function() { return "dagar"; },
+    ),
+    "week" => array(
+        "en" => function() { return "week"; },
+        "sv" => function() { return "vecka"; },
+    ),
+    "weeks" => array(
+        "en" => function() { return "weeks"; },
+        "sv" => function() { return "veckor"; },
+    ),
+    "month" => array(
+        "en" => function() { return "month"; },
+        "sv" => function() { return "månad"; },
+    ),
+    "months" => array(
+        "en" => function() { return "months"; },
+        "sv" => function() { return "månader"; },
+    ),
+    "year" => array(
+        "en" => function() { return "year"; },
+        "sv" => function() { return "år"; },
+    ),
+    "years" => array(
+        "en" => function() { return "years"; },
+        "sv" => function() { return "år"; },
+    ),
     "{count} products" => array(
         "en" => function($count) { return "$count products"; },
         "sv" => function($count) { return "$count artiklar"; },
diff --git a/script.js b/script.js
index 3478b9a..10af5d9 100644
--- a/script.js
+++ b/script.js
@@ -581,9 +581,19 @@ function loanLength(event, length, unit) {
     var enddate = new Date()
     switch(unit) {
     case 'day':
+    case 'days':
         enddate.setDate(enddate.getDate() + length)
         break
+    case 'week':
+    case 'weeks':
+        enddate.setDate(enddate.getDate() + length*7)
+        break;
+    case 'month':
+    case 'months':
+        enddate.setMonth(enddate.getMonth() + length)
+        break;
     case 'year':
+    case 'years':
         enddate.setFullYear(enddate.getFullYear() + length)
         break;
     }