diff --git a/change_log.txt b/change_log.txt
index 8630a431ce..dc7ded1bb7 100644
--- a/change_log.txt
+++ b/change_log.txt
@@ -4,6 +4,14 @@ Started 2007-June-11
 Please add newer entries at the top, list the date and your name with 
 email address.
 
+2007-Oct-29 UPDATE  Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
+================================================================================
++cvpcb: listboxes.cpp problem solved: Workaround for a curious bug in wxWidgets:
+     if we switch from a long list of footprints to a short list (a filtered footprint list),
+     and if the selected item is near the end of the long list,
+     the new list is not displayed from the top of the list box
+
+
 2007-Oct-27 UPDATE  Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
 ================================================================================
 + all:
diff --git a/common/edaappl.cpp b/common/edaappl.cpp
index f27818dacb..f17d788200 100644
--- a/common/edaappl.cpp
+++ b/common/edaappl.cpp
@@ -54,21 +54,21 @@
                                  *  The real font size will be computed at run time */
 
 
-/*****************************/
-/* Constructeur de WinEDA_App */
-/*****************************/
+/**************************/
+/* WinEDA_App Constructor */
+/**************************/
 
 WinEDA_App::WinEDA_App()
 {
     m_Checker   = NULL;
     m_MainFrame = NULL;
     m_PcbFrame  = NULL;
-    m_ModuleEditFrame = NULL;       // Edition des modules
-    m_SchematicFrame  = NULL;       // Edition des Schemas
-    m_LibeditFrame    = NULL;       // Edition des composants
-    m_ViewlibFrame    = NULL;       // Visualisation des composants
+    m_ModuleEditFrame = NULL;       // Frame for footprint edition
+    m_SchematicFrame  = NULL;       // Frame for schematic edition
+    m_LibeditFrame    = NULL;       // Frame for component edition
+    m_ViewlibFrame    = NULL;       // Frame for browsing component libraries
     m_CvpcbFrame  = NULL;
-    m_GerberFrame = NULL;           // ecran de visualisation GERBER
+    m_GerberFrame = NULL;           // Frame for the gerber viewer GERBVIEW
 
     m_LastProjectMaxCount = 10;
     m_HtmlCtrl = NULL;
@@ -83,15 +83,15 @@ WinEDA_App::WinEDA_App()
 }
 
 
-/*****************************/
-/* Destructeur de WinEDA_App */
-/*****************************/
+/*************************/
+/* WinEDA_App Destructor */
+/*************************/
 
 WinEDA_App::~WinEDA_App()
 {
     SaveSettings();
 
-    /* delete data non directement geree par wxAppl */
+    /* delete user datas */
     delete g_Prj_Config;
     delete m_EDA_Config;
     delete m_EDA_CommonConfig;
@@ -116,10 +116,12 @@ void WinEDA_App::InitEDA_Appl( const wxString& name )
     ident     = name + wxT( "-" ) + wxGetUserId();
     m_Checker = new wxSingleInstanceChecker( ident );
 
-    /* Init environnement
-     *  (KICAD definit le chemin de kicad ex: set KICAD=d:\kicad) */
+    /* Init kicad environment
+     * the environment variable KICAD (if exists) gives the kicad path:
+	 * something like set KICAD=d:\kicad
+	*/
     m_Env_Defined = wxGetEnv( wxT( "KICAD" ), &m_KicadEnv );
-    if( m_Env_Defined )    // m_KicadEnv doit finir par "/" ou "\"
+    if( m_Env_Defined )    // ensure m_KicadEnv ends by "/"
     {
         m_KicadEnv.Replace( WIN_STRING_DIR_SEP, UNIX_STRING_DIR_SEP );
         if( m_KicadEnv.Last() != '/' )
@@ -129,13 +131,13 @@ void WinEDA_App::InitEDA_Appl( const wxString& name )
     /* Prepare On Line Help */
     m_HelpFileName = name + wxT( ".html" );
 
-    // Init parametres pour configuration
+    // Init parameters for configuration
     SetVendorName( wxT( "kicad" ) );
     SetAppName( name );
     m_EDA_Config = new wxConfig( name );
     m_EDA_CommonConfig = new wxConfig( wxT( "kicad_common" ) );
 
-    /* Creation des fontes utiles */
+    /* Create the fontes used in dialogs and messages */
     g_StdFontPointSize    = FONT_DEFAULT_SIZE;
     g_MsgFontPointSize    = FONT_DEFAULT_SIZE;
     g_DialogFontPointSize = FONT_DEFAULT_SIZE;
@@ -155,12 +157,12 @@ void WinEDA_App::InitEDA_Appl( const wxString& name )
     wxImage::AddHandler( new wxJPEGHandler );
     wxFileSystem::AddHandler( new wxZipFSHandler );
 
-    // Analyse command line & init binary path
+    // Analyse the command line & init binary path
     SetBinDir();
 
     ReadPdfBrowserInfos();
 
-    // Internationalisation: chargement du Dictionnaire de kicad
+    // Internationalisation: loading the kicad suitable Dictionnary
     m_EDA_CommonConfig->Read( wxT( "Language" ), &m_LanguageId, wxLANGUAGE_DEFAULT );
 
     bool succes = SetLanguage( TRUE );
@@ -262,7 +264,7 @@ bool WinEDA_App::SetBinDir()
 void WinEDA_App::GetSettings()
 /*********************************/
 
-/* Lit les infos utiles sauvees lors de la derniere utilisation du logiciel
+/* Get the last setup used (fontes, files opened...)
  */
 {
     wxString Line, Ident;
@@ -639,8 +641,11 @@ wxMenu* WinEDA_App::SetLanguageList( wxMenu* MasterMenu )
 }
 
 
+/**********************/
 int WinEDA_App::OnRun()
-/* Run init scripts */
+/**********************/
+/* Run init scripts
+*/
 {
     #ifdef KICAD_PYTHON
     PyHandler::GetInstance()->RunScripts();
diff --git a/common/msgpanel.cpp b/common/msgpanel.cpp
index bbd8903205..0dcf9f4b99 100644
--- a/common/msgpanel.cpp
+++ b/common/msgpanel.cpp
@@ -141,7 +141,7 @@ void WinEDA_MsgPanel::Affiche_1_Parametre( int pos_X, const wxString& texte_H,
 }
 
 
-void WinEDA_MsgPanel::showItem( wxWindowDC& dc, const MsgItem& aItem )
+void WinEDA_MsgPanel::showItem( wxDC& dc, const MsgItem& aItem )
 {
     int color = aItem.m_Color;
     
diff --git a/cvpcb/listboxes.cpp b/cvpcb/listboxes.cpp
index 15a5860ec5..a4679f3f6f 100644
--- a/cvpcb/listboxes.cpp
+++ b/cvpcb/listboxes.cpp
@@ -12,66 +12,68 @@
 
 #include "protos.h"
 
-/************************************************************************/
-/* Class (from wxListView) for displaying component and footprint lists */
-/************************************************************************/
+/******************************************************************************/
+/* Basic class (from wxListView) for displaying component and footprint lists */
+/* Not directly used: the 2 list boxes actually used are derived from it      */
+/******************************************************************************/
 
-ListBoxBase::ListBoxBase(WinEDA_CvpcbFrame * parent,
-				wxWindowID id, const wxPoint& loc, const wxSize& size):
-			LIST_BOX_TYPE(parent, id, loc, size,
-				wxSUNKEN_BORDER | wxLC_NO_HEADER |
-				wxLC_SINGLE_SEL|wxLC_REPORT | wxLC_VIRTUAL)
+ListBoxBase::ListBoxBase( WinEDA_CvpcbFrame* parent,
+                          wxWindowID id, const wxPoint& loc, const wxSize& size ) :
+    LIST_BOX_TYPE( parent, id, loc, size,
+                   wxSUNKEN_BORDER | wxLC_NO_HEADER |
+                   wxLC_SINGLE_SEL | wxLC_REPORT | wxLC_VIRTUAL )
 {
-	m_Parent = parent;
-    InsertColumn(0, wxEmptyString);
-	SetColumnWidth(0, wxLIST_AUTOSIZE );
+    m_Parent = parent;
+    InsertColumn( 0, wxEmptyString );
+    SetColumnWidth( 0, wxLIST_AUTOSIZE );
 }
 
 
-
 ListBoxBase::~ListBoxBase()
 {
 }
 
+
 /************************************************/
-void ListBoxBase::OnSize(wxSizeEvent& event)
+void ListBoxBase::OnSize( wxSizeEvent& event )
 /************************************************/
+
 // Ajust the column width to the entire available window width
 {
-wxSize size = GetClientSize();
-int width = 0;
-	
+    wxSize size  = GetClientSize();
+    int    width = 0;
+
 //	SetColumnWidth(0, wxLIST_AUTOSIZE );
 //	width = GetColumnWidth(0);
-	SetColumnWidth(0, MAX(width, size.x) );
+    SetColumnWidth( 0, MAX( width, size.x ) );
 
-	event.Skip();
+    event.Skip();
 }
 
 
 /*********************************/
 int ListBoxBase::GetSelection()
 /*********************************/
+
 // Return an index for the selected item
 {
-	return GetFirstSelected();
+    return GetFirstSelected();
 }
 
 
-/************************************************************/
-/* ListBox derivee pour l'affichage de la liste des Modules */
-/************************************************************/
+/***************************************/
+/* ListBox handling the footprint list */
+/***************************************/
 
-FootprintListBox::FootprintListBox(WinEDA_CvpcbFrame * parent,
-				wxWindowID id, const wxPoint& loc, const wxSize& size,
-				int nbitems, wxString choice[]):
-			ListBoxBase(parent, id, loc, size)
+FootprintListBox::FootprintListBox( WinEDA_CvpcbFrame* parent,
+                                    wxWindowID id, const wxPoint& loc, const wxSize& size,
+                                    int nbitems, wxString choice[] ) :
+    ListBoxBase( parent, id, loc, size )
 {
-	SetActiveFootprintList(TRUE);
+    SetActiveFootprintList( TRUE );
 }
 
 
-
 FootprintListBox::~FootprintListBox()
 {
 }
@@ -80,235 +82,251 @@ FootprintListBox::~FootprintListBox()
 /**********************************/
 int FootprintListBox::GetCount()
 /**********************************/
+
 // Return number of items
 {
-	return m_ActiveFootprintList->Count();
+    return m_ActiveFootprintList->Count();
 }
 
 
 /*****************************************************************************/
-void FootprintListBox::SetString(unsigned linecount, const wxString & text)
+void FootprintListBox::SetString( unsigned linecount, const wxString& text )
 /*****************************************************************************/
+
 // Change an item text
 {
-	if (linecount >= m_ActiveFootprintList->Count())
-		linecount = m_ActiveFootprintList->Count()-1;
-	if ( linecount >= 0 ) (*m_ActiveFootprintList)[linecount] = text;
+    if( linecount >= m_ActiveFootprintList->Count() )
+        linecount = m_ActiveFootprintList->Count() - 1;
+    if( linecount >= 0 )
+        (*m_ActiveFootprintList)[linecount] = text;
 }
 
+
 /***************************************************/
 wxString FootprintListBox::GetSelectedFootprint()
 /***************************************************/
+
 // Return an index for the selected item
 {
-wxString FootprintName;
-int ii = GetFirstSelected();
-	
-	if ( ii >= 0 )
-	{
-	wxString msg = (*m_ActiveFootprintList)[ii];
-		msg.Trim(TRUE); msg.Trim(FALSE);
-		FootprintName = msg.AfterFirst(wxChar(' '));
-	}
+    wxString FootprintName;
+    int      ii = GetFirstSelected();
 
-	return FootprintName;
+    if( ii >= 0 )
+    {
+        wxString msg = (*m_ActiveFootprintList)[ii];
+        msg.Trim( TRUE ); msg.Trim( FALSE );
+        FootprintName = msg.AfterFirst( wxChar( ' ' ) );
+    }
+
+    return FootprintName;
 }
 
 
 /*********************************************************/
-void FootprintListBox::AppendLine(const wxString & text)
+void FootprintListBox::AppendLine( const wxString& text )
 /*********************************************************/
+
 // Add an item at end of list
 {
-	m_ActiveFootprintList->Add(text);
-	SetItemCount(m_ActiveFootprintList->Count() );
+    m_ActiveFootprintList->Add( text );
+    SetItemCount( m_ActiveFootprintList->Count() );
 }
 
 
 /*********************************************************************/
-wxString FootprintListBox::OnGetItemText(long item, long column) const
+wxString FootprintListBox::OnGetItemText( long item, long column ) const
 /*********************************************************************/
+
 /* Overlayed function: MUST be provided in wxLC_VIRTUAL mode
-	because real datas are not handled by ListBoxBase
-*/
+ *  because real datas are not handled by ListBoxBase
+ */
 {
-	return m_ActiveFootprintList->Item(item);
+    return m_ActiveFootprintList->Item( item );
 }
 
+
 /*****************************************************************/
-void FootprintListBox::SetSelection(unsigned index, bool State)
+void FootprintListBox::SetSelection( unsigned index, bool State )
 /*****************************************************************/
+
 // Enable or disable an item
 {
-	if ( (int) index >= GetCount() ) index = GetCount()-1;
+    if( (int) index >= GetCount() )
+        index = GetCount() - 1;
 
 #ifndef __WXMAC__
-	Select(index, State);
+    Select( index, State );
 #endif
-	EnsureVisible(index);
+    EnsureVisible( index );
 #ifdef __WXMAC__
-	Refresh();
+    Refresh();
 #endif
 }
 
 
-/***************************************************************/
-/* ListBox derivee pour l'affichage de la liste des Composants */
-/***************************************************************/
+/**************************************************/
+/* ListBox handling the schematic components list */
+/**************************************************/
 
-ListBoxCmp::ListBoxCmp(WinEDA_CvpcbFrame * parent, wxWindowID id,
-				const wxPoint& loc, const wxSize& size,
-				int nbitems, wxString choice[]):
-			ListBoxBase(parent, id, loc, size)
+ListBoxCmp::ListBoxCmp( WinEDA_CvpcbFrame* parent, wxWindowID id,
+                        const wxPoint& loc, const wxSize& size,
+                        int nbitems, wxString choice[] ) :
+    ListBoxBase( parent, id, loc, size )
 {
 }
 
 
-
 ListBoxCmp::~ListBoxCmp()
 {
 }
 
 
+/* Build the events table for the schematic components list box
+ */
 
-/***********************************************************************/
-/* Construction de la table des evenements pour la fenetre des composants */
-/***********************************************************************/
-
-BEGIN_EVENT_TABLE(ListBoxCmp, LIST_BOX_TYPE)
-	EVT_SIZE( ListBoxBase::OnSize)
+BEGIN_EVENT_TABLE( ListBoxCmp, LIST_BOX_TYPE )
+EVT_SIZE( ListBoxBase::OnSize )
 
 END_EVENT_TABLE()
 
 /****************************/
 void ListBoxCmp::Clear()
 /****************************/
+
 // Reset ALL datas
 {
-	m_ComponentList.Clear();
-	SetItemCount(0);
+    m_ComponentList.Clear();
+    SetItemCount( 0 );
 }
 
+
 /******************************/
 int ListBoxCmp::GetCount()
 /******************************/
+
 // Return number of items
 {
-	return m_ComponentList.Count();
+    return m_ComponentList.Count();
 }
+
+
 /********************************************************************/
-void ListBoxCmp::SetString(unsigned linecount, const wxString & text)
+void ListBoxCmp::SetString( unsigned linecount, const wxString& text )
 /********************************************************************/
+
 // Change an item text
 {
-	if (linecount >= m_ComponentList.Count())
-		linecount = m_ComponentList.Count()-1;
-	if ( linecount >= 0 ) m_ComponentList[linecount] = text;
+    if( linecount >= m_ComponentList.Count() )
+        linecount = m_ComponentList.Count() - 1;
+    if( linecount >= 0 )
+        m_ComponentList[linecount] = text;
 }
 
+
 /****************************************************/
-void ListBoxCmp::AppendLine(const wxString & text)
+void ListBoxCmp::AppendLine( const wxString& text )
 /****************************************************/
+
 // Add an item at end of list
 {
-	m_ComponentList.Add(text);
-	SetItemCount(m_ComponentList.Count() );
+    m_ComponentList.Add( text );
+    SetItemCount( m_ComponentList.Count() );
 }
 
 
 /****************************************************************/
-wxString ListBoxCmp::OnGetItemText(long item, long column) const
+wxString ListBoxCmp::OnGetItemText( long item, long column ) const
 /****************************************************************/
+
 /* Overlayed function: MUST be provided in wxLC_VIRTUAL mode
-	because real datas are not handled by ListBoxBase
-*/
+ *  because real datas are not handled by ListBoxBase
+ */
 {
-	return m_ComponentList.Item(item);
+    return m_ComponentList.Item( item );
 }
 
+
 /********************************************************/
-void ListBoxCmp::SetSelection(unsigned index, bool State)
+void ListBoxCmp::SetSelection( unsigned index, bool State )
 /*********************************************************/
+
 // Enable or disable an item
 {
-	if ( (int) index >= GetCount() ) index = GetCount()-1;
+    if( (int) index >= GetCount() )
+        index = GetCount() - 1;
 
 #ifndef __WXMAC__
-	Select(index, State);
+    Select( index, State );
 #endif
-	EnsureVisible(index);
+    EnsureVisible( index );
 #ifdef __WXMAC__
-	Refresh();
+    Refresh();
 #endif
 }
 
+
 /********************************************/
 void WinEDA_CvpcbFrame::BuildCmpListBox()
 /********************************************/
-/* Construit la fenetre d'affichage de la liste des composant.
-	dimx et dimy sont les dimensions de la surface totale d'affichage
-	et non les dims de la fenetre des Cmp
-	Si la fenetre d'affichage a deja ete creee, il y a seulement
-	mise a jour de la liste
-*/
+
+/* Create or update the schematic components list.
+ */
 {
-int ii;
-STORECMP * Composant;
-wxString msg;
-wxSize size(10,10);
+    int       ii;
+    STORECMP* Composant;
+    wxString  msg;
+    wxSize    size( 10, 10 );
 
-	if( m_ListCmp == NULL )
-	{
-		m_ListCmp = new ListBoxCmp(this, ID_CVPCB_COMPONENT_LIST,
-							wxDefaultPosition, size,
-							0, NULL);
-		m_ListCmp->SetBackgroundColour(wxColour(225,255,255));
-		m_ListCmp->SetForegroundColour(wxColour(0,0,0));
-		m_ListCmp->SetFont(*g_FixedFont);
-	}
+    if( m_ListCmp == NULL )
+    {
+        m_ListCmp = new ListBoxCmp( this, ID_CVPCB_COMPONENT_LIST,
+                                    wxDefaultPosition, size,
+                                    0, NULL );
+        m_ListCmp->SetBackgroundColour( wxColour( 225, 255, 255 ) );
+        m_ListCmp->SetForegroundColour( wxColour( 0, 0, 0 ) );
+        m_ListCmp->SetFont( *g_FixedFont );
+    }
 
-	m_ListCmp->m_ComponentList.Clear();
-	Composant = g_BaseListeCmp;
-	for (ii = 1 ; Composant != NULL; Composant = Composant->Pnext, ii++ )
-	{
-		msg.Printf(CMP_FORMAT ,ii,
-			Composant->m_Reference.GetData(), Composant->m_Valeur.GetData(),
-			Composant->m_Module.GetData());
-		m_ListCmp->m_ComponentList.Add(msg);
-	}
-	m_ListCmp->SetItemCount(m_ListCmp->m_ComponentList.Count() );
+    m_ListCmp->m_ComponentList.Clear();
+    Composant = g_BaseListeCmp;
+    for( ii = 1; Composant != NULL; Composant = Composant->Pnext, ii++ )
+    {
+        msg.Printf( CMP_FORMAT, ii,
+                   Composant->m_Reference.GetData(), Composant->m_Valeur.GetData(),
+                   Composant->m_Module.GetData() );
+        m_ListCmp->m_ComponentList.Add( msg );
+    }
 
-	m_ListCmp->SetSelection(0, TRUE);
+    m_ListCmp->SetItemCount( m_ListCmp->m_ComponentList.Count() );
+
+    m_ListCmp->SetSelection( 0, TRUE );
 }
 
 
-/*************************************************************/
+/**********************************************/
 void WinEDA_CvpcbFrame::BuildFootprintListBox()
-/*************************************************************/
-/* Construit la fenetre d'affichage de la liste des Modules.
-	dimx et dimy sont les dimensions de la surface totale d'affichage
-	et non les dims de la fenetre des Modules
-	Si la fenetre d'affichage a deja ete creee, il y a seulement
-	mise a jour de la liste
-*/
+/**********************************************/
+
+/* Create or update the footprint list.
+ */
 {
-wxString msg;
-wxSize size(10,10);
+    wxString msg;
+    wxSize   size( 10, 10 );
 
-	if( m_FootprintList == NULL )
-	{
-		m_FootprintList = new FootprintListBox(this, ID_CVPCB_FOOTPRINT_LIST,
-							wxDefaultPosition, size,
-							0, NULL);
-		m_FootprintList->SetBackgroundColour(wxColour(225,255,225));
-		m_FootprintList->SetForegroundColour(wxColour(0,0,0));
-		m_FootprintList->SetFont(*g_FixedFont);
-	}
+    if( m_FootprintList == NULL )
+    {
+        m_FootprintList = new FootprintListBox( this, ID_CVPCB_FOOTPRINT_LIST,
+                                                wxDefaultPosition, size,
+                                                0, NULL );
+        m_FootprintList->SetBackgroundColour( wxColour( 225, 255, 225 ) );
+        m_FootprintList->SetForegroundColour( wxColour( 0, 0, 0 ) );
+        m_FootprintList->SetFont( *g_FixedFont );
+    }
 
-	m_FootprintList->SetFootprintFullList();
-	
-	msg.Printf(_("Footprints: %d"), m_FootprintList->GetCount());
-	SetStatusText(msg,2);
+    m_FootprintList->SetFootprintFullList();
+
+    msg.Printf( _( "Footprints: %d" ), m_FootprintList->GetCount() );
+    SetStatusText( msg, 2 );
 }
 
 
@@ -316,157 +334,184 @@ wxSize size(10,10);
 void FootprintListBox::SetFootprintFullList()
 /************************************************/
 {
-STOREMOD * FootprintItem;
-wxString msg;
-int OldSelection = GetSelection();
-	
-	m_FullFootprintList.Clear();
-	FootprintItem = g_BaseListePkg;
+    STOREMOD* FootprintItem;
+    wxString  msg;
+    int       OldSelection = GetSelection();
 
-	for ( int ii = 1; FootprintItem != NULL; FootprintItem = FootprintItem->Pnext, ii++ )
-	{
-		msg.Printf( wxT("%3d %s"), ii, FootprintItem->m_Module.GetData());
-		m_FullFootprintList.Add(msg);
-	}
-	
-	SetActiveFootprintList(TRUE);
+    m_FullFootprintList.Clear();
+    FootprintItem = g_BaseListePkg;
 
-	if ( (GetCount() == 0) ||  (OldSelection < 0) || ( OldSelection >= GetCount() ) )
-		SetSelection(0, TRUE);
-	Refresh();
+    for( int ii = 1; FootprintItem != NULL; FootprintItem = FootprintItem->Pnext, ii++ )
+    {
+        msg.Printf( wxT( "%3d %s" ), ii, FootprintItem->m_Module.GetData() );
+        m_FullFootprintList.Add( msg );
+    }
+
+    SetActiveFootprintList( TRUE );
+
+    if( (GetCount() == 0) ||  (OldSelection < 0) || ( OldSelection >= GetCount() ) )
+        SetSelection( 0, TRUE );
+    Refresh();
 }
 
+
 /**********************************************************************/
-void FootprintListBox::SetFootprintFilteredList(STORECMP * Component)
+void FootprintListBox::SetFootprintFilteredList( STORECMP* Component )
 /*********************************************************************/
 {
-STOREMOD * FootprintItem;
-wxString msg;
-int OldSelection = GetSelection();
-bool HasItem = FALSE;
-	
-	m_FilteredFootprintList.Clear();
-	FootprintItem = g_BaseListePkg;
+    STOREMOD* FootprintItem;
+    wxString  msg;
+    int       OldSelection = GetSelection();
+    bool      HasItem = FALSE;
 
-	int cmpnum = 1;
-	for ( int ii = 0; FootprintItem != NULL; FootprintItem = FootprintItem->Pnext, ii++ )
-	{
-		/* Search for matching footprints */
-		for ( unsigned jj = 0; jj < Component->m_FootprintFilter.GetCount(); jj ++ )
-		{
-			if ( ! FootprintItem->m_Module.Matches(Component->m_FootprintFilter[jj]) )
-				continue;
-			msg.Printf( wxT("%3d %s"), cmpnum++, FootprintItem->m_Module.GetData());
-			m_FilteredFootprintList.Add(msg);
-			HasItem = TRUE;
-		}
-	}
-	
-	
-	if ( HasItem ) SetActiveFootprintList(FALSE);
-	else SetActiveFootprintList(TRUE);
+    m_FilteredFootprintList.Clear();
+    FootprintItem = g_BaseListePkg;
 
-	
-	if ( (GetCount() == 0) || ( OldSelection >= GetCount() ) )
-		SetSelection(0, TRUE);
-	
-	Refresh();
+    int cmpnum = 1;
+    for( int ii = 0; FootprintItem != NULL; FootprintItem = FootprintItem->Pnext, ii++ )
+    {
+        /* Search for matching footprints */
+        for( unsigned jj = 0; jj < Component->m_FootprintFilter.GetCount(); jj++ )
+        {
+            if( !FootprintItem->m_Module.Matches( Component->m_FootprintFilter[jj] ) )
+                continue;
+            msg.Printf( wxT( "%3d %s" ), cmpnum++, FootprintItem->m_Module.GetData() );
+            m_FilteredFootprintList.Add( msg );
+            HasItem = TRUE;
+        }
+    }
+
+    if( HasItem )
+        SetActiveFootprintList( FALSE );
+    else
+        SetActiveFootprintList( TRUE );
+
+    if( (GetCount() == 0) || ( OldSelection >= GetCount() ) )
+        SetSelection( 0, TRUE );
+
+    Refresh();
 }
 
 
 /**************************************************************************/
-void FootprintListBox::SetActiveFootprintList(bool FullList, bool Redraw)
+void FootprintListBox::SetActiveFootprintList( bool FullList, bool Redraw )
 /**************************************************************************/
+
+/** Set the footprint list. We can have 2 footprint list:
+ *  The full footprint list
+ *  The filtered footprint list (if the current selected component has a filter for footprints)
+ *  @param FullList true = full footprint list, false = filtered footprint list
+ *  @param Redraw = true to redraw the window
+ */
 {
-bool old_selection = m_UseFootprintFullList;
-	
-	if ( FullList )
+    bool old_selection = m_UseFootprintFullList;
+
+    /* Workaround for a curious bug in wxWidgets:
+     *  if we switch from a long list of footprints to a short list (a filtered footprint list),
+     *  and if the selected item is near the end of the long list,
+     *  the new list is not displayed from the top of the list box
+     */
+	if ( m_ActiveFootprintList )
 	{
-		m_UseFootprintFullList = TRUE;
-		m_ActiveFootprintList = &m_FullFootprintList;
-		SetItemCount(m_FullFootprintList.GetCount() );
-	}
-	else
-	{
-		m_UseFootprintFullList = FALSE;
-		m_ActiveFootprintList = &m_FilteredFootprintList;
-		SetItemCount(m_FilteredFootprintList.GetCount() );
+		bool new_selection;
+		if( FullList ) new_selection = TRUE;
+		else new_selection = FALSE;
+		if( new_selection != old_selection )
+			SetSelection( 0, TRUE );
 	}
 
-	if ( Redraw )
-	{
-		if ( ! m_UseFootprintFullList || (m_UseFootprintFullList != old_selection) )
-		{
-			Refresh();
-		}
-	}
+    if( FullList )
+    {
+        m_UseFootprintFullList = TRUE;
+        m_ActiveFootprintList  = &m_FullFootprintList;
+        SetItemCount( m_FullFootprintList.GetCount() );
+    }
+    else
+    {
+        m_UseFootprintFullList = FALSE;
+        m_ActiveFootprintList  = &m_FilteredFootprintList;
+        SetItemCount( m_FilteredFootprintList.GetCount() );
+    }
 
-	if ( ! m_UseFootprintFullList || (m_UseFootprintFullList != old_selection) )
-	{
-		m_Parent->SetStatusText(wxEmptyString,0);
-		m_Parent->SetStatusText(wxEmptyString,1);
-	}
-	
-	wxString msg;
-	if ( FullList )
-		msg.Printf(_("Footprints (All): %d"), m_ActiveFootprintList->GetCount());
-	else
-		msg.Printf(_("Footprints (filtered): %d"), m_ActiveFootprintList->GetCount());
-	m_Parent->SetStatusText(msg,2);
+    if( Redraw )
+    {
+        if( !m_UseFootprintFullList || (m_UseFootprintFullList != old_selection) )
+        {
+            Refresh();
+        }
+    }
+
+    if( !m_UseFootprintFullList || (m_UseFootprintFullList != old_selection) )
+    {
+        m_Parent->SetStatusText( wxEmptyString, 0 );
+        m_Parent->SetStatusText( wxEmptyString, 1 );
+    }
+
+    wxString msg;
+    if( FullList )
+        msg.Printf( _( "Footprints (All): %d" ), m_ActiveFootprintList->GetCount() );
+    else
+        msg.Printf( _( "Footprints (filtered): %d" ), m_ActiveFootprintList->GetCount() );
+    m_Parent->SetStatusText( msg, 2 );
 }
 
-/***********************************************************************/
-/* Construction de la table des evenements pour la fenetre des modules */
-/***********************************************************************/
 
-BEGIN_EVENT_TABLE(FootprintListBox, LIST_BOX_TYPE)
-	EVT_SIZE( ListBoxBase::OnSize)
+/**************************************/
+/* Event table for the footprint list */
+/**************************************/
+
+BEGIN_EVENT_TABLE( FootprintListBox, LIST_BOX_TYPE )
+EVT_SIZE( ListBoxBase::OnSize )
 
 END_EVENT_TABLE()
 
 
 /********************************************************/
-void FootprintListBox::OnLeftClick(wxListEvent & event)
+void FootprintListBox::OnLeftClick( wxListEvent& event )
 /********************************************************/
 {
-STOREMOD * Module;
-wxString msg;
-wxString FootprintName = GetSelectedFootprint();
-	
-	Module = GetModuleDescrByName(FootprintName);
-	if( m_Parent->DrawFrame )
-	{
-		m_Parent->CreateScreenCmp(); /* refresh general */
-	}
+    STOREMOD* Module;
+    wxString  msg;
+    wxString  FootprintName = GetSelectedFootprint();
 
-	if ( Module ) msg = Module->m_Doc;
-	m_Parent->SetStatusText(msg,0);
+    Module = GetModuleDescrByName( FootprintName );
+    if( m_Parent->DrawFrame )
+    {
+        m_Parent->CreateScreenCmp(); /* refresh general */
+    }
 
-	msg = wxT("KeyW: ");
-	if( Module ) msg += Module->m_KeyWord;
-	m_Parent->SetStatusText(msg, 1);
+    if( Module )
+        msg = Module->m_Doc;
+    m_Parent->SetStatusText( msg, 0 );
+
+    msg = wxT( "KeyW: " );
+    if( Module )
+        msg += Module->m_KeyWord;
+    m_Parent->SetStatusText( msg, 1 );
 }
 
 
 /******************************************************/
-void FootprintListBox::OnLeftDClick(wxListEvent & event)
+void FootprintListBox::OnLeftDClick( wxListEvent& event )
 /******************************************************/
 {
-wxString FootprintName = GetSelectedFootprint();
+    wxString FootprintName = GetSelectedFootprint();
 
-	m_Parent->SetNewPkg(FootprintName);
+    m_Parent->SetNewPkg( FootprintName );
 }
 
+
 /**************************************************************/
-STOREMOD * GetModuleDescrByName(const wxString & FootprintName)
+STOREMOD* GetModuleDescrByName( const wxString& FootprintName )
 /**************************************************************/
 {
-STOREMOD * FootprintItem = g_BaseListePkg;
+    STOREMOD* FootprintItem = g_BaseListePkg;
 
-	for ( ; FootprintItem != NULL; FootprintItem = FootprintItem->Pnext )
-	{
-		if( FootprintItem->m_Module == FootprintName)
-			break;	// found !
-	}
-	return FootprintItem;
+    for( ; FootprintItem != NULL; FootprintItem = FootprintItem->Pnext )
+    {
+        if( FootprintItem->m_Module == FootprintName )
+            break; // found !
+    }
+
+    return FootprintItem;
 }
diff --git a/include/wxstruct.h b/include/wxstruct.h
index c4b5d4461c..2cfe2a6d54 100644
--- a/include/wxstruct.h
+++ b/include/wxstruct.h
@@ -1409,7 +1409,7 @@ class WinEDA_MsgPanel : public wxPanel
 protected:
     std::vector<MsgItem>    m_Items;    
 
-    void showItem( wxWindowDC& dc, const MsgItem& aItem );
+    void showItem( wxDC& dc, const MsgItem& aItem );
     
 public:
     WinEDA_DrawFrame* m_Parent;