diff --git a/portable/GCC/MCF5235/port.c b/portable/GCC/MCF5235/port.c
deleted file mode 100644
index 9c7e84e..0000000
--- a/portable/GCC/MCF5235/port.c
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
-    FreeRTOS V4.1.1 - Copyright (C) 2003-2006 Richard Barry.
-    MCF5235 Port - Copyright (C) 2006 Christian Walter.
-
-    This file is part of the FreeRTOS distribution.
-
-    FreeRTOS is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License** as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    FreeRTOS is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with FreeRTOS; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-    A special exception to the GPL can be applied should you wish to distribute
-    a combined work that includes FreeRTOS, without being obliged to provide
-    the source code for any proprietary components.  See the licensing section
-    of https://www.FreeRTOS.org for full details of how and when the exception
-    can be applied.
-
-    ***************************************************************************
-    ***************************************************************************
-    *                                                                         *
-    * Get the FreeRTOS eBook!  See https://www.FreeRTOS.org/Documentation     *
-    *                                                                         *
-    * This is a concise, step by step, 'hands on' guide that describes both   *
-    * general multitasking concepts and FreeRTOS specifics. It presents and   *
-    * explains numerous examples that are written using the FreeRTOS API.     *
-    * Full source code for all the examples is provided in an accompanying    *
-    * .zip file.                                                              *
-    *                                                                         *
-    ***************************************************************************
-    ***************************************************************************
-
-	Please ensure to read the configuration and relevant port sections of the
-	online documentation.
-
-	https://www.FreeRTOS.org - Documentation, latest information, license and 
-	contact details.
-
-        https://www.highintegritysystems.com/safertos/ - A version that is
-        certified for use in safety critical systems.
-
-        https://www.highintegritysystems.com/openrtos/ - Commercial support,
-        development, porting, licensing and training services.
-*/
-
-#include <stdlib.h>
-
-#include "FreeRTOS.h"
-#include "FreeRTOSConfig.h"
-#include "task.h"
-
-/* ------------------------ Types ----------------------------------------- */
-typedef volatile uint32_t vuint32;
-typedef volatile uint16_t vuint16;
-typedef volatile uint8_t vuint8;
-
-/* ------------------------ Defines --------------------------------------- */
-#define portVECTOR_TABLE                __RAMVEC
-#define portVECTOR_SYSCALL              ( 32 + portTRAP_YIELD )
-#define portVECTOR_TIMER                ( 64 + 36 )
-
-#define MCF_PIT_PRESCALER               512UL
-#define MCF_PIT_TIMER_TICKS             ( FSYS_2 / MCF_PIT_PRESCALER )
-#define MCF_PIT_MODULUS_REGISTER(freq)  ( MCF_PIT_TIMER_TICKS / ( freq ) - 1UL)
-
-#define MCF_PIT_PMR0                    ( *( vuint16 * )( void * )( &__IPSBAR[ 0x150002 ] ) )
-#define MCF_PIT_PCSR0                   ( *( vuint16 * )( void * )( &__IPSBAR[ 0x150000 ] ) )
-#define MCF_PIT_PCSR_PRE(x)             ( ( ( x ) & 0x000F ) << 8 )
-#define MCF_PIT_PCSR_EN                 ( 0x0001 )
-#define MCF_PIT_PCSR_RLD                ( 0x0002 )
-#define MCF_PIT_PCSR_PIF                ( 0x0004 )
-#define MCF_PIT_PCSR_PIE                ( 0x0008 )
-#define MCF_PIT_PCSR_OVW                ( 0x0010 )
-#define MCF_INTC0_ICR36                 ( *( vuint8 * )( void * )( &__IPSBAR[ 0x000C64 ] ) )
-#define MCF_INTC0_IMRH                  ( *( vuint32 * )( void * )( &__IPSBAR[ 0x000C08 ] ) )
-#define MCF_INTC0_IMRH_INT_MASK36       ( 0x00000010 )
-#define MCF_INTC0_IMRH_MASKALL          ( 0x00000001 )
-#define MCF_INTC0_ICRn_IP(x)            ( ( ( x ) & 0x07 ) << 0 )
-#define MCF_INTC0_ICRn_IL(x)            ( ( ( x ) & 0x07 ) << 3 )
-
-#define portNO_CRITICAL_NESTING         ( ( uint32_t ) 0 )
-#define portINITIAL_CRITICAL_NESTING    ( ( uint32_t ) 10 )
-
-/* ------------------------ Static variables ------------------------------ */
-volatile uint32_t              ulCriticalNesting = portINITIAL_CRITICAL_NESTING;
-
-/* ------------------------ Static functions ------------------------------ */
-#if configUSE_PREEMPTION == 0
-static void prvPortPreemptiveTick ( void ) __attribute__ ((interrupt_handler));
-#else
-static void prvPortPreemptiveTick ( void );
-#endif
-
-/* ------------------------ Start implementation -------------------------- */
-
-StackType_t *
-pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode,
-                       void *pvParameters )
-{
-    /* Place the parameter on the stack in the expected location. */
-    *pxTopOfStack = ( StackType_t ) pvParameters;
-    pxTopOfStack--;
-
-    /* Place dummy return address on stack. Tasks should never terminate so
-     * we can set this to anything. */
-    *pxTopOfStack = ( StackType_t ) 0;
-    pxTopOfStack--;
-
-    /* Create a Motorola Coldfire exception stack frame. First comes the return
-     * address. */
-    *pxTopOfStack = ( StackType_t ) pxCode;
-    pxTopOfStack--;
-
-    /* Format, fault-status, vector number for exception stack frame. Task
-     * run in supervisor mode. */
-    *pxTopOfStack = 0x40002000UL | ( portVECTOR_SYSCALL + 32 ) << 18;
-    pxTopOfStack--;
-
-    /* Set the initial critical section nesting counter to zero. This value
-     * is used to restore the value of ulCriticalNesting. */
-    *pxTopOfStack = 0;
-    *pxTopOfStack--;
-
-    *pxTopOfStack = ( StackType_t ) 0xA6;    /* A6 / FP */
-    pxTopOfStack--;
-    *pxTopOfStack = ( StackType_t ) 0xA5;    /* A5 */
-    pxTopOfStack--;
-    *pxTopOfStack = ( StackType_t ) 0xA4;    /* A4 */
-    pxTopOfStack--;
-    *pxTopOfStack = ( StackType_t ) 0xA3;    /* A3 */
-    pxTopOfStack--;
-    *pxTopOfStack = ( StackType_t ) 0xA2;    /* A2 */
-    pxTopOfStack--;
-    *pxTopOfStack = ( StackType_t ) 0xA1;    /* A1 */
-    pxTopOfStack--;
-    *pxTopOfStack = ( StackType_t ) 0xA0;    /* A0 */
-    pxTopOfStack--;
-    *pxTopOfStack = ( StackType_t ) 0xD7;    /* D7 */
-    pxTopOfStack--;
-    *pxTopOfStack = ( StackType_t ) 0xD6;    /* D6 */
-    pxTopOfStack--;
-    *pxTopOfStack = ( StackType_t ) 0xD5;    /* D5 */
-    pxTopOfStack--;
-    *pxTopOfStack = ( StackType_t ) 0xD4;    /* D4 */
-    pxTopOfStack--;
-    *pxTopOfStack = ( StackType_t ) 0xD3;    /* D3 */
-    pxTopOfStack--;
-    *pxTopOfStack = ( StackType_t ) 0xD2;    /* D2 */
-    pxTopOfStack--;
-    *pxTopOfStack = ( StackType_t ) 0xD1;    /* D1 */
-    pxTopOfStack--;
-    *pxTopOfStack = ( StackType_t ) 0xD0;    /* D0 */
-
-    return pxTopOfStack;
-}
-
-/*
- * Called by portYIELD() or taskYIELD() to manually force a context switch.
- */
-static void
-prvPortYield( void )
-{
-    asm volatile ( "move.w  #0x2700, %sr\n\t" );
-#if _GCC_USES_FP == 1
-    asm volatile ( "unlk %fp\n\t" );
-#endif
-     /* Perform the context switch.  First save the context of the current task. */
-    portSAVE_CONTEXT(  );
-
-    /* Find the highest priority task that is ready to run. */
-    vTaskSwitchContext(  );
-
-    /* Restore the context of the new task. */
-    portRESTORE_CONTEXT(  );
-}
-
-#if configUSE_PREEMPTION == 0
-/*
- * The ISR used for the scheduler tick depends on whether the cooperative or
- * the preemptive scheduler is being used.
- */
-static void
-prvPortPreemptiveTick ( void )
-{
-    /* The cooperative scheduler requires a normal IRQ service routine to
-     * simply increment the system tick.
-     */
-
-    xTaskIncrementTick();
-    MCF_PIT_PCSR0 |= MCF_PIT_PCSR_PIF;
-}
-
-#else
-
-static void
-prvPortPreemptiveTick( void )
-{
-    asm volatile ( "move.w  #0x2700, %sr\n\t" );
-#if _GCC_USES_FP == 1
-    asm volatile ( "unlk %fp\n\t" );
-#endif
-    portSAVE_CONTEXT(  );
-    MCF_PIT_PCSR0 |= MCF_PIT_PCSR_PIF;
-    if( xTaskIncrementTick() != pdFALSE )
-	{
-		vTaskSwitchContext(  );
-	}
-    portRESTORE_CONTEXT(  );
-}
-#endif
-
-void
-vPortEnterCritical()
-{
-    /* FIXME: We should store the old IPL here - How are we supposed to do
-     * this.
-     */
-    ( void )portSET_IPL( portIPL_MAX );
-
-    /* Now interrupts are disabled ulCriticalNesting can be accessed
-     * directly.  Increment ulCriticalNesting to keep a count of how many times
-     * portENTER_CRITICAL() has been called. */
-    ulCriticalNesting++;
-}
-
-void
-vPortExitCritical()
-{
-    if( ulCriticalNesting > portNO_CRITICAL_NESTING )
-    {
-        /* Decrement the nesting count as we are leaving a critical section. */
-        ulCriticalNesting--;
-
-        /* If the nesting level has reached zero then interrupts should be
-        re-enabled. */
-        if( ulCriticalNesting == portNO_CRITICAL_NESTING )
-        {
-            ( void )portSET_IPL( 0 );
-        }
-    }
-}
-
-BaseType_t
-xPortStartScheduler( void )
-{
-    extern void     ( *portVECTOR_TABLE[  ] ) (  );
-
-    /* Add entry in vector table for yield system call. */
-    portVECTOR_TABLE[ portVECTOR_SYSCALL ] = prvPortYield;
-    /* Add entry in vector table for periodic timer. */
-    portVECTOR_TABLE[ portVECTOR_TIMER ] = prvPortPreemptiveTick;
-
-    /* Configure the timer for the system clock. */
-    if ( configTICK_RATE_HZ > 0)
-    {
-        /* Configure prescaler */
-        MCF_PIT_PCSR0 = MCF_PIT_PCSR_PRE( 0x9 ) | MCF_PIT_PCSR_RLD | MCF_PIT_PCSR_OVW;
-        /* Initialize the periodic timer interrupt. */
-        MCF_PIT_PMR0 = MCF_PIT_MODULUS_REGISTER( configTICK_RATE_HZ );
-        /* Configure interrupt priority and level and unmask interrupt. */
-        MCF_INTC0_ICR36 = MCF_INTC0_ICRn_IL( 0x1 ) | MCF_INTC0_ICRn_IP( 0x1 );
-        MCF_INTC0_IMRH &= ~( MCF_INTC0_IMRH_INT_MASK36 | MCF_INTC0_IMRH_MASKALL );
-        /* Enable interrupts */
-        MCF_PIT_PCSR0 |= MCF_PIT_PCSR_PIE | MCF_PIT_PCSR_EN | MCF_PIT_PCSR_PIF;
-    }
-
-    /* Restore the context of the first task that is going to run. */
-    portRESTORE_CONTEXT(  );
-
-    /* Should not get here. */
-    return pdTRUE;
-}
-
-void
-vPortEndScheduler( void )
-{
-}
diff --git a/portable/GCC/MCF5235/portmacro.h b/portable/GCC/MCF5235/portmacro.h
deleted file mode 100644
index 065667f..0000000
--- a/portable/GCC/MCF5235/portmacro.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
-    FreeRTOS V4.1.1 - Copyright (C) 2003-2006 Richard Barry.
-    MCF5235 Port - Copyright (C) 2006 Christian Walter.
-
-    This file is part of the FreeRTOS distribution.
-
-    FreeRTOS is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License** as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    FreeRTOS is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with FreeRTOS; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-    A special exception to the GPL can be applied should you wish to distribute
-    a combined work that includes FreeRTOS, without being obliged to provide
-    the source code for any proprietary components.  See the licensing section
-    of https://www.FreeRTOS.org for full details of how and when the exception
-    can be applied.
-
-    ***************************************************************************
-    ***************************************************************************
-    *                                                                         *
-    * Get the FreeRTOS eBook!  See https://www.FreeRTOS.org/Documentation      *
-	*                                                                         *
-	* This is a concise, step by step, 'hands on' guide that describes both   *
-	* general multitasking concepts and FreeRTOS specifics. It presents and   *
-	* explains numerous examples that are written using the FreeRTOS API.     *
-	* Full source code for all the examples is provided in an accompanying    *
-	* .zip file.                                                              *
-    *                                                                         *
-    ***************************************************************************
-    ***************************************************************************
-
-	Please ensure to read the configuration and relevant port sections of the
-	online documentation.
-
-	https://www.FreeRTOS.org - Documentation, latest information, license and
-	contact details.
-
-        https://www.highintegritysystems.com/safertos/ - A version that is
-        certified for use in safety critical systems.
-
-        https://www.highintegritysystems.com/openrtos/ - Commercial support,
-        development, porting,
-	licensing and training services.
-*/
-
-#ifndef PORTMACRO_H
-#define PORTMACRO_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ------------------------ Data types for Coldfire ----------------------- */
-#define portCHAR        char
-#define portFLOAT       float
-#define portDOUBLE      double
-#define portLONG        long
-#define portSHORT       short
-#define portSTACK_TYPE  unsigned int
-#define portBASE_TYPE   int
-
-typedef portSTACK_TYPE StackType_t;
-typedef long BaseType_t;
-typedef unsigned long UBaseType_t;
-
-#if( configUSE_16_BIT_TICKS == 1 )
-    typedef uint16_t TickType_t;
-    #define portMAX_DELAY ( TickType_t ) 0xffff
-#else
-    typedef uint32_t TickType_t;
-    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
-#endif
-
-/* ------------------------ Architecture specifics ------------------------ */
-#define portSTACK_GROWTH                ( -1 )
-#define portTICK_PERIOD_MS                ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
-#define portBYTE_ALIGNMENT              4
-
-#define portTRAP_YIELD                  0   /* Trap 0 */
-#define portIPL_MAX                     7   /* Only NMI interrupt 7 allowed. */
-
-/* ------------------------ FreeRTOS macros for port ---------------------- */
-
-/*
- * This function must be called when the current state of the active task
- * should be stored. It must be called immediately after exception
- * processing from the CPU, i.e. there exists a Coldfire exception frame at
- * the current position in the stack. The function reserves space on
- * the stack for the CPU registers and other task dependent values (e.g
- * ulCriticalNesting) and updates the top of the stack in the TCB.
- */
-#define portSAVE_CONTEXT()                                                   \
-    asm volatile ( /* reserve space for task state. */                       \
-                   "lea.l   (-64, %sp), %sp\n\t"                             \
-                   /* push data register %d0-%d7/%a0-%a6 on stack. */        \
-                   "movem.l %d0-%d7/%a0-%a6, (%sp)\n\t"                      \
-                   /* push ulCriticalNesting counter on stack. */            \
-                   "lea.l  (60, %sp), %a0\n\t"                               \
-                   "move.l  ulCriticalNesting, (%a0)\n\t"                    \
-                   /* set the new top of the stack in the TCB. */            \
-                   "move.l  pxCurrentTCB, %a0\n\t"                           \
-                   "move.l  %sp, (%a0)");
-
-/*.
- * This function restores the current active and continues its execution.
- * It loads the current TCB and restores the processor registers, the
- * task dependent values (e.g ulCriticalNesting). Finally execution
- * is continued by executing an rte instruction.
- */
-#define portRESTORE_CONTEXT()                                                \
-    asm volatile ( "move.l  pxCurrentTCB, %sp\n\t"                           \
-                   "move.l  (%sp), %sp\n\t"                                  \
-                   /* stack pointer now points to the saved registers. */    \
-                   "movem.l (%sp), %d0-%d7/%a0-%a6\n\t"                      \
-                   /* restore ulCriticalNesting counter from stack. */       \
-                   "lea.l   (%sp, 60), %sp\n\t"                              \
-                   "move.l  (%sp)+, ulCriticalNesting\n\t"                   \
-                   /* stack pointer now points to exception frame. */        \
-                   "rte\n\t" );
-
-#define portENTER_CRITICAL()                                                 \
-    vPortEnterCritical();
-
-#define portEXIT_CRITICAL()                                                  \
-    vPortExitCritical();
-
-#define portSET_IPL( xIPL )                                                  \
-    asm_set_ipl( xIPL )
-
-#define portDISABLE_INTERRUPTS() \
-    do { ( void )portSET_IPL( portIPL_MAX ); } while( 0 )
-#define portENABLE_INTERRUPTS() \
-    do { ( void )portSET_IPL( 0 ); } while( 0 )
-
-#define portYIELD()                                                          \
-    asm volatile ( " trap   %0\n\t" : : "i"(portTRAP_YIELD) )
-
-#define portNOP()                                                            \
-    asm volatile ( "nop\n\t" )
-
-#define portENTER_SWITCHING_ISR()                                            \
-    asm volatile ( "move.w  #0x2700, %sr" );                                 \
-    /* Save the context of the interrupted task. */                          \
-    portSAVE_CONTEXT(  );                                                    \
-    {
-
-#define portEXIT_SWITCHING_ISR( SwitchRequired )                             \
-        /* If a switch is required we call vTaskSwitchContext(). */          \
-        if( SwitchRequired )                                                 \
-        {                                                                    \
-            vTaskSwitchContext(  );                                          \
-        }                                                                    \
-    }                                                                        \
-    portRESTORE_CONTEXT(  );
-
-/* ------------------------ Function prototypes --------------------------- */
-void vPortEnterCritical( void );
-void vPortExitCritical( void );
-int asm_set_ipl( uint32_t int uiNewIPL );
-
-/* ------------------------ Compiler specifics ---------------------------- */
-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters )                   \
-    void vFunction( void *pvParameters )
-
-#define portTASK_FUNCTION( vFunction, pvParameters )                         \
-    void vFunction( void *pvParameters )
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* PORTMACRO_H */
-
diff --git a/portable/GCC/MCF5235/readme.md b/portable/GCC/MCF5235/readme.md
new file mode 100644
index 0000000..650cfcc
--- /dev/null
+++ b/portable/GCC/MCF5235/readme.md
@@ -0,0 +1,2 @@
+The MCF5235 port is deprecated. The last FreeRTOS version that includes this port is 10.4.3.
+
