diff --git a/tests/suites/helpers.function b/tests/suites/helpers.function
index 66af8af..881a0ac 100644
--- a/tests/suites/helpers.function
+++ b/tests/suites/helpers.function
@@ -9,6 +9,10 @@
 #include <inttypes.h>
 #endif
 
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
 /*
  * 32-bit integer manipulation macros (big endian)
  */
diff --git a/tests/suites/main_test.function b/tests/suites/main_test.function
new file mode 100644
index 0000000..ca2e252
--- /dev/null
+++ b/tests/suites/main_test.function
@@ -0,0 +1,283 @@
+#include <stdio.h>
+#include <string.h>
+
+static int test_errors = 0;
+
+static int test_assert( int correct, char *test )
+{
+    if( correct )
+        return( 0 );
+
+    test_errors++;
+//    if( test_errors == 1 )
+        printf( "FAILED\n  %s\n\n", test );
+
+    return( 1 );
+}
+
+#define TEST_ASSERT( TEST ) (test_assert((TEST) ? 1 : 0, #TEST))
+
+int verify_string( char **str )
+{
+    if( (*str)[0] != '"' ||
+        (*str)[strlen( *str ) - 1] != '"' )
+    {
+        printf( "Expected string (with \"\") for parameter and got: %s\n", *str );
+        return( -1 );
+    }
+
+    (*str)++;
+    (*str)[strlen( *str ) - 1] = '\0';
+
+    return( 0 );
+}
+
+int verify_int( char *str, int *value )
+{
+    size_t i;
+    int minus = 0;
+    int digits = 1;
+    int hex = 0;
+
+    for( i = 0; i < strlen( str ); i++ )
+    {
+        if( i == 0 && str[i] == '-' )
+        {
+            minus = 1;
+            continue;
+        }
+
+        if( ( ( minus && i == 2 ) || ( !minus && i == 1 ) ) &&
+            str[i - 1] == '0' && str[i] == 'x' )
+        {
+            hex = 1;
+            continue;
+        }
+
+        if( str[i] < '0' || str[i] > '9' )
+        {
+            digits = 0;
+            break;
+        }
+    }
+
+    if( digits )
+    {
+        if( hex )
+            *value = strtol( str, NULL, 16 );
+        else
+            *value = strtol( str, NULL, 10 );
+
+        return( 0 );
+    }
+
+MAPPING_CODE
+
+    printf( "Expected integer for parameter and got: %s\n", str );
+    return( -1 );
+}
+
+int dep_check( char *str )
+{
+    if( str == NULL )
+        return( 1 );
+
+DEP_CHECK_CODE
+
+    return( 1 );
+}
+
+FUNCTION_CODE
+int dispatch_test(int cnt, char *params[50])
+{
+    int ret;
+
+DISPATCH_FUNCTION
+    {
+        fprintf( stdout, "FAILED\nSkipping unknown test function '%s'\n", params[0] );
+        fflush( stdout );
+        return( 1 );
+    }
+
+    return( ret );
+}
+
+int get_line( FILE *f, char *buf, size_t len )
+{
+    char *ret;
+
+    ret = fgets( buf, len, f );
+    if( ret == NULL )
+        return( -1 );
+
+    if( strlen( buf ) && buf[strlen(buf) - 1] == '\n' )
+        buf[strlen(buf) - 1] = '\0';
+    if( strlen( buf ) && buf[strlen(buf) - 1] == '\r' )
+        buf[strlen(buf) - 1] = '\0';
+
+    return( 0 );
+}
+
+int parse_arguments( char *buf, size_t len, char *params[50] )
+{
+    int cnt = 0, i;
+    char *cur = buf;
+    char *p = buf, *q;
+
+    params[cnt++] = cur;
+
+    while( *p != '\0' && p < buf + len )
+    {
+        if( *p == '\\' )
+        {
+           *p++;
+           *p++;
+            continue;
+        }
+        if( *p == ':' )
+        {
+            if( p + 1 < buf + len )
+            {
+                cur = p + 1;
+                params[cnt++] = cur;
+            }
+            *p = '\0';
+        }
+
+        *p++;
+    }
+
+    // Replace newlines, question marks and colons in strings
+    for( i = 0; i < cnt; i++ )
+    {
+        p = params[i];
+        q = params[i];
+
+        while( *p != '\0' )
+        {
+            if( *p == '\\' && *(p + 1) == 'n' )
+            {
+                p += 2;
+                *(q++) = '\n';
+            }
+            else if( *p == '\\' && *(p + 1) == ':' )
+            {
+                p += 2;
+                *(q++) = ':';
+            }
+            else if( *p == '\\' && *(p + 1) == '?' )
+            {
+                p += 2;
+                *(q++) = '?';
+            }
+            else
+                *(q++) = *(p++);
+        }
+        *q = '\0';
+    }
+
+    return( cnt );
+}
+
+int main()
+{
+    int ret, i, cnt, total_errors = 0, total_tests = 0, total_skipped = 0;
+    const char *filename = "TEST_FILENAME";
+    FILE *file;
+    char buf[5000];
+    char *params[50];
+
+#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C)
+    unsigned char buf[1000000];
+    memory_buffer_alloc_init( buf, sizeof(buf) );
+#endif
+
+    file = fopen( filename, "r" );
+    if( file == NULL )
+    {
+        fprintf( stderr, "Failed to open\n" );
+        return( 1 );
+    }
+
+    while( !feof( file ) )
+    {
+        int skip = 0;
+
+        if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
+            break;
+        fprintf( stdout, "%.66s", buf );
+        fprintf( stdout, " " );
+        for( i = strlen( buf ) + 1; i < 67; i++ )
+            fprintf( stdout, "." );
+        fprintf( stdout, " " );
+        fflush( stdout );
+
+        total_tests++;
+
+        if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
+            break;
+        cnt = parse_arguments( buf, strlen(buf), params );
+
+        if( strcmp( params[0], "depends_on" ) == 0 )
+        {
+            for( i = 1; i < cnt; i++ )
+                if( dep_check( params[i] ) != 0 )
+                    skip = 1;
+
+            if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
+                break;
+            cnt = parse_arguments( buf, strlen(buf), params );
+        }
+
+        if( skip == 0 )
+        {
+            test_errors = 0;
+            ret = dispatch_test( cnt, params );
+        }
+
+        if( skip == 1 || ret == 3 )
+        {
+            total_skipped++;
+            fprintf( stdout, "-------\n" );
+            fflush( stdout );
+        }
+        else if( ret == 0  && test_errors == 0 )
+        {
+            fprintf( stdout, "PASS\n" );
+            fflush( stdout );
+        }
+        else if( ret == 2 )
+        {
+            fprintf( stderr, "FAILED: FATAL PARSE ERROR\n" );
+            fclose(file);
+            exit( 2 );
+        }
+        else
+            total_errors++;
+
+        if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
+            break;
+        if( strlen(buf) != 0 )
+        {
+            fprintf( stderr, "Should be empty %d\n", strlen(buf) );
+            return( 1 );
+        }
+    }
+    fclose(file);
+
+    fprintf( stdout, "\n----------------------------------------------------------------------------\n\n");
+    if( total_errors == 0 )
+        fprintf( stdout, "PASSED" );
+    else
+        fprintf( stdout, "FAILED" );
+
+    fprintf( stdout, " (%d / %d tests (%d skipped))\n",
+             total_tests - total_errors, total_tests, total_skipped );
+
+#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && defined(POLARSSL_MEMORY_DEBUG)
+    memory_buffer_alloc_status();
+#endif
+
+    return( total_errors != 0 );
+}
+
