diff --git a/programs/.gitignore b/programs/.gitignore
index 72ccb5b..a4ff337 100644
--- a/programs/.gitignore
+++ b/programs/.gitignore
@@ -38,6 +38,7 @@
 pkey/rsa_sign_pss
 pkey/rsa_verify
 pkey/rsa_verify_pss
+psa/aead_cipher_psa
 psa/crypto_examples
 psa/hmac_md_psa
 psa/key_ladder_demo
diff --git a/programs/Makefile b/programs/Makefile
index 782cf90..62654a5 100644
--- a/programs/Makefile
+++ b/programs/Makefile
@@ -84,6 +84,7 @@
 	pkey/rsa_sign_pss \
 	pkey/rsa_verify \
 	pkey/rsa_verify_pss \
+	psa/aead_cipher_psa \
 	psa/crypto_examples \
 	psa/hmac_md_psa \
 	psa/key_ladder_demo \
@@ -262,6 +263,10 @@
 	echo "  CC    pkey/rsa_encrypt.c"
 	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/rsa_encrypt.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
 
+psa/aead_cipher_psa$(EXEXT): psa/aead_cipher_psa.c $(DEP)
+	echo "  CC    psa/aead_cipher_psa.c"
+	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) psa/aead_cipher_psa.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
+
 psa/crypto_examples$(EXEXT): psa/crypto_examples.c $(DEP)
 	echo "  CC    psa/crypto_examples.c"
 	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) psa/crypto_examples.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
diff --git a/programs/psa/CMakeLists.txt b/programs/psa/CMakeLists.txt
index 2773230..450ef36 100644
--- a/programs/psa/CMakeLists.txt
+++ b/programs/psa/CMakeLists.txt
@@ -1,4 +1,5 @@
 set(executables
+    aead_cipher_psa
     crypto_examples
     hmac_md_psa
     key_ladder_demo
diff --git a/programs/psa/aead_cipher_psa.c b/programs/psa/aead_cipher_psa.c
new file mode 100644
index 0000000..301701c
--- /dev/null
+++ b/programs/psa/aead_cipher_psa.c
@@ -0,0 +1,350 @@
+/*
+ *  Copyright The Mbed TLS Contributors
+ *  SPDX-License-Identifier: Apache-2.0
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License"); you may
+ *  not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/*
+ * This is a simple example of multi-part AEAD computation using both the old
+ * Cipher API and the new PSA API; its goal is to help migration to PSA Crypto.
+ *
+ * When in comes to multi-part HMAC operations, the `mbedtls_md_context`
+ * serves a triple purpose (1) hold the key, (2) store the algorithm, and (3)
+ * save progress information for the current operation. With PSA those roles
+ * are held by disinct objects: (1) a psa_key_id_t to hold the key, a (2)
+ * psa_algorithm_t to represent the algorithm, and (3) a psa_operation_t for
+ * multi-part progress.
+ *
+ * On the other hand, with PSA, the algorithms encodes the desired tag length;
+ * with Cipher the desired tag length needs to be tracked separately.
+ *
+ * This program illustrates this by doing the same sequence of multi-part AEAD
+ * computation with both APIs; looking at the two series of functions
+ * cipher_xxx() and aead_xxx() side by side should make the differences and
+ * similarities clear.
+ */
+
+#include <stdio.h>
+
+#include "mbedtls/build_info.h"
+
+#if !defined(MBEDTLS_PSA_CRYPTO_C) || !defined(MBEDTLS_CIPHER_C) || \
+    !defined(MBEDTLS_AES_C) || !defined(MBEDTLS_GCM_C) || \
+    !defined(MBEDTLS_CHACHAPOLY_C)
+int main( void )
+{
+    printf( "MBEDTLS_PSA_CRYPTO_C and/or MBEDTLS_MD_C and/or "
+            "MBEDTLS_AES_C and/or MBEDTLS_GCM_C and/or "
+            "MBEDTLS_CHACHAPOLY_C not defined.\r\n" );
+    return( 0 );
+}
+#else
+
+#include <string.h>
+
+#include "mbedtls/cipher.h"
+#include "psa/crypto.h"
+
+/*
+ * Common data and helper functions
+ */
+const char usage[] = "Usage: aead_cipher_psa [gcm128|gcm256|gcm128_8|chachapoly]";
+
+const unsigned char iv1[12] = { 0x00 };
+const unsigned char ad1[] = { 0x01, 0x02 };
+const unsigned char pa1[] = { 0x03, 0x04 };
+const unsigned char pb1[] = { 0x05, 0x06, 0x07 };
+
+const unsigned char iv2[12] = { 0x10 };
+const unsigned char ad2[] = { 0x11, 0x12 };
+const unsigned char pa2[] = { 0x13, 0x14 };
+const unsigned char pb2[] = { 0x15, 0x16, 0x17 };
+
+const unsigned char key_bytes[32] = { 0x2a };
+
+void print_out( const char *title, unsigned char *out, size_t len )
+{
+    printf( "%s:", title );
+    for( size_t i = 0; i < len; i++ )
+        printf( " %02x", out[i] );
+    printf( "\n" );
+}
+
+/*
+ * Functions using the Cipher API
+ */
+#define CHK( code )         \
+    do {                    \
+        ret = code;         \
+        if( ret != 0 ) {    \
+            printf( "%s:%03d: ret = -0x%04x\n", __func__, __LINE__, -ret ); \
+            goto exit;      \
+        }                   \
+    } while( 0 )
+
+
+static int cipher_prepare( const char *info,
+                           mbedtls_cipher_context_t *ctx,
+                           size_t *tag_len )
+{
+    int ret;
+
+    mbedtls_cipher_type_t type;
+    if( strcmp( info, "gcm128" ) == 0 ) {
+        type = MBEDTLS_CIPHER_AES_128_GCM;
+        *tag_len = 16;
+    } else if( strcmp( info, "gcm256" ) == 0 ) {
+        type = MBEDTLS_CIPHER_AES_256_GCM;
+        *tag_len = 16;
+    } else if( strcmp( info, "gcm128_8" ) == 0 ) {
+        type = MBEDTLS_CIPHER_AES_128_GCM;
+        *tag_len = 8;
+    } else if( strcmp( info, "chachapoly" ) == 0 ) {
+        type = MBEDTLS_CIPHER_CHACHA20_POLY1305;
+        *tag_len = 16;
+    } else {
+        puts( usage );
+        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
+    }
+
+    CHK( mbedtls_cipher_setup( ctx,
+                               mbedtls_cipher_info_from_type( type ) ) );
+
+    size_t key_len = mbedtls_cipher_get_key_bitlen( ctx );
+    CHK( mbedtls_cipher_setkey( ctx, key_bytes, key_len, MBEDTLS_ENCRYPT ) );
+
+exit:
+    return( ret );
+}
+
+static void cipher_info( const mbedtls_cipher_context_t *ctx, size_t tag_len )
+{
+    // no convenient way to get the cipher type (for example, AES)
+    const char *ciph = "???";
+    int key_bits = mbedtls_cipher_get_key_bitlen( ctx );
+    mbedtls_cipher_mode_t mode = mbedtls_cipher_get_cipher_mode( ctx );
+
+    const char *mode_str = mode == MBEDTLS_MODE_GCM ? "GCM"
+                         : mode == MBEDTLS_MODE_CHACHAPOLY ? "ChachaPoly"
+                         : "???";
+
+    printf( "cipher: %s, %d, %s, %zu\n", ciph, key_bits, mode_str, tag_len );
+}
+
+static int cipher_encrypt( mbedtls_cipher_context_t *ctx, size_t tag_len,
+        const unsigned char *iv, size_t iv_len,
+        const unsigned char *ad, size_t ad_len,
+        const unsigned char *pa, size_t pa_len,
+        const unsigned char *pb, size_t pb_len )
+{
+    int ret;
+    size_t olen;
+    unsigned char out[32];
+    unsigned char *p = out;
+
+    CHK( mbedtls_cipher_set_iv( ctx, iv, iv_len ) );
+    CHK( mbedtls_cipher_reset( ctx ) );
+    CHK( mbedtls_cipher_update_ad( ctx, ad, ad_len ) );
+    CHK( mbedtls_cipher_update( ctx, pa, pa_len, p, &olen ) );
+    p += olen;
+    CHK( mbedtls_cipher_update( ctx, pb, pb_len, p, &olen ) );
+    p += olen;
+    CHK( mbedtls_cipher_finish( ctx, p, &olen ) );
+    p += olen;
+    CHK( mbedtls_cipher_write_tag( ctx, p, tag_len ) );
+    p += tag_len;
+
+    olen = p - out;
+    print_out( "cipher", out, olen );
+
+exit:
+    return( ret );
+}
+
+static int cipher( const char *info )
+{
+    int ret = 0;
+
+    mbedtls_cipher_context_t ctx;
+    size_t tag_len;
+
+    mbedtls_cipher_init( &ctx );
+
+    CHK( cipher_prepare( info, &ctx, &tag_len ) );
+
+    cipher_info( &ctx, tag_len );
+
+    CHK( cipher_encrypt( &ctx, tag_len,
+                         iv1, sizeof( iv1 ), ad1, sizeof( ad1 ),
+                         pa1, sizeof( pa1 ), pb1, sizeof( pb1 ) ) );
+    CHK( cipher_encrypt( &ctx, tag_len,
+                         iv2, sizeof( iv2 ), ad2, sizeof( ad2 ),
+                         pa2, sizeof( pa2 ), pb2, sizeof( pb2 ) ) );
+
+exit:
+    mbedtls_cipher_free( &ctx );
+
+    return( ret );
+}
+
+#undef CHK
+
+/*
+ * Functions using the PSA Crypto API
+ */
+
+#define CHK( code )     \
+    do {                \
+        status = code;     \
+        if( status != PSA_SUCCESS ) { \
+            printf( "%s:%03d: status = %d\n", __func__, __LINE__, status ); \
+            goto exit;  \
+        } \
+    } while( 0 )
+
+static psa_status_t aead_prepare( const char *info,
+                                  psa_key_id_t *key,
+                                  psa_algorithm_t *alg )
+{
+    psa_status_t status;
+
+    size_t key_bits;
+    psa_key_type_t key_type;
+    if( strcmp( info, "gcm128" ) == 0 ) {
+        *alg = PSA_ALG_GCM;
+        key_bits = 128;
+        key_type = PSA_KEY_TYPE_AES;
+    } else if( strcmp( info, "gcm256" ) == 0 ) {
+        *alg = PSA_ALG_GCM;
+        key_bits = 256;
+        key_type = PSA_KEY_TYPE_AES;
+    } else if( strcmp( info, "gcm128_8" ) == 0 ) {
+        *alg = PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_GCM, 8);
+        key_bits = 128;
+        key_type = PSA_KEY_TYPE_AES;
+    } else if( strcmp( info, "chachapoly" ) == 0 ) {
+        *alg = PSA_ALG_CHACHA20_POLY1305;
+        key_bits = 256;
+        key_type = PSA_KEY_TYPE_CHACHA20;
+    } else {
+        puts( usage );
+        return( PSA_ERROR_INVALID_ARGUMENT );
+    }
+
+    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
+    psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
+    psa_set_key_algorithm( &attributes, *alg );
+    psa_set_key_type( &attributes, key_type );
+    psa_set_key_bits( &attributes, key_bits );
+
+    CHK( psa_import_key( &attributes, key_bytes, key_bits / 8, key ) );
+
+exit:
+    return( status );
+}
+
+static void aead_info( psa_key_id_t key, psa_algorithm_t alg )
+{
+    psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
+    (void) psa_get_key_attributes( key, &attr );
+    psa_key_type_t key_type = psa_get_key_type( &attr );
+    size_t key_bits = psa_get_key_bits( &attr );
+    psa_algorithm_t base_alg = PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG( alg );
+    size_t tag_len = PSA_AEAD_TAG_LENGTH( key_type, key_bits, alg );
+
+    const char *type_str = key_type == PSA_KEY_TYPE_AES ? "AES"
+                         : key_type == PSA_KEY_TYPE_CHACHA20 ? "Chacha"
+                         : "???";
+    const char *base_str = base_alg == PSA_ALG_GCM ? "GCM"
+                         : base_alg == PSA_ALG_CHACHA20_POLY1305 ? "ChachaPoly"
+                         : "???";
+
+    printf( "aead  : %s, %zu, %s, %zu\n", type_str, key_bits, base_str, tag_len );
+}
+
+static int aead_encrypt( psa_key_id_t key, psa_algorithm_t alg,
+        const unsigned char *iv, size_t iv_len,
+        const unsigned char *ad, size_t ad_len,
+        const unsigned char *pa, size_t pa_len,
+        const unsigned char *pb, size_t pb_len )
+{
+    psa_status_t status;
+    size_t olen, olen_tag;
+    unsigned char out[32];
+    unsigned char *p = out, *end = out + sizeof( out );
+    unsigned char tag[16];
+
+    psa_aead_operation_t op = PSA_AEAD_OPERATION_INIT;
+    CHK( psa_aead_encrypt_setup( &op, key, alg ) );
+
+    CHK( psa_aead_set_nonce( &op, iv, iv_len ) );
+    CHK( psa_aead_update_ad( &op, ad, ad_len ) );
+    CHK( psa_aead_update( &op, pa, pa_len, p, end - p, &olen ) );
+    p += olen;
+    CHK( psa_aead_update( &op, pb, pb_len, p, end - p, &olen ) );
+    p += olen;
+    CHK( psa_aead_finish( &op, p, end - p, &olen,
+                               tag, sizeof( tag ), &olen_tag ) );
+    p += olen;
+    memcpy( p, tag, olen_tag );
+    p += olen_tag;
+
+    olen = p - out;
+    print_out( "aead  ", out, olen );
+exit:
+    return( status );
+}
+
+static psa_status_t aead( const char *info )
+{
+    psa_status_t status;
+
+    psa_key_id_t key;
+    psa_algorithm_t alg;
+
+    CHK( aead_prepare( info, &key, &alg ) );
+
+    aead_info( key, alg );
+
+    CHK( aead_encrypt( key, alg,
+                       iv1, sizeof( iv1 ), ad1, sizeof( ad1 ),
+                       pa1, sizeof( pa1 ), pb1, sizeof( pb1 ) ) );
+    CHK( aead_encrypt( key, alg,
+                       iv2, sizeof( iv2 ), ad2, sizeof( ad2 ),
+                       pa2, sizeof( pa2 ), pb2, sizeof( pb2 ) ) );
+
+exit:
+    return( status );
+}
+
+#undef CHK
+
+/*
+ * Main function
+ */
+int main( int argc, char **argv )
+{
+    if( argc != 2 )
+    {
+        puts( usage );
+        return( 1 );
+    }
+
+    psa_crypto_init();
+
+    cipher( argv[1] );
+    aead( argv[1] );
+}
+
+#endif
