diff --git a/apps/coremark/include/coremark.h b/apps/coremark/include/coremark.h
deleted file mode 100644
index 075f791..0000000
--- a/apps/coremark/include/coremark.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
-Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC)
-
-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.
-
-Original Author: Shay Gal-on
-*/
-
-/* Topic: Description
-   This file contains  declarations of the various benchmark functions.
-*/
-
-/* Configuration: TOTAL_DATA_SIZE
-   Define total size for data algorithms will operate on
-*/
-#ifndef TOTAL_DATA_SIZE
-#define TOTAL_DATA_SIZE 2*1000
-#endif
-
-#define SEED_ARG 0
-#define SEED_FUNC 1
-#define SEED_VOLATILE 2
-
-#define MEM_STATIC 0
-#define MEM_MALLOC 1
-#define MEM_STACK 2
-
-#include "core_portme.h"
-
-#if HAS_STDIO
-#include <stdio.h>
-#endif
-#if HAS_PRINTF
-#define ee_printf printf
-#endif
-
-/* Actual benchmark execution in iterate */
-void *iterate(void *pres);
-
-/* Typedef: secs_ret
-   For machines that have floating point support, get number of seconds as a double. 
-   Otherwise an unsigned int.
-*/
-#if HAS_FLOAT
-typedef double secs_ret;
-#else
-typedef ee_u32 secs_ret;
-#endif
-
-#if MAIN_HAS_NORETURN
-#define MAIN_RETURN_VAL
-#define MAIN_RETURN_TYPE void
-#else
-#define MAIN_RETURN_VAL 0
-#define MAIN_RETURN_TYPE int
-#endif
-
-void start_time(void);
-void stop_time(void);
-CORE_TICKS get_time(void);
-secs_ret time_in_secs(CORE_TICKS ticks);
-
-/* Misc useful functions */
-ee_u16 crcu8(ee_u8 data, ee_u16 crc);
-ee_u16 crc16(ee_s16 newval, ee_u16 crc);
-ee_u16 crcu16(ee_u16 newval, ee_u16 crc);
-ee_u16 crcu32(ee_u32 newval, ee_u16 crc);
-ee_u8 check_data_types();
-void *portable_malloc(ee_size_t size);
-void portable_free(void *p);
-ee_s32 parseval(char *valstring);
-
-/* Algorithm IDS */
-#define ID_LIST      (1<<0)
-#define ID_MATRIX    (1<<1)
-#define ID_STATE     (1<<2)
-#define ALL_ALGORITHMS_MASK (ID_LIST|ID_MATRIX|ID_STATE)
-#define NUM_ALGORITHMS 3
-
-/* list data structures */
-typedef struct list_data_s {
-    ee_s16 data16;
-    ee_s16 idx;
-} list_data;
-
-typedef struct list_head_s {
-    struct list_head_s *next;
-    struct list_data_s *info;
-} list_head;
-
-
-/*matrix benchmark related stuff */
-#define MATDAT_INT 1
-#if MATDAT_INT
-typedef ee_s16 MATDAT;
-typedef ee_s32 MATRES;
-#else
-typedef ee_f16 MATDAT;
-typedef ee_f32 MATRES;
-#endif
-
-typedef struct MAT_PARAMS_S {
-    int N;
-    MATDAT *A;
-    MATDAT *B;
-    MATRES *C;
-} mat_params;
-
-/* state machine related stuff */
-/* List of all the possible states for the FSM */
-typedef enum CORE_STATE {
-    CORE_START=0,
-    CORE_INVALID,
-    CORE_S1,
-    CORE_S2,
-    CORE_INT,
-    CORE_FLOAT,
-    CORE_EXPONENT,
-    CORE_SCIENTIFIC,
-    NUM_CORE_STATES
-} core_state_e ;
-
-
-/* Helper structure to hold results */
-typedef struct RESULTS_S {
-    /* inputs */
-    ee_s16    seed1;        /* Initializing seed */
-    ee_s16    seed2;        /* Initializing seed */
-    ee_s16    seed3;        /* Initializing seed */
-    void    *memblock[4];   /* Pointer to safe memory location */
-    ee_u32    size;         /* Size of the data */
-    ee_u32 iterations;      /* Number of iterations to execute */
-    ee_u32    execs;        /* Bitmask of operations to execute */
-    struct list_head_s *list;
-    mat_params mat;
-    /* outputs */
-    ee_u16    crc;
-    ee_u16    crclist;
-    ee_u16    crcmatrix;
-    ee_u16    crcstate;
-    ee_s16    err;
-    /* ultithread specific */
-    core_portable port;
-} core_results;
-
-/* Multicore execution handling */
-#if (MULTITHREAD>1)
-ee_u8 core_start_parallel(core_results *res);
-ee_u8 core_stop_parallel(core_results *res);
-#endif
-
-/* list benchmark functions */
-list_head *core_list_init(ee_u32 blksize, list_head *memblock, ee_s16 seed);
-ee_u16 core_bench_list(core_results *res, ee_s16 finder_idx);
-
-/* state benchmark functions */
-void core_init_state(ee_u32 size, ee_s16 seed, ee_u8 *p);
-ee_u16 core_bench_state(ee_u32 blksize, ee_u8 *memblock,
-        ee_s16 seed1, ee_s16 seed2, ee_s16 step, ee_u16 crc);
-
-/* matrix benchmark functions */
-ee_u32 core_init_matrix(ee_u32 blksize, void *memblk, ee_s32 seed, mat_params *p);
-ee_u16 core_bench_matrix(mat_params *p, ee_s16 seed, ee_u16 crc);
-
diff --git a/apps/coremark/pkg.yml b/apps/coremark/pkg.yml
index 39bea07..f3ec0a8 100644
--- a/apps/coremark/pkg.yml
+++ b/apps/coremark/pkg.yml
@@ -30,3 +30,4 @@
     - "@apache-mynewt-core/sys/stats"
     - "@apache-mynewt-core/sys/log"
     - "@apache-mynewt-core/sys/console"
+    - "@apache-mynewt-core/util/coremark"
diff --git a/apps/coremark/src/core_list_join.c b/apps/coremark/src/core_list_join.c
deleted file mode 100644
index f3fa086..0000000
--- a/apps/coremark/src/core_list_join.c
+++ /dev/null
@@ -1,495 +0,0 @@
-/*
-Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC)
-
-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.
-
-Original Author: Shay Gal-on
-*/
-
-#include "coremark.h"
-/*
-Topic: Description
-    Benchmark using a linked list.
-
-    Linked list is a common data structure used in many applications.
-
-    For our purposes, this will excercise the memory units of the processor.
-    In particular, usage of the list pointers to find and alter data.
-
-    We are not using Malloc since some platforms do not support this library.
-
-    Instead, the memory block being passed in is used to create a list,
-    and the benchmark takes care not to add more items then can be
-    accomodated by the memory block. The porting layer will make sure
-    that we have a valid memory block.
-
-    All operations are done in place, without using any extra memory.
-
-    The list itself contains list pointers and pointers to data items.
-    Data items contain the following:
-
-    idx - An index that captures the initial order of the list.
-    data - Variable data initialized based on the input parameters. The 16b are divided as follows:
-    o Upper 8b are backup of original data.
-    o Bit 7 indicates if the lower 7 bits are to be used as is or calculated.
-    o Bits 0-2 indicate type of operation to perform to get a 7b value.
-    o Bits 3-6 provide input for the operation.
-
-*/
-
-/* local functions */
-
-list_head *core_list_find(list_head *list,list_data *info);
-list_head *core_list_reverse(list_head *list);
-list_head *core_list_remove(list_head *item);
-list_head *core_list_undo_remove(list_head *item_removed, list_head *item_modified);
-list_head *core_list_insert_new(list_head *insert_point
-    , list_data *info, list_head **memblock, list_data **datablock
-    , list_head *memblock_end, list_data *datablock_end);
-typedef ee_s32(*list_cmp)(list_data *a, list_data *b, core_results *res);
-list_head *core_list_mergesort(list_head *list, list_cmp cmp, core_results *res);
-
-ee_s16 calc_func(ee_s16 *pdata, core_results *res) {
-    ee_s16 data=*pdata;
-    ee_s16 retval;
-    ee_u8 optype=(data>>7) & 1; /* bit 7 indicates if the function result has been cached */
-    if (optype) /* if cached, use cache */
-        return (data & 0x007f);
-    else { /* otherwise calculate and cache the result */
-        ee_s16 flag=data & 0x7; /* bits 0-2 is type of function to perform */
-        ee_s16 dtype=((data>>3) & 0xf); /* bits 3-6 is specific data for the operation */
-        dtype |= dtype << 4; /* replicate the lower 4 bits to get an 8b value */
-        switch (flag) {
-            case 0:
-                if (dtype<0x22) /* set min period for bit corruption */
-                    dtype=0x22;
-                retval=core_bench_state(res->size,res->memblock[3],res->seed1,res->seed2,dtype,res->crc);
-                if (res->crcstate==0)
-                    res->crcstate=retval;
-                break;
-            case 1:
-                retval=core_bench_matrix(&(res->mat),dtype,res->crc);
-                if (res->crcmatrix==0)
-                    res->crcmatrix=retval;
-                break;
-            default:
-                retval=data;
-                break;
-        }
-        res->crc=crcu16(retval,res->crc);
-        retval &= 0x007f;
-        *pdata = (data & 0xff00) | 0x0080 | retval; /* cache the result */
-        return retval;
-    }
-}
-/* Function: cmp_complex
-    Compare the data item in a list cell.
-
-    Can be used by mergesort.
-*/
-ee_s32 cmp_complex(list_data *a, list_data *b, core_results *res) {
-    ee_s16 val1=calc_func(&(a->data16),res);
-    ee_s16 val2=calc_func(&(b->data16),res);
-    return val1 - val2;
-}
-
-/* Function: cmp_idx
-    Compare the idx item in a list cell, and regen the data.
-
-    Can be used by mergesort.
-*/
-ee_s32 cmp_idx(list_data *a, list_data *b, core_results *res) {
-    if (res==NULL) {
-        a->data16 = (a->data16 & 0xff00) | (0x00ff & (a->data16>>8));
-        b->data16 = (b->data16 & 0xff00) | (0x00ff & (b->data16>>8));
-    }
-    return a->idx - b->idx;
-}
-
-void copy_info(list_data *to,list_data *from) {
-    to->data16=from->data16;
-    to->idx=from->idx;
-}
-
-/* Benchmark for linked list:
-    - Try to find multiple data items.
-    - List sort
-    - Operate on data from list (crc)
-    - Single remove/reinsert
-    * At the end of this function, the list is back to original state
-*/
-ee_u16 core_bench_list(core_results *res, ee_s16 finder_idx) {
-    ee_u16 retval=0;
-    ee_u16 found=0,missed=0;
-    list_head *list=res->list;
-    ee_s16 find_num=res->seed3;
-    list_head *this_find;
-    list_head *finder, *remover;
-    list_data info;
-    ee_s16 i;
-
-    info.idx=finder_idx;
-    /* find <find_num> values in the list, and change the list each time (reverse and cache if value found) */
-    for (i=0; i<find_num; i++) {
-        info.data16= (i & 0xff) ;
-        this_find=core_list_find(list,&info);
-        list=core_list_reverse(list);
-        if (this_find==NULL) {
-            missed++;
-            retval+=(list->next->info->data16 >> 8) & 1;
-        }
-        else {
-            found++;
-            if (this_find->info->data16 & 0x1) /* use found value */
-                retval+=(this_find->info->data16 >> 9) & 1;
-            /* and cache next item at the head of the list (if any) */
-            if (this_find->next != NULL) {
-                finder = this_find->next;
-                this_find->next = finder->next;
-                finder->next=list->next;
-                list->next=finder;
-            }
-        }
-        if (info.idx>=0)
-            info.idx++;
-#if CORE_DEBUG
-    ee_printf("List find %d: [%d,%d,%d]\n",i,retval,missed,found);
-#endif
-    }
-    retval+=found*4-missed;
-    /* sort the list by data content and remove one item*/
-    if (finder_idx>0)
-        list=core_list_mergesort(list,cmp_complex,res);
-    remover=core_list_remove(list->next);
-    /* CRC data content of list from location of index N forward, and then undo remove */
-    finder=core_list_find(list,&info);
-    if (!finder)
-        finder=list->next;
-    while (finder) {
-        retval=crc16(list->info->data16,retval);
-        finder=finder->next;
-    }
-#if CORE_DEBUG
-    ee_printf("List sort 1: %04x\n",retval);
-#endif
-    remover=core_list_undo_remove(remover,list->next);
-    /* sort the list by index, in effect returning the list to original state */
-    list=core_list_mergesort(list,cmp_idx,NULL);
-    /* CRC data content of list */
-    finder=list->next;
-    while (finder) {
-        retval=crc16(list->info->data16,retval);
-        finder=finder->next;
-    }
-#if CORE_DEBUG
-    ee_printf("List sort 2: %04x\n",retval);
-#endif
-    return retval;
-}
-/* Function: core_list_init
-    Initialize list with data.
-
-    Parameters:
-    blksize - Size of memory to be initialized.
-    memblock - Pointer to memory block.
-    seed -     Actual values chosen depend on the seed parameter.
-        The seed parameter MUST be supplied from a source that cannot be determined at compile time
-
-    Returns:
-    Pointer to the head of the list.
-
-*/
-list_head *core_list_init(ee_u32 blksize, list_head *memblock, ee_s16 seed) {
-    /* calculated pointers for the list */
-    ee_u32 per_item=16+sizeof(struct list_data_s);
-    ee_u32 size=(blksize/per_item)-2; /* to accomodate systems with 64b pointers, and make sure same code is executed, set max list elements */
-    list_head *memblock_end=memblock+size;
-    list_data *datablock=(list_data *)(memblock_end);
-    list_data *datablock_end=datablock+size;
-    /* some useful variables */
-    ee_u32 i;
-    list_head *finder,*list=memblock;
-    list_data info;
-
-    /* create a fake items for the list head and tail */
-    list->next=NULL;
-    list->info=datablock;
-    list->info->idx=0x0000;
-    list->info->data16=(ee_s16)0x8080;
-    memblock++;
-    datablock++;
-    info.idx=0x7fff;
-    info.data16=(ee_s16)0xffff;
-    core_list_insert_new(list,&info,&memblock,&datablock,memblock_end,datablock_end);
-
-    /* then insert size items */
-    for (i=0; i<size; i++) {
-        ee_u16 datpat=((ee_u16)(seed^i) & 0xf);
-        ee_u16 dat=(datpat<<3) | (i&0x7); /* alternate between algorithms */
-        info.data16=(dat<<8) | dat;        /* fill the data with actual data and upper bits with rebuild value */
-        core_list_insert_new(list,&info,&memblock,&datablock,memblock_end,datablock_end);
-    }
-    /* and now index the list so we know initial seed order of the list */
-    finder=list->next;
-    i=1;
-    while (finder->next!=NULL) {
-        if (i<size/5) /* first 20% of the list in order */
-            finder->info->idx=i++;
-        else {
-            ee_u16 pat=(ee_u16)(i++ ^ seed); /* get a pseudo random number */
-            finder->info->idx=0x3fff & (((i & 0x07) << 8) | pat); /* make sure the mixed items end up after the ones in sequence */
-        }
-        finder=finder->next;
-    }
-    list = core_list_mergesort(list,cmp_idx,NULL);
-#if CORE_DEBUG
-    ee_printf("Initialized list:\n");
-    finder=list;
-    while (finder) {
-        ee_printf("[%04x,%04x]",finder->info->idx,(ee_u16)finder->info->data16);
-        finder=finder->next;
-    }
-    ee_printf("\n");
-#endif
-    return list;
-}
-
-/* Function: core_list_insert
-    Insert an item to the list
-
-    Parameters:
-    insert_point - where to insert the item.
-    info - data for the cell.
-    memblock - pointer for the list header
-    datablock - pointer for the list data
-    memblock_end - end of region for list headers
-    datablock_end - end of region for list data
-
-    Returns:
-    Pointer to new item.
-*/
-list_head *core_list_insert_new(list_head *insert_point, list_data *info, list_head **memblock, list_data **datablock
-    , list_head *memblock_end, list_data *datablock_end) {
-    list_head *newitem;
-
-    if ((*memblock+1) >= memblock_end)
-        return NULL;
-    if ((*datablock+1) >= datablock_end)
-        return NULL;
-
-    newitem=*memblock;
-    (*memblock)++;
-    newitem->next=insert_point->next;
-    insert_point->next=newitem;
-
-    newitem->info=*datablock;
-    (*datablock)++;
-    copy_info(newitem->info,info);
-
-    return newitem;
-}
-
-/* Function: core_list_remove
-    Remove an item from the list.
-
-    Operation:
-    For a singly linked list, remove by copying the data from the next item
-    over to the current cell, and unlinking the next item.
-
-    Note:
-    since there is always a fake item at the end of the list, no need to check for NULL.
-
-    Returns:
-    Removed item.
-*/
-list_head *core_list_remove(list_head *item) {
-    list_data *tmp;
-    list_head *ret=item->next;
-    /* swap data pointers */
-    tmp=item->info;
-    item->info=ret->info;
-    ret->info=tmp;
-    /* and eliminate item */
-    item->next=item->next->next;
-    ret->next=NULL;
-    return ret;
-}
-
-/* Function: core_list_undo_remove
-    Undo a remove operation.
-
-    Operation:
-    Since we want each iteration of the benchmark to be exactly the same,
-    we need to be able to undo a remove.
-    Link the removed item back into the list, and switch the info items.
-
-    Parameters:
-    item_removed - Return value from the <core_list_remove>
-    item_modified - List item that was modified during <core_list_remove>
-
-    Returns:
-    The item that was linked back to the list.
-
-*/
-list_head *core_list_undo_remove(list_head *item_removed, list_head *item_modified) {
-    list_data *tmp;
-    /* swap data pointers */
-    tmp=item_removed->info;
-    item_removed->info=item_modified->info;
-    item_modified->info=tmp;
-    /* and insert item */
-    item_removed->next=item_modified->next;
-    item_modified->next=item_removed;
-    return item_removed;
-}
-
-/* Function: core_list_find
-    Find an item in the list
-
-    Operation:
-    Find an item by idx (if not 0) or specific data value
-
-    Parameters:
-    list - list head
-    info - idx or data to find
-
-    Returns:
-    Found item, or NULL if not found.
-*/
-list_head *core_list_find(list_head *list,list_data *info) {
-    if (info->idx>=0) {
-        while (list && (list->info->idx != info->idx))
-            list=list->next;
-        return list;
-    } else {
-        while (list && ((list->info->data16 & 0xff) != info->data16))
-            list=list->next;
-        return list;
-    }
-}
-/* Function: core_list_reverse
-    Reverse a list
-
-    Operation:
-    Rearrange the pointers so the list is reversed.
-
-    Parameters:
-    list - list head
-    info - idx or data to find
-
-    Returns:
-    Found item, or NULL if not found.
-*/
-
-list_head *core_list_reverse(list_head *list) {
-    list_head *next=NULL, *tmp;
-    while (list) {
-        tmp=list->next;
-        list->next=next;
-        next=list;
-        list=tmp;
-    }
-    return next;
-}
-/* Function: core_list_mergesort
-    Sort the list in place without recursion.
-
-    Description:
-    Use mergesort, as for linked list this is a realistic solution.
-    Also, since this is aimed at embedded, care was taken to use iterative rather then recursive algorithm.
-    The sort can either return the list to original order (by idx) ,
-    or use the data item to invoke other other algorithms and change the order of the list.
-
-    Parameters:
-    list - list to be sorted.
-    cmp - cmp function to use
-
-    Returns:
-    New head of the list.
-
-    Note:
-    We have a special header for the list that will always be first,
-    but the algorithm could theoretically modify where the list starts.
-
- */
-list_head *core_list_mergesort(list_head *list, list_cmp cmp, core_results *res) {
-    list_head *p, *q, *e, *tail;
-    ee_s32 insize, nmerges, psize, qsize, i;
-
-    insize = 1;
-
-    while (1) {
-        p = list;
-        list = NULL;
-        tail = NULL;
-
-        nmerges = 0;  /* count number of merges we do in this pass */
-
-        while (p) {
-            nmerges++;  /* there exists a merge to be done */
-            /* step `insize' places along from p */
-            q = p;
-            psize = 0;
-            for (i = 0; i < insize; i++) {
-                psize++;
-                q = q->next;
-                if (!q) break;
-            }
-
-            /* if q hasn't fallen off end, we have two lists to merge */
-            qsize = insize;
-
-            /* now we have two lists; merge them */
-            while (psize > 0 || (qsize > 0 && q)) {
-
-                /* decide whether next element of merge comes from p or q */
-                if (psize == 0) {
-                    /* p is empty; e must come from q. */
-                    e = q; q = q->next; qsize--;
-                } else if (qsize == 0 || !q) {
-                    /* q is empty; e must come from p. */
-                    e = p; p = p->next; psize--;
-                } else if (cmp(p->info,q->info,res) <= 0) {
-                    /* First element of p is lower (or same); e must come from p. */
-                    e = p; p = p->next; psize--;
-                } else {
-                    /* First element of q is lower; e must come from q. */
-                    e = q; q = q->next; qsize--;
-                }
-
-                /* add the next element to the merged list */
-                if (tail) {
-                    tail->next = e;
-                } else {
-                    list = e;
-                }
-                tail = e;
-            }
-
-            /* now p has stepped `insize' places along, and q has too */
-            p = q;
-        }
-
-        tail->next = NULL;
-
-        /* If we have done only one merge, we're finished. */
-        if (nmerges <= 1)   /* allow for nmerges==0, the empty list case */
-            return list;
-
-        /* Otherwise repeat, merging lists twice the size */
-        insize *= 2;
-    }
-#if COMPILER_REQUIRES_SORT_RETURN
-    return list;
-#endif
-}
diff --git a/apps/coremark/src/core_main.c b/apps/coremark/src/core_main.c
deleted file mode 100644
index e7c1898..0000000
--- a/apps/coremark/src/core_main.c
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
-Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC)
-
-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.
-
-Original Author: Shay Gal-on
-*/
-
-/* File: core_main.c
-    This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
-*/
-#include "coremark.h"
-
-/* Function: iterate
-    Run the benchmark for a specified number of iterations.
-
-    Operation:
-    For each type of benchmarked algorithm:
-        a - Initialize the data block for the algorithm.
-        b - Execute the algorithm N times.
-
-    Returns:
-    NULL.
-*/
-static ee_u16 list_known_crc[]   =      {(ee_u16)0xd4b0,(ee_u16)0x3340,(ee_u16)0x6a79,(ee_u16)0xe714,(ee_u16)0xe3c1};
-static ee_u16 matrix_known_crc[] =      {(ee_u16)0xbe52,(ee_u16)0x1199,(ee_u16)0x5608,(ee_u16)0x1fd7,(ee_u16)0x0747};
-static ee_u16 state_known_crc[]  =      {(ee_u16)0x5e47,(ee_u16)0x39bf,(ee_u16)0xe5a4,(ee_u16)0x8e3a,(ee_u16)0x8d84};
-void *iterate(void *pres) {
-    ee_u32 i;
-    ee_u16 crc;
-    core_results *res=(core_results *)pres;
-    ee_u32 iterations=res->iterations;
-    res->crc=0;
-    res->crclist=0;
-    res->crcmatrix=0;
-    res->crcstate=0;
-
-    for (i=0; i<iterations; i++) {
-        crc=core_bench_list(res,1);
-        res->crc=crcu16(crc,res->crc);
-        crc=core_bench_list(res,-1);
-        res->crc=crcu16(crc,res->crc);
-        if (i==0) res->crclist=res->crc;
-    }
-    return NULL;
-}
-
-#if (SEED_METHOD==SEED_ARG)
-ee_s32 get_seed_args(int i, int argc, char *argv[]);
-#define get_seed(x) (ee_s16)get_seed_args(x,argc,argv)
-#define get_seed_32(x) get_seed_args(x,argc,argv)
-#else /* via function or volatile */
-ee_s32 get_seed_32(int i);
-#define get_seed(x) (ee_s16)get_seed_32(x)
-#endif
-
-#if (MEM_METHOD==MEM_STATIC)
-ee_u8 static_memblk[TOTAL_DATA_SIZE];
-#endif
-char *mem_name[3] = {"Static","Heap","Stack"};
-/* Function: main
-    Main entry routine for the benchmark.
-    This function is responsible for the following steps:
-
-    1 - Initialize input seeds from a source that cannot be determined at compile time.
-    2 - Initialize memory block for use.
-    3 - Run and time the benchmark.
-    4 - Report results, testing the validity of the output if the seeds are known.
-
-    Arguments:
-    1 - first seed  : Any value
-    2 - second seed : Must be identical to first for iterations to be identical
-    3 - third seed  : Any value, should be at least an order of magnitude less then the input size, but bigger then 32.
-    4 - Iterations  : Special, if set to 0, iterations will be automatically determined such that the benchmark will run between 10 to 100 secs
-
-*/
-
-#if MAIN_HAS_NOARGC
-MAIN_RETURN_TYPE coremark_main(void) {
-    int argc=0;
-    char *argv[1];
-#else
-MAIN_RETURN_TYPE coremark_main(int argc, char *argv[]) {
-#endif
-    ee_u16 i,j=0,num_algorithms=0;
-    ee_s16 known_id=-1,total_errors=0;
-    ee_u16 seedcrc=0;
-    CORE_TICKS total_time;
-    core_results results[MULTITHREAD];
-#if (MEM_METHOD==MEM_STACK)
-    ee_u8 stack_memblock[TOTAL_DATA_SIZE*MULTITHREAD];
-#endif
-    /* first call any initializations needed */
-    portable_init(&(results[0].port), &argc, argv);
-    /* First some checks to make sure benchmark will run ok */
-    if (sizeof(struct list_head_s)>128) {
-        ee_printf("list_head structure too big for comparable data!\n");
-        return MAIN_RETURN_VAL;
-    }
-    results[0].seed1=get_seed(1);
-    results[0].seed2=get_seed(2);
-    results[0].seed3=get_seed(3);
-    results[0].iterations=get_seed_32(4);
-#if CORE_DEBUG
-    results[0].iterations=1;
-#endif
-    results[0].execs=get_seed_32(5);
-    if (results[0].execs==0) { /* if not supplied, execute all algorithms */
-        results[0].execs=ALL_ALGORITHMS_MASK;
-    }
-        /* put in some default values based on one seed only for easy testing */
-    if ((results[0].seed1==0) && (results[0].seed2==0) && (results[0].seed3==0)) { /* validation run */
-        results[0].seed1=0;
-        results[0].seed2=0;
-        results[0].seed3=0x66;
-    }
-    if ((results[0].seed1==1) && (results[0].seed2==0) && (results[0].seed3==0)) { /* perfromance run */
-        results[0].seed1=0x3415;
-        results[0].seed2=0x3415;
-        results[0].seed3=0x66;
-    }
-#if (MEM_METHOD==MEM_STATIC)
-    results[0].memblock[0]=(void *)static_memblk;
-    results[0].size=TOTAL_DATA_SIZE;
-    results[0].err=0;
-    #if (MULTITHREAD>1)
-    #error "Cannot use a static data area with multiple contexts!"
-    #endif
-#elif (MEM_METHOD==MEM_MALLOC)
-    for (i=0 ; i<MULTITHREAD; i++) {
-        ee_s32 malloc_override=get_seed(7);
-        if (malloc_override != 0)
-            results[i].size=malloc_override;
-        else
-            results[i].size=TOTAL_DATA_SIZE;
-        results[i].memblock[0]=portable_malloc(results[i].size);
-        results[i].seed1=results[0].seed1;
-        results[i].seed2=results[0].seed2;
-        results[i].seed3=results[0].seed3;
-        results[i].err=0;
-        results[i].execs=results[0].execs;
-    }
-#elif (MEM_METHOD==MEM_STACK)
-    for (i=0 ; i<MULTITHREAD; i++) {
-        results[i].memblock[0]=stack_memblock+i*TOTAL_DATA_SIZE;
-        results[i].size=TOTAL_DATA_SIZE;
-        results[i].seed1=results[0].seed1;
-        results[i].seed2=results[0].seed2;
-        results[i].seed3=results[0].seed3;
-        results[i].err=0;
-        results[i].execs=results[0].execs;
-    }
-#else
-#error "Please define a way to initialize a memory block."
-#endif
-    /* Data init */
-    /* Find out how space much we have based on number of algorithms */
-    for (i=0; i<NUM_ALGORITHMS; i++) {
-        if ((1<<(ee_u32)i) & results[0].execs)
-            num_algorithms++;
-    }
-    for (i=0 ; i<MULTITHREAD; i++)
-        results[i].size=results[i].size/num_algorithms;
-    /* Assign pointers */
-    for (i=0; i<NUM_ALGORITHMS; i++) {
-        ee_u32 ctx;
-        if ((1<<(ee_u32)i) & results[0].execs) {
-            for (ctx=0 ; ctx<MULTITHREAD; ctx++)
-                results[ctx].memblock[i+1]=(char *)(results[ctx].memblock[0])+results[0].size*j;
-            j++;
-        }
-    }
-    /* call inits */
-    for (i=0 ; i<MULTITHREAD; i++) {
-        if (results[i].execs & ID_LIST) {
-            results[i].list=core_list_init(results[0].size,results[i].memblock[1],results[i].seed1);
-        }
-        if (results[i].execs & ID_MATRIX) {
-            core_init_matrix(results[0].size, results[i].memblock[2], (ee_s32)results[i].seed1 | (((ee_s32)results[i].seed2) << 16), &(results[i].mat) );
-        }
-        if (results[i].execs & ID_STATE) {
-            core_init_state(results[0].size,results[i].seed1,results[i].memblock[3]);
-        }
-    }
-
-    /* automatically determine number of iterations if not set */
-    if (results[0].iterations==0) {
-        secs_ret secs_passed=0;
-        ee_u32 divisor;
-        results[0].iterations=1;
-        while (secs_passed < (secs_ret)1) {
-            results[0].iterations*=10;
-            start_time();
-            iterate(&results[0]);
-            stop_time();
-            secs_passed=time_in_secs(get_time());
-        }
-        /* now we know it executes for at least 1 sec, set actual run time at about 10 secs */
-        divisor=(ee_u32)secs_passed;
-        if (divisor==0) /* some machines cast float to int as 0 since this conversion is not defined by ANSI, but we know at least one second passed */
-            divisor=1;
-        results[0].iterations*=1+10/divisor;
-    }
-    /* perform actual benchmark */
-    start_time();
-#if (MULTITHREAD>1)
-    if (default_num_contexts>MULTITHREAD) {
-        default_num_contexts=MULTITHREAD;
-    }
-    for (i=0 ; i<default_num_contexts; i++) {
-        results[i].iterations=results[0].iterations;
-        results[i].execs=results[0].execs;
-        core_start_parallel(&results[i]);
-    }
-    for (i=0 ; i<default_num_contexts; i++) {
-        core_stop_parallel(&results[i]);
-    }
-#else
-    iterate(&results[0]);
-#endif
-    stop_time();
-    total_time=get_time();
-    /* get a function of the input to report */
-    seedcrc=crc16(results[0].seed1,seedcrc);
-    seedcrc=crc16(results[0].seed2,seedcrc);
-    seedcrc=crc16(results[0].seed3,seedcrc);
-    seedcrc=crc16(results[0].size,seedcrc);
-
-    switch (seedcrc) { /* test known output for common seeds */
-        case 0x8a02: /* seed1=0, seed2=0, seed3=0x66, size 2000 per algorithm */
-            known_id=0;
-            ee_printf("6k performance run parameters for coremark.\n");
-            break;
-        case 0x7b05: /*  seed1=0x3415, seed2=0x3415, seed3=0x66, size 2000 per algorithm */
-            known_id=1;
-            ee_printf("6k validation run parameters for coremark.\n");
-            break;
-        case 0x4eaf: /* seed1=0x8, seed2=0x8, seed3=0x8, size 400 per algorithm */
-            known_id=2;
-            ee_printf("Profile generation run parameters for coremark.\n");
-            break;
-        case 0xe9f5: /* seed1=0, seed2=0, seed3=0x66, size 666 per algorithm */
-            known_id=3;
-            ee_printf("2K performance run parameters for coremark.\n");
-            break;
-        case 0x18f2: /*  seed1=0x3415, seed2=0x3415, seed3=0x66, size 666 per algorithm */
-            known_id=4;
-            ee_printf("2K validation run parameters for coremark.\n");
-            break;
-        default:
-            total_errors=-1;
-            break;
-    }
-    if (known_id>=0) {
-        for (i=0 ; i<default_num_contexts; i++) {
-            results[i].err=0;
-            if ((results[i].execs & ID_LIST) &&
-                (results[i].crclist!=list_known_crc[known_id])) {
-                ee_printf("[%u]ERROR! list crc 0x%04x - should be 0x%04x\n",i,results[i].crclist,list_known_crc[known_id]);
-                results[i].err++;
-            }
-            if ((results[i].execs & ID_MATRIX) &&
-                (results[i].crcmatrix!=matrix_known_crc[known_id])) {
-                ee_printf("[%u]ERROR! matrix crc 0x%04x - should be 0x%04x\n",i,results[i].crcmatrix,matrix_known_crc[known_id]);
-                results[i].err++;
-            }
-            if ((results[i].execs & ID_STATE) &&
-                (results[i].crcstate!=state_known_crc[known_id])) {
-                ee_printf("[%u]ERROR! state crc 0x%04x - should be 0x%04x\n",i,results[i].crcstate,state_known_crc[known_id]);
-                results[i].err++;
-            }
-            total_errors+=results[i].err;
-        }
-    }
-    total_errors+=check_data_types();
-    /* and report results */
-    ee_printf("CoreMark Size    : %lu\n", (long unsigned) results[0].size);
-    ee_printf("Total ticks      : %lu\n", (long unsigned) total_time);
-#if HAS_FLOAT
-    ee_printf("Total time (secs): %f\n",time_in_secs(total_time));
-    if (time_in_secs(total_time) > 0)
-        ee_printf("Iterations/Sec   : %f\n",default_num_contexts*results[0].iterations/time_in_secs(total_time));
-#else
-    ee_printf("Total time (secs): %d\n",time_in_secs(total_time));
-    if (time_in_secs(total_time) > 0)
-        ee_printf("Iterations/Sec   : %d\n",default_num_contexts*results[0].iterations/time_in_secs(total_time));
-#endif
-    if (time_in_secs(total_time) < 10) {
-        ee_printf("ERROR! Must execute for at least 10 secs for a valid result!\n");
-        total_errors++;
-    }
-
-    ee_printf("Iterations       : %lu\n", (long unsigned) default_num_contexts*results[0].iterations);
-    ee_printf("Compiler version : %s\n",COMPILER_VERSION);
-    ee_printf("Compiler flags   : %s\n",COMPILER_FLAGS);
-#if (MULTITHREAD>1)
-    ee_printf("Parallel %s : %d\n",PARALLEL_METHOD,default_num_contexts);
-#endif
-    ee_printf("Memory location  : %s\n",MEM_LOCATION);
-    /* output for verification */
-    ee_printf("seedcrc          : 0x%04x\n",seedcrc);
-    if (results[0].execs & ID_LIST)
-        for (i=0 ; i<default_num_contexts; i++)
-            ee_printf("[%d]crclist       : 0x%04x\n",i,results[i].crclist);
-    if (results[0].execs & ID_MATRIX)
-        for (i=0 ; i<default_num_contexts; i++)
-            ee_printf("[%d]crcmatrix     : 0x%04x\n",i,results[i].crcmatrix);
-    if (results[0].execs & ID_STATE)
-        for (i=0 ; i<default_num_contexts; i++)
-            ee_printf("[%d]crcstate      : 0x%04x\n",i,results[i].crcstate);
-    for (i=0 ; i<default_num_contexts; i++)
-        ee_printf("[%d]crcfinal      : 0x%04x\n",i,results[i].crc);
-    if (total_errors==0) {
-        ee_printf("Correct operation validated. See README.md for run and reporting rules.\n");
-#if HAS_FLOAT
-        if (known_id==3) {
-            ee_printf("CoreMark 1.0 : %f / %s %s",default_num_contexts*results[0].iterations/time_in_secs(total_time),COMPILER_VERSION,COMPILER_FLAGS);
-#if defined(MEM_LOCATION) && !defined(MEM_LOCATION_UNSPEC)
-            ee_printf(" / %s",MEM_LOCATION);
-#else
-            ee_printf(" / %s",mem_name[MEM_METHOD]);
-#endif
-
-#if (MULTITHREAD>1)
-            ee_printf(" / %d:%s",default_num_contexts,PARALLEL_METHOD);
-#endif
-            ee_printf("\n");
-        }
-#endif
-    }
-    if (total_errors>0)
-        ee_printf("Errors detected\n");
-    if (total_errors<0)
-        ee_printf("Cannot validate operation for these seed values, please compare with results on a known platform.\n");
-
-#if (MEM_METHOD==MEM_MALLOC)
-    for (i=0 ; i<MULTITHREAD; i++)
-        portable_free(results[i].memblock[0]);
-#endif
-    /* And last call any target specific code for finalizing */
-    portable_fini(&(results[0].port));
-
-    return MAIN_RETURN_VAL;
-}
-
-int
-mynewt_main(int argc, char **argv)
-{
-    sysinit();
-
-    coremark_main(argc, argv);
-
-    while (1) {
-        os_eventq_run(os_eventq_dflt_get());
-    }
-}
diff --git a/apps/coremark/src/core_matrix.c b/apps/coremark/src/core_matrix.c
deleted file mode 100644
index 06b706b..0000000
--- a/apps/coremark/src/core_matrix.c
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
-Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC)
-
-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.
-
-Original Author: Shay Gal-on
-*/
-
-#include "coremark.h"
-/*
-Topic: Description
-    Matrix manipulation benchmark
-
-    This very simple algorithm forms the basis of many more complex algorithms.
-
-    The tight inner loop is the focus of many optimizations (compiler as well as hardware based)
-    and is thus relevant for embedded processing.
-
-    The total available data space will be divided to 3 parts:
-    NxN Matrix A - initialized with small values (upper 3/4 of the bits all zero).
-    NxN Matrix B - initialized with medium values (upper half of the bits all zero).
-    NxN Matrix C - used for the result.
-
-    The actual values for A and B must be derived based on input that is not available at compile time.
-*/
-ee_s16 matrix_test(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B, MATDAT val);
-ee_s16 matrix_sum(ee_u32 N, MATRES *C, MATDAT clipval);
-void matrix_mul_const(ee_u32 N, MATRES *C, MATDAT *A, MATDAT val);
-void matrix_mul_vect(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B);
-void matrix_mul_matrix(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B);
-void matrix_mul_matrix_bitextract(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B);
-void matrix_add_const(ee_u32 N, MATDAT *A, MATDAT val);
-
-#define matrix_test_next(x) (x+1)
-#define matrix_clip(x,y) ((y) ? (x) & 0x0ff : (x) & 0x0ffff)
-#define matrix_big(x) (0xf000 | (x))
-#define bit_extract(x,from,to) (((x)>>(from)) & (~(0xffffffff << (to))))
-
-#if CORE_DEBUG
-void printmat(MATDAT *A, ee_u32 N, char *name) {
-    ee_u32 i,j;
-    ee_printf("Matrix %s [%dx%d]:\n",name,N,N);
-    for (i=0; i<N; i++) {
-        for (j=0; j<N; j++) {
-            if (j!=0)
-                ee_printf(",");
-            ee_printf("%d",A[i*N+j]);
-        }
-        ee_printf("\n");
-    }
-}
-void printmatC(MATRES *C, ee_u32 N, char *name) {
-    ee_u32 i,j;
-    ee_printf("Matrix %s [%dx%d]:\n",name,N,N);
-    for (i=0; i<N; i++) {
-        for (j=0; j<N; j++) {
-            if (j!=0)
-                ee_printf(",");
-            ee_printf("%d",C[i*N+j]);
-        }
-        ee_printf("\n");
-    }
-}
-#endif
-/* Function: core_bench_matrix
-    Benchmark function
-
-    Iterate <matrix_test> N times,
-    changing the matrix values slightly by a constant amount each time.
-*/
-ee_u16 core_bench_matrix(mat_params *p, ee_s16 seed, ee_u16 crc) {
-    ee_u32 N=p->N;
-    MATRES *C=p->C;
-    MATDAT *A=p->A;
-    MATDAT *B=p->B;
-    MATDAT val=(MATDAT)seed;
-
-    crc=crc16(matrix_test(N,C,A,B,val),crc);
-
-    return crc;
-}
-
-/* Function: matrix_test
-    Perform matrix manipulation.
-
-    Parameters:
-    N - Dimensions of the matrix.
-    C - memory for result matrix.
-    A - input matrix
-    B - operator matrix (not changed during operations)
-
-    Returns:
-    A CRC value that captures all results calculated in the function.
-    In particular, crc of the value calculated on the result matrix
-    after each step by <matrix_sum>.
-
-    Operation:
-
-    1 - Add a constant value to all elements of a matrix.
-    2 - Multiply a matrix by a constant.
-    3 - Multiply a matrix by a vector.
-    4 - Multiply a matrix by a matrix.
-    5 - Add a constant value to all elements of a matrix.
-
-    After the last step, matrix A is back to original contents.
-*/
-ee_s16 matrix_test(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B, MATDAT val) {
-    ee_u16 crc=0;
-    MATDAT clipval=matrix_big(val);
-
-    matrix_add_const(N,A,val); /* make sure data changes  */
-#if CORE_DEBUG
-    printmat(A,N,"matrix_add_const");
-#endif
-    matrix_mul_const(N,C,A,val);
-    crc=crc16(matrix_sum(N,C,clipval),crc);
-#if CORE_DEBUG
-    printmatC(C,N,"matrix_mul_const");
-#endif
-    matrix_mul_vect(N,C,A,B);
-    crc=crc16(matrix_sum(N,C,clipval),crc);
-#if CORE_DEBUG
-    printmatC(C,N,"matrix_mul_vect");
-#endif
-    matrix_mul_matrix(N,C,A,B);
-    crc=crc16(matrix_sum(N,C,clipval),crc);
-#if CORE_DEBUG
-    printmatC(C,N,"matrix_mul_matrix");
-#endif
-    matrix_mul_matrix_bitextract(N,C,A,B);
-    crc=crc16(matrix_sum(N,C,clipval),crc);
-#if CORE_DEBUG
-    printmatC(C,N,"matrix_mul_matrix_bitextract");
-#endif
-
-    matrix_add_const(N,A,-val); /* return matrix to initial value */
-    return crc;
-}
-
-/* Function : matrix_init
-    Initialize the memory block for matrix benchmarking.
-
-    Parameters:
-    blksize - Size of memory to be initialized.
-    memblk - Pointer to memory block.
-    seed - Actual values chosen depend on the seed parameter.
-    p - pointers to <mat_params> containing initialized matrixes.
-
-    Returns:
-    Matrix dimensions.
-
-    Note:
-    The seed parameter MUST be supplied from a source that cannot be determined at compile time
-*/
-ee_u32 core_init_matrix(ee_u32 blksize, void *memblk, ee_s32 seed, mat_params *p) {
-    ee_u32 N=0;
-    MATDAT *A;
-    MATDAT *B;
-    ee_s32 order=1;
-    MATDAT val;
-    ee_u32 i=0,j=0;
-    if (seed==0)
-        seed=1;
-    while (j<blksize) {
-        i++;
-        j=i*i*2*4;
-    }
-    N=i-1;
-    A=(MATDAT *)align_mem(memblk);
-    B=A+N*N;
-
-    for (i=0; i<N; i++) {
-        for (j=0; j<N; j++) {
-            seed = ( ( order * seed ) % 65536 );
-            val = (seed + order);
-            val=matrix_clip(val,0);
-            B[i*N+j] = val;
-            val =  (val + order);
-            val=matrix_clip(val,1);
-            A[i*N+j] = val;
-            order++;
-        }
-    }
-
-    p->A=A;
-    p->B=B;
-    p->C=(MATRES *)align_mem(B+N*N);
-    p->N=N;
-#if CORE_DEBUG
-    printmat(A,N,"A");
-    printmat(B,N,"B");
-#endif
-    return N;
-}
-
-/* Function: matrix_sum
-    Calculate a function that depends on the values of elements in the matrix.
-
-    For each element, accumulate into a temporary variable.
-
-    As long as this value is under the parameter clipval,
-    add 1 to the result if the element is bigger then the previous.
-
-    Otherwise, reset the accumulator and add 10 to the result.
-*/
-ee_s16 matrix_sum(ee_u32 N, MATRES *C, MATDAT clipval) {
-    MATRES tmp=0,prev=0,cur=0;
-    ee_s16 ret=0;
-    ee_u32 i,j;
-    for (i=0; i<N; i++) {
-        for (j=0; j<N; j++) {
-            cur=C[i*N+j];
-            tmp+=cur;
-            if (tmp>clipval) {
-                ret+=10;
-                tmp=0;
-            } else {
-                ret += (cur>prev) ? 1 : 0;
-            }
-            prev=cur;
-        }
-    }
-    return ret;
-}
-
-/* Function: matrix_mul_const
-    Multiply a matrix by a constant.
-    This could be used as a scaler for instance.
-*/
-void matrix_mul_const(ee_u32 N, MATRES *C, MATDAT *A, MATDAT val) {
-    ee_u32 i,j;
-    for (i=0; i<N; i++) {
-        for (j=0; j<N; j++) {
-            C[i*N+j]=(MATRES)A[i*N+j] * (MATRES)val;
-        }
-    }
-}
-
-/* Function: matrix_add_const
-    Add a constant value to all elements of a matrix.
-*/
-void matrix_add_const(ee_u32 N, MATDAT *A, MATDAT val) {
-    ee_u32 i,j;
-    for (i=0; i<N; i++) {
-        for (j=0; j<N; j++) {
-            A[i*N+j] += val;
-        }
-    }
-}
-
-/* Function: matrix_mul_vect
-    Multiply a matrix by a vector.
-    This is common in many simple filters (e.g. fir where a vector of coefficients is applied to the matrix.)
-*/
-void matrix_mul_vect(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) {
-    ee_u32 i,j;
-    for (i=0; i<N; i++) {
-        C[i]=0;
-        for (j=0; j<N; j++) {
-            C[i]+=(MATRES)A[i*N+j] * (MATRES)B[j];
-        }
-    }
-}
-
-/* Function: matrix_mul_matrix
-    Multiply a matrix by a matrix.
-    Basic code is used in many algorithms, mostly with minor changes such as scaling.
-*/
-void matrix_mul_matrix(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) {
-    ee_u32 i,j,k;
-    for (i=0; i<N; i++) {
-        for (j=0; j<N; j++) {
-            C[i*N+j]=0;
-            for(k=0;k<N;k++)
-            {
-                C[i*N+j]+=(MATRES)A[i*N+k] * (MATRES)B[k*N+j];
-            }
-        }
-    }
-}
-
-/* Function: matrix_mul_matrix_bitextract
-    Multiply a matrix by a matrix, and extract some bits from the result.
-    Basic code is used in many algorithms, mostly with minor changes such as scaling.
-*/
-void matrix_mul_matrix_bitextract(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) {
-    ee_u32 i,j,k;
-    for (i=0; i<N; i++) {
-        for (j=0; j<N; j++) {
-            C[i*N+j]=0;
-            for(k=0;k<N;k++)
-            {
-                MATRES tmp=(MATRES)A[i*N+k] * (MATRES)B[k*N+j];
-                C[i*N+j]+=bit_extract(tmp,2,4)*bit_extract(tmp,5,7);
-            }
-        }
-    }
-}
diff --git a/apps/coremark/src/core_state.c b/apps/coremark/src/core_state.c
deleted file mode 100644
index 8b4e4b5..0000000
--- a/apps/coremark/src/core_state.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
-Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC)
-
-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.
-
-Original Author: Shay Gal-on
-*/
-
-#include "coremark.h"
-/* local functions */
-enum CORE_STATE core_state_transition( ee_u8 **instr , ee_u32 *transition_count);
-
-/*
-Topic: Description
-    Simple state machines like this one are used in many embedded products.
-
-    For more complex state machines, sometimes a state transition table implementation is used instead,
-    trading speed of direct coding for ease of maintenance.
-
-    Since the main goal of using a state machine in CoreMark is to excercise the switch/if behaviour,
-    we are using a small moore machine.
-
-    In particular, this machine tests type of string input,
-    trying to determine whether the input is a number or something else.
-    (see core_state.png).
-*/
-
-/* Function: core_bench_state
-    Benchmark function
-
-    Go over the input twice, once direct, and once after introducing some corruption.
-*/
-ee_u16 core_bench_state(ee_u32 blksize, ee_u8 *memblock,
-        ee_s16 seed1, ee_s16 seed2, ee_s16 step, ee_u16 crc)
-{
-    ee_u32 final_counts[NUM_CORE_STATES];
-    ee_u32 track_counts[NUM_CORE_STATES];
-    ee_u8 *p=memblock;
-    ee_u32 i;
-
-
-#if CORE_DEBUG
-    ee_printf("State Bench: %d,%d,%d,%04x\n",seed1,seed2,step,crc);
-#endif
-    for (i=0; i<NUM_CORE_STATES; i++) {
-        final_counts[i]=track_counts[i]=0;
-    }
-    /* run the state machine over the input */
-    while (*p!=0) {
-        enum CORE_STATE fstate=core_state_transition(&p,track_counts);
-        final_counts[fstate]++;
-#if CORE_DEBUG
-    ee_printf("%d,",fstate);
-    }
-    ee_printf("\n");
-#else
-    }
-#endif
-    p=memblock;
-    while (p < (memblock+blksize)) { /* insert some corruption */
-        if (*p!=',')
-            *p^=(ee_u8)seed1;
-        p+=step;
-    }
-    p=memblock;
-    /* run the state machine over the input again */
-    while (*p!=0) {
-        enum CORE_STATE fstate=core_state_transition(&p,track_counts);
-        final_counts[fstate]++;
-#if CORE_DEBUG
-    ee_printf("%d,",fstate);
-    }
-    ee_printf("\n");
-#else
-    }
-#endif
-    p=memblock;
-    while (p < (memblock+blksize)) { /* undo corruption is seed1 and seed2 are equal */
-        if (*p!=',')
-            *p^=(ee_u8)seed2;
-        p+=step;
-    }
-    /* end timing */
-    for (i=0; i<NUM_CORE_STATES; i++) {
-        crc=crcu32(final_counts[i],crc);
-        crc=crcu32(track_counts[i],crc);
-    }
-    return crc;
-}
-
-/* Default initialization patterns */
-static ee_u8 *intpat[4]  ={(ee_u8 *)"5012",(ee_u8 *)"1234",(ee_u8 *)"-874",(ee_u8 *)"+122"};
-static ee_u8 *floatpat[4]={(ee_u8 *)"35.54400",(ee_u8 *)".1234500",(ee_u8 *)"-110.700",(ee_u8 *)"+0.64400"};
-static ee_u8 *scipat[4]  ={(ee_u8 *)"5.500e+3",(ee_u8 *)"-.123e-2",(ee_u8 *)"-87e+832",(ee_u8 *)"+0.6e-12"};
-static ee_u8 *errpat[4]  ={(ee_u8 *)"T0.3e-1F",(ee_u8 *)"-T.T++Tq",(ee_u8 *)"1T3.4e4z",(ee_u8 *)"34.0e-T^"};
-
-/* Function: core_init_state
-    Initialize the input data for the state machine.
-
-    Populate the input with several predetermined strings, interspersed.
-    Actual patterns chosen depend on the seed parameter.
-
-    Note:
-    The seed parameter MUST be supplied from a source that cannot be determined at compile time
-*/
-void core_init_state(ee_u32 size, ee_s16 seed, ee_u8 *p) {
-    ee_u32 total=0,next=0,i;
-    ee_u8 *buf=0;
-#if CORE_DEBUG
-    ee_u8 *start=p;
-    ee_printf("State: %d,%d\n",size,seed);
-#endif
-    size--;
-    next=0;
-    while ((total+next+1)<size) {
-        if (next>0) {
-            for(i=0;i<next;i++)
-                *(p+total+i)=buf[i];
-            *(p+total+i)=',';
-            total+=next+1;
-        }
-        seed++;
-        switch (seed & 0x7) {
-            case 0: /* int */
-            case 1: /* int */
-            case 2: /* int */
-                buf=intpat[(seed>>3) & 0x3];
-                next=4;
-            break;
-            case 3: /* float */
-            case 4: /* float */
-                buf=floatpat[(seed>>3) & 0x3];
-                next=8;
-            break;
-            case 5: /* scientific */
-            case 6: /* scientific */
-                buf=scipat[(seed>>3) & 0x3];
-                next=8;
-            break;
-            case 7: /* invalid */
-                buf=errpat[(seed>>3) & 0x3];
-                next=8;
-            break;
-            default: /* Never happen, just to make some compilers happy */
-            break;
-        }
-    }
-    size++;
-    while (total<size) { /* fill the rest with 0 */
-        *(p+total)=0;
-        total++;
-    }
-#if CORE_DEBUG
-    ee_printf("State Input: %s\n",start);
-#endif
-}
-
-static ee_u8 ee_isdigit(ee_u8 c) {
-    ee_u8 retval;
-    retval = ((c>='0') & (c<='9')) ? 1 : 0;
-    return retval;
-}
-
-/* Function: core_state_transition
-    Actual state machine.
-
-    The state machine will continue scanning until either:
-    1 - an invalid input is detcted.
-    2 - a valid number has been detected.
-
-    The input pointer is updated to point to the end of the token, and the end state is returned (either specific format determined or invalid).
-*/
-
-enum CORE_STATE core_state_transition( ee_u8 **instr , ee_u32 *transition_count) {
-    ee_u8 *str=*instr;
-    ee_u8 NEXT_SYMBOL;
-    enum CORE_STATE state=CORE_START;
-    for( ; *str && state != CORE_INVALID; str++ ) {
-        NEXT_SYMBOL = *str;
-        if (NEXT_SYMBOL==',') /* end of this input */ {
-            str++;
-            break;
-        }
-        switch(state) {
-        case CORE_START:
-            if(ee_isdigit(NEXT_SYMBOL)) {
-                state = CORE_INT;
-            }
-            else if( NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-' ) {
-                state = CORE_S1;
-            }
-            else if( NEXT_SYMBOL == '.' ) {
-                state = CORE_FLOAT;
-            }
-            else {
-                state = CORE_INVALID;
-                transition_count[CORE_INVALID]++;
-            }
-            transition_count[CORE_START]++;
-            break;
-        case CORE_S1:
-            if(ee_isdigit(NEXT_SYMBOL)) {
-                state = CORE_INT;
-                transition_count[CORE_S1]++;
-            }
-            else if( NEXT_SYMBOL == '.' ) {
-                state = CORE_FLOAT;
-                transition_count[CORE_S1]++;
-            }
-            else {
-                state = CORE_INVALID;
-                transition_count[CORE_S1]++;
-            }
-            break;
-        case CORE_INT:
-            if( NEXT_SYMBOL == '.' ) {
-                state = CORE_FLOAT;
-                transition_count[CORE_INT]++;
-            }
-            else if(!ee_isdigit(NEXT_SYMBOL)) {
-                state = CORE_INVALID;
-                transition_count[CORE_INT]++;
-            }
-            break;
-        case CORE_FLOAT:
-            if( NEXT_SYMBOL == 'E' || NEXT_SYMBOL == 'e' ) {
-                state = CORE_S2;
-                transition_count[CORE_FLOAT]++;
-            }
-            else if(!ee_isdigit(NEXT_SYMBOL)) {
-                state = CORE_INVALID;
-                transition_count[CORE_FLOAT]++;
-            }
-            break;
-        case CORE_S2:
-            if( NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-' ) {
-                state = CORE_EXPONENT;
-                transition_count[CORE_S2]++;
-            }
-            else {
-                state = CORE_INVALID;
-                transition_count[CORE_S2]++;
-            }
-            break;
-        case CORE_EXPONENT:
-            if(ee_isdigit(NEXT_SYMBOL)) {
-                state = CORE_SCIENTIFIC;
-                transition_count[CORE_EXPONENT]++;
-            }
-            else {
-                state = CORE_INVALID;
-                transition_count[CORE_EXPONENT]++;
-            }
-            break;
-        case CORE_SCIENTIFIC:
-            if(!ee_isdigit(NEXT_SYMBOL)) {
-                state = CORE_INVALID;
-                transition_count[CORE_INVALID]++;
-            }
-            break;
-        default:
-            break;
-        }
-    }
-    *instr=str;
-    return state;
-}
diff --git a/apps/coremark/src/core_util.c b/apps/coremark/src/core_util.c
deleted file mode 100644
index 5c2a4de..0000000
--- a/apps/coremark/src/core_util.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
-Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC)
-
-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.
-
-Original Author: Shay Gal-on
-*/
-
-#include "coremark.h"
-/* Function: get_seed
-    Get a values that cannot be determined at compile time.
-
-    Since different embedded systems and compilers are used, 3 different methods are provided:
-    1 - Using a volatile variable. This method is only valid if the compiler is forced to generate code that
-    reads the value of a volatile variable from memory at run time.
-    Please note, if using this method, you would need to modify core_portme.c to generate training profile.
-    2 - Command line arguments. This is the preferred method if command line arguments are supported.
-    3 - System function. If none of the first 2 methods is available on the platform,
-    a system function which is not a stub can be used.
-
-    e.g. read the value on GPIO pins connected to switches, or invoke special simulator functions.
-*/
-#if (SEED_METHOD==SEED_VOLATILE)
-    extern volatile ee_s32 seed1_volatile;
-    extern volatile ee_s32 seed2_volatile;
-    extern volatile ee_s32 seed3_volatile;
-    extern volatile ee_s32 seed4_volatile;
-    extern volatile ee_s32 seed5_volatile;
-    ee_s32 get_seed_32(int i) {
-        ee_s32 retval;
-        switch (i) {
-            case 1:
-                retval=seed1_volatile;
-                break;
-            case 2:
-                retval=seed2_volatile;
-                break;
-            case 3:
-                retval=seed3_volatile;
-                break;
-            case 4:
-                retval=seed4_volatile;
-                break;
-            case 5:
-                retval=seed5_volatile;
-                break;
-            default:
-                retval=0;
-                break;
-        }
-        return retval;
-    }
-#elif (SEED_METHOD==SEED_ARG)
-ee_s32 parseval(char *valstring) {
-    ee_s32 retval=0;
-    ee_s32 neg=1;
-    int hexmode=0;
-    if (*valstring == '-') {
-        neg=-1;
-        valstring++;
-    }
-    if ((valstring[0] == '0') && (valstring[1] == 'x')) {
-        hexmode=1;
-        valstring+=2;
-    }
-        /* first look for digits */
-    if (hexmode) {
-        while (((*valstring >= '0') && (*valstring <= '9')) || ((*valstring >= 'a') && (*valstring <= 'f'))) {
-            ee_s32 digit=*valstring-'0';
-            if (digit>9)
-                digit=10+*valstring-'a';
-            retval*=16;
-            retval+=digit;
-            valstring++;
-        }
-    } else {
-        while ((*valstring >= '0') && (*valstring <= '9')) {
-            ee_s32 digit=*valstring-'0';
-            retval*=10;
-            retval+=digit;
-            valstring++;
-        }
-    }
-    /* now add qualifiers */
-    if (*valstring=='K')
-        retval*=1024;
-    if (*valstring=='M')
-        retval*=1024*1024;
-
-    retval*=neg;
-    return retval;
-}
-
-ee_s32 get_seed_args(int i, int argc, char *argv[]) {
-    if (argc>i)
-        return parseval(argv[i]);
-    return 0;
-}
-
-#elif (SEED_METHOD==SEED_FUNC)
-/* If using OS based function, you must define and implement the functions below in core_portme.h and core_portme.c ! */
-ee_s32 get_seed_32(int i) {
-    ee_s32 retval;
-    switch (i) {
-        case 1:
-            retval=portme_sys1();
-            break;
-        case 2:
-            retval=portme_sys2();
-            break;
-        case 3:
-            retval=portme_sys3();
-            break;
-        case 4:
-            retval=portme_sys4();
-            break;
-        case 5:
-            retval=portme_sys5();
-            break;
-        default:
-            retval=0;
-            break;
-    }
-    return retval;
-}
-#endif
-
-/* Function: crc*
-    Service functions to calculate 16b CRC code.
-
-*/
-ee_u16 crcu8(ee_u8 data, ee_u16 crc )
-{
-    ee_u8 i=0,x16=0,carry=0;
-
-    for (i = 0; i < 8; i++)
-    {
-        x16 = (ee_u8)((data & 1) ^ ((ee_u8)crc & 1));
-        data >>= 1;
-
-        if (x16 == 1)
-        {
-           crc ^= 0x4002;
-           carry = 1;
-        }
-        else
-            carry = 0;
-        crc >>= 1;
-        if (carry)
-           crc |= 0x8000;
-        else
-           crc &= 0x7fff;
-    }
-    return crc;
-}
-ee_u16 crcu16(ee_u16 newval, ee_u16 crc) {
-    crc=crcu8( (ee_u8) (newval)                ,crc);
-    crc=crcu8( (ee_u8) ((newval)>>8)    ,crc);
-    return crc;
-}
-ee_u16 crcu32(ee_u32 newval, ee_u16 crc) {
-    crc=crc16((ee_s16) newval        ,crc);
-    crc=crc16((ee_s16) (newval>>16)    ,crc);
-    return crc;
-}
-ee_u16 crc16(ee_s16 newval, ee_u16 crc) {
-    return crcu16((ee_u16)newval, crc);
-}
-
-ee_u8 check_data_types() {
-    ee_u8 retval=0;
-    if (sizeof(ee_u8) != 1) {
-        ee_printf("ERROR: ee_u8 is not an 8b datatype!\n");
-        retval++;
-    }
-    if (sizeof(ee_u16) != 2) {
-        ee_printf("ERROR: ee_u16 is not a 16b datatype!\n");
-        retval++;
-    }
-    if (sizeof(ee_s16) != 2) {
-        ee_printf("ERROR: ee_s16 is not a 16b datatype!\n");
-        retval++;
-    }
-    if (sizeof(ee_s32) != 4) {
-        ee_printf("ERROR: ee_s32 is not a 32b datatype!\n");
-        retval++;
-    }
-    if (sizeof(ee_u32) != 4) {
-        ee_printf("ERROR: ee_u32 is not a 32b datatype!\n");
-        retval++;
-    }
-    if (sizeof(ee_ptr_int) != sizeof(int *)) {
-        ee_printf("ERROR: ee_ptr_int is not a datatype that holds an int pointer!\n");
-        retval++;
-    }
-    if (retval>0) {
-        ee_printf("ERROR: Please modify the datatypes in core_portme.h!\n");
-    }
-    return retval;
-}
diff --git a/apps/coremark/src/main.c b/apps/coremark/src/main.c
new file mode 100644
index 0000000..8eed66d
--- /dev/null
+++ b/apps/coremark/src/main.c
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+#include "console/console.h"
+#include "coremark/coremark_api.h"
+
+extern uint32_t SystemCoreClock;
+
+int
+mynewt_main(int argc, char **argv)
+{
+    sysinit();
+
+    printf("Coremark running on %s at %lu MHz\n\n", MYNEWT_VAL(BSP_NAME), SystemCoreClock / 1000000L);
+
+    coremark_run();
+
+    while (1) {
+        os_eventq_run(os_eventq_dflt_get());
+    }
+}
diff --git a/apps/coremark/syscfg.yml b/apps/coremark/syscfg.yml
index 0a9983d..630e671 100644
--- a/apps/coremark/syscfg.yml
+++ b/apps/coremark/syscfg.yml
@@ -16,15 +16,11 @@
 # under the License.
 #
 
-syscfg.defs:
-    COREMARK_ITERATIONS:
-        description: Number of iterations to run
-        value: 0
-
 syscfg.vals:
     CONSOLE_IMPLEMENTATION: full
     LOG_IMPLEMENTATION: stub
     STATS_IMPLEMENTATION: stub
+    COREMARK_SHELL: 0
 
 syscfg.vals.HARDFLOAT:
     FLOAT_USER: 1
diff --git a/util/coremark/include/coremark/coremark_api.h b/util/coremark/include/coremark/coremark_api.h
new file mode 100644
index 0000000..bdd324e
--- /dev/null
+++ b/util/coremark/include/coremark/coremark_api.h
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+#ifndef _COREMARK_API_H_
+#define _COREMARK_API_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void coremark_run(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _COREMARK_API_H_ */
diff --git a/util/coremark/pkg.yml b/util/coremark/pkg.yml
new file mode 100644
index 0000000..fc9e802
--- /dev/null
+++ b/util/coremark/pkg.yml
@@ -0,0 +1,43 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+pkg.name: util/coremark
+pkg.description: Industry-standard benchmark to measures the MCU performance.
+pkg.author: "EEMBC"
+pkg.homepage: "https://github.com/eembc/coremark"
+pkg.keywords:
+    - benchmark
+
+pkg.deps:
+    - "@apache-mynewt-core/kernel/os"
+    - "@apache-mynewt-core/hw/hal"
+    - "@apache-mynewt-core/sys/console"
+    - "@apache-mynewt-core/util/parse"
+    - "@apache-mynewt-core/util/coremark/repo"
+
+pkg.cflags:
+
+pkg.source_files:
+    - src/core_portme.c
+
+pkg.source_files.COREMARK_SHELL:
+    - src/coremark_shell.c
+
+pkg.init.COREMARK_SHELL:
+    coremark_shell_init_pkg: $after:shell_init
diff --git a/apps/coremark/include/core_portme.h b/util/coremark/repo/include/core_portme.h
similarity index 99%
rename from apps/coremark/include/core_portme.h
rename to util/coremark/repo/include/core_portme.h
index 7d57f73..4d0f038 100644
--- a/apps/coremark/include/core_portme.h
+++ b/util/coremark/repo/include/core_portme.h
@@ -151,7 +151,7 @@
     This flag only matters if MULTITHREAD has been defined to a value greater then 1.
 */
 #ifndef MAIN_HAS_NOARGC
-#define MAIN_HAS_NOARGC 0
+#define MAIN_HAS_NOARGC 1
 #endif
 
 /* Configuration : MAIN_HAS_NORETURN
diff --git a/util/coremark/repo/pkg.yml b/util/coremark/repo/pkg.yml
new file mode 100644
index 0000000..239d5f2
--- /dev/null
+++ b/util/coremark/repo/pkg.yml
@@ -0,0 +1,57 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+pkg.name: util/coremark/repo
+pkg.type: sdk
+pkg.description: Industry-standard benchmark to measures the MCU performance.
+pkg.author: "EEMBC"
+pkg.homepage: "https://github.com/eembc/coremark"
+pkg.keywords:
+    - benchmark
+
+pkg.deps:
+    - "@apache-mynewt-core/kernel/os"
+    - "@apache-mynewt-core/hw/hal"
+    - "@apache-mynewt-core/sys/stats"
+    - "@apache-mynewt-core/sys/log"
+    - "@apache-mynewt-core/sys/console"
+
+pkg.include_dirs:
+    - "@eembc-coremark/."
+
+pkg.source_files:
+    - "@eembc-coremark/core_list_join.c"
+    - "@eembc-coremark/core_main.c"
+    - "@eembc-coremark/core_matrix.c"
+    - "@eembc-coremark/core_state.c"
+    - "@eembc-coremark/core_util.c"
+
+pkg.cflags:
+    - -DFLAGS_STR=""
+    - -Wno-format
+    - -Wno-maybe-uninitialized
+
+pkg.build_profile: speed
+
+repository.eembc-coremark:
+    type: github
+    vers: v1.01-commit
+    branch: main
+    user: eembc
+    repo: coremark
diff --git a/apps/coremark/src/core_portme.c b/util/coremark/src/core_portme.c
similarity index 98%
rename from apps/coremark/src/core_portme.c
rename to util/coremark/src/core_portme.c
index d8b9181..43d6ffe 100644
--- a/apps/coremark/src/core_portme.c
+++ b/util/coremark/src/core_portme.c
@@ -130,3 +130,11 @@
 {
     p->portable_id=0;
 }
+
+void
+coremark_run()
+{
+    int main();
+
+    main();
+}
diff --git a/util/coremark/src/coremark_shell.c b/util/coremark/src/coremark_shell.c
new file mode 100644
index 0000000..a736da8
--- /dev/null
+++ b/util/coremark/src/coremark_shell.c
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+#include <os/mynewt.h>
+
+#include <shell/shell.h>
+#include <parse/parse.h>
+#include <stdio.h>
+#include <coremark/coremark_api.h>
+
+extern uint32_t SystemCoreClock;
+
+static int
+coremark_shell_cmd(int argc, char **argv)
+{
+    printf("Coremark running on %s at %lu MHz\n\n",
+           MYNEWT_VAL(BSP_NAME), SystemCoreClock / 1000000L);
+
+    coremark_run();
+
+    return 0;
+}
+
+static const struct shell_cmd_help coremark_help = {
+    .summary = "Run coremark benchmark",
+    .params = NULL,
+    .usage = NULL,
+};
+
+static const struct shell_cmd coremark_shell_cmd_struct = {
+    .sc_cmd = "coremark",
+    .sc_cmd_func = coremark_shell_cmd,
+    .help = &coremark_help,
+};
+
+void
+coremark_shell_init_pkg(void)
+{
+#if MYNEWT_VAL(SHELL_COMPAT)
+    int rc;
+    rc = shell_cmd_register(&coremark_shell_cmd_struct);
+    SYSINIT_PANIC_ASSERT(rc == 0);
+#endif
+}
diff --git a/util/coremark/syscfg.yml b/util/coremark/syscfg.yml
new file mode 100644
index 0000000..5917d87
--- /dev/null
+++ b/util/coremark/syscfg.yml
@@ -0,0 +1,27 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+syscfg.defs:
+    COREMARK_ITERATIONS:
+        description: Number of iterations to run
+        value: 0
+
+    COREMARK_SHELL:
+        description:
+            If set to 1 adds coremark command to shell.
+        value: 1
