diff --git a/library/ssl_tls.c b/library/ssl_tls.c
index ed95d3e..5e2e772 100644
--- a/library/ssl_tls.c
+++ b/library/ssl_tls.c
@@ -355,6 +355,7 @@
 
 int ssl_derive_keys( ssl_context *ssl )
 {
+    int ret = 0;
     unsigned char tmp[64];
     unsigned char keyblk[256];
     unsigned char *key1;
@@ -648,15 +649,46 @@
              break;
 #endif
 
-#if defined(POLARSSL_AES_C)
         case POLARSSL_CIPHER_AES_128_CBC:
         case POLARSSL_CIPHER_AES_256_CBC:
-            aes_setkey_enc( (aes_context*) transform->ctx_enc, key1,
-                            cipher_info->key_length );
-            aes_setkey_dec( (aes_context*) transform->ctx_dec, key2,
-                            cipher_info->key_length );
+            if( ( ret = cipher_init_ctx( &transform->cipher_ctx_enc,
+                                         cipher_info ) ) != 0 )
+            {
+                return( ret );
+            }
+
+            if( ( ret = cipher_setkey( &transform->cipher_ctx_enc, key1,
+                                       cipher_info->key_length,
+                                       POLARSSL_ENCRYPT ) ) != 0 )
+            {
+                return( ret );
+            }
+
+            if( ( ret = cipher_set_padding_mode( &transform->cipher_ctx_enc,
+                                                 POLARSSL_PADDING_NONE ) ) != 0 )
+            {
+                return( ret );
+            }
+
+            if( ( ret = cipher_init_ctx( &transform->cipher_ctx_dec,
+                                         cipher_info ) ) != 0 )
+            {
+                return( ret );
+            }
+
+            if( ( ret = cipher_setkey( &transform->cipher_ctx_dec, key2,
+                                       cipher_info->key_length,
+                                       POLARSSL_DECRYPT ) ) != 0 )
+            {
+                return( ret );
+            }
+
+            if( ( ret = cipher_set_padding_mode( &transform->cipher_ctx_dec,
+                                                 POLARSSL_PADDING_NONE ) ) != 0 )
+            {
+                return( ret );
+            }
             break;
-#endif
 
 #if defined(POLARSSL_CAMELLIA_C)
         case POLARSSL_CIPHER_CAMELLIA_128_CBC:
@@ -999,8 +1031,10 @@
     else
 #endif /* POLARSSL_GCM_C */
     {
+        int ret;
         unsigned char *enc_msg;
         size_t enc_msglen;
+        size_t olen = 0;
 
         padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) %
                  ssl->transform_out->ivlen;
@@ -1065,14 +1099,49 @@
                 break;
 #endif
 
-#if defined(POLARSSL_AES_C)
             case POLARSSL_CIPHER_AES_128_CBC:
             case POLARSSL_CIPHER_AES_256_CBC:
-                aes_crypt_cbc( (aes_context *) ssl->transform_out->ctx_enc,
-                               AES_ENCRYPT, enc_msglen,
-                               ssl->transform_out->iv_enc, enc_msg, enc_msg );
-                break;
+                if( ( ret = cipher_reset( &ssl->transform_out->cipher_ctx_enc,
+                                          ssl->transform_out->iv_enc ) ) != 0 )
+                {
+                    return( ret );
+                }
+
+                if( ( ret = cipher_update( &ssl->transform_out->cipher_ctx_enc,
+                                           enc_msg, enc_msglen, enc_msg,
+                                           &olen ) ) != 0 )
+                {
+                    return( ret );
+                }
+
+                enc_msglen -= olen;
+
+                if( ( ret = cipher_finish( &ssl->transform_out->cipher_ctx_enc,
+                                           enc_msg + olen, &olen ) ) != 0 )
+                {
+                    return( ret );
+                }
+
+                if( enc_msglen != olen )
+                {
+                    SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect %d %d",
+                                        enc_msglen, olen ) );
+                    // TODO Real error number
+                    return( -1 );
+                }
+
+#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1)
+                if( ssl->minor_ver < SSL_MINOR_VERSION_2 )
+                {
+                    /*
+                     * Save IV in SSL3 and TLS1
+                     */
+                    memcpy( ssl->transform_out->iv_enc,
+                            ssl->transform_out->cipher_ctx_enc.iv,
+                            ssl->transform_out->ivlen );
+                }
 #endif
+                break;
 
 #if defined(POLARSSL_CAMELLIA_C)
             case POLARSSL_CIPHER_CAMELLIA_128_CBC:
@@ -1190,10 +1259,12 @@
         /*
          * Decrypt and check the padding
          */
+        int ret;
         unsigned char *dec_msg;
         unsigned char *dec_msg_result;
         size_t dec_msglen;
         size_t minlen = 0;
+        size_t olen = 0;
 
         /*
          * Check immediate ciphertext sanity
@@ -1252,14 +1323,47 @@
                 break;
 #endif
 
-#if defined(POLARSSL_AES_C)
             case POLARSSL_CIPHER_AES_128_CBC:
             case POLARSSL_CIPHER_AES_256_CBC:
-                aes_crypt_cbc( (aes_context *) ssl->transform_in->ctx_dec,
-                               AES_DECRYPT, dec_msglen,
-                               ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
-                break;
+                if( ( ret = cipher_reset( &ssl->transform_in->cipher_ctx_dec,
+                                          ssl->transform_in->iv_dec ) ) != 0 )
+                {
+                    return( ret );
+                }
+
+                if( ( ret = cipher_update( &ssl->transform_in->cipher_ctx_dec,
+                                           dec_msg, dec_msglen, dec_msg_result,
+                                           &olen ) ) != 0 )
+                {
+                    return( ret );
+                }
+
+                dec_msglen -= olen;
+                if( ( ret = cipher_finish( &ssl->transform_in->cipher_ctx_dec,
+                                           dec_msg_result + olen, &olen ) ) != 0 )
+                {
+                    return( ret );
+                }
+
+                if( dec_msglen != olen )
+                {
+                    SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect" ) );
+                    // TODO Real error number
+                    return( -1 );
+                }
+
+#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1)
+                if( ssl->minor_ver < SSL_MINOR_VERSION_2 )
+                {
+                    /*
+                     * Save IV in SSL3 and TLS1
+                     */
+                    memcpy( ssl->transform_in->iv_dec,
+                            ssl->transform_in->cipher_ctx_dec.iv,
+                            ssl->transform_in->ivlen );
+                }
 #endif
+                break;
 
 #if defined(POLARSSL_CAMELLIA_C)
             case POLARSSL_CIPHER_CAMELLIA_128_CBC:
