diff --git a/yotta/data/example-hashing/README.md b/yotta/data/example-hashing/README.md
new file mode 100644
index 0000000..703d5b4
--- /dev/null
+++ b/yotta/data/example-hashing/README.md
@@ -0,0 +1,69 @@
+# Hashing tutorial
+
+This application performs hashing of a buffer with SHA-256 using various APIs. It serves as a tutorial for the basic hashing APIs of mbed TLS.
+
+## Pre-requisites
+
+To build and run this example the requirements below are necessary:
+
+* A computer with the following software installed:
+  * [CMake](http://www.cmake.org/download/).
+  * [yotta](https://github.com/ARMmbed/yotta). Please note that **yotta has its own set of dependencies**, listed in the [installation instructions](http://armmbed.github.io/yotta/#installing-on-windows).
+  * [Python](https://www.python.org/downloads/).
+  * [ARM GCC toolchain](https://launchpad.net/gcc-arm-embedded).
+  * A serial terminal emulator (e.g. screen, pySerial, cu).
+* An [FRDM-K64F](http://developer.mbed.org/platforms/FRDM-K64F/) development board, or another board supported by mbed OS (in that case you'll have to substitute frdm-k64f-gcc with the appropriate target below).
+* A micro-USB cable.
+* If your OS is Windows, please follow the installation instructions [for the serial port driver](https://developer.mbed.org/handbook/Windows-serial-configuration).
+
+## Getting started
+
+1. Connect the FRDM-K64F to the computer with the micro-USB cable, being careful to use the micro-usb port labeled "OpenSDA".
+
+2. Navigate to the mbedtls directory supplied with your release and open a terminal.
+
+3. Set the yotta target:
+
+    ```
+    yotta target frdm-k64f-gcc
+    ```
+
+4. Check that there are no missing dependencies:
+
+    ```
+    $ yt ls
+    ```
+
+    If there are, yotta will list them in the terminal. Please install them before proceeding.
+
+5. Build mbedtls and the examples. This will take a long time if it is the first time:
+
+    ```
+    $ yt build
+    ```
+
+6. Copy `build/frdm-k64f-gcc/test/mbedtls-test-example-hashing.bin` to your mbed board and wait until the LED next to the USB port stops blinking.
+
+7. Start the serial terminal emulator and connect to the virtual serial port presented by FRDM-K64F. For settings, use 9600 baud, 8N1, no flow control.
+
+8. Press the reset button on the board.
+
+9. The output in the terminal window should look like:
+
+    ```
+    {{timeout;10}}
+    {{host_test_name;default}}
+    {{description;mbed TLS example on hashing}}
+    {{test_id;MBEDTLS_EX_HASHING}}
+    {{start}}
+
+
+    Method 1: 315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3
+    Method 2: 315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3
+    Method 3: 315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3
+    Method 4: 315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3
+
+    DONE
+    {{success}}
+    {{end}}
+    ```
diff --git a/yotta/data/example-hashing/main.cpp b/yotta/data/example-hashing/main.cpp
new file mode 100644
index 0000000..8eb3c1b
--- /dev/null
+++ b/yotta/data/example-hashing/main.cpp
@@ -0,0 +1,157 @@
+/*
+ *  Hello world example of using the hashing functions of mbed TLS
+ *
+ *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
+ *
+ *  This file is part of mbed TLS (https://tls.mbed.org)
+ */
+
+/*
+ * This program illustrates various ways of hashing a buffer.
+ * You normally need only one of these two includes.
+ */
+#include "mbedtls/sha256.h" /* SHA-256 only */
+#include "mbedtls/md.h"     /* generic interface */
+
+#if defined(TARGET_LIKE_MBED)
+#include "mbed/mbed.h"
+#endif
+#include <cstdio>
+
+static void print_hex(const char *title, const unsigned char buf[], size_t len)
+{
+    printf("%s: ", title);
+
+    for (size_t i = 0; i < len; i++)
+        printf("%02x", buf[i]);
+
+    printf("\r\n");
+}
+
+static const char hello_str[] = "Hello, world!";
+static const unsigned char *hello_buffer = (const unsigned char *) hello_str;
+static const size_t hello_len = sizeof hello_str - 1;
+
+int example(void)
+{
+    printf( "\r\n\r\n" );
+
+    /*
+     * Method 1: use all-in-one function of a specific SHA-xxx module
+     */
+    unsigned char output1[32]; /* SHA-256 outputs 32 bytes */
+
+    /* 0 here means use the full SHA-256, not the SHA-224 variant */
+    mbedtls_sha256(hello_buffer, hello_len, output1, 0);
+
+    print_hex("Method 1", output1, sizeof output1);
+
+
+    /*
+     * Method 2: use the streaming interface of a specific SHA-xxx module
+     * This is useful if we get our input piecewise.
+     */
+    unsigned char output2[32];
+    mbedtls_sha256_context ctx2;
+
+    mbedtls_sha256_init(&ctx2);
+    mbedtls_sha256_starts(&ctx2, 0); /* SHA-256, not 224 */
+
+    /* Simulating multiple fragments */
+    mbedtls_sha256_update(&ctx2, hello_buffer, 1);
+    mbedtls_sha256_update(&ctx2, hello_buffer + 1, 1);
+    mbedtls_sha256_update(&ctx2, hello_buffer + 2, hello_len - 2);
+
+    mbedtls_sha256_finish(&ctx2, output2);
+    print_hex("Method 2", output2, sizeof output2);
+
+    /* Or you could re-use the context by doing mbedtls_sha256_starts() again */
+    mbedtls_sha256_free(&ctx2);
+
+    /*
+     * Method 3: use all-in-one function of the generice interface
+     */
+    unsigned char output3[MBEDTLS_MD_MAX_SIZE]; /* Enough for any hash */
+
+    /* Can easily pick any hash you want, by identifier */
+    const mbedtls_md_info_t *md_info3 = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
+
+    if (md_info3 == NULL)
+    {
+        printf("SHA256 not available\r\n");
+        return 1;
+    }
+
+    int ret3 = mbedtls_md(md_info3, hello_buffer, hello_len, output3);
+
+    if (ret3 != 0)
+    {
+        printf("md() returned -0x%04X\r\n", -ret3);
+        return 1;
+    }
+
+    print_hex("Method 3", output3, mbedtls_md_get_size(md_info3));
+
+
+    /*
+     * Method 4: streaming & generic interface
+     */
+    unsigned char output4[MBEDTLS_MD_MAX_SIZE]; /* Enough for any hash */
+
+    const mbedtls_md_info_t *md_info4 = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
+
+    if (md_info4 == NULL)
+    {
+        printf("SHA256 not available\r\n");
+        return 1;
+    }
+
+    mbedtls_md_context_t ctx4;
+
+    mbedtls_md_init(&ctx4);
+
+    int ret4 = mbedtls_md_init_ctx(&ctx4, md_info4);
+    if (ret4 != 0)
+    {
+        printf("md_init_ctx() returned -0x%04X\r\n", -ret4);
+        return 1;
+    }
+
+    mbedtls_md_starts(&ctx4);
+
+    /* Simulating multiple fragments */
+    mbedtls_md_update(&ctx4, hello_buffer, 1);
+    mbedtls_md_update(&ctx4, hello_buffer + 1, 1);
+    mbedtls_md_update(&ctx4, hello_buffer + 2, hello_len - 2);
+
+    mbedtls_md_finish(&ctx4, output4);
+    print_hex("Method 4", output4, mbedtls_md_get_size(md_info4));
+
+    /* Or you could re-use the context by doing mbedtls_md_starts() again */
+    mbedtls_md_free(&ctx4);
+
+
+    printf("\r\nDONE\r\n");
+
+    return 0;
+}
+
+#if defined(TARGET_LIKE_MBED)
+
+#include "mbed/test_env.h"
+
+int main() {
+    MBED_HOSTTEST_TIMEOUT(10);
+    MBED_HOSTTEST_SELECT(default);
+    MBED_HOSTTEST_DESCRIPTION(mbed TLS example on hashing);
+    MBED_HOSTTEST_START("MBEDTLS_EX_HASHING");
+    MBED_HOSTTEST_RESULT(example() == 0);
+}
+
+#else
+
+int main() {
+    return example();
+}
+
+#endif
