diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index 2d356ab..34f988d 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -52,6 +52,7 @@
 #endif
 #include "lcd-remote.h"
 #include "crc32.h"
+#define LOGF_ENABLE
 #include "logf.h"
 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
 #include "disk.h"
@@ -2332,6 +2333,29 @@ static bool dbg_pic(void)
 }
 #endif
 
+#ifdef HAVE_AS3543
+#include "ascodec-target.h"
+static bool dbg_as3543(void)
+{
+    static bool enable = false;
+    enable = !enable;
+
+    unsigned value = ascodec_read_pmu(0x17, 7);
+    
+    logf ("old PMU 17-7 = %x", value);
+
+    if (enable)
+        value |= 0xc0;
+    else
+        value &= ~0xc0;
+
+    logf ("new PMU 17-7 = %x", value);
+
+    ascodec_write_pmu(0x17, 7, value);
+
+    splashf(HZ, "AS3543 feature %s", enable?"enabled":"disabled");
+}
+#endif  /* HAVE_AS3543 */
 
 /****** The menu *********/
 struct the_menu_item {
@@ -2417,6 +2441,9 @@ static const struct the_menu_item menuitems[] = {
 #if defined(CREATIVE_ZVx) && !defined(SIMULATOR)
         { "View PIC info", dbg_pic },
 #endif
+#ifdef HAVE_AS3543
+        { "AS3543 toggle", dbg_as3543 },
+#endif  /* HAVE_AS3543 */
 #ifdef ROCKBOX_HAS_LOGF
         {"Show Log File", logfdisplay },
         {"Dump Log File", logfdump },
diff --git a/firmware/drivers/audio/as3514.c b/firmware/drivers/audio/as3514.c
index 52d1237..c314382 100644
--- a/firmware/drivers/audio/as3514.c
+++ b/firmware/drivers/audio/as3514.c
@@ -79,14 +79,14 @@ const struct sound_settings_info audiohw_settings[] = {
 };
 
 /* Shadow registers */
-static uint8_t as3514_regs[AS3514_NUM_AUDIO_REGS]; /* 8-bit registers */
+/* static */ uint8_t as3514_regs[AS3514_NUM_AUDIO_REGS]; /* 8-bit registers */
 
 /*
  * little helper method to set register values.
  * With the help of as3514_regs, we minimize i2c
  * traffic.
  */
-static void as3514_write(unsigned int reg, unsigned int value)
+/* static */ void as3514_write(unsigned int reg, unsigned int value)
 {
     ascodec_write(reg, value);
 
@@ -95,12 +95,12 @@ static void as3514_write(unsigned int reg, unsigned int value)
 }
 
 /* Helpers to set/clear bits */
-static void as3514_set(unsigned int reg, unsigned int bits)
+/* static */ void as3514_set(unsigned int reg, unsigned int bits)
 {
     as3514_write(reg, as3514_regs[reg] | bits);
 }
 
-static void as3514_clear(unsigned int reg, unsigned int bits)
+/* static */ void as3514_clear(unsigned int reg, unsigned int bits)
 {
     as3514_write(reg, as3514_regs[reg] & ~bits);
 }
@@ -145,21 +145,42 @@ int sound_val2phys(int setting, int value)
  */
 void audiohw_preinit(void)
 {
+    as3514_write(0x00, 0);
+    as3514_write(0x01, 0);
+    as3514_write(0x04, 0);
+    as3514_write(0x05, 0);
+    as3514_write(0x08, 0);
+    as3514_write(0x09, 0);
+    as3514_write(0x0C, 0);
+    as3514_write(0x0D, 0);
+    as3514_write(0x13, 0);
+
     /* read all reg values */
     ascodec_readbytes(0x0, AS3514_NUM_AUDIO_REGS, as3514_regs);
 
 #ifdef HAVE_AS3543
 
     as3514_write(AS3514_AUDIOSET1, AUDIOSET1_DAC_on | AUDIOSET1_DAC_GAIN_on);
+//m    as3514_write(AS3514_AUDIOSET1, AUDIOSET1_DAC_on | AUDIOSET1_DAC_GAIN_on
+//m                                   | AUDIOSET1_SDI_MUTE_on);
+//m    as3514_write(AS3514_AUDIOSET1, AUDIOSET1_DAC_on | AUDIOSET1_SDI_MUTE_on);
     as3514_write(AS3514_AUDIOSET2, AUDIOSET2_HPH_QUALITY_HIGH);
+//m    as3514_write(AS3514_AUDIOSET2, AUDIOSET2_HPH_QUALITY_HIGH | AUDIOSET2_AGC_off);
+//m    as3514_write(AS3514_AUDIOSET2, AUDIOSET2_HPH_QUALITY_HIGH | AUDIOSET2_SUM_off | AUDIOSET2_AGC_off);
     /* common ground on, delay playback unmuting when inserting headphones */
     as3514_write(AS3514_AUDIOSET3, AUDIOSET3_HPCM_on | AUDIOSET3_HP_LONGSTART | AUDIOSET3_HP_BIAS_150);
+//m    as3514_write(AS3514_AUDIOSET3, AUDIOSET3_HPCM_on | AUDIOSET3_HP_LONGSTART |
+//m                 AUDIOSET3_HP_BIAS_150 | AUDIOSET3_MICMIX_off |
+//m                 AUDIOSET3_ADCMIX_off | AUDIOSET3_LINMIX_off);
 
     as3514_write(AS3543_DAC_IF, AS3543_DAC_INT_PLL);
+//m!    as3514_write(AS3543_DAC_IF, AS3543_DAC_INT_PLL | AS3543_DAC_ATTEN_on | 0x1f);
+//m    as3514_write(AS3543_DAC_IF, AS3543_DAC_EXT_MCLK);
     /* Select Line 2 for FM radio */
     as3514_set(AS3514_LINE_IN1_R, LINE_IN_R_LINE_SELECT);
     /* Output SUM of microphone/line/DAC */
     as3514_write(AS3514_HPH_OUT_R, HPH_OUT_R_HEADPHONES | HPH_OUT_R_HP_OUT_SUM);
+//m    as3514_write(AS3514_HPH_OUT_R, HPH_OUT_R_HEADPHONES | HPH_OUT_R_HP_OUT_DAC);
 
 #else
     /* as3514/as3515 */
@@ -221,6 +242,7 @@ void audiohw_preinit(void)
 
     /* Headphone ON, MUTE, Min volume */
     as3514_write(AS3514_HPH_OUT_L, HPH_OUT_L_HP_ON | HPH_OUT_L_HP_MUTE | 0x00);
+//m    as3514_write(AS3514_HPH_OUT_L, HPH_OUT_L_HP_ON | HPH_OUT_L_HP_DET_ON | HPH_OUT_L_HP_MUTE | 0x00);
 
 #if defined(SANSA_E200V2) || defined(SANSA_FUZE) || defined(SANSA_C200)
     /* Line Out Stereo, MUTE, Min volume */
@@ -230,6 +252,10 @@ void audiohw_preinit(void)
 
     /* DAC_Mute_off */
     as3514_set(AS3514_DAC_L, DAC_L_DAC_MUTE_off);
+
+#if defined(HAVE_RECORDING) || defined(HAVE_FMRADIO_IN)
+    audiohw_set_monitor(false);
+#endif
 }
 
 static void audiohw_mute(bool mute)
diff --git a/firmware/export/as3514.h b/firmware/export/as3514.h
index dfe0f80..7d49012 100644
--- a/firmware/export/as3514.h
+++ b/firmware/export/as3514.h
@@ -272,16 +272,20 @@ extern void audiohw_set_sampr_dividers(int fsel);
 #endif
 /* Use AS3514_VOL_MASK */
 
-/* DAC_IF (11h) */
+/* DAC_IF (12h) */
 #ifdef HAVE_AS3543
 #define AS3543_DAC_INT_PLL      (0x0 << 7)
 #define AS3543_DAC_EXT_MCLK     (0x1 << 7)
+#define AS3543_DAC_LOOP         (0x1 << 6)
+#define AS3543_DAC_ATTEN_on     (0x1 << 5)
+/* Use AS3514_VOL_MASK */
 #endif
 
 /* AUDIOSET1 (14h)*/
 #ifdef HAVE_AS3543
 #define AUDIOSET1_DAC_on        (0x1 << 6)
 #define AUDIOSET1_DAC_GAIN_on   (0x1 << 5)
+#define AUDIOSET1_SDI_MUTE_on   (0x1 << 4)
 #else
 #define AUDIOSET1_SUM_on        (0x1 << 6)
 #define AUDIOSET1_DAC_on        (0x1 << 5)
@@ -300,12 +304,21 @@ extern void audiohw_set_sampr_dividers(int fsel);
 
 /* AUDIOSET2 (15h) */
 #ifdef HAVE_AS3543
+#define AUDIOSET2_SUM_off               (0x1 << 6)
 #define AUDIOSET2_HPH_QUALITY_LOW_POWER (0x0 << 4)
 #define AUDIOSET2_HPH_QUALITY_HIGH      (0x1 << 4)
+#define AUDIOSET2_GAIN_STEP             (0x3 << 2)
+    #define AUDIOSET2_GAIN_STEP_2ms         (0x0 << 2)
+    #define AUDIOSET2_GAIN_STEP_4ms         (0x1 << 2)
+    #define AUDIOSET2_GAIN_STEP_8ms         (0x2 << 2)
+    #define AUDIOSET2_GAIN_STEP_off         (0x3 << 2)
+#define AUDIOSET2_VMICS                 (0x3 << 0)
+    #define AUDIOSET2_VMICS_17div           (0x0 << 2)
+    #define AUDIOSET2_VMICS_22div           (0x1 << 2)
+    #define AUDIOSET2_VMICS_27div           (0x2 << 2)
+    #define AUDIOSET2_VMICS_32div           (0x3 << 2)
 #else
-#define AUDIOSET2_BIAS_off      (0x1 << 7)
 #define AUDIOSET2_DITH_off      (0x1 << 6)
-#define AUDIOSET2_AGC_off       (0x1 << 5)
 #define AUDIOSET2_IBR_DAC       (0x3 << 3)
     #define AUDIOSET2_IBR_DAC_0     (0x0 << 3)
     #define AUDIOSET2_IBR_DAC_25    (0x1 << 3)
@@ -318,9 +331,15 @@ extern void audiohw_set_sampr_dividers(int fsel);
     #define AUDIOSET2_IBR_LSP_34    (0x2 << 0)
     #define AUDIOSET2_IBR_LSP_50    (0x3 << 0)
 #endif
+/* common bits */
+#define AUDIOSET2_BIAS_off      (0x1 << 7)
+#define AUDIOSET2_AGC_off       (0x1 << 5)
 
 /* AUDIOSET3 (16h) */
 #ifdef HAVE_AS3543
+#define AUDIOSET3_MICMIX_off    (0x1 << 6)
+#define AUDIOSET3_ADCMIX_off    (0x1 << 4)
+#define AUDIOSET3_LINMIX_off    (0x1 << 3)
 #define AUDIOSET3_HP_FASTSTART  (0x1 << 2)
 #define AUDIOSET3_HP_LONGSTART  (0x0 << 2)
 #define AUDIOSET3_HP_BIAS_150   (0x1 << 1)
