diff --git a/3d-viewer/3d_canvas/board_adapter.cpp b/3d-viewer/3d_canvas/board_adapter.cpp
index 27821a5823..df7c2917f1 100644
--- a/3d-viewer/3d_canvas/board_adapter.cpp
+++ b/3d-viewer/3d_canvas/board_adapter.cpp
@@ -805,6 +805,46 @@ std::bitset<LAYER_3D_END> BOARD_ADAPTER::GetVisibleLayers() const
 {
     std::bitset<LAYER_3D_END> ret;
 
+    if( m_board->IsFootprintHolder() )
+    {
+        if( m_Cfg->m_Render.preview_show_board_body )
+        {
+            ret.set( LAYER_3D_BOARD,             m_Cfg->m_Render.show_board_body );
+            ret.set( LAYER_3D_SOLDERMASK_TOP,    m_Cfg->m_Render.show_soldermask_top );
+            ret.set( LAYER_3D_SOLDERMASK_BOTTOM, m_Cfg->m_Render.show_soldermask_bottom );
+            ret.set( LAYER_3D_SOLDERPASTE,       m_Cfg->m_Render.show_solderpaste );
+            ret.set( LAYER_3D_ADHESIVE,          m_Cfg->m_Render.show_adhesive );
+        }
+
+        ret.set( LAYER_3D_COPPER_TOP,        true );
+        ret.set( LAYER_3D_COPPER_BOTTOM,     true );
+        ret.set( LAYER_3D_SILKSCREEN_TOP,    true );
+        ret.set( LAYER_3D_SILKSCREEN_BOTTOM, true );
+        ret.set( LAYER_3D_USER_COMMENTS,     true );
+        ret.set( LAYER_3D_USER_DRAWINGS,     true );
+        ret.set( LAYER_3D_USER_ECO1,         true );
+        ret.set( LAYER_3D_USER_ECO2,         true );
+
+        for( int layer = LAYER_3D_USER_1; layer <= LAYER_3D_USER_45; ++layer )
+            ret.set( layer, true );
+
+        ret.set( LAYER_FP_REFERENCES,        true );
+        ret.set( LAYER_FP_VALUES,            true );
+        ret.set( LAYER_FP_TEXT,              true );
+
+        ret.set( LAYER_3D_TH_MODELS,         true );
+        ret.set( LAYER_3D_SMD_MODELS,        true );
+        ret.set( LAYER_3D_VIRTUAL_MODELS,    true );
+        ret.set( LAYER_3D_MODELS_NOT_IN_POS, true );
+        ret.set( LAYER_3D_MODELS_MARKED_DNP, true );
+
+        ret.set( LAYER_3D_BOUNDING_BOXES,    m_Cfg->m_Render.show_model_bbox );
+        ret.set( LAYER_3D_OFF_BOARD_SILK,    m_Cfg->m_Render.show_off_board_silk );
+        ret.set( LAYER_3D_AXES,              m_Cfg->m_Render.show_axis );
+
+        return ret;
+    }
+
     ret.set( LAYER_3D_BOARD,             m_Cfg->m_Render.show_board_body );
     ret.set( LAYER_3D_COPPER_TOP,        m_Cfg->m_Render.show_copper_top );
     ret.set( LAYER_3D_COPPER_BOTTOM,     m_Cfg->m_Render.show_copper_bottom );
@@ -938,6 +978,12 @@ std::bitset<LAYER_3D_END> BOARD_ADAPTER::GetDefaultVisibleLayers() const
 }
 
 
+bool BOARD_ADAPTER::GetUseBoardEditorCopperLayerColors() const
+{
+    return m_Cfg->m_Render.use_board_editor_copper_colors && !m_board->IsFootprintHolder();
+}
+
+
 bool BOARD_ADAPTER::createBoardPolygon( wxString* aErrorMsg )
 {
     m_board_poly.RemoveAllContours();
diff --git a/3d-viewer/3d_canvas/board_adapter.h b/3d-viewer/3d_canvas/board_adapter.h
index 2c6918a394..1b71c0f9c5 100644
--- a/3d-viewer/3d_canvas/board_adapter.h
+++ b/3d-viewer/3d_canvas/board_adapter.h
@@ -119,6 +119,8 @@ public:
     std::bitset<LAYER_3D_END> GetDefaultVisibleLayers() const;
     void SetVisibleLayers( const std::bitset<LAYER_3D_END>& aLayers );
 
+    bool GetUseBoardEditorCopperLayerColors() const;
+
     /**
      * Function to be called by the render when it need to reload the settings for the board.
      *
diff --git a/3d-viewer/3d_rendering/opengl/render_3d_opengl.cpp b/3d-viewer/3d_rendering/opengl/render_3d_opengl.cpp
index 89f525cb1e..3e88208158 100644
--- a/3d-viewer/3d_rendering/opengl/render_3d_opengl.cpp
+++ b/3d-viewer/3d_rendering/opengl/render_3d_opengl.cpp
@@ -271,9 +271,7 @@ void RENDER_3D_OPENGL::setupMaterials()
 
 void RENDER_3D_OPENGL::setLayerMaterial( PCB_LAYER_ID aLayerID )
 {
-    EDA_3D_VIEWER_SETTINGS::RENDER_SETTINGS& cfg = m_boardAdapter.m_Cfg->m_Render;
-
-    if( cfg.use_board_editor_copper_colors && IsCopperLayer( aLayerID ) )
+    if( m_boardAdapter.GetUseBoardEditorCopperLayerColors() && IsCopperLayer( aLayerID ) )
     {
         COLOR4D copper_color = m_boardAdapter.m_BoardEditorColors[aLayerID];
         m_materials.m_Copper.m_Diffuse = SFVEC3F( copper_color.r, copper_color.g,
diff --git a/3d-viewer/3d_viewer/eda_3d_viewer_settings.cpp b/3d-viewer/3d_viewer/eda_3d_viewer_settings.cpp
index 4abf9fea0f..1330030809 100644
--- a/3d-viewer/3d_viewer/eda_3d_viewer_settings.cpp
+++ b/3d-viewer/3d_viewer/eda_3d_viewer_settings.cpp
@@ -401,6 +401,8 @@ EDA_3D_VIEWER_SETTINGS::EDA_3D_VIEWER_SETTINGS() :
                                             &m_Render.differentiate_plated_copper, false ) );
     m_params.emplace_back( new PARAM<bool>( "render.use_board_editor_copper_colors",
                                             &m_Render.use_board_editor_copper_colors, false ) );
+    m_params.emplace_back( new PARAM<bool>( "render.preview_show_board_body",
+                                            &m_Render.preview_show_board_body, true ) );
     m_params.emplace_back( new PARAM<bool>( "camera.animation_enabled",
                                             &m_Camera.animation_enabled, true ) );
     m_params.emplace_back( new PARAM<int>( "camera.moving_speed_multiplier",
diff --git a/3d-viewer/3d_viewer/eda_3d_viewer_settings.h b/3d-viewer/3d_viewer/eda_3d_viewer_settings.h
index 79bb73ef80..373eaa0836 100644
--- a/3d-viewer/3d_viewer/eda_3d_viewer_settings.h
+++ b/3d-viewer/3d_viewer/eda_3d_viewer_settings.h
@@ -152,21 +152,19 @@ public:
         bool subtract_mask_from_silk;
         bool clip_silk_on_via_annuli;
         bool differentiate_plated_copper;
-        // Board editor copper colors are used only in OpenGL mode if
-        // use_board_editor_copper_colors is true
-        bool use_board_editor_copper_colors;
+        bool use_board_editor_copper_colors;    // OpenGL only
+        bool preview_show_board_body;
 
         /**
          * return true if platted copper aeras and non platted copper areas must be drawn
          * using a different color
-         * in OPENGL mode, if use_board_editor_copper_colors, always false
-         * in RAYTRACING mode, use_board_editor_copper_colors is ignored (board editor copper
-         * colors are ignored)
          */
         bool DifferentiatePlatedCopper()
         {
-            return engine == RENDER_ENGINE::RAYTRACING ? differentiate_plated_copper
-                                : differentiate_plated_copper && !use_board_editor_copper_colors;
+            if( engine == RENDER_ENGINE::OPENGL && use_board_editor_copper_colors )
+                return false;
+
+            return differentiate_plated_copper;
         }
     };
 
diff --git a/3d-viewer/dialogs/appearance_controls_3D.cpp b/3d-viewer/dialogs/appearance_controls_3D.cpp
index f73fa727ba..10c95a9f8e 100644
--- a/3d-viewer/dialogs/appearance_controls_3D.cpp
+++ b/3d-viewer/dialogs/appearance_controls_3D.cpp
@@ -177,7 +177,6 @@ APPEARANCE_CONTROLS_3D::APPEARANCE_CONTROLS_3D( EDA_3D_VIEWER_FRAME* aParent,
                 cfg->m_UseStackupColors = aEvent.IsChecked();
 
                 UpdateLayerCtls();
-                syncLayerPresetSelection();
                 m_frame->NewDisplay( true );
             } );
 
@@ -194,7 +193,6 @@ APPEARANCE_CONTROLS_3D::APPEARANCE_CONTROLS_3D( EDA_3D_VIEWER_FRAME* aParent,
                 cfg->m_Render.use_board_editor_copper_colors = aEvent.IsChecked();
 
                 UpdateLayerCtls();
-                syncLayerPresetSelection();
                 m_frame->NewDisplay( true );
             } );
 
@@ -314,7 +312,13 @@ void APPEARANCE_CONTROLS_3D::CommonSettingsChanged()
     rebuildControls();
 
     UpdateLayerCtls();
-    syncLayerPresetSelection();
+
+    const wxString& currentPreset = m_frame->GetAdapter().m_Cfg->m_CurrentPreset;
+
+    if( currentPreset == FOLLOW_PCB || currentPreset == FOLLOW_PLOT_SETTINGS )
+        updateLayerPresetWidget( currentPreset );
+    else
+        syncLayerPresetSelection();
 }
 
 
@@ -502,7 +506,12 @@ void APPEARANCE_CONTROLS_3D::onColorSwatchChanged( COLOR_SWATCH* aSwatch )
 
     m_frame->GetAdapter().SetLayerColors( colors );
 
-    syncLayerPresetSelection();
+    const wxString& currentPreset = m_frame->GetAdapter().m_Cfg->m_CurrentPreset;
+
+    if( currentPreset == FOLLOW_PCB || currentPreset == FOLLOW_PLOT_SETTINGS )
+        updateLayerPresetWidget( currentPreset );
+    else
+        syncLayerPresetSelection();
 
     m_frame->NewDisplay( true );
 }
diff --git a/3d-viewer/dialogs/panel_preview_3d_model.cpp b/3d-viewer/dialogs/panel_preview_3d_model.cpp
index ceff53fcd6..1aecb7bbc5 100644
--- a/3d-viewer/dialogs/panel_preview_3d_model.cpp
+++ b/3d-viewer/dialogs/panel_preview_3d_model.cpp
@@ -68,8 +68,6 @@ PANEL_PREVIEW_3D_MODEL::PANEL_PREVIEW_3D_MODEL( wxWindow* aParent, PCB_BASE_FRAM
     // This board will only be used to hold a footprint for viewing
     m_dummyBoard->SetBoardUse( BOARD_USE::FPHOLDER );
 
-    m_bodyStyleShowAll = true;
-
     BOARD_DESIGN_SETTINGS parent_bds = aFrame->GetDesignSettings();
     BOARD_DESIGN_SETTINGS& dummy_bds = m_dummyBoard->GetDesignSettings();
     dummy_bds.SetBoardThickness( parent_bds.GetBoardThickness() );
@@ -225,16 +223,6 @@ void PANEL_PREVIEW_3D_MODEL::loadSettings()
         m_previewPane->SetAnimationEnabled( cfg->m_Camera.animation_enabled );
         m_previewPane->SetMovingSpeedMultiplier( cfg->m_Camera.moving_speed_multiplier );
         m_previewPane->SetProjectionMode( cfg->m_Camera.projection_mode );
-
-        // Ensure the board body is always shown, and do not use the settings of the 3D viewer
-        cfg->m_Render.show_copper_top = m_bodyStyleShowAll;
-        cfg->m_Render.show_copper_bottom = m_bodyStyleShowAll;
-        cfg->m_Render.show_soldermask_top = m_bodyStyleShowAll;
-        cfg->m_Render.show_soldermask_bottom = m_bodyStyleShowAll;
-        cfg->m_Render.show_solderpaste = m_bodyStyleShowAll;
-        cfg->m_Render.show_zones = m_bodyStyleShowAll;
-        cfg->m_Render.show_board_body = m_bodyStyleShowAll;
-        cfg->m_Render.use_board_editor_copper_colors = false;
     }
 }
 
@@ -405,13 +393,7 @@ void PANEL_PREVIEW_3D_MODEL::setBodyStyleView( wxCommandEvent& event )
     if( !cfg )
         return;
 
-    m_bodyStyleShowAll = !m_bodyStyleShowAll;
-
-    cfg->m_Render.show_soldermask_top = m_bodyStyleShowAll;
-    cfg->m_Render.show_soldermask_bottom = m_bodyStyleShowAll;
-    cfg->m_Render.show_solderpaste = m_bodyStyleShowAll;
-    cfg->m_Render.show_zones = m_bodyStyleShowAll;
-    cfg->m_Render.show_board_body = m_bodyStyleShowAll;
+    cfg->m_Render.preview_show_board_body = !cfg->m_Render.preview_show_board_body;
 
     m_previewPane->ReloadRequest();
     m_previewPane->Refresh();
diff --git a/3d-viewer/dialogs/panel_preview_3d_model.h b/3d-viewer/dialogs/panel_preview_3d_model.h
index 6f128dbc76..6b13a7662b 100644
--- a/3d-viewer/dialogs/panel_preview_3d_model.h
+++ b/3d-viewer/dialogs/panel_preview_3d_model.h
@@ -222,11 +222,11 @@ private:
     int                      m_selected;            /// Index into m_parentInfoList
 
     EDA_UNITS                m_userUnits;
-    bool                     m_bodyStyleShowAll;    /// true if the board body is show
-    /// The 3d viewer Render initial settings (must be saved and restored)
-    EDA_3D_VIEWER_SETTINGS::RENDER_SETTINGS m_initialRender;
 
-    std::unique_ptr<NL_FOOTPRINT_PROPERTIES_PLUGIN>     m_spaceMouse;
+    /// The 3d viewer Render initial settings (must be saved and restored)
+    EDA_3D_VIEWER_SETTINGS::RENDER_SETTINGS          m_initialRender;
+
+    std::unique_ptr<NL_FOOTPRINT_PROPERTIES_PLUGIN>  m_spaceMouse;
 };
 
 #endif  // PANEL_PREVIEW_3D_MODEL_H