diff --git a/programs/pkey/gen_key.c b/programs/pkey/gen_key.c
index 6b93111..17baabe 100644
--- a/programs/pkey/gen_key.c
+++ b/programs/pkey/gen_key.c
@@ -20,21 +20,21 @@
  *  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_printf     printf
+#define mbedtls_printf     printf
 #endif
 
-#if defined(POLARSSL_PK_WRITE_C) && defined(POLARSSL_FS_IO) && \
-    defined(POLARSSL_ENTROPY_C) && defined(POLARSSL_CTR_DRBG_C)
+#if defined(MBEDTLS_PK_WRITE_C) && defined(MBEDTLS_FS_IO) && \
+    defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_CTR_DRBG_C)
 #include "mbedtls/error.h"
 #include "mbedtls/pk.h"
 #include "mbedtls/ecdsa.h"
@@ -64,7 +64,7 @@
 
     file = fopen( "/dev/random", "rb" );
     if( file == NULL )
-        return( POLARSSL_ERR_ENTROPY_SOURCE_FAILED );
+        return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
 
     while( left > 0 )
     {
@@ -73,7 +73,7 @@
         if( ret == 0 && ferror( file ) )
         {
             fclose( file );
-            return( POLARSSL_ERR_ENTROPY_SOURCE_FAILED );
+            return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
         }
 
         p += ret;
@@ -88,23 +88,23 @@
 #endif /* !_WIN32 */
 #endif
 
-#if defined(POLARSSL_ECP_C)
-#define DFL_EC_CURVE            ecp_curve_list()->grp_id
+#if defined(MBEDTLS_ECP_C)
+#define DFL_EC_CURVE            mbedtls_ecp_curve_list()->grp_id
 #else
 #define DFL_EC_CURVE            0
 #endif
 
-#if !defined(_WIN32) && defined(POLARSSL_FS_IO)
+#if !defined(_WIN32) && defined(MBEDTLS_FS_IO)
 #define USAGE_DEV_RANDOM \
     "    use_dev_random=0|1    default: 0\n"
 #else
 #define USAGE_DEV_RANDOM ""
-#endif /* !_WIN32 && POLARSSL_FS_IO */
+#endif /* !_WIN32 && MBEDTLS_FS_IO */
 
 #define FORMAT_PEM              0
 #define FORMAT_DER              1
 
-#define DFL_TYPE                POLARSSL_PK_RSA
+#define DFL_TYPE                MBEDTLS_PK_RSA
 #define DFL_RSA_KEYSIZE         4096
 #define DFL_FILENAME            "keyfile.key"
 #define DFL_FORMAT              FORMAT_PEM
@@ -121,12 +121,12 @@
     USAGE_DEV_RANDOM                                    \
     "\n"
 
-#if !defined(POLARSSL_PK_WRITE_C) || !defined(POLARSSL_FS_IO) ||    \
-    !defined(POLARSSL_ENTROPY_C) || !defined(POLARSSL_CTR_DRBG_C)
+#if !defined(MBEDTLS_PK_WRITE_C) || !defined(MBEDTLS_FS_IO) ||    \
+    !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_CTR_DRBG_C)
 int main( void )
 {
-    polarssl_printf( "POLARSSL_PK_WRITE_C and/or POLARSSL_FS_IO and/or "
-            "POLARSSL_ENTROPY_C and/or POLARSSL_CTR_DRBG_C "
+    mbedtls_printf( "MBEDTLS_PK_WRITE_C and/or MBEDTLS_FS_IO and/or "
+            "MBEDTLS_ENTROPY_C and/or MBEDTLS_CTR_DRBG_C "
             "not defined.\n" );
     return( 0 );
 }
@@ -144,7 +144,7 @@
     int use_dev_random;         /* use /dev/random as entropy source    */
 } opt;
 
-static int write_private_key( pk_context *key, const char *output_file )
+static int write_private_key( mbedtls_pk_context *key, const char *output_file )
 {
     int ret;
     FILE *f;
@@ -155,14 +155,14 @@
     memset(output_buf, 0, 16000);
     if( opt.format == FORMAT_PEM )
     {
-        if( ( ret = pk_write_key_pem( key, output_buf, 16000 ) ) != 0 )
+        if( ( ret = mbedtls_pk_write_key_pem( key, output_buf, 16000 ) ) != 0 )
             return( ret );
 
         len = strlen( (char *) output_buf );
     }
     else
     {
-        if( ( ret = pk_write_key_der( key, output_buf, 16000 ) ) < 0 )
+        if( ( ret = mbedtls_pk_write_key_der( key, output_buf, 16000 ) ) < 0 )
             return( ret );
 
         len = ret;
@@ -186,34 +186,34 @@
 int main( int argc, char *argv[] )
 {
     int ret = 0;
-    pk_context key;
+    mbedtls_pk_context key;
     char buf[1024];
     int i;
     char *p, *q;
-    entropy_context entropy;
-    ctr_drbg_context ctr_drbg;
+    mbedtls_entropy_context entropy;
+    mbedtls_ctr_drbg_context ctr_drbg;
     const char *pers = "gen_key";
-#if defined(POLARSSL_ECP_C)
-    const ecp_curve_info *curve_info;
+#if defined(MBEDTLS_ECP_C)
+    const mbedtls_ecp_curve_info *curve_info;
 #endif
 
     /*
      * Set to sane values
      */
-    pk_init( &key );
+    mbedtls_pk_init( &key );
     memset( buf, 0, sizeof( buf ) );
 
     if( argc == 0 )
     {
     usage:
         ret = 1;
-        polarssl_printf( USAGE );
-#if defined(POLARSSL_ECP_C)
-        polarssl_printf( " availabled ec_curve values:\n" );
-        curve_info = ecp_curve_list();
-        polarssl_printf( "    %s (default)\n", curve_info->name );
+        mbedtls_printf( USAGE );
+#if defined(MBEDTLS_ECP_C)
+        mbedtls_printf( " availabled ec_curve values:\n" );
+        curve_info = mbedtls_ecp_curve_list();
+        mbedtls_printf( "    %s (default)\n", curve_info->name );
         while( ( ++curve_info )->name != NULL )
-            polarssl_printf( "    %s\n", curve_info->name );
+            mbedtls_printf( "    %s\n", curve_info->name );
 #endif
         goto exit;
     }
@@ -235,9 +235,9 @@
         if( strcmp( p, "type" ) == 0 )
         {
             if( strcmp( q, "rsa" ) == 0 )
-                opt.type = POLARSSL_PK_RSA;
+                opt.type = MBEDTLS_PK_RSA;
             else if( strcmp( q, "ec" ) == 0 )
-                opt.type = POLARSSL_PK_ECKEY;
+                opt.type = MBEDTLS_PK_ECKEY;
             else
                 goto usage;
         }
@@ -254,13 +254,13 @@
         {
             opt.rsa_keysize = atoi( q );
             if( opt.rsa_keysize < 1024 ||
-                opt.rsa_keysize > POLARSSL_MPI_MAX_BITS )
+                opt.rsa_keysize > MBEDTLS_MPI_MAX_BITS )
                 goto usage;
         }
-#if defined(POLARSSL_ECP_C)
+#if defined(MBEDTLS_ECP_C)
         else if( strcmp( p, "ec_curve" ) == 0 )
         {
-            if( ( curve_info = ecp_curve_info_from_name( q ) ) == NULL )
+            if( ( curve_info = mbedtls_ecp_curve_info_from_name( q ) ) == NULL )
                 goto usage;
             opt.ec_curve = curve_info->grp_id;
         }
@@ -277,144 +277,144 @@
             goto usage;
     }
 
-    polarssl_printf( "\n  . Seeding the random number generator..." );
+    mbedtls_printf( "\n  . Seeding the random number generator..." );
     fflush( stdout );
 
-    entropy_init( &entropy );
-#if !defined(_WIN32) && defined(POLARSSL_FS_IO)
+    mbedtls_entropy_init( &entropy );
+#if !defined(_WIN32) && defined(MBEDTLS_FS_IO)
     if( opt.use_dev_random )
     {
-        if( ( ret = entropy_add_source( &entropy, dev_random_entropy_poll,
+        if( ( ret = mbedtls_entropy_add_source( &entropy, dev_random_entropy_poll,
                                         NULL, DEV_RANDOM_THRESHOLD ) ) != 0 )
         {
-            polarssl_printf( " failed\n  ! entropy_add_source returned -0x%04x\n", -ret );
+            mbedtls_printf( " failed\n  ! mbedtls_entropy_add_source returned -0x%04x\n", -ret );
             goto exit;
         }
 
-        polarssl_printf("\n    Using /dev/random, so can take a long time! " );
+        mbedtls_printf("\n    Using /dev/random, so can take a long time! " );
         fflush( stdout );
     }
-#endif /* !_WIN32 && POLARSSL_FS_IO */
+#endif /* !_WIN32 && MBEDTLS_FS_IO */
 
-    if( ( ret = ctr_drbg_init( &ctr_drbg, entropy_func, &entropy,
+    if( ( ret = mbedtls_ctr_drbg_init( &ctr_drbg, mbedtls_entropy_func, &entropy,
                                (const unsigned char *) pers,
                                strlen( pers ) ) ) != 0 )
     {
-        polarssl_printf( " failed\n  ! ctr_drbg_init returned -0x%04x\n", -ret );
+        mbedtls_printf( " failed\n  ! mbedtls_ctr_drbg_init returned -0x%04x\n", -ret );
         goto exit;
     }
 
     /*
      * 1.1. Generate the key
      */
-    polarssl_printf( "\n  . Generating the private key ..." );
+    mbedtls_printf( "\n  . Generating the private key ..." );
     fflush( stdout );
 
-    if( ( ret = pk_init_ctx( &key, pk_info_from_type( opt.type ) ) ) != 0 )
+    if( ( ret = mbedtls_pk_init_ctx( &key, mbedtls_pk_info_from_type( opt.type ) ) ) != 0 )
     {
-        polarssl_printf( " failed\n  !  pk_init_ctx returned -0x%04x", -ret );
+        mbedtls_printf( " failed\n  !  mbedtls_pk_init_ctx returned -0x%04x", -ret );
         goto exit;
     }
 
-#if defined(POLARSSL_RSA_C) && defined(POLARSSL_GENPRIME)
-    if( opt.type == POLARSSL_PK_RSA )
+#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_GENPRIME)
+    if( opt.type == MBEDTLS_PK_RSA )
     {
-        ret = rsa_gen_key( pk_rsa( key ), ctr_drbg_random, &ctr_drbg,
+        ret = mbedtls_rsa_gen_key( mbedtls_pk_rsa( key ), mbedtls_ctr_drbg_random, &ctr_drbg,
                            opt.rsa_keysize, 65537 );
         if( ret != 0 )
         {
-            polarssl_printf( " failed\n  !  rsa_gen_key returned -0x%04x", -ret );
+            mbedtls_printf( " failed\n  !  mbedtls_rsa_gen_key returned -0x%04x", -ret );
             goto exit;
         }
     }
     else
-#endif /* POLARSSL_RSA_C */
-#if defined(POLARSSL_ECP_C)
-    if( opt.type == POLARSSL_PK_ECKEY )
+#endif /* MBEDTLS_RSA_C */
+#if defined(MBEDTLS_ECP_C)
+    if( opt.type == MBEDTLS_PK_ECKEY )
     {
-        ret = ecp_gen_key( opt.ec_curve, pk_ec( key ),
-                          ctr_drbg_random, &ctr_drbg );
+        ret = mbedtls_ecp_gen_key( opt.ec_curve, mbedtls_pk_ec( key ),
+                          mbedtls_ctr_drbg_random, &ctr_drbg );
         if( ret != 0 )
         {
-            polarssl_printf( " failed\n  !  rsa_gen_key returned -0x%04x", -ret );
+            mbedtls_printf( " failed\n  !  mbedtls_rsa_gen_key returned -0x%04x", -ret );
             goto exit;
         }
     }
     else
-#endif /* POLARSSL_ECP_C */
+#endif /* MBEDTLS_ECP_C */
     {
-        polarssl_printf( " failed\n  !  key type not supported\n" );
+        mbedtls_printf( " failed\n  !  key type not supported\n" );
         goto exit;
     }
 
     /*
      * 1.2 Print the key
      */
-    polarssl_printf( " ok\n  . Key information:\n" );
+    mbedtls_printf( " ok\n  . Key information:\n" );
 
-#if defined(POLARSSL_RSA_C)
-    if( pk_get_type( &key ) == POLARSSL_PK_RSA )
+#if defined(MBEDTLS_RSA_C)
+    if( mbedtls_pk_get_type( &key ) == MBEDTLS_PK_RSA )
     {
-        rsa_context *rsa = pk_rsa( key );
-        mpi_write_file( "N:  ",  &rsa->N,  16, NULL );
-        mpi_write_file( "E:  ",  &rsa->E,  16, NULL );
-        mpi_write_file( "D:  ",  &rsa->D,  16, NULL );
-        mpi_write_file( "P:  ",  &rsa->P,  16, NULL );
-        mpi_write_file( "Q:  ",  &rsa->Q,  16, NULL );
-        mpi_write_file( "DP: ",  &rsa->DP, 16, NULL );
-        mpi_write_file( "DQ:  ", &rsa->DQ, 16, NULL );
-        mpi_write_file( "QP:  ", &rsa->QP, 16, NULL );
+        mbedtls_rsa_context *rsa = mbedtls_pk_rsa( key );
+        mbedtls_mpi_write_file( "N:  ",  &rsa->N,  16, NULL );
+        mbedtls_mpi_write_file( "E:  ",  &rsa->E,  16, NULL );
+        mbedtls_mpi_write_file( "D:  ",  &rsa->D,  16, NULL );
+        mbedtls_mpi_write_file( "P:  ",  &rsa->P,  16, NULL );
+        mbedtls_mpi_write_file( "Q:  ",  &rsa->Q,  16, NULL );
+        mbedtls_mpi_write_file( "DP: ",  &rsa->DP, 16, NULL );
+        mbedtls_mpi_write_file( "DQ:  ", &rsa->DQ, 16, NULL );
+        mbedtls_mpi_write_file( "QP:  ", &rsa->QP, 16, NULL );
     }
     else
 #endif
-#if defined(POLARSSL_ECP_C)
-    if( pk_get_type( &key ) == POLARSSL_PK_ECKEY )
+#if defined(MBEDTLS_ECP_C)
+    if( mbedtls_pk_get_type( &key ) == MBEDTLS_PK_ECKEY )
     {
-        ecp_keypair *ecp = pk_ec( key );
-        polarssl_printf( "curve: %s\n",
-                ecp_curve_info_from_grp_id( ecp->grp.id )->name );
-        mpi_write_file( "X_Q:   ", &ecp->Q.X, 16, NULL );
-        mpi_write_file( "Y_Q:   ", &ecp->Q.Y, 16, NULL );
-        mpi_write_file( "D:     ", &ecp->d  , 16, NULL );
+        mbedtls_ecp_keypair *ecp = mbedtls_pk_ec( key );
+        mbedtls_printf( "curve: %s\n",
+                mbedtls_ecp_curve_info_from_grp_id( ecp->grp.id )->name );
+        mbedtls_mpi_write_file( "X_Q:   ", &ecp->Q.X, 16, NULL );
+        mbedtls_mpi_write_file( "Y_Q:   ", &ecp->Q.Y, 16, NULL );
+        mbedtls_mpi_write_file( "D:     ", &ecp->d  , 16, NULL );
     }
     else
 #endif
-        polarssl_printf("  ! key type not supported\n");
+        mbedtls_printf("  ! key type not supported\n");
 
     /*
      * 1.3 Export key
      */
-    polarssl_printf( "  . Writing key to file..." );
+    mbedtls_printf( "  . Writing key to file..." );
 
     if( ( ret = write_private_key( &key, opt.filename ) ) != 0 )
     {
-        polarssl_printf( " failed\n" );
+        mbedtls_printf( " failed\n" );
         goto exit;
     }
 
-    polarssl_printf( " ok\n" );
+    mbedtls_printf( " ok\n" );
 
 exit:
 
     if( ret != 0 && ret != 1)
     {
-#ifdef POLARSSL_ERROR_C
-        polarssl_strerror( ret, buf, sizeof( buf ) );
-        polarssl_printf( " - %s\n", buf );
+#ifdef MBEDTLS_ERROR_C
+        mbedtls_strerror( ret, buf, sizeof( buf ) );
+        mbedtls_printf( " - %s\n", buf );
 #else
-        polarssl_printf("\n");
+        mbedtls_printf("\n");
 #endif
     }
 
-    pk_free( &key );
-    ctr_drbg_free( &ctr_drbg );
-    entropy_free( &entropy );
+    mbedtls_pk_free( &key );
+    mbedtls_ctr_drbg_free( &ctr_drbg );
+    mbedtls_entropy_free( &entropy );
 
 #if defined(_WIN32)
-    polarssl_printf( "  + Press Enter to exit this program.\n" );
+    mbedtls_printf( "  + Press Enter to exit this program.\n" );
     fflush( stdout ); getchar();
 #endif
 
     return( ret );
 }
-#endif /* POLARSSL_PK_WRITE_C && POLARSSL_FS_IO */
+#endif /* MBEDTLS_PK_WRITE_C && MBEDTLS_FS_IO */
