diff --git a/programs/aes/aescrypt2.c b/programs/aes/aescrypt2.c
index 712a941..694865f 100644
--- a/programs/aes/aescrypt2.c
+++ b/programs/aes/aescrypt2.c
@@ -20,18 +20,18 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#if !defined(POLARSSL_CONFIG_FILE)
+#if !defined(MBEDTLS_CONFIG_FILE)
 #include "mbedtls/config.h"
 #else
-#include POLARSSL_CONFIG_FILE
+#include MBEDTLS_CONFIG_FILE
 #endif
 
-#if defined(POLARSSL_PLATFORM_C)
+#if defined(MBEDTLS_PLATFORM_C)
 #include "mbedtls/platform.h"
 #else
 #include <stdio.h>
-#define polarssl_fprintf    fprintf
-#define polarssl_printf     printf
+#define mbedtls_fprintf    fprintf
+#define mbedtls_printf     printf
 #endif
 
 #include "mbedtls/aes.h"
@@ -60,12 +60,12 @@
     "\n  example: aescrypt2 0 file file.aes hex:E76B2413958B00E193\n" \
     "\n"
 
-#if !defined(POLARSSL_AES_C) || !defined(POLARSSL_SHA256_C) || \
-    !defined(POLARSSL_FS_IO) || !defined(POLARSSL_MD_C)
+#if !defined(MBEDTLS_AES_C) || !defined(MBEDTLS_SHA256_C) || \
+    !defined(MBEDTLS_FS_IO) || !defined(MBEDTLS_MD_C)
 int main( void )
 {
-    polarssl_printf("POLARSSL_AES_C and/or POLARSSL_SHA256_C "
-                    "and/or POLARSSL_FS_IO and/or POLARSSL_MD_C "
+    mbedtls_printf("MBEDTLS_AES_C and/or MBEDTLS_SHA256_C "
+                    "and/or MBEDTLS_FS_IO and/or MBEDTLS_MD_C "
                     "not defined.\n");
     return( 0 );
 }
@@ -86,8 +86,8 @@
     unsigned char buffer[1024];
     unsigned char diff;
 
-    aes_context aes_ctx;
-    md_context_t sha_ctx;
+    mbedtls_aes_context aes_ctx;
+    mbedtls_md_context_t sha_ctx;
 
 #if defined(_WIN32_WCE)
     long filesize, offset;
@@ -98,13 +98,13 @@
       off_t filesize, offset;
 #endif
 
-    aes_init( &aes_ctx );
-    md_init( &sha_ctx );
+    mbedtls_aes_init( &aes_ctx );
+    mbedtls_md_init( &sha_ctx );
 
-    ret = md_setup( &sha_ctx, md_info_from_type( POLARSSL_MD_SHA256 ), 1 );
+    ret = mbedtls_md_setup( &sha_ctx, mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ), 1 );
     if( ret != 0 )
     {
-        polarssl_printf( "  ! md_setup() returned -0x%04x\n", -ret );
+        mbedtls_printf( "  ! mbedtls_md_setup() returned -0x%04x\n", -ret );
         goto exit;
     }
 
@@ -113,10 +113,10 @@
      */
     if( argc != 5 )
     {
-        polarssl_printf( USAGE );
+        mbedtls_printf( USAGE );
 
 #if defined(_WIN32)
-        polarssl_printf( "\n  Press Enter to exit this program.\n" );
+        mbedtls_printf( "\n  Press Enter to exit this program.\n" );
         fflush( stdout ); getchar();
 #endif
 
@@ -131,25 +131,25 @@
 
     if( mode != MODE_ENCRYPT && mode != MODE_DECRYPT )
     {
-        polarssl_fprintf( stderr, "invalide operation mode\n" );
+        mbedtls_fprintf( stderr, "invalide operation mode\n" );
         goto exit;
     }
 
     if( strcmp( argv[2], argv[3] ) == 0 )
     {
-        polarssl_fprintf( stderr, "input and output filenames must differ\n" );
+        mbedtls_fprintf( stderr, "input and output filenames must differ\n" );
         goto exit;
     }
 
     if( ( fin = fopen( argv[2], "rb" ) ) == NULL )
     {
-        polarssl_fprintf( stderr, "fopen(%s,rb) failed\n", argv[2] );
+        mbedtls_fprintf( stderr, "fopen(%s,rb) failed\n", argv[2] );
         goto exit;
     }
 
     if( ( fout = fopen( argv[3], "wb+" ) ) == NULL )
     {
-        polarssl_fprintf( stderr, "fopen(%s,wb+) failed\n", argv[3] );
+        mbedtls_fprintf( stderr, "fopen(%s,wb+) failed\n", argv[3] );
         goto exit;
     }
 
@@ -202,7 +202,7 @@
 
     if( li_size.LowPart == 0xFFFFFFFF && GetLastError() != NO_ERROR )
     {
-        polarssl_fprintf( stderr, "SetFilePointer(0,FILE_END) failed\n" );
+        mbedtls_fprintf( stderr, "SetFilePointer(0,FILE_END) failed\n" );
         goto exit;
     }
 
@@ -218,7 +218,7 @@
 
     if( fseek( fin, 0, SEEK_SET ) < 0 )
     {
-        polarssl_fprintf( stderr, "fseek(0,SEEK_SET) failed\n" );
+        mbedtls_fprintf( stderr, "fseek(0,SEEK_SET) failed\n" );
         goto exit;
     }
 
@@ -233,10 +233,10 @@
 
         p = argv[2];
 
-        md_starts( &sha_ctx );
-        md_update( &sha_ctx, buffer, 8 );
-        md_update( &sha_ctx, (unsigned char *) p, strlen( p ) );
-        md_finish( &sha_ctx, digest );
+        mbedtls_md_starts( &sha_ctx );
+        mbedtls_md_update( &sha_ctx, buffer, 8 );
+        mbedtls_md_update( &sha_ctx, (unsigned char *) p, strlen( p ) );
+        mbedtls_md_finish( &sha_ctx, digest );
 
         memcpy( IV, digest, 16 );
 
@@ -254,7 +254,7 @@
          */
         if( fwrite( IV, 1, 16, fout ) != 16 )
         {
-            polarssl_fprintf( stderr, "fwrite(%d bytes) failed\n", 16 );
+            mbedtls_fprintf( stderr, "fwrite(%d bytes) failed\n", 16 );
             goto exit;
         }
 
@@ -267,15 +267,15 @@
 
         for( i = 0; i < 8192; i++ )
         {
-            md_starts( &sha_ctx );
-            md_update( &sha_ctx, digest, 32 );
-            md_update( &sha_ctx, key, keylen );
-            md_finish( &sha_ctx, digest );
+            mbedtls_md_starts( &sha_ctx );
+            mbedtls_md_update( &sha_ctx, digest, 32 );
+            mbedtls_md_update( &sha_ctx, key, keylen );
+            mbedtls_md_finish( &sha_ctx, digest );
         }
 
         memset( key, 0, sizeof( key ) );
-        aes_setkey_enc( &aes_ctx, digest, 256 );
-        md_hmac_starts( &sha_ctx, digest, 32 );
+        mbedtls_aes_setkey_enc( &aes_ctx, digest, 256 );
+        mbedtls_md_hmac_starts( &sha_ctx, digest, 32 );
 
         /*
          * Encrypt and write the ciphertext.
@@ -287,19 +287,19 @@
 
             if( fread( buffer, 1, n, fin ) != (size_t) n )
             {
-                polarssl_fprintf( stderr, "fread(%d bytes) failed\n", n );
+                mbedtls_fprintf( stderr, "fread(%d bytes) failed\n", n );
                 goto exit;
             }
 
             for( i = 0; i < 16; i++ )
                 buffer[i] = (unsigned char)( buffer[i] ^ IV[i] );
 
-            aes_crypt_ecb( &aes_ctx, AES_ENCRYPT, buffer, buffer );
-            md_hmac_update( &sha_ctx, buffer, 16 );
+            mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, buffer, buffer );
+            mbedtls_md_hmac_update( &sha_ctx, buffer, 16 );
 
             if( fwrite( buffer, 1, 16, fout ) != 16 )
             {
-                polarssl_fprintf( stderr, "fwrite(%d bytes) failed\n", 16 );
+                mbedtls_fprintf( stderr, "fwrite(%d bytes) failed\n", 16 );
                 goto exit;
             }
 
@@ -309,11 +309,11 @@
         /*
          * Finally write the HMAC.
          */
-        md_hmac_finish( &sha_ctx, digest );
+        mbedtls_md_hmac_finish( &sha_ctx, digest );
 
         if( fwrite( digest, 1, 32, fout ) != 32 )
         {
-            polarssl_fprintf( stderr, "fwrite(%d bytes) failed\n", 16 );
+            mbedtls_fprintf( stderr, "fwrite(%d bytes) failed\n", 16 );
             goto exit;
         }
     }
@@ -333,13 +333,13 @@
          */
         if( filesize < 48 )
         {
-            polarssl_fprintf( stderr, "File too short to be encrypted.\n" );
+            mbedtls_fprintf( stderr, "File too short to be encrypted.\n" );
             goto exit;
         }
 
         if( ( filesize & 0x0F ) != 0 )
         {
-            polarssl_fprintf( stderr, "File size not a multiple of 16.\n" );
+            mbedtls_fprintf( stderr, "File size not a multiple of 16.\n" );
             goto exit;
         }
 
@@ -353,7 +353,7 @@
          */
         if( fread( buffer, 1, 16, fin ) != 16 )
         {
-            polarssl_fprintf( stderr, "fread(%d bytes) failed\n", 16 );
+            mbedtls_fprintf( stderr, "fread(%d bytes) failed\n", 16 );
             goto exit;
         }
 
@@ -369,15 +369,15 @@
 
         for( i = 0; i < 8192; i++ )
         {
-            md_starts( &sha_ctx );
-            md_update( &sha_ctx, digest, 32 );
-            md_update( &sha_ctx, key, keylen );
-            md_finish( &sha_ctx, digest );
+            mbedtls_md_starts( &sha_ctx );
+            mbedtls_md_update( &sha_ctx, digest, 32 );
+            mbedtls_md_update( &sha_ctx, key, keylen );
+            mbedtls_md_finish( &sha_ctx, digest );
         }
 
         memset( key, 0, sizeof( key ) );
-        aes_setkey_dec( &aes_ctx, digest, 256 );
-        md_hmac_starts( &sha_ctx, digest, 32 );
+        mbedtls_aes_setkey_dec( &aes_ctx, digest, 256 );
+        mbedtls_md_hmac_starts( &sha_ctx, digest, 32 );
 
         /*
          * Decrypt and write the plaintext.
@@ -386,14 +386,14 @@
         {
             if( fread( buffer, 1, 16, fin ) != 16 )
             {
-                polarssl_fprintf( stderr, "fread(%d bytes) failed\n", 16 );
+                mbedtls_fprintf( stderr, "fread(%d bytes) failed\n", 16 );
                 goto exit;
             }
 
             memcpy( tmp, buffer, 16 );
 
-            md_hmac_update( &sha_ctx, buffer, 16 );
-            aes_crypt_ecb( &aes_ctx, AES_DECRYPT, buffer, buffer );
+            mbedtls_md_hmac_update( &sha_ctx, buffer, 16 );
+            mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_DECRYPT, buffer, buffer );
 
             for( i = 0; i < 16; i++ )
                 buffer[i] = (unsigned char)( buffer[i] ^ IV[i] );
@@ -405,7 +405,7 @@
 
             if( fwrite( buffer, 1, n, fout ) != (size_t) n )
             {
-                polarssl_fprintf( stderr, "fwrite(%d bytes) failed\n", n );
+                mbedtls_fprintf( stderr, "fwrite(%d bytes) failed\n", n );
                 goto exit;
             }
         }
@@ -413,11 +413,11 @@
         /*
          * Verify the message authentication code.
          */
-        md_hmac_finish( &sha_ctx, digest );
+        mbedtls_md_hmac_finish( &sha_ctx, digest );
 
         if( fread( buffer, 1, 32, fin ) != 32 )
         {
-            polarssl_fprintf( stderr, "fread(%d bytes) failed\n", 32 );
+            mbedtls_fprintf( stderr, "fread(%d bytes) failed\n", 32 );
             goto exit;
         }
 
@@ -428,7 +428,7 @@
 
         if( diff != 0 )
         {
-            polarssl_fprintf( stderr, "HMAC check failed: wrong key, "
+            mbedtls_fprintf( stderr, "HMAC check failed: wrong key, "
                              "or file corrupted.\n" );
             goto exit;
         }
@@ -445,9 +445,9 @@
     memset( buffer, 0, sizeof( buffer ) );
     memset( digest, 0, sizeof( digest ) );
 
-    aes_free( &aes_ctx );
-    md_free( &sha_ctx );
+    mbedtls_aes_free( &aes_ctx );
+    mbedtls_md_free( &sha_ctx );
 
     return( ret );
 }
-#endif /* POLARSSL_AES_C && POLARSSL_SHA256_C && POLARSSL_FS_IO */
+#endif /* MBEDTLS_AES_C && MBEDTLS_SHA256_C && MBEDTLS_FS_IO */
diff --git a/programs/aes/crypt_and_hash.c b/programs/aes/crypt_and_hash.c
index d102b69..67f47c2 100644
--- a/programs/aes/crypt_and_hash.c
+++ b/programs/aes/crypt_and_hash.c
@@ -21,22 +21,22 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#if !defined(POLARSSL_CONFIG_FILE)
+#if !defined(MBEDTLS_CONFIG_FILE)
 #include "mbedtls/config.h"
 #else
-#include POLARSSL_CONFIG_FILE
+#include MBEDTLS_CONFIG_FILE
 #endif
 
-#if defined(POLARSSL_PLATFORM_C)
+#if defined(MBEDTLS_PLATFORM_C)
 #include "mbedtls/platform.h"
 #else
 #include <stdio.h>
-#define polarssl_fprintf    fprintf
-#define polarssl_printf     printf
+#define mbedtls_fprintf    fprintf
+#define mbedtls_printf     printf
 #endif
 
-#if defined(POLARSSL_CIPHER_C) && defined(POLARSSL_MD_C) && \
- defined(POLARSSL_FS_IO)
+#if defined(MBEDTLS_CIPHER_C) && defined(MBEDTLS_MD_C) && \
+ defined(MBEDTLS_FS_IO)
 #include "mbedtls/cipher.h"
 #include "mbedtls/md.h"
 
@@ -59,16 +59,16 @@
 #define MODE_DECRYPT    1
 
 #define USAGE   \
-    "\n  crypt_and_hash <mode> <input filename> <output filename> <cipher> <md> <key>\n" \
+    "\n  crypt_and_hash <mode> <input filename> <output filename> <cipher> <mbedtls_md> <key>\n" \
     "\n   <mode>: 0 = encrypt, 1 = decrypt\n" \
     "\n  example: crypt_and_hash 0 file file.aes AES-128-CBC SHA1 hex:E76B2413958B00E193\n" \
     "\n"
 
-#if !defined(POLARSSL_CIPHER_C) || !defined(POLARSSL_MD_C) || \
-    !defined(POLARSSL_FS_IO)
+#if !defined(MBEDTLS_CIPHER_C) || !defined(MBEDTLS_MD_C) || \
+    !defined(MBEDTLS_FS_IO)
 int main( void )
 {
-    polarssl_printf("POLARSSL_CIPHER_C and/or POLARSSL_MD_C and/or POLARSSL_FS_IO not defined.\n");
+    mbedtls_printf("MBEDTLS_CIPHER_C and/or MBEDTLS_MD_C and/or MBEDTLS_FS_IO not defined.\n");
     return( 0 );
 }
 #else
@@ -82,15 +82,15 @@
     char *p;
     unsigned char IV[16];
     unsigned char key[512];
-    unsigned char digest[POLARSSL_MD_MAX_SIZE];
+    unsigned char digest[MBEDTLS_MD_MAX_SIZE];
     unsigned char buffer[1024];
     unsigned char output[1024];
     unsigned char diff;
 
-    const cipher_info_t *cipher_info;
-    const md_info_t *md_info;
-    cipher_context_t cipher_ctx;
-    md_context_t md_ctx;
+    const mbedtls_cipher_info_t *cipher_info;
+    const mbedtls_md_info_t *md_info;
+    mbedtls_cipher_context_t cipher_ctx;
+    mbedtls_md_context_t md_ctx;
 #if defined(_WIN32_WCE)
     long filesize, offset;
 #elif defined(_WIN32)
@@ -100,8 +100,8 @@
       off_t filesize, offset;
 #endif
 
-    cipher_init( &cipher_ctx );
-    md_init( &md_ctx );
+    mbedtls_cipher_init( &cipher_ctx );
+    mbedtls_md_init( &md_ctx );
 
     /*
      * Parse the command-line arguments.
@@ -110,28 +110,28 @@
     {
         const int *list;
 
-        polarssl_printf( USAGE );
+        mbedtls_printf( USAGE );
 
-        polarssl_printf( "Available ciphers:\n" );
-        list = cipher_list();
+        mbedtls_printf( "Available ciphers:\n" );
+        list = mbedtls_cipher_list();
         while( *list )
         {
-            cipher_info = cipher_info_from_type( *list );
-            polarssl_printf( "  %s\n", cipher_info->name );
+            cipher_info = mbedtls_cipher_info_from_type( *list );
+            mbedtls_printf( "  %s\n", cipher_info->name );
             list++;
         }
 
-        polarssl_printf( "\nAvailable message digests:\n" );
-        list = md_list();
+        mbedtls_printf( "\nAvailable message digests:\n" );
+        list = mbedtls_md_list();
         while( *list )
         {
-            md_info = md_info_from_type( *list );
-            polarssl_printf( "  %s\n", md_get_name( md_info ) );
+            md_info = mbedtls_md_info_from_type( *list );
+            mbedtls_printf( "  %s\n", mbedtls_md_get_name( md_info ) );
             list++;
         }
 
 #if defined(_WIN32)
-        polarssl_printf( "\n  Press Enter to exit this program.\n" );
+        mbedtls_printf( "\n  Press Enter to exit this program.\n" );
         fflush( stdout ); getchar();
 #endif
 
@@ -142,50 +142,50 @@
 
     if( mode != MODE_ENCRYPT && mode != MODE_DECRYPT )
     {
-        polarssl_fprintf( stderr, "invalid operation mode\n" );
+        mbedtls_fprintf( stderr, "invalid operation mode\n" );
         goto exit;
     }
 
     if( strcmp( argv[2], argv[3] ) == 0 )
     {
-        polarssl_fprintf( stderr, "input and output filenames must differ\n" );
+        mbedtls_fprintf( stderr, "input and output filenames must differ\n" );
         goto exit;
     }
 
     if( ( fin = fopen( argv[2], "rb" ) ) == NULL )
     {
-        polarssl_fprintf( stderr, "fopen(%s,rb) failed\n", argv[2] );
+        mbedtls_fprintf( stderr, "fopen(%s,rb) failed\n", argv[2] );
         goto exit;
     }
 
     if( ( fout = fopen( argv[3], "wb+" ) ) == NULL )
     {
-        polarssl_fprintf( stderr, "fopen(%s,wb+) failed\n", argv[3] );
+        mbedtls_fprintf( stderr, "fopen(%s,wb+) failed\n", argv[3] );
         goto exit;
     }
 
     /*
      * Read the Cipher and MD from the command line
      */
-    cipher_info = cipher_info_from_string( argv[4] );
+    cipher_info = mbedtls_cipher_info_from_string( argv[4] );
     if( cipher_info == NULL )
     {
-        polarssl_fprintf( stderr, "Cipher '%s' not found\n", argv[4] );
+        mbedtls_fprintf( stderr, "Cipher '%s' not found\n", argv[4] );
         goto exit;
     }
-    if( ( ret = cipher_init_ctx( &cipher_ctx, cipher_info) ) != 0 )
+    if( ( ret = mbedtls_cipher_init_ctx( &cipher_ctx, cipher_info) ) != 0 )
     {
-        polarssl_fprintf( stderr, "cipher_init_ctx failed\n" );
+        mbedtls_fprintf( stderr, "mbedtls_cipher_init_ctx failed\n" );
         goto exit;
     }
 
-    md_info = md_info_from_string( argv[5] );
+    md_info = mbedtls_md_info_from_string( argv[5] );
     if( md_info == NULL )
     {
-        polarssl_fprintf( stderr, "Message Digest '%s' not found\n", argv[5] );
+        mbedtls_fprintf( stderr, "Message Digest '%s' not found\n", argv[5] );
         goto exit;
     }
-    md_setup( &md_ctx, md_info, 1 );
+    mbedtls_md_setup( &md_ctx, md_info, 1 );
 
     /*
      * Read the secret key and clean the command line.
@@ -236,7 +236,7 @@
 
     if( li_size.LowPart == 0xFFFFFFFF && GetLastError() != NO_ERROR )
     {
-        polarssl_fprintf( stderr, "SetFilePointer(0,FILE_END) failed\n" );
+        mbedtls_fprintf( stderr, "SetFilePointer(0,FILE_END) failed\n" );
         goto exit;
     }
 
@@ -252,7 +252,7 @@
 
     if( fseek( fin, 0, SEEK_SET ) < 0 )
     {
-        polarssl_fprintf( stderr, "fseek(0,SEEK_SET) failed\n" );
+        mbedtls_fprintf( stderr, "fseek(0,SEEK_SET) failed\n" );
         goto exit;
     }
 
@@ -267,10 +267,10 @@
 
         p = argv[2];
 
-        md_starts( &md_ctx );
-        md_update( &md_ctx, buffer, 8 );
-        md_update( &md_ctx, (unsigned char *) p, strlen( p ) );
-        md_finish( &md_ctx, digest );
+        mbedtls_md_starts( &md_ctx );
+        mbedtls_md_update( &md_ctx, buffer, 8 );
+        mbedtls_md_update( &md_ctx, (unsigned char *) p, strlen( p ) );
+        mbedtls_md_finish( &md_ctx, digest );
 
         memcpy( IV, digest, 16 );
 
@@ -288,7 +288,7 @@
          */
         if( fwrite( IV, 1, 16, fout ) != 16 )
         {
-            polarssl_fprintf( stderr, "fwrite(%d bytes) failed\n", 16 );
+            mbedtls_fprintf( stderr, "fwrite(%d bytes) failed\n", 16 );
             goto exit;
         }
 
@@ -301,84 +301,84 @@
 
         for( i = 0; i < 8192; i++ )
         {
-            md_starts( &md_ctx );
-            md_update( &md_ctx, digest, 32 );
-            md_update( &md_ctx, key, keylen );
-            md_finish( &md_ctx, digest );
+            mbedtls_md_starts( &md_ctx );
+            mbedtls_md_update( &md_ctx, digest, 32 );
+            mbedtls_md_update( &md_ctx, key, keylen );
+            mbedtls_md_finish( &md_ctx, digest );
 
         }
 
         memset( key, 0, sizeof( key ) );
 
-        if( cipher_setkey( &cipher_ctx, digest, cipher_info->key_length,
-                           POLARSSL_ENCRYPT ) != 0 )
+        if( mbedtls_cipher_setkey( &cipher_ctx, digest, cipher_info->key_length,
+                           MBEDTLS_ENCRYPT ) != 0 )
         {
-            polarssl_fprintf( stderr, "cipher_setkey() returned error\n");
+            mbedtls_fprintf( stderr, "mbedtls_cipher_setkey() returned error\n");
             goto exit;
         }
-        if( cipher_set_iv( &cipher_ctx, IV, 16 ) != 0 )
+        if( mbedtls_cipher_set_iv( &cipher_ctx, IV, 16 ) != 0 )
         {
-            polarssl_fprintf( stderr, "cipher_set_iv() returned error\n");
+            mbedtls_fprintf( stderr, "mbedtls_cipher_set_iv() returned error\n");
             goto exit;
         }
-        if( cipher_reset( &cipher_ctx ) != 0 )
+        if( mbedtls_cipher_reset( &cipher_ctx ) != 0 )
         {
-            polarssl_fprintf( stderr, "cipher_reset() returned error\n");
+            mbedtls_fprintf( stderr, "mbedtls_cipher_reset() returned error\n");
             goto exit;
         }
 
-        md_hmac_starts( &md_ctx, digest, 32 );
+        mbedtls_md_hmac_starts( &md_ctx, digest, 32 );
 
         /*
          * Encrypt and write the ciphertext.
          */
-        for( offset = 0; offset < filesize; offset += cipher_get_block_size( &cipher_ctx ) )
+        for( offset = 0; offset < filesize; offset += mbedtls_cipher_get_block_size( &cipher_ctx ) )
         {
-            ilen = ( (unsigned int) filesize - offset > cipher_get_block_size( &cipher_ctx ) ) ?
-                cipher_get_block_size( &cipher_ctx ) : (unsigned int) ( filesize - offset );
+            ilen = ( (unsigned int) filesize - offset > mbedtls_cipher_get_block_size( &cipher_ctx ) ) ?
+                mbedtls_cipher_get_block_size( &cipher_ctx ) : (unsigned int) ( filesize - offset );
 
             if( fread( buffer, 1, ilen, fin ) != ilen )
             {
-                polarssl_fprintf( stderr, "fread(%ld bytes) failed\n", (long) ilen );
+                mbedtls_fprintf( stderr, "fread(%ld bytes) failed\n", (long) ilen );
                 goto exit;
             }
 
-            if( cipher_update( &cipher_ctx, buffer, ilen, output, &olen ) != 0 )
+            if( mbedtls_cipher_update( &cipher_ctx, buffer, ilen, output, &olen ) != 0 )
             {
-                polarssl_fprintf( stderr, "cipher_update() returned error\n");
+                mbedtls_fprintf( stderr, "mbedtls_cipher_update() returned error\n");
                 goto exit;
             }
 
-            md_hmac_update( &md_ctx, output, olen );
+            mbedtls_md_hmac_update( &md_ctx, output, olen );
 
             if( fwrite( output, 1, olen, fout ) != olen )
             {
-                polarssl_fprintf( stderr, "fwrite(%ld bytes) failed\n", (long) olen );
+                mbedtls_fprintf( stderr, "fwrite(%ld bytes) failed\n", (long) olen );
                 goto exit;
             }
         }
 
-        if( cipher_finish( &cipher_ctx, output, &olen ) != 0 )
+        if( mbedtls_cipher_finish( &cipher_ctx, output, &olen ) != 0 )
         {
-            polarssl_fprintf( stderr, "cipher_finish() returned error\n" );
+            mbedtls_fprintf( stderr, "mbedtls_cipher_finish() returned error\n" );
             goto exit;
         }
-        md_hmac_update( &md_ctx, output, olen );
+        mbedtls_md_hmac_update( &md_ctx, output, olen );
 
         if( fwrite( output, 1, olen, fout ) != olen )
         {
-            polarssl_fprintf( stderr, "fwrite(%ld bytes) failed\n", (long) olen );
+            mbedtls_fprintf( stderr, "fwrite(%ld bytes) failed\n", (long) olen );
             goto exit;
         }
 
         /*
          * Finally write the HMAC.
          */
-        md_hmac_finish( &md_ctx, digest );
+        mbedtls_md_hmac_finish( &md_ctx, digest );
 
-        if( fwrite( digest, 1, md_get_size( md_info ), fout ) != md_get_size( md_info ) )
+        if( fwrite( digest, 1, mbedtls_md_get_size( md_info ), fout ) != mbedtls_md_get_size( md_info ) )
         {
-            polarssl_fprintf( stderr, "fwrite(%d bytes) failed\n", md_get_size( md_info ) );
+            mbedtls_fprintf( stderr, "fwrite(%d bytes) failed\n", mbedtls_md_get_size( md_info ) );
             goto exit;
         }
     }
@@ -394,31 +394,31 @@
          *      N*16 .. (N+1)*16 - 1    AES Encrypted Block #N
          *  (N+1)*16 .. (N+1)*16 + 32   HMAC-SHA-256(ciphertext)
          */
-        if( filesize < 16 + md_get_size( md_info ) )
+        if( filesize < 16 + mbedtls_md_get_size( md_info ) )
         {
-            polarssl_fprintf( stderr, "File too short to be encrypted.\n" );
+            mbedtls_fprintf( stderr, "File too short to be encrypted.\n" );
             goto exit;
         }
 
-        if( ( ( filesize - md_get_size( md_info ) ) %
-                cipher_get_block_size( &cipher_ctx ) ) != 0 )
+        if( ( ( filesize - mbedtls_md_get_size( md_info ) ) %
+                mbedtls_cipher_get_block_size( &cipher_ctx ) ) != 0 )
         {
-            polarssl_fprintf( stderr, "File content not a multiple of the block size (%d).\n",
-                     cipher_get_block_size( &cipher_ctx ));
+            mbedtls_fprintf( stderr, "File content not a multiple of the block size (%d).\n",
+                     mbedtls_cipher_get_block_size( &cipher_ctx ));
             goto exit;
         }
 
         /*
          * Subtract the IV + HMAC length.
          */
-        filesize -= ( 16 + md_get_size( md_info ) );
+        filesize -= ( 16 + mbedtls_md_get_size( md_info ) );
 
         /*
          * Read the IV and original filesize modulo 16.
          */
         if( fread( buffer, 1, 16, fin ) != 16 )
         {
-            polarssl_fprintf( stderr, "fread(%d bytes) failed\n", 16 );
+            mbedtls_fprintf( stderr, "fread(%d bytes) failed\n", 16 );
             goto exit;
         }
 
@@ -434,60 +434,60 @@
 
         for( i = 0; i < 8192; i++ )
         {
-            md_starts( &md_ctx );
-            md_update( &md_ctx, digest, 32 );
-            md_update( &md_ctx, key, keylen );
-            md_finish( &md_ctx, digest );
+            mbedtls_md_starts( &md_ctx );
+            mbedtls_md_update( &md_ctx, digest, 32 );
+            mbedtls_md_update( &md_ctx, key, keylen );
+            mbedtls_md_finish( &md_ctx, digest );
         }
 
         memset( key, 0, sizeof( key ) );
 
-        if( cipher_setkey( &cipher_ctx, digest, cipher_info->key_length,
-                           POLARSSL_DECRYPT ) != 0 )
+        if( mbedtls_cipher_setkey( &cipher_ctx, digest, cipher_info->key_length,
+                           MBEDTLS_DECRYPT ) != 0 )
         {
-            polarssl_fprintf( stderr, "cipher_setkey() returned error\n" );
+            mbedtls_fprintf( stderr, "mbedtls_cipher_setkey() returned error\n" );
             goto exit;
         }
 
-        if( cipher_set_iv( &cipher_ctx, IV, 16 ) != 0 )
+        if( mbedtls_cipher_set_iv( &cipher_ctx, IV, 16 ) != 0 )
         {
-            polarssl_fprintf( stderr, "cipher_set_iv() returned error\n" );
+            mbedtls_fprintf( stderr, "mbedtls_cipher_set_iv() returned error\n" );
             goto exit;
         }
 
-        if( cipher_reset( &cipher_ctx ) != 0 )
+        if( mbedtls_cipher_reset( &cipher_ctx ) != 0 )
         {
-            polarssl_fprintf( stderr, "cipher_reset() returned error\n" );
+            mbedtls_fprintf( stderr, "mbedtls_cipher_reset() returned error\n" );
             goto exit;
         }
 
-        md_hmac_starts( &md_ctx, digest, 32 );
+        mbedtls_md_hmac_starts( &md_ctx, digest, 32 );
 
         /*
          * Decrypt and write the plaintext.
          */
-        for( offset = 0; offset < filesize; offset += cipher_get_block_size( &cipher_ctx ) )
+        for( offset = 0; offset < filesize; offset += mbedtls_cipher_get_block_size( &cipher_ctx ) )
         {
-            if( fread( buffer, 1, cipher_get_block_size( &cipher_ctx ), fin ) !=
-                (size_t) cipher_get_block_size( &cipher_ctx ) )
+            if( fread( buffer, 1, mbedtls_cipher_get_block_size( &cipher_ctx ), fin ) !=
+                (size_t) mbedtls_cipher_get_block_size( &cipher_ctx ) )
             {
-                polarssl_fprintf( stderr, "fread(%d bytes) failed\n",
-                    cipher_get_block_size( &cipher_ctx ) );
+                mbedtls_fprintf( stderr, "fread(%d bytes) failed\n",
+                    mbedtls_cipher_get_block_size( &cipher_ctx ) );
                 goto exit;
             }
 
-            md_hmac_update( &md_ctx, buffer, cipher_get_block_size( &cipher_ctx ) );
-            if( cipher_update( &cipher_ctx, buffer,
-                               cipher_get_block_size( &cipher_ctx ),
+            mbedtls_md_hmac_update( &md_ctx, buffer, mbedtls_cipher_get_block_size( &cipher_ctx ) );
+            if( mbedtls_cipher_update( &cipher_ctx, buffer,
+                               mbedtls_cipher_get_block_size( &cipher_ctx ),
                                output, &olen ) != 0 )
             {
-                polarssl_fprintf( stderr, "cipher_update() returned error\n" );
+                mbedtls_fprintf( stderr, "mbedtls_cipher_update() returned error\n" );
                 goto exit;
             }
 
             if( fwrite( output, 1, olen, fout ) != olen )
             {
-                polarssl_fprintf( stderr, "fwrite(%ld bytes) failed\n", (long) olen );
+                mbedtls_fprintf( stderr, "fwrite(%ld bytes) failed\n", (long) olen );
                 goto exit;
             }
         }
@@ -495,22 +495,22 @@
         /*
          * Verify the message authentication code.
          */
-        md_hmac_finish( &md_ctx, digest );
+        mbedtls_md_hmac_finish( &md_ctx, digest );
 
-        if( fread( buffer, 1, md_get_size( md_info ), fin ) != md_get_size( md_info ) )
+        if( fread( buffer, 1, mbedtls_md_get_size( md_info ), fin ) != mbedtls_md_get_size( md_info ) )
         {
-            polarssl_fprintf( stderr, "fread(%d bytes) failed\n", md_get_size( md_info ) );
+            mbedtls_fprintf( stderr, "fread(%d bytes) failed\n", mbedtls_md_get_size( md_info ) );
             goto exit;
         }
 
         /* Use constant-time buffer comparison */
         diff = 0;
-        for( i = 0; i < md_get_size( md_info ); i++ )
+        for( i = 0; i < mbedtls_md_get_size( md_info ); i++ )
             diff |= digest[i] ^ buffer[i];
 
         if( diff != 0 )
         {
-            polarssl_fprintf( stderr, "HMAC check failed: wrong key, "
+            mbedtls_fprintf( stderr, "HMAC check failed: wrong key, "
                              "or file corrupted.\n" );
             goto exit;
         }
@@ -518,11 +518,11 @@
         /*
          * Write the final block of data
          */
-        cipher_finish( &cipher_ctx, output, &olen );
+        mbedtls_cipher_finish( &cipher_ctx, output, &olen );
 
         if( fwrite( output, 1, olen, fout ) != olen )
         {
-            polarssl_fprintf( stderr, "fwrite(%ld bytes) failed\n", (long) olen );
+            mbedtls_fprintf( stderr, "fwrite(%ld bytes) failed\n", (long) olen );
             goto exit;
         }
     }
@@ -538,9 +538,9 @@
     memset( buffer, 0, sizeof( buffer ) );
     memset( digest, 0, sizeof( digest ) );
 
-    cipher_free( &cipher_ctx );
-    md_free( &md_ctx );
+    mbedtls_cipher_free( &cipher_ctx );
+    mbedtls_md_free( &md_ctx );
 
     return( ret );
 }
-#endif /* POLARSSL_CIPHER_C && POLARSSL_MD_C && POLARSSL_FS_IO */
+#endif /* MBEDTLS_CIPHER_C && MBEDTLS_MD_C && MBEDTLS_FS_IO */
