diff --git a/ChangeLog b/ChangeLog
index d4d38015325cae27133e35e9318434744d205232..4edad13141b8e890e5ff297a961705cc55aa3a75 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
 2013-09-17  Niels Möller  <nisse@lysator.liu.se>
 
+	* src/testsuite/lsh-6-test (ALGORITHMS): Test both 3des-cbc and
+	3des-ctr.
+
+	* src/algorithms.c (all_symmetric_algorithms): Added ATOM_3DES_CTR.
+	(all_crypto_algorithms): Likewise.
+	(lookup_crypto): For parsng the -c option, make just "3des" mean
+	"3des-ctr" rather than "3des-cbc".
+
+	* src/crypto.c (des3_ctr_instance): New class.
+	(do_des3_ctr_crypt): New function.
+	(make_des3_ctr_instance): New function.
+	(crypto_des3_ctr_algorithm): New struct.
+	* src/crypto.h (crypto_des3_ctr_algorithm): Declare.
+
 	* src/dsa.c (do_dsa_sign): Fixed failure message.
 
 2013-09-02  Niels Möller  <nisse@lysator.liu.se>
diff --git a/src/algorithms.c b/src/algorithms.c
index 3183901176af75ba209677c68f80e7d2b780f24d..881ff0be5ff78a51c3b16df44e0dba8a3fb28931 100644
--- a/src/algorithms.c
+++ b/src/algorithms.c
@@ -47,7 +47,7 @@
 struct alist *
 all_symmetric_algorithms()
 {
-  return make_alist(12
+  return make_alist(13
 #if WITH_ZLIB
 		    +1
 #endif
@@ -61,6 +61,7 @@ all_symmetric_algorithms()
                     ATOM_AES256_CTR, &crypto_aes256_ctr_algorithm,
 		    ATOM_SERPENT256_CBC, &crypto_serpent256_cbc_algorithm,
 		    ATOM_3DES_CBC, &crypto_des3_cbc_algorithm,
+		    ATOM_3DES_CTR, &crypto_des3_ctr_algorithm,
 		    ATOM_CAST128_CBC, &crypto_cast128_cbc_algorithm,
 		    ATOM_HMAC_SHA1,
 		      make_hmac_algorithm(&nettle_sha1),
@@ -105,12 +106,13 @@ default_crypto_algorithms(struct alist *algorithms)
 static struct int_list *
 all_crypto_algorithms(struct alist *algorithms)
 {
-  return filter_algorithms_l(algorithms, 10,
+  return filter_algorithms_l(algorithms, 11,
                              ATOM_AES128_CBC,
                              ATOM_AES128_CTR,
                              ATOM_AES256_CBC,
                              ATOM_AES256_CTR,
 			     ATOM_3DES_CBC,
+			     ATOM_3DES_CTR,
 			     ATOM_TWOFISH_CBC, 
 			     ATOM_CAST128_CBC,
 			     ATOM_SERPENT256_CBC,
@@ -190,8 +192,10 @@ lookup_crypto(struct alist *algorithms, const char *name, struct crypto_algorith
     atom = ATOM_TWOFISH_CBC;
   else if (strcasecmp_list(name, "blowfish-cbc", "blowfish", NULL))
     atom = ATOM_BLOWFISH_CBC;
-  else if (strcasecmp_list(name, "3des-cbc", "3des", NULL))
+  else if (strcasecmp_list(name, "3des-cbc", NULL))
     atom = ATOM_3DES_CBC;
+  else if (strcasecmp_list(name, "3des-ctr", "3des", NULL))
+    atom = ATOM_3DES_CTR;
   else if (strcasecmp_list(name, "aes128-cbc", "aes-cbc", NULL))
     atom = ATOM_AES128_CBC;
   else if (strcasecmp_list(name, "aes128-ctr", "aes-ctr", "aes", "aes128", NULL))
diff --git a/src/crypto.c b/src/crypto.c
index 00c4a7e5ed32e5aae88335cd39000eb8db6c6587..c9aef660a160f69434177896810811cfcfdc102d 100644
--- a/src/crypto.c
+++ b/src/crypto.c
@@ -276,6 +276,47 @@ struct crypto_algorithm crypto_des3_cbc_algorithm =
 { STATIC_HEADER,
   DES3_BLOCK_SIZE, DES3_KEY_SIZE, DES3_BLOCK_SIZE, make_des3_cbc_instance };
 
+/* GABA:
+   (class
+     (name des3_ctr_instance)
+     (super crypto_instance)
+     (vars
+       (ctx . "struct CTR_CTX(struct des3_ctx, DES_BLOCK_SIZE)")))
+*/
+
+static void
+do_des3_ctr_crypt(struct crypto_instance *s,
+		  uint32_t length,
+		  struct lsh_string *dst, uint32_t di,
+		  const struct lsh_string *src, uint32_t si)
+{
+  CAST(des3_ctr_instance, self, s);
+
+  lsh_string_ctr_crypt(dst, di, src, si, length,
+		       DES3_BLOCK_SIZE, self->ctx.ctr,
+		       (nettle_crypt_func *) des3_encrypt,
+		       &self->ctx.ctx);
+}
+
+static struct crypto_instance *
+make_des3_ctr_instance(struct crypto_algorithm *algorithm UNUSED, int mode UNUSED,
+		       const uint8_t *key, const uint8_t *iv)
+{
+  NEW(des3_ctr_instance, self);
+
+  self->super.block_size = DES3_BLOCK_SIZE;
+
+  self->super.crypt = do_des3_ctr_crypt;
+  des3_set_key(&self->ctx.ctx, key);
+
+  CTR_SET_COUNTER(&self->ctx, iv);
+  
+  return(&self->super);
+}
+
+struct crypto_algorithm crypto_des3_ctr_algorithm =
+{ STATIC_HEADER,
+  DES3_BLOCK_SIZE, DES3_KEY_SIZE, DES3_BLOCK_SIZE, make_des3_ctr_instance};
 
 /* Cast-128 */
 /* GABA:
diff --git a/src/crypto.h b/src/crypto.h
index 45d6ec03f98f5783af9f54a82821a4ae844e3855..b52cee47ebd43c36bb393ff9d3ee1f6ba6815348 100644
--- a/src/crypto.h
+++ b/src/crypto.h
@@ -85,6 +85,7 @@ extern struct crypto_algorithm crypto_arcfour_algorithm;
 extern struct crypto_algorithm crypto_blowfish_cbc_algorithm;
 extern struct crypto_algorithm crypto_cast128_cbc_algorithm;
 extern struct crypto_algorithm crypto_des3_cbc_algorithm;
+extern struct crypto_algorithm crypto_des3_ctr_algorithm;
 extern struct crypto_algorithm crypto_serpent256_cbc_algorithm;
 extern struct crypto_algorithm crypto_twofish256_cbc_algorithm;
 
diff --git a/src/testsuite/lsh-6-test b/src/testsuite/lsh-6-test
index f0015207b9f8031d2f052c20d3aedb5dd4800e2f..e7a8637cfeb2080e122a12462f79315cd2cd2356 100755
--- a/src/testsuite/lsh-6-test
+++ b/src/testsuite/lsh-6-test
@@ -10,7 +10,7 @@ fi
 
 OLD_FLAGS="$LSH_FLAGS"
 
-ALGORITHMS="arcfour twofish blowfish 3des aes128-cbc aes128-ctr aes256-cbc aes256-ctr cast128 all"
+ALGORITHMS="arcfour twofish blowfish 3des-cbc 3des-ctr aes128-cbc aes128-ctr aes256-cbc aes256-ctr cast128 all"
 
 LSHD_FLAGS="$LSHD_FLAGS -c all"