#define DH_BITS        (1024)
 
+#if LIBGNUTLS_VERSION_NUMBER >= 0x020200
+#define        HAVE_CIPHERSUITES       1
+#else
+#undef HAVE_CIPHERSUITES
+#endif
+
+#ifndef HAVE_CIPHERSUITES
+/* Versions prior to 2.2.0 didn't handle cipher suites, so we had to
+ * kludge them ourselves.
+ */
 typedef struct tls_cipher_suite {
        const char *name;
        gnutls_kx_algorithm_t kx;
        gnutls_mac_algorithm_t mac;
        gnutls_protocol_t version;
 } tls_cipher_suite;
+#endif
 
 typedef struct tlsg_ctx {
        struct ldapoptions *lo;
        gnutls_dh_params_t dh_params;
        unsigned long verify_depth;
        int refcount;
+#ifdef HAVE_CIPHERSUITES
+       gnutls_priority_t prios;
+#else
        int *kx_list;
        int *cipher_list;
        int *mac_list;
+#endif
 #ifdef LDAP_R_COMPILE
        ldap_pvt_thread_mutex_t ref_mutex;
 #endif
        struct berval peer_der_dn;
 } tlsg_session;
 
+#ifndef HAVE_CIPHERSUITES
 static tls_cipher_suite *tlsg_ciphers;
 static int tlsg_n_ciphers;
+#endif
 
 static int tlsg_parse_ciphers( tlsg_ctx *ctx, char *suites );
 static int tlsg_cert_verify( tlsg_session *s );
 {
        gnutls_global_init();
 
+#ifndef HAVE_CIPHERSUITES
        /* GNUtls cipher suite handling: The library ought to parse suite
         * names for us, but it doesn't. It will return a list of suite names
         * that it supports, so we can do parsing ourselves. It ought to tell
                                &tlsg_ciphers[i].version );
                }
        }
+#endif
        return 0;
 }
 
 static void
 tlsg_destroy( void )
 {
+#ifndef HAVE_CIPHERSUITES
        LDAP_FREE( tlsg_ciphers );
        tlsg_ciphers = NULL;
        tlsg_n_ciphers = 0;
-
+#endif
        gnutls_global_deinit();
 }
 
                        return NULL;
                }
                ctx->refcount = 1;
+#ifdef HAVE_CIPHERSUITES
+               gnutls_priority_init( &ctx->prios, "NORMAL", NULL );
+#endif
 #ifdef LDAP_R_COMPILE
                ldap_pvt_thread_mutex_init( &ctx->ref_mutex );
 #endif
 #endif
        if ( refcount )
                return;
+#ifdef HAVE_CIPHERSUITES
+       gnutls_priority_deinit( c->prios );
+#else
        LDAP_FREE( c->kx_list );
+#endif
        gnutls_certificate_free_credentials( c->cred );
        ber_memfree ( c );
 }
 
        session->ctx = c;
        gnutls_init( &session->session, is_server ? GNUTLS_SERVER : GNUTLS_CLIENT );
+#ifdef HAVE_CIPHERSUITES
+       gnutls_priority_set( session->session, c->prios );
+#else
        gnutls_set_default_priority( session->session );
        if ( c->kx_list ) {
                gnutls_kx_set_priority( session->session, c->kx_list );
                gnutls_cipher_set_priority( session->session, c->cipher_list );
                gnutls_mac_set_priority( session->session, c->mac_list );
        }
+#endif
        if ( c->cred )
                gnutls_credentials_set( session->session, GNUTLS_CRD_CERTIFICATE, c->cred );
        
 static int
 tlsg_parse_ciphers( tlsg_ctx *ctx, char *suites )
 {
+#ifdef HAVE_CIPHERSUITES
+       const char *err;
+       return gnutls_priority_init( &ctx->prios, suites, &err );
+#else
        char *ptr, *end;
        int i, j, len, num;
        int *list, nkx = 0, ncipher = 0, nmac = 0;
        ctx->cipher_list = cipher;
        ctx->mac_list = mac;
        return 0;
+#endif
 }
 
 /*