diff --git a/programs/pkey/key_app.c b/programs/pkey/key_app.c
index bea996a..de5f513 100644
--- a/programs/pkey/key_app.c
+++ b/programs/pkey/key_app.c
@@ -37,6 +37,19 @@
 #include "polarssl/rsa.h"
 #include "polarssl/x509.h"
 
+#if !defined(POLARSSL_BIGNUM_C) ||                                  \
+    !defined(POLARSSL_PK_PARSE_C) || !defined(POLARSSL_FS_IO)
+int main( int argc, char *argv[] )
+{
+    ((void) argc);
+    ((void) argv);
+
+    printf("POLARSSL_BIGNUM_C and/or "
+           "POLARSSL_PK_PARSE_C and/or POLARSSL_FS_IO not defined.\n");
+    return( 0 );
+}
+#else
+
 #define MODE_NONE               0
 #define MODE_PRIVATE            1
 #define MODE_PUBLIC             2
@@ -67,22 +80,10 @@
     "    password_file=%%s    default: \"\"\n"          \
     "\n"
 
-#if !defined(POLARSSL_BIGNUM_C) || !defined(POLARSSL_RSA_C) ||         \
-    !defined(POLARSSL_X509_PARSE_C) || !defined(POLARSSL_FS_IO)
-int main( int argc, char *argv[] )
-{
-    ((void) argc);
-    ((void) argv);
-
-    printf("POLARSSL_BIGNUM_C and/or POLARSSL_RSA_C and/or "
-           "POLARSSL_X509_PARSE_C and/or POLARSSL_FS_IO not defined.\n");
-    return( 0 );
-}
-#else
 int main( int argc, char *argv[] )
 {
     int ret = 0;
-    rsa_context rsa;
+    pk_context pk;
     char buf[1024];
     int i;
     char *p, *q;
@@ -90,7 +91,7 @@
     /*
      * Set to sane values
      */
-    memset( &rsa, 0, sizeof( rsa_context ) );
+    pk_init( &pk );
     memset( buf, 0, 1024 );
 
     if( argc == 0 )
@@ -164,15 +165,12 @@
         printf( "\n  . Loading the private key ..." );
         fflush( stdout );
 
-        ret = x509parse_keyfile_rsa( &rsa, opt.filename, opt.password );
+        ret = pk_parse_keyfile( &pk, opt.filename, opt.password );
 
         if( ret != 0 )
         {
-#ifdef POLARSSL_ERROR_C
             polarssl_strerror( ret, buf, 1024 );
-#endif
-            printf( " failed\n  !  x509parse_key_rsa returned %d - %s\n\n", ret, buf );
-            rsa_free( &rsa );
+            printf( " failed\n  !  pk_parse_keyfile returned %d - %s\n\n", ret, buf );
             goto exit;
         }
 
@@ -181,15 +179,38 @@
         /*
          * 1.2 Print the key
          */
-        printf( "  . Key information    ...\n" );
-        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 );
+#if defined(POLARSSL_RSA_C)
+        if( pk_can_do( &pk, POLARSSL_PK_RSA ) )
+        {
+            rsa_context *rsa = pk_rsa( pk );
+            printf( "  . Key information    ...\n" );
+            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 );
+        }
+        else
+#endif
+#if defined(POLARSSL_ECP_C)
+        if( pk_can_do( &pk, POLARSSL_PK_ECKEY ) )
+        {
+            ecp_keypair *ecp = pk_ec( pk );
+            printf( "  . Key information    ...\n" );
+            mpi_write_file( "Q(X): ", &ecp->Q.X, 16, NULL );
+            mpi_write_file( "Q(Y): ", &ecp->Q.Y, 16, NULL );
+            mpi_write_file( "Q(Z): ", &ecp->Q.Z, 16, NULL );
+            mpi_write_file( "D   : ", &ecp->d  , 16, NULL );
+        }
+        else
+#endif
+        {
+            printf("Do not know how to print key information for this type\n" );
+            goto exit;
+        }
     }
     else if( opt.mode == MODE_PUBLIC )
     {
@@ -199,33 +220,49 @@
         printf( "\n  . Loading the public key ..." );
         fflush( stdout );
 
-        ret = x509parse_public_keyfile_rsa( &rsa, opt.filename );
+        ret = pk_parse_public_keyfile( &pk, opt.filename );
 
         if( ret != 0 )
         {
-#ifdef POLARSSL_ERROR_C
             polarssl_strerror( ret, buf, 1024 );
-#endif
-            printf( " failed\n  !  x509parse_public_key_rsa returned %d - %s\n\n", ret, buf );
-            rsa_free( &rsa );
+            printf( " failed\n  !  pk_parse_public_keyfile returned %d - %s\n\n", ret, buf );
             goto exit;
         }
 
         printf( " ok\n" );
 
-        /*
-         * 1.2 Print the key
-         */
-        printf( "  . Key information    ...\n" );
-        mpi_write_file( "N: ", &rsa.N, 16, NULL );
-        mpi_write_file( "E:  ", &rsa.E, 16, NULL );
+#if defined(POLARSSL_RSA_C)
+        if( pk_can_do( &pk, POLARSSL_PK_RSA ) )
+        {
+            rsa_context *rsa = pk_rsa( pk );
+            printf( "  . Key information    ...\n" );
+            mpi_write_file( "N:  ", &rsa->N, 16, NULL );
+            mpi_write_file( "E:  ", &rsa->E, 16, NULL );
+        }
+        else
+#endif
+#if defined(POLARSSL_ECP_C)
+        if( pk_can_do( &pk, POLARSSL_PK_ECKEY ) )
+        {
+            ecp_keypair *ecp = pk_ec( pk );
+            printf( "  . Key information    ...\n" );
+            mpi_write_file( "Q(X): ", &ecp->Q.X, 16, NULL );
+            mpi_write_file( "Q(Y): ", &ecp->Q.Y, 16, NULL );
+            mpi_write_file( "Q(Z): ", &ecp->Q.Z, 16, NULL );
+        }
+        else
+#endif
+        {
+            printf("Do not know how to print key information for this type\n" );
+            goto exit;
+        }
     }
     else
         goto usage;
 
 exit:
 
-    rsa_free( &rsa );
+    pk_free( &pk );
 
 #if defined(_WIN32)
     printf( "  + Press Enter to exit this program.\n" );
@@ -234,5 +271,4 @@
 
     return( ret );
 }
-#endif /* POLARSSL_BIGNUM_C && POLARSSL_RSA_C &&
-          POLARSSL_X509_PARSE_C && POLARSSL_FS_IO */
+#endif /* POLARSSL_BIGNUM_C && POLARSSL_PK_PARSE_C && POLARSSL_FS_IO */
