diff --git a/examples/.c-style b/examples/.c-style
new file mode 100644
index 0000000000000000000000000000000000000000..1112b4b1b840f17c8995df48f86499c169d186dd
--- /dev/null
+++ b/examples/.c-style
@@ -0,0 +1 @@
+"gnu"
diff --git a/examples/Makefile.am b/examples/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..0630288e96c12b69b84f032e54a032b2323375db
--- /dev/null
+++ b/examples/Makefile.am
@@ -0,0 +1,7 @@
+CFLAGS = -I$(top_srcdir) @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+LDADD = ../libnettle.a
+
+noinst_PROGRAMS = nettle-benchmark
+
diff --git a/examples/nettle-benchmark.c b/examples/nettle-benchmark.c
new file mode 100644
index 0000000000000000000000000000000000000000..846d12759fffb5759501a72351c47fa0f3d93ef4
--- /dev/null
+++ b/examples/nettle-benchmark.c
@@ -0,0 +1,193 @@
+/* nettle-benchmark.c
+ *
+ * Tries the performance of the various algorithms.
+ *
+ */
+ 
+/* nettle, low-level cryptographics library
+ *
+ * Copyright (C) 2001 Niels Möller
+ *  
+ * The nettle library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at your
+ * option) any later version.
+ * 
+ * The nettle library 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 Lesser General Public
+ * License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with the nettle library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ */
+
+#include "aes.h"
+#include "cbc.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <time.h>
+
+/* Encrypt 1MB, 1K at a time. */
+#define BENCH_SIZE 1024
+
+typedef void (*crypt_func)(void *ctx,
+			   unsigned length, uint8_t *dst,
+			   const uint8_t *src);
+static double
+time_function(void (*f)(void *arg), void *arg)
+{
+  clock_t before;
+  clock_t after;
+
+  before = clock();
+  
+  f(arg);
+  
+  after = clock();
+
+  return ((double)(after - before)) / CLOCKS_PER_SEC;
+}
+
+struct bench_cipher_info
+{
+  void *ctx;
+  crypt_func crypt;
+  uint8_t *data;
+};
+
+static void
+bench_cipher(void *arg)
+{
+  struct bench_cipher_info *info = arg;
+  unsigned i;
+  
+  for (i = 0; i<BENCH_SIZE; i++)
+    info->crypt(info->ctx, BENCH_SIZE, info->data, info->data);
+}
+
+struct bench_cbc_info
+{
+  void *ctx;
+  crypt_func crypt;
+
+  uint8_t *data;
+
+  unsigned block_size;
+  uint8_t *iv;
+};
+
+static void
+bench_cbc_encrypt(void *arg)
+{
+  struct bench_cbc_info *info = arg;
+  unsigned i;
+
+  for (i = 0; i<BENCH_SIZE; i++)
+    cbc_encrypt(info->ctx, info->crypt,
+		info->block_size, info->iv,
+		BENCH_SIZE, info->data, info->data);
+}
+
+static void
+bench_cbc_decrypt(void *arg)
+{
+  struct bench_cbc_info *info = arg;
+  unsigned i;
+
+  for (i = 0; i<BENCH_SIZE; i++)
+    cbc_decrypt(info->ctx, info->crypt,
+		info->block_size, info->iv,
+		BENCH_SIZE, info->data, info->data);
+}
+
+/* Set data[i] = floor(sqrt(i)) */
+static void
+init_data(uint8_t *data)
+{
+  unsigned i,j;
+  for (i = j = 0; i<BENCH_SIZE;  i++)
+    {
+      if (j*j < i)
+	j++;
+      data[i] = j;
+    }
+}
+
+static void
+bench(const char *name, void (*f)(void *), void *arg)
+{
+  printf("%15s: %f\n", name, time_function(f, arg));
+}
+
+int
+main(int argc, char **argv)
+{
+  /* Time block ciphers */
+  uint8_t iv[AES_BLOCK_SIZE];
+  uint8_t key[AES_MAX_KEY_SIZE];
+  
+  uint8_t data[BENCH_SIZE];
+
+  {
+    struct aes_ctx ctx;
+    struct bench_cipher_info info
+      = { &ctx, (crypt_func) aes_encrypt, data };
+    
+    memset(key, 0, sizeof(key));
+
+    aes_set_key(&ctx, sizeof(key), key);
+    init_data(data);
+
+    bench("AES (ECB encrypt)", bench_cipher, &info);
+  }
+
+  {
+    struct aes_ctx ctx;
+    struct bench_cipher_info info
+      = { &ctx, (crypt_func) aes_decrypt, data };
+    
+    memset(key, 0, sizeof(key));
+
+    aes_set_key(&ctx, sizeof(key), key);
+    init_data(data);
+
+    bench("AES (ECB decrypt)", bench_cipher, &info);
+  }
+
+  {
+    struct aes_ctx ctx;
+    struct bench_cbc_info info
+      = { &ctx, (crypt_func) aes_encrypt, data, AES_BLOCK_SIZE, iv };
+    
+    memset(key, 0, sizeof(key));
+    memset(iv, 0, sizeof(iv));
+    
+    aes_set_key(&ctx, sizeof(key), key);
+    init_data(data);
+
+    bench("AES (CBC encrypt)", bench_cbc_encrypt, &info);
+  }
+
+  {
+    struct aes_ctx ctx;
+    struct bench_cbc_info info
+      = { &ctx, (crypt_func) aes_decrypt, data, AES_BLOCK_SIZE, iv };
+    
+    memset(key, 0, sizeof(key));
+    memset(iv, 0, sizeof(iv));
+
+    aes_set_key(&ctx, sizeof(key), key);
+    init_data(data);
+
+    bench("AES (CBC decrypt)", bench_cbc_decrypt, &info);
+  }
+
+  return 0;
+}