diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 5c0ef5d..176b679 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -20,10 +20,18 @@
     </configurations>
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="cea36e80-e289-4d69-9030-7186d540ac0e" name="更改" comment="掃描下翻譯">
+    <list default="true" id="cea36e80-e289-4d69-9030-7186d540ac0e" name="更改" comment="fix https://github.com/losehu/uv-k5-firmware-chinese/issues/4">
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/app/app.c" beforeDir="false" afterPath="$PROJECT_DIR$/app/app.c" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/app/menu.c" beforeDir="false" afterPath="$PROJECT_DIR$/app/menu.c" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/app/uart.c" beforeDir="false" afterPath="$PROJECT_DIR$/app/uart.c" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/board.c" beforeDir="false" afterPath="$PROJECT_DIR$/board.c" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/board.h" beforeDir="false" afterPath="$PROJECT_DIR$/board.h" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/main.c" beforeDir="false" afterPath="$PROJECT_DIR$/main.c" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/radio.c" beforeDir="false" afterPath="$PROJECT_DIR$/radio.c" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/settings.c" beforeDir="false" afterPath="$PROJECT_DIR$/settings.c" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/settings.h" beforeDir="false" afterPath="$PROJECT_DIR$/settings.h" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ui/main.c" beforeDir="false" afterPath="$PROJECT_DIR$/ui/main.c" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/ui/menu.c" beforeDir="false" afterPath="$PROJECT_DIR$/ui/menu.c" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
@@ -127,7 +135,8 @@
       <workItem from="1701269777451" duration="21031000" />
       <workItem from="1701325367312" duration="22657000" />
       <workItem from="1701413653518" duration="3544000" />
-      <workItem from="1701430185864" duration="9460000" />
+      <workItem from="1701430185864" duration="10115000" />
+      <workItem from="1701559895523" duration="1725000" />
     </task>
     <task id="LOCAL-00001" summary="bug fix">
       <created>1701136012311</created>
@@ -255,7 +264,14 @@
       <option name="project" value="LOCAL" />
       <updated>1701439333297</updated>
     </task>
-    <option name="localTasksCounter" value="19" />
+    <task id="LOCAL-00019" summary="fix https://github.com/losehu/uv-k5-firmware-chinese/issues/4">
+      <created>1701484068802</created>
+      <option name="number" value="00019" />
+      <option name="presentableId" value="LOCAL-00019" />
+      <option name="project" value="LOCAL" />
+      <updated>1701484068802</updated>
+    </task>
+    <option name="localTasksCounter" value="20" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -277,6 +293,7 @@
     <MESSAGE value="rebuild chinese" />
     <MESSAGE value="fix bug" />
     <MESSAGE value="掃描下翻譯" />
-    <option name="LAST_COMMIT_MESSAGE" value="掃描下翻譯" />
+    <MESSAGE value="fix https://github.com/losehu/uv-k5-firmware-chinese/issues/4" />
+    <option name="LAST_COMMIT_MESSAGE" value="fix https://github.com/losehu/uv-k5-firmware-chinese/issues/4" />
   </component>
 </project>
\ No newline at end of file
diff --git a/app/app.c b/app/app.c
index 90f3ada..2c08ca4 100644
--- a/app/app.c
+++ b/app/app.c
@@ -1190,7 +1190,6 @@ void APP_TimeSlice10ms(void)
 #endif
 
 #ifdef ENABLE_AM_FIX
-    //		if (gEeprom.VfoInfo[gEeprom.RX_VFO].Modulation != MODULATION_FM && gSetting_AM_fix)
 		if (gRxVfo->Modulation == MODULATION_AM && gSetting_AM_fix)
 			AM_fix_10ms(gEeprom.RX_VFO);
 #endif
@@ -2025,7 +2024,7 @@ static void ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
 
     if (gRequestSaveChannel > 0)
     {
-        if (!bKeyHeld)
+        if (!bKeyHeld)// TODO: remove the gRequestSaveChannel, why use global variable for that??
         {
             SETTINGS_SaveChannel(gTxVfo->CHANNEL_SAVE, gEeprom.TX_VFO, gTxVfo, gRequestSaveChannel);
 
diff --git a/app/menu.c b/app/menu.c
index d90f66d..eb0a403 100644
--- a/app/menu.c
+++ b/app/menu.c
@@ -381,7 +381,6 @@ void MENU_AcceptSetting(void)
 {
 	int32_t        Min;
 	int32_t        Max;
-	uint8_t        Code;
 	FREQ_Config_t *pConfig = &gTxVfo->freq_config_RX;
 
 	if (!MENU_GetLimits(UI_MENU_GetCurrentMenuId(), &Min, &Max))
@@ -393,90 +392,74 @@ void MENU_AcceptSetting(void)
     char a=gSubMenuSelection;//UART_Send(a,1);
     UART_Send((uint8_t *)&a, 1);
 
-    switch (UI_MENU_GetCurrentMenuId())
-	{
-		default:
-			return;
+    switch (UI_MENU_GetCurrentMenuId()) {
+        default:
+            return;
 
-		case MENU_SQL:
-			gEeprom.SQUELCH_LEVEL = gSubMenuSelection;
-			gVfoConfigureMode     = VFO_CONFIGURE;
-			break;
+        case MENU_SQL:
+            gEeprom.SQUELCH_LEVEL = gSubMenuSelection;
+            gVfoConfigureMode = VFO_CONFIGURE;
+            break;
 
-		case MENU_STEP:
-			gTxVfo->STEP_SETTING = FREQUENCY_GetStepIdxFromSortedIdx(gSubMenuSelection);
-			if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE))
-			{
-				gRequestSaveChannel = 1;
-				return;
-			}
-			return;
+        case MENU_STEP:
+            gTxVfo->STEP_SETTING = FREQUENCY_GetStepIdxFromSortedIdx(gSubMenuSelection);
+            if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) {
+                gRequestSaveChannel = 1;
+                return;
+            }
+            return;
 
 //		case MENU_TXP:
 //			gTxVfo->OUTPUT_POWER = gSubMenuSelection;
 //			gRequestSaveChannel = 1;
 //			return;
 
-		case MENU_T_DCS:
-			pConfig = &gTxVfo->freq_config_TX;
+        case MENU_T_DCS:
+            pConfig = &gTxVfo->freq_config_TX;
 
-			// Fallthrough
+            // Fallthrough
 
-		case MENU_R_DCS:
-			if (gSubMenuSelection == 0)
-			{
-				if (pConfig->CodeType != CODE_TYPE_DIGITAL && pConfig->CodeType != CODE_TYPE_REVERSE_DIGITAL)
-				{
-					gRequestSaveChannel = 1;
-					return;
-				}
-				Code              = 0;
-				pConfig->CodeType = CODE_TYPE_OFF;
-			}
-			else
-			if (gSubMenuSelection < 105)
-			{
-				pConfig->CodeType = CODE_TYPE_DIGITAL;
-				Code              = gSubMenuSelection - 1;
-			}
-			else
-			{
-				pConfig->CodeType = CODE_TYPE_REVERSE_DIGITAL;
-				Code              = gSubMenuSelection - 105;
-			}
-
-			pConfig->Code       = Code;
-			gRequestSaveChannel = 1;
-			return;
+        case MENU_R_DCS:{
+            if (gSubMenuSelection == 0) {
+                if (pConfig->CodeType == CODE_TYPE_CONTINUOUS_TONE) {
+                    return;
+                }
+                pConfig->Code = 0;
+                pConfig->CodeType = CODE_TYPE_OFF;
+            } else if (gSubMenuSelection < 105) {
+                pConfig->CodeType = CODE_TYPE_DIGITAL;
+                pConfig->Code = gSubMenuSelection - 1;
+            } else {
+                pConfig->CodeType = CODE_TYPE_REVERSE_DIGITAL;
+                pConfig->Code = gSubMenuSelection - 105;
+            }
 
+            gRequestSaveChannel = 1;
+            return;
+    }
 		case MENU_T_CTCS:
 			pConfig = &gTxVfo->freq_config_TX;
 			[[fallthrough]];
-		case MENU_R_CTCS:
+		case MENU_R_CTCS:{
 			if (gSubMenuSelection == 0)
 			{
 				if (pConfig->CodeType != CODE_TYPE_CONTINUOUS_TONE)
 				{
-					gRequestSaveChannel = 1;
 					return;
 				}
-				Code              = 0;
-				pConfig->Code     = Code;
+                pConfig->Code = 0;
 				pConfig->CodeType = CODE_TYPE_OFF;
 
-				BK4819_ExitSubAu();
 			}
-			else
-			{
-				pConfig->CodeType = CODE_TYPE_CONTINUOUS_TONE;
-				Code              = gSubMenuSelection - 1;
-				pConfig->Code     = Code;
+            else {
+                pConfig->Code     = gSubMenuSelection - 1;
+                pConfig->CodeType = CODE_TYPE_CONTINUOUS_TONE;
 
-				BK4819_SetCTCSSFrequency(CTCSS_Options[Code]);
-			}
+            }
 
-			gRequestSaveChannel = 1;
-			return;
+            gRequestSaveChannel = 1;
+            return;
+    }
 
 		case MENU_SFT_D:
 			gTxVfo->TX_OFFSET_FREQUENCY_DIRECTION = gSubMenuSelection;
@@ -522,21 +505,14 @@ void MENU_AcceptSetting(void)
 			return;
 
 		case MENU_MEM_NAME:
-			{	// trailing trim
-				for (int i = 9; i >= 0; i--)
-				{
-					if (edit[i] != ' ' && edit[i] != '_' && edit[i] != 0x00 && edit[i] != 0xff)
-						break;
-					edit[i] = ' ';
-				}
+				// trailing trim
+                for (int i = 9; i >= 0; i--) {
+                    if (edit[i] != ' ' && edit[i] != '_' && edit[i] != 0x00 && edit[i] != 0xff)
+                        break;
+                    edit[i] = ' ';
 			}
 
-			// save the channel name
-			memset(gTxVfo->Name, 0, sizeof(gTxVfo->Name));
-			memmove(gTxVfo->Name, edit, 10);
-//bug
-			SETTINGS_SaveChannel(gSubMenuSelection, gEeprom.TX_VFO, gTxVfo, 3);
-			gFlagReconfigureVfos = true;
+            SETTINGS_SaveChannelName(gSubMenuSelection, edit);
 			return;
 
 		case MENU_SAVE:
@@ -548,7 +524,7 @@ void MENU_AcceptSetting(void)
 //				gEeprom.VOX_SWITCH = gSubMenuSelection != 0;
 //				if (gEeprom.VOX_SWITCH)
 //					gEeprom.VOX_LEVEL = gSubMenuSelection - 1;
-//				BOARD_EEPROM_LoadCalibration();
+//				SETTINGS_LoadCalibration();
 //				gFlagReconfigureVfos = true;
 //				gUpdateStatus        = true;
 //				break;
@@ -631,7 +607,7 @@ void MENU_AcceptSetting(void)
 
 		case MENU_MIC:
 			gEeprom.MIC_SENSITIVITY = gSubMenuSelection;
-			BOARD_EEPROM_LoadCalibration();
+            SETTINGS_LoadCalibration();
 			gFlagReconfigureVfos = true;
 			break;
 
@@ -759,8 +735,8 @@ void MENU_AcceptSetting(void)
 			return;
 
 		case MENU_RESET:
-			BOARD_FactoryReset(gSubMenuSelection);
-			return;
+            SETTINGS_FactoryReset(gSubMenuSelection);
+            return;
 
 		case MENU_350TX:
 			gSetting_350TX = gSubMenuSelection;
@@ -1469,8 +1445,7 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
 			if (!RADIO_CheckValidChannel(gSubMenuSelection, false, 0))
 				return;
 
-			BOARD_fetchChannelName(edit, gSubMenuSelection);
-
+            SETTINGS_FetchChannelName(edit, gSubMenuSelection);
 			// pad the channel name out with '_'
 			edit_index = strlen(edit);
 			while (edit_index < 10)
diff --git a/app/uart.c b/app/uart.c
index 5186a85..064646f 100644
--- a/app/uart.c
+++ b/app/uart.c
@@ -314,8 +314,8 @@ static void CMD_051D(const uint8_t *pBuffer)
 		}
 
 		if (bReloadEeprom)
-			BOARD_EEPROM_Init();
-	}
+            SETTINGS_InitEEPROM();
+    }
 
 	SendReply(&Reply, sizeof(Reply));
 }
diff --git a/board.c b/board.c
index e3c5ef1..a774edd 100644
--- a/board.c
+++ b/board.c
@@ -16,7 +16,6 @@
 
 #include <string.h>
 
-#include "app/dtmf.h"
 #ifdef ENABLE_FMRADIO
 #include "app/fm.h"
 #endif
@@ -30,7 +29,7 @@
 #ifdef ENABLE_FMRADIO
 #include "driver/bk1080.h"
 #endif
-#include "driver/bk4819.h"
+
 #include "driver/crc.h"
 #include "driver/eeprom.h"
 #include "driver/flash.h"
@@ -44,16 +43,6 @@
 #if defined(ENABLE_OVERLAY)
 #include "sram-overlay.h"
 #endif
-#include "ui/menu.h"
-
-static const uint32_t gDefaultFrequencyTable[] =
-        {
-                14500000,    //
-                14550000,    //
-                43300000,    //
-                43320000,    //
-                43350000     //
-        };
 
 #if defined(ENABLE_OVERLAY)
 void BOARD_FLASH_Init(void)
@@ -511,390 +500,3 @@ void BOARD_Init(void)
     CRC_Init();
 }
 
-void BOARD_EEPROM_Init(void)
-{
-    unsigned int i;
-    uint8_t      Data[16];
-
-    memset(Data, 0, sizeof(Data));
-
-    // 0E70..0E77
-    EEPROM_ReadBuffer(0x0E70, Data, 8);
-    gEeprom.CHAN_1_CALL          = IS_MR_CHANNEL(Data[0]) ? Data[0] : MR_CHANNEL_FIRST;
-    gEeprom.SQUELCH_LEVEL        = (Data[1] < 10) ? Data[1] : 1;
-    gEeprom.TX_TIMEOUT_TIMER     = (Data[2] < 11) ? Data[2] : 1;
-#ifdef ENABLE_NOAA
-    gEeprom.NOAA_AUTO_SCAN   = (Data[3] <  2) ? Data[3] : false;
-#endif
-    gEeprom.KEY_LOCK             = (Data[4] <  2) ? Data[4] : false;
-#ifdef ENABLE_VOX
-    gEeprom.VOX_SWITCH       = (Data[5] <  2) ? Data[5] : false;
-		gEeprom.VOX_LEVEL        = (Data[6] < 10) ? Data[6] : 1;
-#endif
-    gEeprom.MIC_SENSITIVITY      = (Data[7] <  5) ? Data[7] : 4;
-
-    // 0E78..0E7F
-    EEPROM_ReadBuffer(0x0E78, Data, 8);
-    gEeprom.BACKLIGHT_MAX 		  = (Data[0] & 0xF) <= 10 ? (Data[0] & 0xF) : 10;
-  //  gEeprom.BACKLIGHT_MIN 		  = 0;//(Data[0] >> 4) < gEeprom.BACKLIGHT_MAX ? (Data[0] >> 4) : 0;
-#ifdef ENABLE_BLMIN_TMP_OFF
-    gEeprom.BACKLIGHT_MIN_STAT	  = BLMIN_STAT_ON;
-#endif
-    gEeprom.CHANNEL_DISPLAY_MODE  = (Data[1] < 4) ? Data[1] : MDF_FREQUENCY;    // 4 instead of 3 - extra display mode
-    gEeprom.CROSS_BAND_RX_TX      = (Data[2] < 3) ? Data[2] : CROSS_BAND_OFF;
-    gEeprom.BATTERY_SAVE          = (Data[3] < 5) ? Data[3] : 4;
-    gEeprom.DUAL_WATCH            = (Data[4] < 3) ? Data[4] : DUAL_WATCH_CHAN_A;
-    gEeprom.BACKLIGHT_TIME        = (Data[5] < ARRAY_SIZE(gSubMenu_BACKLIGHT)) ? Data[5] : 3;
-    gEeprom.TAIL_TONE_ELIMINATION = (Data[6] < 2) ? Data[6] : false;
-    gEeprom.VFO_OPEN              = (Data[7] < 2) ? Data[7] : true;
-
-    // 0E80..0E87
-    EEPROM_ReadBuffer(0x0E80, Data, 8);
-    gEeprom.ScreenChannel[0]   = IS_VALID_CHANNEL(Data[0]) ? Data[0] : (FREQ_CHANNEL_FIRST + BAND6_400MHz);
-    gEeprom.ScreenChannel[1]   = IS_VALID_CHANNEL(Data[3]) ? Data[3] : (FREQ_CHANNEL_FIRST + BAND6_400MHz);
-    gEeprom.MrChannel[0]       = IS_MR_CHANNEL(Data[1])    ? Data[1] : MR_CHANNEL_FIRST;
-    gEeprom.MrChannel[1]       = IS_MR_CHANNEL(Data[4])    ? Data[4] : MR_CHANNEL_FIRST;
-    gEeprom.FreqChannel[0]     = IS_FREQ_CHANNEL(Data[2])  ? Data[2] : (FREQ_CHANNEL_FIRST + BAND6_400MHz);
-    gEeprom.FreqChannel[1]     = IS_FREQ_CHANNEL(Data[5])  ? Data[5] : (FREQ_CHANNEL_FIRST + BAND6_400MHz);
-#ifdef ENABLE_NOAA
-    gEeprom.NoaaChannel[0] = IS_NOAA_CHANNEL(Data[6])  ? Data[6] : NOAA_CHANNEL_FIRST;
-		gEeprom.NoaaChannel[1] = IS_NOAA_CHANNEL(Data[7])  ? Data[7] : NOAA_CHANNEL_FIRST;
-#endif
-
-#ifdef ENABLE_FMRADIO
-    {	// 0E88..0E8F
-		struct
-		{
-			uint16_t SelectedFrequency;
-			uint8_t  SelectedChannel;
-			uint8_t  IsMrMode;
-			uint8_t  Padding[8];
-		} __attribute__((packed)) FM;
-
-		EEPROM_ReadBuffer(0x0E88, &FM, 8);
-		gEeprom.FM_LowerLimit = 760;
-		gEeprom.FM_UpperLimit = 1080;
-		if (FM.SelectedFrequency < gEeprom.FM_LowerLimit || FM.SelectedFrequency > gEeprom.FM_UpperLimit)
-			gEeprom.FM_SelectedFrequency = 960;
-		else
-			gEeprom.FM_SelectedFrequency = FM.SelectedFrequency;
-
-		gEeprom.FM_SelectedChannel = FM.SelectedChannel;
-		gEeprom.FM_IsMrMode        = (FM.IsMrMode < 2) ? FM.IsMrMode : false;
-	}
-
-	// 0E40..0E67
-	EEPROM_ReadBuffer(0x0E40, gFM_Channels, sizeof(gFM_Channels));
-	FM_ConfigureChannelState();
-#endif
-
-    // 0E90..0E97
-    EEPROM_ReadBuffer(0x0E90, Data, 8);
-    gEeprom.BEEP_CONTROL                 = Data[0] & 1;
-    gEeprom.KEY_M_LONG_PRESS_ACTION      = ((Data[0] >> 1) < ACTION_OPT_LEN) ? (Data[0] >> 1) : ACTION_OPT_NONE;
-    gEeprom.KEY_1_SHORT_PRESS_ACTION     = (Data[1] < ACTION_OPT_LEN) ? Data[1] : ACTION_OPT_MONITOR;
-    gEeprom.KEY_1_LONG_PRESS_ACTION      = (Data[2] < ACTION_OPT_LEN) ? Data[2] : ACTION_OPT_FLASHLIGHT;
-    gEeprom.KEY_2_SHORT_PRESS_ACTION     = (Data[3] < ACTION_OPT_LEN) ? Data[3] : ACTION_OPT_SCAN;
-    gEeprom.KEY_2_LONG_PRESS_ACTION      = (Data[4] < ACTION_OPT_LEN) ? Data[4] : ACTION_OPT_NONE;
-    gEeprom.SCAN_RESUME_MODE             = (Data[5] < 3)              ? Data[5] : SCAN_RESUME_CO;
-   // gEeprom.AUTO_KEYPAD_LOCK             = (Data[6] < 2)              ? Data[6] : false;
-    gEeprom.POWER_ON_DISPLAY_MODE        = (Data[7] < 4)              ? Data[7] : POWER_ON_DISPLAY_MODE_NONE;
-
-    // 0E98..0E9F
-    EEPROM_ReadBuffer(0x0E98, Data, 8);
-    memmove(&gEeprom.POWER_ON_PASSWORD, Data, 4);
-
-    // 0EA0..0EA7
-#ifdef ENABLE_VOICE
-    EEPROM_ReadBuffer(0x0EA0, Data, 8);
-		gEeprom.VOICE_PROMPT = (Data[0] < 3) ? Data[0] : VOICE_PROMPT_ENGLISH;
-#endif
-
-    // 0EA8..0EAF
-    EEPROM_ReadBuffer(0x0EA8, Data, 8);
-#ifdef ENABLE_ALARM
-    gEeprom.ALARM_MODE                 = (Data[0] <  2) ? Data[0] : true;
-#endif
-    gEeprom.ROGER                          = (Data[1] <  3) ? Data[1] : ROGER_MODE_OFF;
-    gEeprom.REPEATER_TAIL_TONE_ELIMINATION = (Data[2] < 11) ? Data[2] : 0;
-    gEeprom.TX_VFO                         = (Data[3] <  2) ? Data[3] : 0;
-    gEeprom.BATTERY_TYPE                   = (Data[4] < BATTERY_TYPE_UNKNOWN) ? Data[4] : BATTERY_TYPE_1600_MAH;
-
-    // 0ED0..0ED7
-    EEPROM_ReadBuffer(0x0ED0, Data, 8);
-    gEeprom.DTMF_SIDE_TONE               = (Data[0] <   2) ? Data[0] : true;
-
-#ifdef ENABLE_DTMF_CALLING
-    gEeprom.DTMF_SEPARATE_CODE           = DTMF_ValidateCodes((char *)(Data + 1), 1) ? Data[1] : '*';
-	gEeprom.DTMF_GROUP_CALL_CODE         = DTMF_ValidateCodes((char *)(Data + 2), 1) ? Data[2] : '#';
-	gEeprom.DTMF_DECODE_RESPONSE         = (Data[3] <   4) ? Data[3] : 0;
-	gEeprom.DTMF_auto_reset_time         = (Data[4] <  61) ? Data[4] : (Data[4] >= 5) ? Data[4] : 10;
-#endif
-    gEeprom.DTMF_PRELOAD_TIME            = (Data[5] < 101) ? Data[5] * 10 : 300;
-    gEeprom.DTMF_FIRST_CODE_PERSIST_TIME = (Data[6] < 101) ? Data[6] * 10 : 100;
-    gEeprom.DTMF_HASH_CODE_PERSIST_TIME  = (Data[7] < 101) ? Data[7] * 10 : 100;
-
-    // 0ED8..0EDF
-    EEPROM_ReadBuffer(0x0ED8, Data, 8);
-    gEeprom.DTMF_CODE_PERSIST_TIME  = (Data[0] < 101) ? Data[0] * 10 : 100;
-    gEeprom.DTMF_CODE_INTERVAL_TIME = (Data[1] < 101) ? Data[1] * 10 : 100;
-#ifdef ENABLE_DTMF_CALLING
-    gEeprom.PERMIT_REMOTE_KILL      = (Data[2] <   2) ? Data[2] : true;
-
-	// 0EE0..0EE7
-
-	EEPROM_ReadBuffer(0x0EE0, Data, 8);
-	if (DTMF_ValidateCodes((char *)Data, 8))
-		memmove(gEeprom.ANI_DTMF_ID, Data, 8);
-	else
-	{
-		memset(gEeprom.ANI_DTMF_ID, 0, sizeof(gEeprom.ANI_DTMF_ID));
-		strcpy(gEeprom.ANI_DTMF_ID, "123");
-	}
-
-
-	// 0EE8..0EEF
-	EEPROM_ReadBuffer(0x0EE8, Data, 8);
-	if (DTMF_ValidateCodes((char *)Data, 8))
-		memmove(gEeprom.KILL_CODE, Data, 8);
-	else
-	{
-		memset(gEeprom.KILL_CODE, 0, sizeof(gEeprom.KILL_CODE));
-		strcpy(gEeprom.KILL_CODE, "ABCD9");
-	}
-
-	// 0EF0..0EF7
-	EEPROM_ReadBuffer(0x0EF0, Data, 8);
-	if (DTMF_ValidateCodes((char *)Data, 8))
-		memmove(gEeprom.REVIVE_CODE, Data, 8);
-	else
-	{
-		memset(gEeprom.REVIVE_CODE, 0, sizeof(gEeprom.REVIVE_CODE));
-		strcpy(gEeprom.REVIVE_CODE, "9DCBA");
-	}
-#endif
-
-    // 0EF8..0F07
-    EEPROM_ReadBuffer(0x0EF8, Data, 16);
-    if (DTMF_ValidateCodes((char *)Data, 16))
-        memmove(gEeprom.DTMF_UP_CODE, Data, 16);
-    else
-    {
-        memset(gEeprom.DTMF_UP_CODE, 0, sizeof(gEeprom.DTMF_UP_CODE));
-        strcpy(gEeprom.DTMF_UP_CODE, "12345");
-    }
-
-    // 0F08..0F17
-    EEPROM_ReadBuffer(0x0F08, Data, 16);
-    if (DTMF_ValidateCodes((char *)Data, 16))
-        memmove(gEeprom.DTMF_DOWN_CODE, Data, 16);
-    else
-    {
-        memset(gEeprom.DTMF_DOWN_CODE, 0, sizeof(gEeprom.DTMF_DOWN_CODE));
-        strcpy(gEeprom.DTMF_DOWN_CODE, "54321");
-    }
-
-    // 0F18..0F1F
-    EEPROM_ReadBuffer(0x0F18, Data, 8);
-//	gEeprom.SCAN_LIST_DEFAULT = (Data[0] < 2) ? Data[0] : false;
-    gEeprom.SCAN_LIST_DEFAULT = (Data[0] < 3) ? Data[0] : false;  // we now have 'all' channel scan option
-    for (i = 0; i < 2; i++)
-    {
-        const unsigned int j = 1 + (i * 3);
-        gEeprom.SCAN_LIST_ENABLED[i]     = (Data[j + 0] < 2) ? Data[j] : false;
-        gEeprom.SCANLIST_PRIORITY_CH1[i] =  Data[j + 1];
-        gEeprom.SCANLIST_PRIORITY_CH2[i] =  Data[j + 2];
-    }
-
-    // 0F40..0F47
-    EEPROM_ReadBuffer(0x0F40, Data, 8);
-    gSetting_F_LOCK            = (Data[0] < F_LOCK_LEN) ? Data[0] : F_LOCK_DEF;
-    gSetting_350TX             = (Data[1] < 2) ? Data[1] : false;  // was true
-#ifdef ENABLE_DTMF_CALLING
-    gSetting_KILLED            = (Data[2] < 2) ? Data[2] : false;
-#endif
-    gSetting_200TX             = (Data[3] < 2) ? Data[3] : false;
-    gSetting_500TX             = (Data[4] < 2) ? Data[4] : false;
-    gSetting_350EN             = (Data[5] < 2) ? Data[5] : true;
-    gSetting_ScrambleEnable    = (Data[6] < 2) ? Data[6] : true;
-    //gSetting_TX_EN             = (Data[7] & (1u << 0)) ? true : false;
-    gSetting_live_DTMF_decoder = (Data[7] & (1u << 1)) ? true : false;
-    //gSetting_battery_text      = (((Data[7] >> 2) & 3u) <= 2) ? (Data[7] >> 2) & 3 : 2;
-#ifdef ENABLE_AUDIO_BAR
-   // gSetting_mic_bar       = (Data[7] & (1u << 4)) ? true : false;
-#endif
-#ifdef ENABLE_AM_FIX
-    gSetting_AM_fix        = (Data[7] & (1u << 5)) ? true : false;
-#endif
-    //gSetting_backlight_on_tx_rx = (Data[7] >> 6) & 3u;
-
-    if (!gEeprom.VFO_OPEN)
-    {
-        gEeprom.ScreenChannel[0] = gEeprom.MrChannel[0];
-        gEeprom.ScreenChannel[1] = gEeprom.MrChannel[1];
-    }
-
-    // 0D60..0E27
-    EEPROM_ReadBuffer(0x0D60, gMR_ChannelAttributes, sizeof(gMR_ChannelAttributes));
-    for(uint16_t i = 0; i < sizeof(gMR_ChannelAttributes); i++) {
-        ChannelAttributes_t *att = &gMR_ChannelAttributes[i];
-        if(att->__val == 0xff){
-            att->__val = 0;
-            att->band = 0xf;
-        }
-    }
-
-    // 0F30..0F3F
-    EEPROM_ReadBuffer(0x0F30, gCustomAesKey, sizeof(gCustomAesKey));
-    bHasCustomAesKey = false;
-    for (i = 0; i < ARRAY_SIZE(gCustomAesKey); i++)
-    {
-        if (gCustomAesKey[i] != 0xFFFFFFFFu)
-        {
-            bHasCustomAesKey = true;
-            return;
-        }
-    }
-}
-
-void BOARD_EEPROM_LoadCalibration(void)
-{
-//	uint8_t Mic;
-
-    EEPROM_ReadBuffer(0x1EC0, gEEPROM_RSSI_CALIB[3], 8);
-    memcpy(gEEPROM_RSSI_CALIB[4], gEEPROM_RSSI_CALIB[3], 8);
-    memcpy(gEEPROM_RSSI_CALIB[5], gEEPROM_RSSI_CALIB[3], 8);
-    memcpy(gEEPROM_RSSI_CALIB[6], gEEPROM_RSSI_CALIB[3], 8);
-
-    EEPROM_ReadBuffer(0x1EC8, gEEPROM_RSSI_CALIB[0], 8);
-    memcpy(gEEPROM_RSSI_CALIB[1], gEEPROM_RSSI_CALIB[0], 8);
-    memcpy(gEEPROM_RSSI_CALIB[2], gEEPROM_RSSI_CALIB[0], 8);
-
-    EEPROM_ReadBuffer(0x1F40, gBatteryCalibration, 12);
-    if (gBatteryCalibration[0] >= 5000)
-    {
-        gBatteryCalibration[0] = 1900;
-        gBatteryCalibration[1] = 2000;
-    }
-    gBatteryCalibration[5] = 2300;
-
-#ifdef ENABLE_VOX
-    EEPROM_ReadBuffer(0x1F50 + (gEeprom.VOX_LEVEL * 2), &gEeprom.VOX1_THRESHOLD, 2);
-		EEPROM_ReadBuffer(0x1F68 + (gEeprom.VOX_LEVEL * 2), &gEeprom.VOX0_THRESHOLD, 2);
-#endif
-
-    //EEPROM_ReadBuffer(0x1F80 + gEeprom.MIC_SENSITIVITY, &Mic, 1);
-    //gEeprom.MIC_SENSITIVITY_TUNING = (Mic < 32) ? Mic : 15;
-    gEeprom.MIC_SENSITIVITY_TUNING = gMicGain_dB2[gEeprom.MIC_SENSITIVITY];
-
-    {
-        struct
-        {
-            int16_t  BK4819_XtalFreqLow;
-            uint16_t EEPROM_1F8A;
-            uint16_t EEPROM_1F8C;
-            uint8_t  VOLUME_GAIN;
-            uint8_t  DAC_GAIN;
-        } __attribute__((packed)) Misc;
-
-        // radio 1 .. 04 00 46 00 50 00 2C 0E
-        // radio 2 .. 05 00 46 00 50 00 2C 0E
-        EEPROM_ReadBuffer(0x1F88, &Misc, 8);
-
-        gEeprom.BK4819_XTAL_FREQ_LOW = (Misc.BK4819_XtalFreqLow >= -1000 && Misc.BK4819_XtalFreqLow <= 1000) ? Misc.BK4819_XtalFreqLow : 0;
-        gEEPROM_1F8A                 = Misc.EEPROM_1F8A & 0x01FF;
-        gEEPROM_1F8C                 = Misc.EEPROM_1F8C & 0x01FF;
-        gEeprom.VOLUME_GAIN          = (Misc.VOLUME_GAIN < 64) ? Misc.VOLUME_GAIN : 58;
-        gEeprom.DAC_GAIN             = (Misc.DAC_GAIN    < 16) ? Misc.DAC_GAIN    : 8;
-
-        BK4819_WriteRegister(BK4819_REG_3B, 22656 + gEeprom.BK4819_XTAL_FREQ_LOW);
-//		BK4819_WriteRegister(BK4819_REG_3C, gEeprom.BK4819_XTAL_FREQ_HIGH);
-    }
-}
-
-uint32_t BOARD_fetchChannelFrequency(const int channel)
-{
-    struct
-    {
-        uint32_t frequency;
-        uint32_t offset;
-    } __attribute__((packed)) info;
-
-    EEPROM_ReadBuffer(channel * 16, &info, sizeof(info));
-
-    return info.frequency;
-}
-
-void BOARD_fetchChannelName(char *s, const int channel)
-{
-    int i;
-
-    if (s == NULL)
-        return;
-
-    memset(s, 0, 11);  // 's' had better be large enough !
-
-    if (channel < 0)
-        return;
-
-    if (!RADIO_CheckValidChannel(channel, false, 0))
-        return;
-
-
-    EEPROM_ReadBuffer(0x0F50 + (channel * 16), s + 0, 8);
-    EEPROM_ReadBuffer(0x0F58 + (channel * 16), s + 8, 2);
-
-    for (i = 0; i < 10; i++)
-        if (s[i] < 32 || s[i] > 127)
-            break;                // invalid char
-
-    s[i--] = 0;                   // null term
-
-    while (i >= 0 && s[i] == 32)  // trim trailing spaces
-        s[i--] = 0;               // null term
-}
-
-void BOARD_FactoryReset(bool bIsAll)
-{
-    uint16_t i;
-    uint8_t  Template[8];
-
-    memset(Template, 0xFF, sizeof(Template));
-
-    for (i = 0x0C80; i < 0x1E00; i += 8)
-    {
-        if (
-                !(i >= 0x0EE0 && i < 0x0F18) &&         // ANI ID + DTMF codes
-                !(i >= 0x0F30 && i < 0x0F50) &&         // AES KEY + F LOCK + Scramble Enable
-                !(i >= 0x1C00 && i < 0x1E00) &&         // DTMF contacts
-                !(i >= 0x0EB0 && i < 0x0ED0) &&         // Welcome strings
-                !(i >= 0x0EA0 && i < 0x0EA8) &&         // Voice Prompt
-                (bIsAll ||
-                 (
-                         !(i >= 0x0D60 && i < 0x0E28) &&     // MR Channel Attributes
-                         !(i >= 0x0F18 && i < 0x0F30) &&     // Scan List
-                         !(i >= 0x0F50 && i < 0x1C00) &&     // MR Channel Names
-                         !(i >= 0x0E40 && i < 0x0E70) &&     // FM Channels
-                         !(i >= 0x0E88 && i < 0x0E90)        // FM settings
-                 ))
-                )
-        {
-            EEPROM_WriteBuffer(i, Template);
-        }
-    }
-
-    if (bIsAll)
-    {
-        RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_FIRST + BAND6_400MHz, 43350000);
-
-        // set the first few memory channels
-        for (i = 0; i < ARRAY_SIZE(gDefaultFrequencyTable); i++)
-        {
-            const uint32_t Frequency   = gDefaultFrequencyTable[i];
-            gRxVfo->freq_config_RX.Frequency = Frequency;
-            gRxVfo->freq_config_TX.Frequency = Frequency;
-            gRxVfo->Band               = FREQUENCY_GetBand(Frequency);
-            SETTINGS_SaveChannel(MR_CHANNEL_FIRST + i, 0, gRxVfo, 2);
-        }
-    }
-}
\ No newline at end of file
diff --git a/board.h b/board.h
index 4f854aa..48b2474 100644
--- a/board.h
+++ b/board.h
@@ -26,11 +26,6 @@ void     BOARD_PORTCON_Init(void);
 void     BOARD_ADC_Init(void);
 void     BOARD_ADC_GetBatteryInfo(uint16_t *pVoltage, uint16_t *pCurrent);
 void     BOARD_Init(void);
-void     BOARD_EEPROM_Init(void);
-void     BOARD_EEPROM_LoadCalibration(void);
-uint32_t BOARD_fetchChannelFrequency(const int channel);
-void     BOARD_fetchChannelName(char *s, const int channel);
-void     BOARD_FactoryReset(bool bIsAll);
 
 #endif
 
diff --git a/main.c b/main.c
index b4a65bd..77890c2 100644
--- a/main.c
+++ b/main.c
@@ -82,9 +82,10 @@ void Main(void)
 
 	BOARD_ADC_GetBatteryInfo(&gBatteryCurrentVoltage, &gBatteryCurrent);
 
-	BOARD_EEPROM_Init();
 
-	BOARD_EEPROM_LoadCalibration();
+    SETTINGS_InitEEPROM();
+
+    SETTINGS_LoadCalibration();
 
 	RADIO_ConfigureChannel(0, VFO_CONFIGURE_RELOAD);
 	RADIO_ConfigureChannel(1, VFO_CONFIGURE_RELOAD);
diff --git a/radio.c b/radio.c
index dd4c14b..826b030 100644
--- a/radio.c
+++ b/radio.c
@@ -379,11 +379,11 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
 
     RADIO_ApplyOffset(pVfo);
 
-    memset(pVfo->Name, 0, sizeof(pVfo->Name));
     if (IS_MR_CHANNEL(channel))
     {	// 16 bytes allocated to the channel name but only 10 used, the rest are 0's
-        EEPROM_ReadBuffer(0x0F50 + (channel * 16), pVfo->Name + 0, 8);
-        EEPROM_ReadBuffer(0x0F58 + (channel * 16), pVfo->Name + 8, 2);
+
+
+        SETTINGS_FetchChannelName(pVfo->Name, channel);
     }
 
     if (!pVfo->FrequencyReverse)
@@ -404,13 +404,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
             pConfig->Frequency = 43300000;
     }
 
-    if (pVfo->Modulation != MODULATION_FM)
-    {	// freq/chan is in AM mode
-        pVfo->SCRAMBLING_TYPE         = 0;
-//		pVfo->DTMF_DECODING_ENABLE    = false;  // no reason to disable DTMF decoding, aircraft use it on SSB
-        pVfo->freq_config_RX.CodeType = CODE_TYPE_OFF;
-        pVfo->freq_config_TX.CodeType = CODE_TYPE_OFF;
-    }
+
 //    else{
 //
 //         FREQ_Config_t *pConfig =  gEeprom.VfoInfo[1].pRX;
diff --git a/settings.c b/settings.c
index cbfc9f0..ce906a9 100644
--- a/settings.c
+++ b/settings.c
@@ -16,16 +16,414 @@
 
 #include <string.h>
 
+#include "app/dtmf.h"
 #ifdef ENABLE_FMRADIO
 #include "app/fm.h"
 #endif
+#include "driver/bk4819.h"
 #include "driver/eeprom.h"
 #include "driver/uart.h"
 #include "misc.h"
 #include "settings.h"
+#include "ui/menu.h"
+
+static const uint32_t gDefaultFrequencyTable[] =
+        {
+                14500000,    //
+                14550000,    //
+                43300000,    //
+                43320000,    //
+                43350000     //
+        };
 
 EEPROM_Config_t gEeprom;
 
+void SETTINGS_InitEEPROM(void)
+{
+    unsigned int i;
+    uint8_t      Data[16];
+
+    memset(Data, 0, sizeof(Data));
+
+    // 0E70..0E77
+    EEPROM_ReadBuffer(0x0E70, Data, 8);
+    gEeprom.CHAN_1_CALL          = IS_MR_CHANNEL(Data[0]) ? Data[0] : MR_CHANNEL_FIRST;
+    gEeprom.SQUELCH_LEVEL        = (Data[1] < 10) ? Data[1] : 1;
+    gEeprom.TX_TIMEOUT_TIMER     = (Data[2] < 11) ? Data[2] : 1;
+#ifdef ENABLE_NOAA
+    gEeprom.NOAA_AUTO_SCAN   = (Data[3] <  2) ? Data[3] : false;
+#endif
+    gEeprom.KEY_LOCK             = (Data[4] <  2) ? Data[4] : false;
+#ifdef ENABLE_VOX
+    gEeprom.VOX_SWITCH       = (Data[5] <  2) ? Data[5] : false;
+		gEeprom.VOX_LEVEL        = (Data[6] < 10) ? Data[6] : 1;
+#endif
+    gEeprom.MIC_SENSITIVITY      = (Data[7] <  5) ? Data[7] : 4;
+
+    // 0E78..0E7F
+    EEPROM_ReadBuffer(0x0E78, Data, 8);
+    gEeprom.BACKLIGHT_MAX 		  = (Data[0] & 0xF) <= 10 ? (Data[0] & 0xF) : 10;
+    gEeprom.BACKLIGHT_MIN 		  = (Data[0] >> 4) < gEeprom.BACKLIGHT_MAX ? (Data[0] >> 4) : 0;
+#ifdef ENABLE_BLMIN_TMP_OFF
+    gEeprom.BACKLIGHT_MIN_STAT	  = BLMIN_STAT_ON;
+#endif
+    gEeprom.CHANNEL_DISPLAY_MODE  = (Data[1] < 4) ? Data[1] : MDF_FREQUENCY;    // 4 instead of 3 - extra display mode
+    gEeprom.CROSS_BAND_RX_TX      = (Data[2] < 3) ? Data[2] : CROSS_BAND_OFF;
+    gEeprom.BATTERY_SAVE          = (Data[3] < 5) ? Data[3] : 4;
+    gEeprom.DUAL_WATCH            = (Data[4] < 3) ? Data[4] : DUAL_WATCH_CHAN_A;
+    gEeprom.BACKLIGHT_TIME        = (Data[5] < ARRAY_SIZE(gSubMenu_BACKLIGHT)) ? Data[5] : 3;
+    gEeprom.TAIL_TONE_ELIMINATION = (Data[6] < 2) ? Data[6] : false;
+    gEeprom.VFO_OPEN              = (Data[7] < 2) ? Data[7] : true;
+
+    // 0E80..0E87
+    EEPROM_ReadBuffer(0x0E80, Data, 8);
+    gEeprom.ScreenChannel[0]   = IS_VALID_CHANNEL(Data[0]) ? Data[0] : (FREQ_CHANNEL_FIRST + BAND6_400MHz);
+    gEeprom.ScreenChannel[1]   = IS_VALID_CHANNEL(Data[3]) ? Data[3] : (FREQ_CHANNEL_FIRST + BAND6_400MHz);
+    gEeprom.MrChannel[0]       = IS_MR_CHANNEL(Data[1])    ? Data[1] : MR_CHANNEL_FIRST;
+    gEeprom.MrChannel[1]       = IS_MR_CHANNEL(Data[4])    ? Data[4] : MR_CHANNEL_FIRST;
+    gEeprom.FreqChannel[0]     = IS_FREQ_CHANNEL(Data[2])  ? Data[2] : (FREQ_CHANNEL_FIRST + BAND6_400MHz);
+    gEeprom.FreqChannel[1]     = IS_FREQ_CHANNEL(Data[5])  ? Data[5] : (FREQ_CHANNEL_FIRST + BAND6_400MHz);
+#ifdef ENABLE_NOAA
+    gEeprom.NoaaChannel[0] = IS_NOAA_CHANNEL(Data[6])  ? Data[6] : NOAA_CHANNEL_FIRST;
+		gEeprom.NoaaChannel[1] = IS_NOAA_CHANNEL(Data[7])  ? Data[7] : NOAA_CHANNEL_FIRST;
+#endif
+
+#ifdef ENABLE_FMRADIO
+    {	// 0E88..0E8F
+		struct
+		{
+			uint16_t SelectedFrequency;
+			uint8_t  SelectedChannel;
+			uint8_t  IsMrMode;
+			uint8_t  Padding[8];
+		} __attribute__((packed)) FM;
+
+		EEPROM_ReadBuffer(0x0E88, &FM, 8);
+		gEeprom.FM_LowerLimit = 760;
+		gEeprom.FM_UpperLimit = 1080;
+		if (FM.SelectedFrequency < gEeprom.FM_LowerLimit || FM.SelectedFrequency > gEeprom.FM_UpperLimit)
+			gEeprom.FM_SelectedFrequency = 960;
+		else
+			gEeprom.FM_SelectedFrequency = FM.SelectedFrequency;
+
+		gEeprom.FM_SelectedChannel = FM.SelectedChannel;
+		gEeprom.FM_IsMrMode        = (FM.IsMrMode < 2) ? FM.IsMrMode : false;
+	}
+
+	// 0E40..0E67
+	EEPROM_ReadBuffer(0x0E40, gFM_Channels, sizeof(gFM_Channels));
+	FM_ConfigureChannelState();
+#endif
+
+    // 0E90..0E97
+    EEPROM_ReadBuffer(0x0E90, Data, 8);
+    gEeprom.BEEP_CONTROL                 = Data[0] & 1;
+    gEeprom.KEY_M_LONG_PRESS_ACTION      = ((Data[0] >> 1) < ACTION_OPT_LEN) ? (Data[0] >> 1) : ACTION_OPT_NONE;
+    gEeprom.KEY_1_SHORT_PRESS_ACTION     = (Data[1] < ACTION_OPT_LEN) ? Data[1] : ACTION_OPT_MONITOR;
+    gEeprom.KEY_1_LONG_PRESS_ACTION      = (Data[2] < ACTION_OPT_LEN) ? Data[2] : ACTION_OPT_FLASHLIGHT;
+    gEeprom.KEY_2_SHORT_PRESS_ACTION     = (Data[3] < ACTION_OPT_LEN) ? Data[3] : ACTION_OPT_SCAN;
+    gEeprom.KEY_2_LONG_PRESS_ACTION      = (Data[4] < ACTION_OPT_LEN) ? Data[4] : ACTION_OPT_NONE;
+    gEeprom.SCAN_RESUME_MODE             = (Data[5] < 3)              ? Data[5] : SCAN_RESUME_CO;
+    gEeprom.AUTO_KEYPAD_LOCK             = (Data[6] < 2)              ? Data[6] : false;
+    gEeprom.POWER_ON_DISPLAY_MODE        = (Data[7] < 4)              ? Data[7] : POWER_ON_DISPLAY_MODE_VOLTAGE;
+
+    // 0E98..0E9F
+    EEPROM_ReadBuffer(0x0E98, Data, 8);
+    memmove(&gEeprom.POWER_ON_PASSWORD, Data, 4);
+
+    // 0EA0..0EA7
+#ifdef ENABLE_VOICE
+    EEPROM_ReadBuffer(0x0EA0, Data, 8);
+		gEeprom.VOICE_PROMPT = (Data[0] < 3) ? Data[0] : VOICE_PROMPT_ENGLISH;
+#endif
+
+    // 0EA8..0EAF
+    EEPROM_ReadBuffer(0x0EA8, Data, 8);
+#ifdef ENABLE_ALARM
+    gEeprom.ALARM_MODE                 = (Data[0] <  2) ? Data[0] : true;
+#endif
+    gEeprom.ROGER                          = (Data[1] <  3) ? Data[1] : ROGER_MODE_OFF;
+    gEeprom.REPEATER_TAIL_TONE_ELIMINATION = (Data[2] < 11) ? Data[2] : 0;
+    gEeprom.TX_VFO                         = (Data[3] <  2) ? Data[3] : 0;
+    gEeprom.BATTERY_TYPE                   = (Data[4] < BATTERY_TYPE_UNKNOWN) ? Data[4] : BATTERY_TYPE_1600_MAH;
+
+    // 0ED0..0ED7
+    EEPROM_ReadBuffer(0x0ED0, Data, 8);
+    gEeprom.DTMF_SIDE_TONE               = (Data[0] <   2) ? Data[0] : true;
+
+#ifdef ENABLE_DTMF_CALLING
+    gEeprom.DTMF_SEPARATE_CODE           = DTMF_ValidateCodes((char *)(Data + 1), 1) ? Data[1] : '*';
+	gEeprom.DTMF_GROUP_CALL_CODE         = DTMF_ValidateCodes((char *)(Data + 2), 1) ? Data[2] : '#';
+	gEeprom.DTMF_DECODE_RESPONSE         = (Data[3] <   4) ? Data[3] : 0;
+	gEeprom.DTMF_auto_reset_time         = (Data[4] <  61) ? Data[4] : (Data[4] >= 5) ? Data[4] : 10;
+#endif
+    gEeprom.DTMF_PRELOAD_TIME            = (Data[5] < 101) ? Data[5] * 10 : 300;
+    gEeprom.DTMF_FIRST_CODE_PERSIST_TIME = (Data[6] < 101) ? Data[6] * 10 : 100;
+    gEeprom.DTMF_HASH_CODE_PERSIST_TIME  = (Data[7] < 101) ? Data[7] * 10 : 100;
+
+    // 0ED8..0EDF
+    EEPROM_ReadBuffer(0x0ED8, Data, 8);
+    gEeprom.DTMF_CODE_PERSIST_TIME  = (Data[0] < 101) ? Data[0] * 10 : 100;
+    gEeprom.DTMF_CODE_INTERVAL_TIME = (Data[1] < 101) ? Data[1] * 10 : 100;
+#ifdef ENABLE_DTMF_CALLING
+    gEeprom.PERMIT_REMOTE_KILL      = (Data[2] <   2) ? Data[2] : true;
+
+	// 0EE0..0EE7
+
+	EEPROM_ReadBuffer(0x0EE0, Data, 8);
+	if (DTMF_ValidateCodes((char *)Data, 8))
+		memmove(gEeprom.ANI_DTMF_ID, Data, 8);
+	else
+	{
+		memset(gEeprom.ANI_DTMF_ID, 0, sizeof(gEeprom.ANI_DTMF_ID));
+		strcpy(gEeprom.ANI_DTMF_ID, "123");
+	}
+
+
+	// 0EE8..0EEF
+	EEPROM_ReadBuffer(0x0EE8, Data, 8);
+	if (DTMF_ValidateCodes((char *)Data, 8))
+		memmove(gEeprom.KILL_CODE, Data, 8);
+	else
+	{
+		memset(gEeprom.KILL_CODE, 0, sizeof(gEeprom.KILL_CODE));
+		strcpy(gEeprom.KILL_CODE, "ABCD9");
+	}
+
+	// 0EF0..0EF7
+	EEPROM_ReadBuffer(0x0EF0, Data, 8);
+	if (DTMF_ValidateCodes((char *)Data, 8))
+		memmove(gEeprom.REVIVE_CODE, Data, 8);
+	else
+	{
+		memset(gEeprom.REVIVE_CODE, 0, sizeof(gEeprom.REVIVE_CODE));
+		strcpy(gEeprom.REVIVE_CODE, "9DCBA");
+	}
+#endif
+
+    // 0EF8..0F07
+    EEPROM_ReadBuffer(0x0EF8, Data, 16);
+    if (DTMF_ValidateCodes((char *)Data, 16))
+        memmove(gEeprom.DTMF_UP_CODE, Data, 16);
+    else
+    {
+        memset(gEeprom.DTMF_UP_CODE, 0, sizeof(gEeprom.DTMF_UP_CODE));
+        strcpy(gEeprom.DTMF_UP_CODE, "12345");
+    }
+
+    // 0F08..0F17
+    EEPROM_ReadBuffer(0x0F08, Data, 16);
+    if (DTMF_ValidateCodes((char *)Data, 16))
+        memmove(gEeprom.DTMF_DOWN_CODE, Data, 16);
+    else
+    {
+        memset(gEeprom.DTMF_DOWN_CODE, 0, sizeof(gEeprom.DTMF_DOWN_CODE));
+        strcpy(gEeprom.DTMF_DOWN_CODE, "54321");
+    }
+
+    // 0F18..0F1F
+    EEPROM_ReadBuffer(0x0F18, Data, 8);
+//	gEeprom.SCAN_LIST_DEFAULT = (Data[0] < 2) ? Data[0] : false;
+    gEeprom.SCAN_LIST_DEFAULT = (Data[0] < 3) ? Data[0] : false;  // we now have 'all' channel scan option
+    for (i = 0; i < 2; i++)
+    {
+        const unsigned int j = 1 + (i * 3);
+        gEeprom.SCAN_LIST_ENABLED[i]     = (Data[j + 0] < 2) ? Data[j] : false;
+        gEeprom.SCANLIST_PRIORITY_CH1[i] =  Data[j + 1];
+        gEeprom.SCANLIST_PRIORITY_CH2[i] =  Data[j + 2];
+    }
+
+    // 0F40..0F47
+    EEPROM_ReadBuffer(0x0F40, Data, 8);
+    gSetting_F_LOCK            = (Data[0] < F_LOCK_LEN) ? Data[0] : F_LOCK_DEF;
+    gSetting_350TX             = (Data[1] < 2) ? Data[1] : false;  // was true
+#ifdef ENABLE_DTMF_CALLING
+    gSetting_KILLED            = (Data[2] < 2) ? Data[2] : false;
+#endif
+    gSetting_200TX             = (Data[3] < 2) ? Data[3] : false;
+    gSetting_500TX             = (Data[4] < 2) ? Data[4] : false;
+    gSetting_350EN             = (Data[5] < 2) ? Data[5] : true;
+    gSetting_ScrambleEnable    = (Data[6] < 2) ? Data[6] : true;
+    //gSetting_TX_EN             = (Data[7] & (1u << 0)) ? true : false;
+    gSetting_live_DTMF_decoder = (Data[7] & (1u << 1)) ? true : false;
+    //gSetting_battery_text      = (((Data[7] >> 2) & 3u) <= 2) ? (Data[7] >> 2) & 3 : 2;
+#ifdef ENABLE_AUDIO_BAR
+    //gSetting_mic_bar       = (Data[7] & (1u << 4)) ? true : false;
+#endif
+#ifdef ENABLE_AM_FIX
+    gSetting_AM_fix        = (Data[7] & (1u << 5)) ? true : false;
+#endif
+  //  gSetting_backlight_on_tx_rx = (Data[7] >> 6) & 3u;
+
+    if (!gEeprom.VFO_OPEN)
+    {
+        gEeprom.ScreenChannel[0] = gEeprom.MrChannel[0];
+        gEeprom.ScreenChannel[1] = gEeprom.MrChannel[1];
+    }
+
+    // 0D60..0E27
+    EEPROM_ReadBuffer(0x0D60, gMR_ChannelAttributes, sizeof(gMR_ChannelAttributes));
+    for(uint16_t i = 0; i < sizeof(gMR_ChannelAttributes); i++) {
+        ChannelAttributes_t *att = &gMR_ChannelAttributes[i];
+        if(att->__val == 0xff){
+            att->__val = 0;
+            att->band = 0xf;
+        }
+    }
+
+    // 0F30..0F3F
+    EEPROM_ReadBuffer(0x0F30, gCustomAesKey, sizeof(gCustomAesKey));
+    bHasCustomAesKey = false;
+    for (i = 0; i < ARRAY_SIZE(gCustomAesKey); i++)
+    {
+        if (gCustomAesKey[i] != 0xFFFFFFFFu)
+        {
+            bHasCustomAesKey = true;
+            return;
+        }
+    }
+}
+
+void SETTINGS_LoadCalibration(void)
+{
+//	uint8_t Mic;
+
+    EEPROM_ReadBuffer(0x1EC0, gEEPROM_RSSI_CALIB[3], 8);
+    memcpy(gEEPROM_RSSI_CALIB[4], gEEPROM_RSSI_CALIB[3], 8);
+    memcpy(gEEPROM_RSSI_CALIB[5], gEEPROM_RSSI_CALIB[3], 8);
+    memcpy(gEEPROM_RSSI_CALIB[6], gEEPROM_RSSI_CALIB[3], 8);
+
+    EEPROM_ReadBuffer(0x1EC8, gEEPROM_RSSI_CALIB[0], 8);
+    memcpy(gEEPROM_RSSI_CALIB[1], gEEPROM_RSSI_CALIB[0], 8);
+    memcpy(gEEPROM_RSSI_CALIB[2], gEEPROM_RSSI_CALIB[0], 8);
+
+    EEPROM_ReadBuffer(0x1F40, gBatteryCalibration, 12);
+    if (gBatteryCalibration[0] >= 5000)
+    {
+        gBatteryCalibration[0] = 1900;
+        gBatteryCalibration[1] = 2000;
+    }
+    gBatteryCalibration[5] = 2300;
+
+#ifdef ENABLE_VOX
+    EEPROM_ReadBuffer(0x1F50 + (gEeprom.VOX_LEVEL * 2), &gEeprom.VOX1_THRESHOLD, 2);
+		EEPROM_ReadBuffer(0x1F68 + (gEeprom.VOX_LEVEL * 2), &gEeprom.VOX0_THRESHOLD, 2);
+#endif
+
+    //EEPROM_ReadBuffer(0x1F80 + gEeprom.MIC_SENSITIVITY, &Mic, 1);
+    //gEeprom.MIC_SENSITIVITY_TUNING = (Mic < 32) ? Mic : 15;
+    gEeprom.MIC_SENSITIVITY_TUNING = gMicGain_dB2[gEeprom.MIC_SENSITIVITY];
+
+    {
+        struct
+        {
+            int16_t  BK4819_XtalFreqLow;
+            uint16_t EEPROM_1F8A;
+            uint16_t EEPROM_1F8C;
+            uint8_t  VOLUME_GAIN;
+            uint8_t  DAC_GAIN;
+        } __attribute__((packed)) Misc;
+
+        // radio 1 .. 04 00 46 00 50 00 2C 0E
+        // radio 2 .. 05 00 46 00 50 00 2C 0E
+        EEPROM_ReadBuffer(0x1F88, &Misc, 8);
+
+        gEeprom.BK4819_XTAL_FREQ_LOW = (Misc.BK4819_XtalFreqLow >= -1000 && Misc.BK4819_XtalFreqLow <= 1000) ? Misc.BK4819_XtalFreqLow : 0;
+        gEEPROM_1F8A                 = Misc.EEPROM_1F8A & 0x01FF;
+        gEEPROM_1F8C                 = Misc.EEPROM_1F8C & 0x01FF;
+        gEeprom.VOLUME_GAIN          = (Misc.VOLUME_GAIN < 64) ? Misc.VOLUME_GAIN : 58;
+        gEeprom.DAC_GAIN             = (Misc.DAC_GAIN    < 16) ? Misc.DAC_GAIN    : 8;
+
+        BK4819_WriteRegister(BK4819_REG_3B, 22656 + gEeprom.BK4819_XTAL_FREQ_LOW);
+//		BK4819_WriteRegister(BK4819_REG_3C, gEeprom.BK4819_XTAL_FREQ_HIGH);
+    }
+}
+
+uint32_t SETTINGS_FetchChannelFrequency(const int channel)
+{
+    struct
+    {
+        uint32_t frequency;
+        uint32_t offset;
+    } __attribute__((packed)) info;
+
+    EEPROM_ReadBuffer(channel * 16, &info, sizeof(info));
+
+    return info.frequency;
+}
+
+void SETTINGS_FetchChannelName(char *s, const int channel)
+{
+    if (s == NULL)
+        return;
+
+    memset(s, 0, 11);  // 's' had better be large enough !
+
+    if (channel < 0)
+        return;
+
+    if (!RADIO_CheckValidChannel(channel, false, 0))
+        return;
+
+    EEPROM_ReadBuffer(0x0F50 + (channel * 16), s + 0, 8);
+    EEPROM_ReadBuffer(0x0F58 + (channel * 16), s + 8, 2);
+
+    int i;
+    for (i = 0; i < 10; i++)
+        if (s[i] < 32 || s[i] > 127)
+            break;                // invalid char
+
+    s[i--] = 0;                   // null term
+
+    while (i >= 0 && s[i] == 32)  // trim trailing spaces
+        s[i--] = 0;               // null term
+}
+
+void SETTINGS_FactoryReset(bool bIsAll)
+{
+    uint16_t i;
+    uint8_t  Template[8];
+
+    memset(Template, 0xFF, sizeof(Template));
+
+    for (i = 0x0C80; i < 0x1E00; i += 8)
+    {
+        if (
+                !(i >= 0x0EE0 && i < 0x0F18) &&         // ANI ID + DTMF codes
+                !(i >= 0x0F30 && i < 0x0F50) &&         // AES KEY + F LOCK + Scramble Enable
+                !(i >= 0x1C00 && i < 0x1E00) &&         // DTMF contacts
+                !(i >= 0x0EB0 && i < 0x0ED0) &&         // Welcome strings
+                !(i >= 0x0EA0 && i < 0x0EA8) &&         // Voice Prompt
+                (bIsAll ||
+                 (
+                         !(i >= 0x0D60 && i < 0x0E28) &&     // MR Channel Attributes
+                         !(i >= 0x0F18 && i < 0x0F30) &&     // Scan List
+                         !(i >= 0x0F50 && i < 0x1C00) &&     // MR Channel Names
+                         !(i >= 0x0E40 && i < 0x0E70) &&     // FM Channels
+                         !(i >= 0x0E88 && i < 0x0E90)        // FM settings
+                 ))
+                )
+        {
+            EEPROM_WriteBuffer(i, Template);
+        }
+    }
+
+    if (bIsAll)
+    {
+        RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_FIRST + BAND6_400MHz, 43350000);
+
+        // set the first few memory channels
+        for (i = 0; i < ARRAY_SIZE(gDefaultFrequencyTable); i++)
+        {
+            const uint32_t Frequency   = gDefaultFrequencyTable[i];
+            gRxVfo->freq_config_RX.Frequency = Frequency;
+            gRxVfo->freq_config_TX.Frequency = Frequency;
+            gRxVfo->Band               = FREQUENCY_GetBand(Frequency);
+            SETTINGS_SaveChannel(MR_CHANNEL_FIRST + i, 0, gRxVfo, 2);
+        }
+    }
+}
+
 #ifdef ENABLE_FMRADIO
 void SETTINGS_SaveFM(void)
 	{
@@ -96,7 +494,7 @@ void SETTINGS_SaveSettings(void)
     State[7] = gEeprom.MIC_SENSITIVITY;
     EEPROM_WriteBuffer(0x0E70, State);
 
-    State[0] =  gEeprom.BACKLIGHT_MAX;
+    State[0] = (gEeprom.BACKLIGHT_MIN << 4) + gEeprom.BACKLIGHT_MAX;
     State[1] = gEeprom.CHANNEL_DISPLAY_MODE;
     State[2] = gEeprom.CROSS_BAND_RX_TX;
     State[3] = gEeprom.BATTERY_SAVE;
@@ -113,7 +511,7 @@ void SETTINGS_SaveSettings(void)
     State[3] = gEeprom.KEY_2_SHORT_PRESS_ACTION;
     State[4] = gEeprom.KEY_2_LONG_PRESS_ACTION;
     State[5] = gEeprom.SCAN_RESUME_MODE;
-    State[6] = false;
+    State[6] = gEeprom.AUTO_KEYPAD_LOCK;
     State[7] = gEeprom.POWER_ON_DISPLAY_MODE;
     EEPROM_WriteBuffer(0x0E90, State);
 
@@ -182,13 +580,12 @@ void SETTINGS_SaveSettings(void)
     State[6]  = gSetting_ScrambleEnable;
     //if (!gSetting_TX_EN)             State[7] &= ~(1u << 0);
     if (!gSetting_live_DTMF_decoder) State[7] &= ~(1u << 1);
-    State[7] = (State[7] & ~(3u << 2)) | ((2 & 3u) << 2);
-#ifdef ENABLE_AUDIO_BAR
-#endif
+    State[7] = (State[7] & ~(3u << 2)) | ((0 & 3u) << 2);
+
 #ifdef ENABLE_AM_FIX
     if (!gSetting_AM_fix)            State[7] &= ~(1u << 5);
 #endif
-    State[7] = (State[7] & ~(3u << 6)) | ((BACKLIGHT_ON_TR_TXRX & 3u) << 6);
+    State[7] = (State[7] & ~(3u << 6)) | ((2 & 3u) << 6);
 
     EEPROM_WriteBuffer(0x0F40, State);
 }
@@ -199,20 +596,18 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
     if (!IS_NOAA_CHANNEL(Channel))
 #endif
     {
-        const uint16_t OffsetMR  = Channel * 16;
-        uint16_t OffsetVFO = OffsetMR;
+        uint16_t OffsetVFO = Channel * 16;
 
         if (!IS_MR_CHANNEL(Channel))
         {	// it's a VFO, not a channel
             OffsetVFO  = (VFO == 0) ? 0x0C80 : 0x0C90;
             OffsetVFO += (Channel - FREQ_CHANNEL_FIRST) * 32;
         }
-//bug #4
-        uint8_t State[8];
 
-        if (Mode != 3 || !IS_MR_CHANNEL(Channel))
+        if (Mode >= 2 || !IS_MR_CHANNEL(Channel))
         {	// copy VFO to a channel
 
+            uint8_t State[8];
 
             ((uint32_t *)State)[0] = pVFO->freq_config_RX.Frequency;
             ((uint32_t *)State)[1] = pVFO->TX_OFFSET_FREQUENCY;
@@ -238,35 +633,16 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
 
             SETTINGS_UpdateChannel(Channel, pVFO, true);
 
-//            if (IS_MR_CHANNEL(Channel))
-//            {	// it's a memory channel
-//
-//#ifndef ENABLE_KEEP_MEM_NAME
-//                // clear/reset the channel name
-//                //memset(&State, 0xFF, sizeof(State));
-//                memset(&State, 0x00, sizeof(State));     // follow the QS way
-//                EEPROM_WriteBuffer(0x0F50 + OffsetMR, State);
-//                EEPROM_WriteBuffer(0x0F58 + OffsetMR, State);
-//#else
-//                if (Mode >= 3)
-//					{	// save the channel name
-//						memmove(State, pVFO->Name + 0, 8);
-//						EEPROM_WriteBuffer(0x0F50 + OffsetMR, State);
-//						//memset(State, 0xFF, sizeof(State));
-//						memset(State, 0x00, sizeof(State));  // follow the QS way
-//						memmove(State, pVFO->Name + 8, 2);
-//						EEPROM_WriteBuffer(0x0F58 + OffsetMR, State);
-//					}
-//#endif
-//            }
-        }else if(IS_MR_CHANNEL(Channel)&&Mode == 3)
-        {
-            memmove(State, pVFO->Name + 0, 8);
-            EEPROM_WriteBuffer(0x0F50 + OffsetMR, State);
-            //memset(State, 0xFF, sizeof(State));
-            memset(State, 0x00, sizeof(State));  // follow the QS way
-            memmove(State, pVFO->Name + 8, 2);
-            EEPROM_WriteBuffer(0x0F58 + OffsetMR, State);
+            if (IS_MR_CHANNEL(Channel)) {
+#ifndef ENABLE_KEEP_MEM_NAME
+                // clear/reset the channel name
+                SETTINGS_SaveChannelName(Channel, "");
+#else
+                if (Mode >= 3) {
+						SETTINGS_SaveChannelName(Channel, pVFO->Name);
+					}
+#endif
+            }
         }
     }
 }
@@ -281,6 +657,16 @@ void SETTINGS_SaveBatteryCalibration(const uint16_t * batteryCalibration)
     EEPROM_WriteBuffer(0x1F48, buf);
 }
 
+void SETTINGS_SaveChannelName(uint8_t channel, const char * name)
+{
+    uint16_t offset = channel * 16;
+    uint8_t  buf[16];
+    memset(&buf, 0x00, sizeof(buf));
+    memcpy(buf, name, MIN(strlen(name),10u));
+    EEPROM_WriteBuffer(0x0F50 + offset, buf);
+    EEPROM_WriteBuffer(0x0F58 + offset, buf + 8);
+}
+
 void SETTINGS_UpdateChannel(uint8_t channel, const VFO_Info_t *pVFO, bool keep)
 {
 #ifdef ENABLE_NOAA
@@ -313,12 +699,9 @@ void SETTINGS_UpdateChannel(uint8_t channel, const VFO_Info_t *pVFO, bool keep)
         gMR_ChannelAttributes[channel] = att;
 
         if (IS_MR_CHANNEL(channel)) {	// it's a memory channel
-            const uint16_t OffsetMR = channel * 16;
             if (!keep) {
                 // clear/reset the channel name
-                memset(&state, 0x00, sizeof(state));
-                EEPROM_WriteBuffer(0x0F50 + OffsetMR, state);
-                EEPROM_WriteBuffer(0x0F58 + OffsetMR, state);
+                SETTINGS_SaveChannelName(channel, "");
             }
         }
     }
diff --git a/settings.h b/settings.h
index 1a3ab06..0f89db3 100644
--- a/settings.h
+++ b/settings.h
@@ -26,9 +26,10 @@
 #include <driver/backlight.h>
 
 enum POWER_OnDisplayMode_t {
-     POWER_ON_DISPLAY_MODE_NONE=0,
-    POWER_ON_DISPLAY_MODE_MESSAGE
-
+    POWER_ON_DISPLAY_MODE_FULL_SCREEN = 0,
+    POWER_ON_DISPLAY_MODE_MESSAGE,
+    POWER_ON_DISPLAY_MODE_VOLTAGE,
+    POWER_ON_DISPLAY_MODE_NONE
 };
 typedef enum POWER_OnDisplayMode_t POWER_OnDisplayMode_t;
 
@@ -92,8 +93,8 @@ enum {
     ACTION_OPT_BLMIN_TMP_OFF, //BackLight Minimum Temporay OFF
 #endif
     ACTION_OPT_LEN,
-    ACTION_OPT_WIDTH,
-    ACTION_OPT_D_DCD
+    ACTION_OPT_D_DCD,
+    ACTION_OPT_WIDTH
 };
 
 #ifdef ENABLE_VOICE
@@ -183,6 +184,7 @@ typedef struct {
     uint8_t               field37_0x32;
     uint8_t               field38_0x33;
 
+    bool                  AUTO_KEYPAD_LOCK;
 #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
     ALARM_Mode_t      ALARM_MODE;
 #endif
@@ -243,7 +245,7 @@ typedef struct {
     uint8_t               field79_0x97;
 
     uint8_t 			  KEY_M_LONG_PRESS_ACTION;
-  //  uint8_t               BACKLIGHT_MIN;
+    uint8_t               BACKLIGHT_MIN;
 #ifdef ENABLE_BLMIN_TMP_OFF
     BLMIN_STAT_t		  BACKLIGHT_MIN_STAT;
 #endif
@@ -253,11 +255,17 @@ typedef struct {
 
 extern EEPROM_Config_t gEeprom;
 
+void     SETTINGS_InitEEPROM(void);
+void     SETTINGS_LoadCalibration(void);
+uint32_t SETTINGS_FetchChannelFrequency(const int channel);
+void     SETTINGS_FetchChannelName(char *s, const int channel);
+void     SETTINGS_FactoryReset(bool bIsAll);
 #ifdef ENABLE_FMRADIO
 void SETTINGS_SaveFM(void);
 #endif
 void SETTINGS_SaveVfoIndices(void);
 void SETTINGS_SaveSettings(void);
+void SETTINGS_SaveChannelName(uint8_t channel, const char * name);
 void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, uint8_t Mode);
 void SETTINGS_SaveBatteryCalibration(const uint16_t * batteryCalibration);
 void SETTINGS_UpdateChannel(uint8_t channel, const VFO_Info_t *pVFO, bool keep);
diff --git a/ui/main.c b/ui/main.c
index 22dca65..24bdb49 100644
--- a/ui/main.c
+++ b/ui/main.c
@@ -553,8 +553,8 @@ void UI_DisplayMain(void)
 					case MDF_NAME:		// show the channel name
 					case MDF_NAME_FREQ:	// show the channel name and frequency
 
-						BOARD_fetchChannelName(String, gEeprom.ScreenChannel[vfo_num]);
-						if (String[0] == 0)
+                        SETTINGS_FetchChannelName(String, gEeprom.ScreenChannel[vfo_num]);
+                        if (String[0] == 0)
 						{	// no channel name, show the channel number instead
 							sprintf(String, "CH-%03u", gEeprom.ScreenChannel[vfo_num] + 1);
 						}
diff --git a/ui/menu.c b/ui/menu.c
index 435bae7..c12d9bf 100644
--- a/ui/menu.c
+++ b/ui/menu.c
@@ -662,7 +662,7 @@ void UI_DisplayMenu(void) {
             UI_PrintStringSmall(String, menu_item_x1, menu_item_x2, 2);
 
             if (valid && !gAskForConfirmation) {    // show the frequency so that the user knows the channels frequency
-                const uint32_t frequency = BOARD_fetchChannelFrequency(gSubMenuSelection);
+                const uint32_t frequency = SETTINGS_FetchChannelFrequency(gSubMenuSelection);
                 sprintf(String, "%u.%05u", frequency / 100000, frequency % 100000);
                 UI_PrintStringSmall(String, menu_item_x1, menu_item_x2, 5);
             }
@@ -678,10 +678,10 @@ void UI_DisplayMenu(void) {
             UI_PrintStringSmall(String, menu_item_x1, menu_item_x2, 2);
 
             if (valid) {
-                const uint32_t frequency = BOARD_fetchChannelFrequency(gSubMenuSelection);
-//bug way
+                const uint32_t frequency = SETTINGS_FetchChannelFrequency(gSubMenuSelection);
+                //bug way
                 if (!gIsInSubMenu || edit_index < 0) {    // show the channel name
-                    BOARD_fetchChannelName(String, gSubMenuSelection);
+                    SETTINGS_FetchChannelName(String, gSubMenuSelection);
                     if (String[0] == 0)
                         strcpy(String, "--");
                     
@@ -973,7 +973,7 @@ void UI_DisplayMenu(void) {
             UI_PrintStringSmall(String, menu_item_x1, menu_item_x2, 2);
 
             // channel name
-            BOARD_fetchChannelName(String, gSubMenuSelection);
+            SETTINGS_FetchChannelName(String, gSubMenuSelection);
             if (String[0] == 0)
                 strcpy(String, "--");
             UI_PrintStringSmall(String, menu_item_x1, menu_item_x2, 4);
@@ -982,7 +982,7 @@ void UI_DisplayMenu(void) {
             UI_PrintStringSmall(String, menu_item_x1, menu_item_x2, 2);
 
             // channel name
-            BOARD_fetchChannelName(String, gSubMenuSelection);
+            SETTINGS_FetchChannelName(String, gSubMenuSelection);
             if (String[0] == 0)
                 strcpy(String, "--");
             UI_PrintStringSmall(String, menu_item_x1, menu_item_x2, 4);
@@ -1003,7 +1003,7 @@ void UI_DisplayMenu(void) {
         UI_MENU_GetCurrentMenuId() == MENU_DEL_CH ||
         UI_MENU_GetCurrentMenuId() == MENU_1_CALL) {    // display the channel name
         char s[11];
-        BOARD_fetchChannelName(s, gSubMenuSelection);
+        SETTINGS_FetchChannelName(s, gSubMenuSelection);
         if (s[0] == 0)
             strcpy(s, "--");
         UI_PrintStringSmall(s, menu_item_x1, menu_item_x2, 3);
diff --git a/version.c b/version.c
index a536d6e..b39ed6d 100644
--- a/version.c
+++ b/version.c
@@ -4,7 +4,7 @@
 #ifdef GIT_HASH
 	#define VER     GIT_HASH
 #else
-	#define VER     "102"
+	#define VER     "103"
 #endif
 
 #ifndef ONE_OF_ELEVEN_VER