diff --git a/ChangeLog b/ChangeLog
index 091d6d4031f0017e232c73bbf49ac1d4662a5614..a44da8f08ab0f76bab78959a550a348f3f97c266 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2015-02-10  Niels Möller  <nisse@lysator.liu.se>
 
+	* base64url-meta.c (nettle_base64url): New file.
+	* nettle-meta.h (nettle_base64url): Declare it.
+	* nettle-meta-armors.c (nettle_armors): Added nettle_base64url.
+	* testsuite/meta-armor-test.c: Updated testcase.
+	* testsuite/base64-test.c (test_main): Additional tests, using
+	nettle_base64url.
+	* Makefile.in (nettle_SOURCES): Added base64url-meta.c.
+
 	Base-64 generalization to support RFC4648 URL safe alphabet,
 	contributed by Amos Jeffries.
 	* base64url-decode.c (base64url_decode_init): New file and
diff --git a/Makefile.in b/Makefile.in
index e861b23a0bed03b69e564f7fa8cd8f8ba1befa96..abba3cd94c35cbcaf4ce34eb4bd5445a66f19b47 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -81,7 +81,7 @@ nettle_SOURCES = aes-decrypt-internal.c aes-decrypt.c \
 		 arctwo.c arctwo-meta.c blowfish.c \
 		 base16-encode.c base16-decode.c base16-meta.c \
 		 base64-encode.c base64-decode.c base64-meta.c \
-		 base64url-encode.c base64url-decode.c \
+		 base64url-encode.c base64url-decode.c base64url-meta.c \
 		 buffer.c buffer-init.c \
 		 camellia-crypt-internal.c camellia-table.c \
 		 camellia-absorb.c camellia-invert-key.c \
diff --git a/base64url-meta.c b/base64url-meta.c
new file mode 100644
index 0000000000000000000000000000000000000000..af4afc951371a93eb88fd999e1e3552a9f0f64c8
--- /dev/null
+++ b/base64url-meta.c
@@ -0,0 +1,63 @@
+/* base64url-meta.c
+
+   Copyright (C) 2015 Niels Möller
+
+   This file is part of GNU Nettle.
+
+   GNU Nettle is free software: you can redistribute it and/or
+   modify it under the terms of either:
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at your
+       option) any later version.
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at your
+       option) any later version.
+
+   or both in parallel, as here.
+
+   GNU Nettle is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see http://www.gnu.org/licenses/.
+*/
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "nettle-meta.h"
+
+#include "base64.h"
+
+/* Same as the macros with the same name */
+static nettle_armor_length_func base64url_encode_length;
+static size_t
+base64url_encode_length(size_t length)
+{
+  return BASE64_ENCODE_LENGTH(length);
+}
+
+static nettle_armor_length_func base64url_decode_length;
+static size_t
+base64url_decode_length(size_t length)
+{
+  return BASE64_DECODE_LENGTH(length);
+}
+
+#define base64url_encode_ctx base64_encode_ctx
+#define base64url_encode_update base64_encode_update
+#define base64url_encode_final base64_encode_final
+#define base64url_decode_ctx base64_decode_ctx
+#define base64url_decode_update base64_decode_update
+#define base64url_decode_final base64_decode_final
+
+const struct nettle_armor nettle_base64url
+= _NETTLE_ARMOR(base64url, BASE64);
diff --git a/nettle-meta-armors.c b/nettle-meta-armors.c
index 04081eab68fd07667b1b7c30dcb00491fc2fe6d4..9b6c341e22a7d4c573aa74ed208df45ec424b172 100644
--- a/nettle-meta-armors.c
+++ b/nettle-meta-armors.c
@@ -38,6 +38,7 @@
 
 const struct nettle_armor * const nettle_armors[] = {
   &nettle_base64,
+  &nettle_base64url,
   &nettle_base16,
   NULL
 };
diff --git a/nettle-meta.h b/nettle-meta.h
index 2d8d5b84b8fb65e4975b42fdb36a0e1a1e9ef48f..14b5e48ed0c166c1fa30059f5c1235c69127c4d4 100644
--- a/nettle-meta.h
+++ b/nettle-meta.h
@@ -220,6 +220,7 @@ struct nettle_armor
 extern const struct nettle_armor * const nettle_armors[];
 
 extern const struct nettle_armor nettle_base64;
+extern const struct nettle_armor nettle_base64url;
 extern const struct nettle_armor nettle_base16;
 
 #ifdef __cplusplus
diff --git a/testsuite/base64-test.c b/testsuite/base64-test.c
index 9fe544f9695b58e5283240e568861ad2afd83629..bdf8415a9fdd21b3478e6fc1fa3fc5fa1c820d17 100644
--- a/testsuite/base64-test.c
+++ b/testsuite/base64-test.c
@@ -91,8 +91,19 @@ test_main(void)
   test_armor(&nettle_base64, 4, "Hell", "SGVsbA==");
   test_armor(&nettle_base64, 5, "Hello", "SGVsbG8=");
   test_armor(&nettle_base64, 6, "Hello", "SGVsbG8A");
+  test_armor(&nettle_base64, 9, "Hello?>>>", "SGVsbG8/Pj4+");
   test_armor(&nettle_base64, 4, "\xff\xff\xff\xff", "/////w==");
 
+  test_armor(&nettle_base64url, 0, "", "");
+  test_armor(&nettle_base64url, 1, "H", "SA==");
+  test_armor(&nettle_base64url, 2, "He", "SGU=");
+  test_armor(&nettle_base64url, 3, "Hel", "SGVs");
+  test_armor(&nettle_base64url, 4, "Hell", "SGVsbA==");
+  test_armor(&nettle_base64url, 5, "Hello", "SGVsbG8=");
+  test_armor(&nettle_base64url, 6, "Hello", "SGVsbG8A");
+  test_armor(&nettle_base64url, 9, "Hello?>>>", "SGVsbG8_Pj4-");
+  test_armor(&nettle_base64url, 4, "\xff\xff\xff\xff", "_____w==");
+
   {
     /* Test overlapping areas */
     uint8_t buffer[] = "Helloxxxx";
diff --git a/testsuite/meta-armor-test.c b/testsuite/meta-armor-test.c
index 368ac2e3bdb7eaa16acaf467fedaa9773c8dbcb1..406c8d0197edcae1f891aba43bc5df06483d043c 100644
--- a/testsuite/meta-armor-test.c
+++ b/testsuite/meta-armor-test.c
@@ -3,7 +3,8 @@
 
 const char* armors[] = {
   "base16",
-  "base64"
+  "base64",
+  "base64url",
 };
 
 void