diff --git a/3d-viewer/3d_aux.cpp b/3d-viewer/3d_aux.cpp
index d563f8b643..8dfbcec2d4 100644
--- a/3d-viewer/3d_aux.cpp
+++ b/3d-viewer/3d_aux.cpp
@@ -25,7 +25,7 @@
 #include "trackball.h"
 
 /**************************************************************************/
-void Struct3D_Master::Set_Object_Coords( S3D_Vertex* coord, int nbcoord )
+void S3D_MASTER::Set_Object_Coords( S3D_Vertex* coord, int nbcoord )
 /**************************************************************************/
 {
     int ii;
diff --git a/3d-viewer/3d_class.cpp b/3d-viewer/3d_class.cpp
index cedf78efff..b826d7e711 100644
--- a/3d-viewer/3d_class.cpp
+++ b/3d-viewer/3d_class.cpp
@@ -26,7 +26,7 @@ S3D_Vertex::S3D_Vertex()
 
 
 /**************************************************************************/
-S3D_Material::S3D_Material( Struct3D_Master* father, const wxString& name ) :
+S3D_MATERIAL::S3D_MATERIAL( S3D_MASTER* father, const wxString& name ) :
     EDA_BaseStruct( father, NOT_USED )
 /**************************************************************************/
 {
@@ -40,7 +40,7 @@ S3D_Material::S3D_Material( Struct3D_Master* father, const wxString& name ) :
 
 
 /***********************************/
-void S3D_Material::SetMaterial()
+void S3D_MATERIAL::SetMaterial()
 /***********************************/
 {
     glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
@@ -57,7 +57,7 @@ void S3D_Material::SetMaterial()
 
 
 /****************************************************/
-void Struct3D_Master::Copy( Struct3D_Master* pattern )
+void S3D_MASTER::Copy( S3D_MASTER* pattern )
 /****************************************************/
 {
     m_Shape3DName = pattern->m_Shape3DName;
@@ -70,7 +70,7 @@ void Struct3D_Master::Copy( Struct3D_Master* pattern )
 
 
 /***************************************************************/
-Struct3D_Master::Struct3D_Master( EDA_BaseStruct* aParent ) :
+S3D_MASTER::S3D_MASTER( EDA_BaseStruct* aParent ) :
     EDA_BaseStruct( aParent, NOT_USED )
 /***************************************************************/
 {
@@ -81,11 +81,11 @@ Struct3D_Master::Struct3D_Master( EDA_BaseStruct* aParent ) :
 
 
 /***************************************/
-Struct3D_Master:: ~Struct3D_Master()
+S3D_MASTER:: ~S3D_MASTER()
 /***************************************/
 {
     Struct3D_Shape* next;
-    S3D_Material*   nextmat;
+    S3D_MATERIAL*   nextmat;
 
     for( ; m_3D_Drawings != NULL; m_3D_Drawings = next )
     {
diff --git a/3d-viewer/3d_draw.cpp b/3d-viewer/3d_draw.cpp
index 28c3d35f66..d234e3d854 100644
--- a/3d-viewer/3d_draw.cpp
+++ b/3d-viewer/3d_draw.cpp
@@ -472,7 +472,7 @@ void MODULE::Draw3D( Pcb3D_GLCanvas* glcanvas )
     }
 
     /* Draw module shape: 3D shape if exists (or module edge if not exists) */
-    Struct3D_Master* Struct3D  = m_3D_Drawings;
+    S3D_MASTER* Struct3D  = m_3D_Drawings;
     bool             As3dShape = FALSE;
     if( g_Parm_3D_Visu.m_Draw3DModule )
     {
diff --git a/3d-viewer/3d_read_mesh.cpp b/3d-viewer/3d_read_mesh.cpp
index c2bc4327c7..bddf9c0af2 100644
--- a/3d-viewer/3d_read_mesh.cpp
+++ b/3d-viewer/3d_read_mesh.cpp
@@ -20,7 +20,7 @@
 
 
 /***********************************/
-int Struct3D_Master:: ReadData()
+int S3D_MASTER:: ReadData()
 /************************************/
 {
     char     line[1024], * text;
@@ -81,7 +81,7 @@ int Struct3D_Master:: ReadData()
 
 
 /*********************************************************/
-int Struct3D_Master:: ReadMaterial( FILE* file, int* LineNum )
+int S3D_MASTER:: ReadMaterial( FILE* file, int* LineNum )
 /*********************************************************/
 
 /*
@@ -100,7 +100,7 @@ int Struct3D_Master:: ReadMaterial( FILE* file, int* LineNum )
 {
     char          line[512], * text, * command;
     wxString      mat_name;
-    S3D_Material* material = NULL;
+    S3D_MATERIAL* material = NULL;
 
     // Lecture de la commande:
     command  = strtok( NULL, " \t\n\r" );
@@ -123,7 +123,7 @@ int Struct3D_Master:: ReadMaterial( FILE* file, int* LineNum )
 
     if( stricmp( command, "DEF" ) == 0 )
     {
-        material = new S3D_Material( this, mat_name );
+        material = new S3D_MATERIAL( this, mat_name );
 
         Insert( material );
 
@@ -186,7 +186,7 @@ int Struct3D_Master:: ReadMaterial( FILE* file, int* LineNum )
 
 
 /**********************************************************/
-int Struct3D_Master::ReadChildren( FILE* file, int* LineNum )
+int S3D_MASTER::ReadChildren( FILE* file, int* LineNum )
 /***********************************************************/
 {
     char line[1024], * text;
@@ -215,7 +215,7 @@ int Struct3D_Master::ReadChildren( FILE* file, int* LineNum )
 
 
 /********************************************************/
-int Struct3D_Master::ReadShape( FILE* file, int* LineNum )
+int S3D_MASTER::ReadShape( FILE* file, int* LineNum )
 /********************************************************/
 {
     char line[1024], * text;
@@ -250,7 +250,7 @@ int Struct3D_Master::ReadShape( FILE* file, int* LineNum )
 
 
 /*************************************************************/
-int Struct3D_Master::ReadAppearance( FILE* file, int* LineNum )
+int S3D_MASTER::ReadAppearance( FILE* file, int* LineNum )
 /*************************************************************/
 {
     char line[1024], * text;
@@ -381,7 +381,7 @@ double* ReadCoordsList( FILE* file, char* text_buffer, int* bufsize, int* LineNu
 
 
 /***********************************************************/
-int Struct3D_Master::ReadGeometry( FILE* file, int* LineNum )
+int S3D_MASTER::ReadGeometry( FILE* file, int* LineNum )
 /***********************************************************/
 {
     char    line[1024], buffer[1024], * text;
diff --git a/3d-viewer/3d_struct.h b/3d-viewer/3d_struct.h
index 66107f4e4c..c5327d52f7 100644
--- a/3d-viewer/3d_struct.h
+++ b/3d-viewer/3d_struct.h
@@ -13,7 +13,7 @@
 #define UNITS3D_TO_UNITSPCB 1000
 
 
-class Struct3D_Master;
+class S3D_MASTER;
 class Struct3D_Shape;
 
 class S3D_Color     /* This is a 3D color (R, G, G) 3 floats range 0 to 1.0*/
@@ -34,7 +34,7 @@ public:
     S3D_Vertex();
 };
 
-class S3D_Material : public EDA_BaseStruct       /* openGL "material" data*/
+class S3D_MATERIAL : public EDA_BaseStruct       /* openGL "material" data*/
 {
 public:
     wxString   m_Name;
@@ -46,17 +46,17 @@ public:
     float      m_Shininess;
 
 public:
-    S3D_Material( Struct3D_Master * father, const wxString &name );
+    S3D_MATERIAL( S3D_MASTER * father, const wxString &name );
 
-    S3D_Material* Next() const { return (S3D_Material*) Pnext; }
-    S3D_Material* Back() const { return (S3D_Material*) Pback; }
+    S3D_MATERIAL* Next() const { return (S3D_MATERIAL*) Pnext; }
+    S3D_MATERIAL* Back() const { return (S3D_MATERIAL*) Pback; }
 
     void SetMaterial();
 };
 
 
 /*******************************************/
-class Struct3D_Master : public EDA_BaseStruct
+class S3D_MASTER : public EDA_BaseStruct
 /*******************************************/
 /* Master structure for a 3D item description */
 {
@@ -66,23 +66,23 @@ public:
     S3D_Vertex      m_MatRotation;
     S3D_Vertex      m_MatPosition;
     Struct3D_Shape* m_3D_Drawings;
-    S3D_Material*   m_Materials;
+    S3D_MATERIAL*   m_Materials;
 
 public:
 
-    Struct3D_Master( EDA_BaseStruct * aParent );
-    ~Struct3D_Master();
+    S3D_MASTER( EDA_BaseStruct * aParent );
+    ~S3D_MASTER();
 
-    Struct3D_Master* Next() const { return (Struct3D_Master*) Pnext; }
-    Struct3D_Master* Back() const { return (Struct3D_Master*) Pback; }
+    S3D_MASTER* Next() const { return (S3D_MASTER*) Pnext; }
+    S3D_MASTER* Back() const { return (S3D_MASTER*) Pback; }
 
-    void Insert( S3D_Material* aMaterial )
+    void Insert( S3D_MATERIAL* aMaterial )
     {
         aMaterial->SetNext( m_Materials );
         m_Materials = aMaterial;
     }
 
-    void    Copy( Struct3D_Master* pattern );
+    void    Copy( S3D_MASTER* pattern );
     int     ReadData();
     int     ReadMaterial( FILE* file, int* LineNum );
     int     ReadChildren( FILE* file, int* LineNum );
diff --git a/change_log.txt b/change_log.txt
index 4c65887f3f..c5339c48cd 100644
--- a/change_log.txt
+++ b/change_log.txt
@@ -5,6 +5,15 @@ Started 2007-June-11
 Please add newer entries at the top, list the date and your name with
 email address.
 
+2008-Dec-5 UPDATE Dick Hollenbeck <dick@softplc.com>
+================================================================================
+++pcbnew & gerbview
+  * Renamed Struct3D_Master to S3D_MASTER.
+  * MODULE::m_3D_Drawings is now a DLIST<>
+  * Removed AddToChain(), DeleteStructList() and replaced with calls to DLIST<>
+    members so that list item counting stays accurate.
+
+
 2008-Dec-05 UPDATE Wayne Stambaugh <stambaughw@verizon.net>
 ================================================================================
 ++all
diff --git a/common/base_struct.cpp b/common/base_struct.cpp
index 48fb47677f..0cd7187094 100644
--- a/common/base_struct.cpp
+++ b/common/base_struct.cpp
@@ -56,37 +56,6 @@ void EDA_BaseStruct::InitVars()
 }
 
 
-/***********************************************************/
-void EDA_BaseStruct::DeleteStructList()
-/***********************************************************/
-{
-    EDA_BaseStruct* item = this;
-    EDA_BaseStruct* next;
-
-    while( item )
-    {
-        next = item->Next();
-        delete item;
-        item = next;
-    }
-}
-
-
-/*********************************************************/
-void EDA_BaseStruct::AddToChain( EDA_BaseStruct* laststruct )
-/*********************************************************/
-
-/*
- *  Add "this" to the linked list, after laststruct
- */
-{
-    Pnext = laststruct->Pnext;
-    Pback = laststruct;
-    laststruct->Pnext = this;
-}
-
-
-
 // see base_struct.h
 SEARCH_RESULT EDA_BaseStruct::IterateForward( EDA_BaseStruct* listStart,
                                               INSPECTOR*      inspector,
diff --git a/gerbview/initpcb.cpp b/gerbview/initpcb.cpp
index 903706fa32..711a09cd36 100644
--- a/gerbview/initpcb.cpp
+++ b/gerbview/initpcb.cpp
@@ -45,7 +45,7 @@ bool WinEDA_GerberFrame::Clear_Pcb( bool query )
     for( ; g_UnDeleteStackPtr != 0; )
     {
         g_UnDeleteStackPtr--;
-        g_UnDeleteStack[ g_UnDeleteStackPtr]->DeleteStructList();
+        delete g_UnDeleteStack[ g_UnDeleteStackPtr];
     }
 
     /* init pointeurs  et variables */
@@ -89,26 +89,24 @@ void WinEDA_GerberFrame::Erase_Zones( bool query )
 void WinEDA_GerberFrame::Erase_Segments_Pcb( bool all_layers, bool query )
 /************************************************************************/
 {
-    BOARD_ITEM*     PtStruct;
-    BOARD_ITEM*     PtNext;
-    int             layer = GetScreen()->m_Active_Layer;
+    int  layer = GetScreen()->m_Active_Layer;
 
     if( all_layers )
         layer = -1;
 
-    PtStruct = m_Pcb->m_Drawings;
-    for( ; PtStruct != NULL; PtStruct = PtNext )
+    BOARD_ITEM*  next;
+    for( BOARD_ITEM* item = m_Pcb->m_Drawings;  item;  item = next )
     {
-        PtNext = PtStruct->Next();
+        next = item->Next();
 
-        switch( PtStruct->Type() )
+        switch( item->Type() )
         {
         case TYPE_DRAWSEGMENT:
         case TYPE_TEXTE:
         case TYPE_COTATION:
         case TYPE_MIRE:
-            if( PtStruct->GetLayer() == layer  || layer < 0 )
-                PtStruct->DeleteStructure();
+            if( item->GetLayer() == layer  || layer < 0 )
+                m_Pcb->Delete( item );
             break;
 
         default:
diff --git a/include/base_struct.h b/include/base_struct.h
index 3844d12e31..63ea1e7889 100644
--- a/include/base_struct.h
+++ b/include/base_struct.h
@@ -424,24 +424,6 @@ public:
     }
 
 
-    /**
-     * Function DeleteStructList
-     * deletes each item in a linked list of EDA_BaseStructs, starting with
-     * "this" object.
-     */
-    void DeleteStructList();
-
-
-    /**
-     * Function AddToChain
-     * adds this item just after laststruct in a linked list established
-     * by the Prev and Back pointers of my base EDA_BaseStruct.
-     * @deprecated
-     * @param laststruct The item to add after
-     */
-    void AddToChain( EDA_BaseStruct* laststruct );
-
-
 #if defined (DEBUG)
 
     /**
diff --git a/pcbnew/class_board.cpp b/pcbnew/class_board.cpp
index 5eb9eb9e43..6745f97bfb 100644
--- a/pcbnew/class_board.cpp
+++ b/pcbnew/class_board.cpp
@@ -192,26 +192,6 @@ wxPoint& BOARD::GetPosition()
 }
 
 
-void BOARD::UnLink()
-{
-    /* Update back link */
-    if( Back() )
-    {
-        if( Back()->Type() == TYPE_PCB )
-        {
-            Back()->SetNext( Next() );
-        }
-    }
-
-    /* Modification du chainage avant */
-    if( Next() )
-        Next()->SetBack( Back() );
-
-    SetNext( 0 );
-    SetBack( 0 );
-}
-
-
 void BOARD::Add( BOARD_ITEM* aBoardItem, int aControl )
 {
     if ( aBoardItem == NULL )
@@ -316,6 +296,31 @@ void BOARD::Delete( BOARD_ITEM* aBoardItem )
         }
         break;
 
+    case TYPE_MODULE:
+        delete m_Modules.Remove( (MODULE*) aBoardItem );
+        break;
+
+    case TYPE_TRACK:
+    case TYPE_VIA:
+        delete m_Track.Remove( (TRACK*) aBoardItem );
+        break;
+
+    case TYPE_ZONE:
+        delete m_Zone.Remove( (SEGZONE*) aBoardItem );
+        break;
+
+    case TYPE_COTATION:
+    case TYPE_DRAWSEGMENT:
+    case TYPE_TEXTE:
+    case TYPE_EDGE_MODULE:
+    case TYPE_MIRE:
+        delete m_Drawings.Remove( aBoardItem );
+        break;
+
+    case TYPE_EQUIPOT:
+        delete m_Equipots.Remove( (EQUIPOT*) aBoardItem );
+        break;
+
     // other types may use linked list
     default:
         wxFAIL_MSG( wxT("BOARD::Delete() needs work") );
diff --git a/pcbnew/class_board.h b/pcbnew/class_board.h
index f1bd6d5a0e..1fbeb6b7f6 100644
--- a/pcbnew/class_board.h
+++ b/pcbnew/class_board.h
@@ -115,8 +115,6 @@ public:
      */
     wxPoint& GetPosition();
 
-    /* supprime du chainage la structure Struct */
-    void    UnLink();
 
     /**
      * Function Add
diff --git a/pcbnew/class_module.cpp b/pcbnew/class_module.cpp
index 53aee0069b..fd6a5ecb97 100644
--- a/pcbnew/class_module.cpp
+++ b/pcbnew/class_module.cpp
@@ -57,7 +57,6 @@ void MODULE::DrawAncre( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset
 MODULE::MODULE( BOARD* parent ) :
     BOARD_ITEM( parent, TYPE_MODULE )
 {
-    m_3D_Drawings  = NULL;
     m_Attributs    = MOD_DEFAULT;
     m_Layer        = CMP_N;
     m_Orient       = 0;
@@ -74,48 +73,40 @@ MODULE::MODULE( BOARD* parent ) :
     m_Value = new TEXTE_MODULE( this, TEXT_is_VALUE );
     m_Value->SetBack( this );
 
-    m_3D_Drawings  = new Struct3D_Master( this );
+    m_3D_Drawings.PushBack( new S3D_MASTER( this ) );
 }
 
 
 MODULE::~MODULE()
 {
-    EDA_BaseStruct* item;
-    EDA_BaseStruct* next;
-
     delete m_Reference;
     delete m_Value;
-    for( item = m_3D_Drawings;  item;  item = next )
-    {
-        next = item->Next();
-        delete item;
-    }
 }
 
 
 /*********************************/
-void MODULE::Copy( MODULE* Module )
+void MODULE::Copy( MODULE* aModule )
 /*********************************/
 {
-    m_Pos           = Module->m_Pos;
-    m_Layer         = Module->m_Layer;
-    m_LibRef        = Module->m_LibRef;
-    m_Attributs     = Module->m_Attributs;
-    m_Orient        = Module->m_Orient;
-    m_BoundaryBox   = Module->m_BoundaryBox;
-    m_PadNum        = Module->m_PadNum;
-    m_CntRot90      = Module->m_CntRot90;
-    m_CntRot180     = Module->m_CntRot180;
-    m_LastEdit_Time = Module->m_LastEdit_Time;
-    m_Path          = Module->m_Path; //is this correct behavior?
+    m_Pos           = aModule->m_Pos;
+    m_Layer         = aModule->m_Layer;
+    m_LibRef        = aModule->m_LibRef;
+    m_Attributs     = aModule->m_Attributs;
+    m_Orient        = aModule->m_Orient;
+    m_BoundaryBox   = aModule->m_BoundaryBox;
+    m_PadNum        = aModule->m_PadNum;
+    m_CntRot90      = aModule->m_CntRot90;
+    m_CntRot180     = aModule->m_CntRot180;
+    m_LastEdit_Time = aModule->m_LastEdit_Time;
+    m_Path          = aModule->m_Path; //is this correct behavior?
     m_TimeStamp     = GetTimeStamp();
 
     /* Copy des structures auxiliaires: Reference et value */
-    m_Reference->Copy( Module->m_Reference );
-    m_Value->Copy( Module->m_Value );
+    m_Reference->Copy( aModule->m_Reference );
+    m_Value->Copy( aModule->m_Value );
 
     /* Copie des structures auxiliaires: Pads */
-    for( D_PAD* pad = Module->m_Pads;  pad;  pad = pad->Next() )
+    for( D_PAD* pad = aModule->m_Pads;  pad;  pad = pad->Next() )
     {
         D_PAD* newpad = new D_PAD( this );
         newpad->Copy( pad );
@@ -124,7 +115,7 @@ void MODULE::Copy( MODULE* Module )
     }
 
     /* Copy des structures auxiliaires: Drawings */
-    for( BOARD_ITEM* item = Module->m_Drawings;  item;  item = item->Next() )
+    for( BOARD_ITEM* item = aModule->m_Drawings;  item;  item = item->Next() )
     {
         switch( item->Type() )
         {
@@ -148,25 +139,16 @@ void MODULE::Copy( MODULE* Module )
         }
     }
 
-    /* Copy des elements complementaires Drawings 3D */
-    m_3D_Drawings->Copy( Module->m_3D_Drawings );
-
-    Struct3D_Master* Struct3D, * NewStruct3D, * CurrStruct3D;
-
-    Struct3D     = Module->m_3D_Drawings->Next();
-    CurrStruct3D = m_3D_Drawings;
-    for( ; Struct3D != NULL;  Struct3D = Struct3D->Next() )
+    for( S3D_MASTER* item = aModule->m_3D_Drawings;  item;  item = item->Next() )
     {
-        NewStruct3D = new Struct3D_Master( this );
-        NewStruct3D->Copy( Struct3D );
-        CurrStruct3D->SetNext( NewStruct3D );
-        NewStruct3D->SetBack( CurrStruct3D );
-        CurrStruct3D = NewStruct3D;
+        S3D_MASTER* t3d = new S3D_MASTER( this );
+        t3d->Copy( item );
+        m_3D_Drawings.PushBack( t3d );
     }
 
     /* Copie des elements complementaires */
-    m_Doc     = Module->m_Doc;
-    m_KeyWord = Module->m_KeyWord;
+    m_Doc     = aModule->m_Doc;
+    m_KeyWord = aModule->m_KeyWord;
 }
 
 
@@ -360,7 +342,7 @@ int MODULE::Write_3D_Descr( FILE* File ) const
  */
 {
     char             buf[512];
-    Struct3D_Master* Struct3D = m_3D_Drawings;
+    S3D_MASTER* Struct3D = m_3D_Drawings;
 
     for( ; Struct3D != NULL; Struct3D = Struct3D->Next() )
     {
@@ -406,19 +388,17 @@ int MODULE::Read_3D_Descr( FILE* File, int* LineNum )
  */
 {
     char             Line[1024];
-    char*            text     = Line + 3;
-    Struct3D_Master* Struct3D = m_3D_Drawings;
+    char*            text = Line + 3;
+
+    S3D_MASTER* Struct3D = m_3D_Drawings;
 
     if( !Struct3D->m_Shape3DName.IsEmpty() )
     {
-        Struct3D_Master* NewStruct3D;
-        while( Struct3D->Next() )
-            Struct3D = Struct3D->Next();
+        S3D_MASTER* n3D = new S3D_MASTER( this );
 
-        NewStruct3D = new Struct3D_Master( this );
-        Struct3D->SetNext( NewStruct3D );
-        NewStruct3D->SetBack( Struct3D );
-        Struct3D = NewStruct3D;
+        m_3D_Drawings.PushBack( n3D );
+
+        Struct3D = n3D;
     }
 
     while( GetLine( File, Line, LineNum, sizeof(Line) - 1 ) != NULL )
diff --git a/pcbnew/class_module.h b/pcbnew/class_module.h
index 44c1eb5af7..9cbfd729c9 100644
--- a/pcbnew/class_module.h
+++ b/pcbnew/class_module.h
@@ -4,7 +4,7 @@
 
 
 class Pcb3D_GLCanvas;
-class Struct3D_Master;
+class S3D_MASTER;
 
 /************************************/
 /* Modules (footprints) description */
@@ -41,7 +41,7 @@ public:
     wxPoint             m_Pos;             // Real coord on board
     DLIST<D_PAD>        m_Pads;            /* Pad list (linked list) */
     DLIST<BOARD_ITEM>   m_Drawings;        /* Graphic items list (linked list) */
-    Struct3D_Master*    m_3D_Drawings;     /* First item of the 3D shapes (linked list)*/
+    DLIST<S3D_MASTER>   m_3D_Drawings;     /* First item of the 3D shapes (linked list)*/
     TEXTE_MODULE*       m_Reference;       // Component reference (U34, R18..)
     TEXTE_MODULE*       m_Value;           // Component value (74LS00, 22K..)
     wxString            m_LibRef;          /* Name of the module in library (and the default value when loading amodule from the library) */
diff --git a/pcbnew/dialog_edit_module.cpp b/pcbnew/dialog_edit_module.cpp
index 6a63d8604f..cfd926c882 100644
--- a/pcbnew/dialog_edit_module.cpp
+++ b/pcbnew/dialog_edit_module.cpp
@@ -100,9 +100,9 @@ void WinEDA_ModulePropertiesFrame::CreateControls()
 
     /* creation des autres formes 3D */
     Panel3D_Ctrl*    panel3D = m_Panel3D, * nextpanel3D;
-    Struct3D_Master* draw3D  = m_CurrentModule->m_3D_Drawings;
-    draw3D = (Struct3D_Master*) draw3D->Next();
-    for( ; draw3D != NULL; draw3D = (Struct3D_Master*) draw3D->Next() )
+    S3D_MASTER* draw3D  = m_CurrentModule->m_3D_Drawings;
+    draw3D = (S3D_MASTER*) draw3D->Next();
+    for( ; draw3D != NULL; draw3D = (S3D_MASTER*) draw3D->Next() )
     {
         nextpanel3D = new Panel3D_Ctrl( this, m_NoteBook, -1, draw3D );
         m_NoteBook->AddPage( nextpanel3D, _( "3D settings" ), FALSE );
@@ -382,7 +382,7 @@ void WinEDA_ModulePropertiesFrame::BuildPanelModuleProperties( bool FullOptions
 /**************************************************************/
 Panel3D_Ctrl::Panel3D_Ctrl( WinEDA_ModulePropertiesFrame* parentframe,
                             wxNotebook* parent,
-                            int id, Struct3D_Master* struct3D ) :
+                            int id, S3D_MASTER* struct3D ) :
     wxPanel( parent, id )
 /**************************************************************/
 
@@ -594,31 +594,34 @@ void WinEDA_ModulePropertiesFrame::OnOkClick( wxCommandEvent& event )
 
     /* Mise a jour des parametres 3D */
     Panel3D_Ctrl*    panel3D = m_Panel3D;
-    Struct3D_Master* draw3D  = m_CurrentModule->m_3D_Drawings,
-    * nextdraw3D;
+    S3D_MASTER* draw3D  = m_CurrentModule->m_3D_Drawings;
+    S3D_MASTER* nextdraw3D;
     for( ; panel3D != NULL; panel3D = panel3D->m_Pnext )
     {
         draw3D->m_Shape3DName = panel3D->m_3D_ShapeName->GetValue();
         draw3D->m_MatScale    = panel3D->m_3D_Scale->GetValue();
         draw3D->m_MatRotation = panel3D->m_3D_Rotation->GetValue();
         draw3D->m_MatPosition = panel3D->m_3D_Offset->GetValue();
+
         if( ( draw3D->m_Shape3DName.IsEmpty() )
            && (draw3D != m_CurrentModule->m_3D_Drawings) )
             continue;
+
         if( (draw3D->Next() == NULL) && panel3D->m_Pnext )
         {
-            nextdraw3D = new Struct3D_Master( draw3D );
-            nextdraw3D->SetBack( draw3D );
-            draw3D->SetNext( nextdraw3D );
+            nextdraw3D = new S3D_MASTER( draw3D );
+
+            // insert after draw3D, therefore pass ->Next() to insert before the next.
+            m_CurrentModule->m_3D_Drawings.Insert( nextdraw3D, draw3D->Next() );
         }
-        draw3D = (Struct3D_Master*) draw3D->Next();
+        draw3D = (S3D_MASTER*) draw3D->Next();
     }
 
     for( ; draw3D != NULL; draw3D = nextdraw3D )
     {
-        nextdraw3D = (Struct3D_Master*) draw3D->Next();
-        (draw3D->Back())->SetNext( NULL );
-        delete draw3D;
+        nextdraw3D = (S3D_MASTER*) draw3D->Next();
+
+        delete m_CurrentModule->m_3D_Drawings.Remove( draw3D );
     }
 
     m_CurrentModule->Set_Rectangle_Encadrement();
diff --git a/pcbnew/dialog_edit_module.h b/pcbnew/dialog_edit_module.h
index 9c8ad2bfb3..19db8f3588 100644
--- a/pcbnew/dialog_edit_module.h
+++ b/pcbnew/dialog_edit_module.h
@@ -1,78 +1,78 @@
-	/************************************************/
-	/* Module editor: Dialog box for editing module	*/
-	/*  properties and carateristics				*/
-	/************************************************/
+    /************************************************/
+    /* Module editor: Dialog box for editing module	*/
+    /*  properties and carateristics				*/
+    /************************************************/
 
 enum id_Module_properties
 {
-	ID_GOTO_MODULE_EDITOR =1900,
-	ID_MODULE_PROPERTIES_EXCHANGE,
-	ID_MODULE_EDIT_ADD_TEXT,
-	ID_MODULE_EDIT_EDIT_TEXT,
-	ID_MODULE_EDIT_DELETE_TEXT,
-	ID_MODULE_LISTBOX_SELECT,
-	ID_LISTBOX_ORIENT_SELECT,
-	ID_BROWSE_3D_LIB,
-	ID_ADD_3D_SHAPE,
-	ID_REMOVE_3D_SHAPE,
-	ID_NOTEBOOK,
-	ID_MODULE_EDIT_X_POSITION,
-	ID_MODULE_EDIT_Y_POSITION
+    ID_GOTO_MODULE_EDITOR =1900,
+    ID_MODULE_PROPERTIES_EXCHANGE,
+    ID_MODULE_EDIT_ADD_TEXT,
+    ID_MODULE_EDIT_EDIT_TEXT,
+    ID_MODULE_EDIT_DELETE_TEXT,
+    ID_MODULE_LISTBOX_SELECT,
+    ID_LISTBOX_ORIENT_SELECT,
+    ID_BROWSE_3D_LIB,
+    ID_ADD_3D_SHAPE,
+    ID_REMOVE_3D_SHAPE,
+    ID_NOTEBOOK,
+    ID_MODULE_EDIT_X_POSITION,
+    ID_MODULE_EDIT_Y_POSITION
 };
 
 class Panel3D_Ctrl;
 
-	/**************************************/
-	/* class WinEDA_ModulePropertiesFrame */
-	/**************************************/
+    /**************************************/
+    /* class WinEDA_ModulePropertiesFrame */
+    /**************************************/
 
 class WinEDA_ModulePropertiesFrame: public wxDialog
 {
 private:
 
-	WinEDA_BasePcbFrame * m_Parent;
-	wxDC * m_DC;
-	MODULE * m_CurrentModule;
-	wxNotebook* m_NoteBook;
-	wxPanel * m_PanelProperties;
-	Panel3D_Ctrl * m_Panel3D;
-	WinEDAChoiceBox * m_TextListBox;
-	wxRadioBox * m_LayerCtrl;
-	wxRadioBox * m_OrientCtrl;
-	wxTextCtrl * m_OrientValue;
-	wxRadioBox * m_AttributsCtrl;
-	wxRadioBox * m_AutoPlaceCtrl;
-	wxSlider * m_CostRot90Ctrl, * m_CostRot180Ctrl;
-	wxButton * m_DeleteFieddButton;
-	wxTextCtrl *m_Doc, *m_Keyword;
-	wxBoxSizer * m_GeneralBoxSizer;
+    WinEDA_BasePcbFrame * m_Parent;
+    wxDC * m_DC;
+    MODULE * m_CurrentModule;
+    wxNotebook* m_NoteBook;
+    wxPanel * m_PanelProperties;
+    Panel3D_Ctrl * m_Panel3D;
+    WinEDAChoiceBox * m_TextListBox;
+    wxRadioBox * m_LayerCtrl;
+    wxRadioBox * m_OrientCtrl;
+    wxTextCtrl * m_OrientValue;
+    wxRadioBox * m_AttributsCtrl;
+    wxRadioBox * m_AutoPlaceCtrl;
+    wxSlider * m_CostRot90Ctrl, * m_CostRot180Ctrl;
+    wxButton * m_DeleteFieddButton;
+    wxTextCtrl *m_Doc, *m_Keyword;
+    wxBoxSizer * m_GeneralBoxSizer;
     wxBoxSizer* m_PanelPropertiesBoxSizer;
     wxTextCtrl *m_ModPositionX, *m_ModPositionY;
     wxString *m_ModPosXStr, *m_ModPosYStr;
 
 
 public:
-	// Constructor and destructor
-	WinEDA_ModulePropertiesFrame(WinEDA_BasePcbFrame *parent,
-							MODULE * Module, wxDC * DC, const wxPoint & pos);
-	~WinEDA_ModulePropertiesFrame()
-		{
-		}
+    // Constructor and destructor
+    WinEDA_ModulePropertiesFrame(WinEDA_BasePcbFrame *parent,
+                            MODULE * Module, wxDC * DC, const wxPoint & pos);
+    ~WinEDA_ModulePropertiesFrame()
+        {
+        }
 
 private:
     void CreateControls();
-	void OnCancelClick(wxCommandEvent& event);
-	void OnOkClick(wxCommandEvent& event);
-	void CreateTextModule(wxCommandEvent& event);
-	void EditOrDelTextModule(wxCommandEvent& event);
-	void SelectTextListBox(wxCommandEvent& event);
-	void ReCreateFieldListBox();
-	void SetTextListButtons();
-	void BuildPanelModuleProperties(bool FullOptions);
-	void ModuleOrientEvent(wxCommandEvent& event);
-	void ExchangeModule(wxCommandEvent& event);
-	void GotoModuleEditor(wxCommandEvent& event);
-	DECLARE_EVENT_TABLE()
+    void OnCancelClick(wxCommandEvent& event);
+    void OnOkClick(wxCommandEvent& event);
+    void CreateTextModule(wxCommandEvent& event);
+    void EditOrDelTextModule(wxCommandEvent& event);
+    void SelectTextListBox(wxCommandEvent& event);
+    void ReCreateFieldListBox();
+    void SetTextListButtons();
+    void BuildPanelModuleProperties(bool FullOptions);
+    void ModuleOrientEvent(wxCommandEvent& event);
+    void ExchangeModule(wxCommandEvent& event);
+    void GotoModuleEditor(wxCommandEvent& event);
+    DECLARE_EVENT_TABLE()
 };
 
 
@@ -82,18 +82,18 @@ class Panel3D_Ctrl: public wxPanel
 /* panel d'entree des caract 3D */
 {
 public:
-	Panel3D_Ctrl * m_Pnext, * m_Pback;	// Chainage
-	wxNotebook * m_Parent;
-	WinEDA_ModulePropertiesFrame * m_ParentFrame;
+    Panel3D_Ctrl * m_Pnext, * m_Pback;	// Chainage
+    wxNotebook * m_Parent;
+    WinEDA_ModulePropertiesFrame * m_ParentFrame;
     wxBoxSizer* m_Panel3DBoxSizer;
-	wxTextCtrl * m_3D_ShapeName;
-	WinEDA_VertexCtrl *m_3D_Scale, *m_3D_Offset, *m_3D_Rotation;
+    wxTextCtrl * m_3D_ShapeName;
+    WinEDA_VertexCtrl *m_3D_Scale, *m_3D_Offset, *m_3D_Rotation;
 public:
-	Panel3D_Ctrl(WinEDA_ModulePropertiesFrame * parentframe,
-		wxNotebook * parent, int id, Struct3D_Master * struct3D);
-	~Panel3D_Ctrl();
-	void Browse3DLib(wxCommandEvent& event);
-	void AddOrRemove3DShape(wxCommandEvent& event);
-	DECLARE_EVENT_TABLE()
+    Panel3D_Ctrl(WinEDA_ModulePropertiesFrame * parentframe,
+        wxNotebook * parent, int id, S3D_MASTER * struct3D);
+    ~Panel3D_Ctrl();
+    void Browse3DLib(wxCommandEvent& event);
+    void AddOrRemove3DShape(wxCommandEvent& event);
+    DECLARE_EVENT_TABLE()
 };
 
diff --git a/pcbnew/edgemod.cpp b/pcbnew/edgemod.cpp
index a73142238d..61f8f28e13 100644
--- a/pcbnew/edgemod.cpp
+++ b/pcbnew/edgemod.cpp
@@ -335,61 +335,75 @@ EDGE_MODULE* WinEDA_ModuleEditFrame::Begin_Edge_Module( EDGE_MODULE* Edge,
  * @return the new created edge.
  */
 {
-    MODULE* Module = m_Pcb->m_Modules;
+    MODULE* module = m_Pcb->m_Modules;
     int     angle  = 0;
 
-    if( Module == NULL )
+    if( module == NULL )
         return NULL;
 
     if( Edge == NULL )       /* Start a new edge item */
     {
-        SaveCopyInUndoList( Module );
-        Edge = new EDGE_MODULE( Module );
+        SaveCopyInUndoList( module );
+
+        Edge = new EDGE_MODULE( module );
         MoveVector.x = MoveVector.y = 0;
 
         /* Add the new item to the Drawings list head*/
-        Module->m_Drawings.PushFront( Edge );
+        module->m_Drawings.PushFront( Edge );
 
         /* Mise a jour des caracteristiques du segment ou de l'arc */
         Edge->m_Flags = IS_NEW;
         Edge->m_Angle = angle;
         Edge->m_Shape = type_edge;
+
         if( Edge->m_Shape == S_ARC )
             Edge->m_Angle = ArcValue;
+
         Edge->m_Width = ModuleSegmentWidth;
-        Edge->SetLayer( Module->GetLayer() );
-        if( Module->GetLayer() == CMP_N )
+        Edge->SetLayer( module->GetLayer() );
+
+        if( module->GetLayer() == CMP_N )
             Edge->SetLayer( SILKSCREEN_N_CMP );
-        if( Module->GetLayer() == COPPER_LAYER_N )
+        if( module->GetLayer() == COPPER_LAYER_N )
             Edge->SetLayer( SILKSCREEN_N_CU );
+
         /* Initialise the starting point of the new segment or arc */
         Edge->m_Start = GetScreen()->m_Curseur;
+
         /* Initialise the ending point of the new segment or arc */
         Edge->m_End = Edge->m_Start;
 
         /* Initialise the relative coordinates */
-        Edge->m_Start0.x = Edge->m_Start.x - Module->m_Pos.x;
-        Edge->m_Start0.y = Edge->m_Start.y - Module->m_Pos.y;
-        RotatePoint( (int*) &(Edge->m_Start0.x),
-                    (int*) &(Edge->m_Start0.y), -Module->m_Orient );
+        Edge->m_Start0.x = Edge->m_Start.x - module->m_Pos.x;
+        Edge->m_Start0.y = Edge->m_Start.y - module->m_Pos.y;
+
+        RotatePoint( (int*) &Edge->m_Start0.x,
+                    (int*) &Edge->m_Start0.y, -module->m_Orient );
+
         Edge->m_End0 = Edge->m_Start0;
-        Module->Set_Rectangle_Encadrement();
+        module->Set_Rectangle_Encadrement();
 
         DrawPanel->ManageCurseur = ShowEdgeModule;
         DrawPanel->ForceCloseManageCurseur = Exit_EditEdge_Module;
     }
-    else    /* trace en cours : les coord du point d'arrivee ont ete mises
-             *  a jour par la routine Montre_Position_New_Edge_Module*/
+
+    /* trace en cours : les coord du point d'arrivee ont ete mises
+     * a jour par la routine Montre_Position_New_Edge_Module
+     */
+    else
     {
         if( type_edge == S_SEGMENT )
         {
-            if( (Edge->m_Start0.x) != (Edge->m_End0.x)
-               || (Edge->m_Start0.y) != (Edge->m_End0.y) )
+            if( Edge->m_Start0 != Edge->m_End0 )
             {
                 Edge->Draw( DrawPanel, DC, GR_OR );
-                EDGE_MODULE* newedge = new EDGE_MODULE( Module );
+
+                EDGE_MODULE* newedge = new EDGE_MODULE( module );
                 newedge->Copy( Edge );
-                newedge->AddToChain( Edge );
+
+                // insert _after_ Edge, which is the same as inserting _before_ Edge->Next()
+                module->m_Drawings.Insert( newedge, Edge->Next() );
+
                 Edge->m_Flags = 0;
                 Edge = newedge;
 
@@ -399,14 +413,16 @@ EDGE_MODULE* WinEDA_ModuleEditFrame::Begin_Edge_Module( EDGE_MODULE* Edge,
                 Edge->m_End   = Edge->m_Start;
 
                 /* Mise a jour des coord relatives */
-                Edge->m_Start0.x = Edge->m_Start.x - Module->m_Pos.x;
-                Edge->m_Start0.y = Edge->m_Start.y - Module->m_Pos.y;
-                RotatePoint( (int*) &(Edge->m_Start0.x),
-                            (int*) &(Edge->m_Start0.y), -Module->m_Orient );
+                Edge->m_Start0.x = Edge->m_Start.x - module->m_Pos.x;
+                Edge->m_Start0.y = Edge->m_Start.y - module->m_Pos.y;
+
+                RotatePoint( (int*) &Edge->m_Start0.x,
+                            (int*) &Edge->m_Start0.y, -module->m_Orient );
+
                 Edge->m_End0 = Edge->m_Start0;
 
-                Module->Set_Rectangle_Encadrement();
-                Module->m_LastEdit_Time = time( NULL );
+                module->Set_Rectangle_Encadrement();
+                module->m_LastEdit_Time = time( NULL );
                 GetScreen()->SetModify();
             }
         }
diff --git a/pcbnew/gen_self.h b/pcbnew/gen_self.h
index b709660dd4..12ea5190cd 100644
--- a/pcbnew/gen_self.h
+++ b/pcbnew/gen_self.h
@@ -301,16 +301,21 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
 
     newedge = new EDGE_MODULE( Module );
     newedge->Copy( PtSegm );
-    newedge->AddToChain( PtSegm );
+
+    Module->m_Drawings.Insert( newedge, PtSegm->Next() );
+
     PtSegm = newedge;
     PtSegm->m_Start = PtSegm->m_End;
+
     PtSegm = gen_arc( PtSegm, PtSegm->m_End.x - Mself.rayon, PtSegm->m_End.y, -900 );
 
     if( lextbrin )
     {
         newedge = new EDGE_MODULE( Module );
         newedge->Copy( PtSegm );
-        newedge->AddToChain( PtSegm );
+
+        Module->m_Drawings.Insert( newedge, PtSegm->Next() );
+
         PtSegm = newedge;
         PtSegm->m_Start  = PtSegm->m_End;
         PtSegm->m_End.x -= lextbrin;
@@ -322,7 +327,9 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
         int arc_angle;
         newedge = new EDGE_MODULE( Module );
         newedge->Copy( PtSegm );
-        newedge->AddToChain( PtSegm );
+
+        Module->m_Drawings.Insert( newedge, PtSegm->Next() );
+
         PtSegm = newedge;
         PtSegm->m_Start = PtSegm->m_End;
 
@@ -338,7 +345,9 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
         {
             newedge = new EDGE_MODULE( Module );
             newedge->Copy( PtSegm );
-            newedge->AddToChain( PtSegm );
+
+            Module->m_Drawings.Insert( newedge, PtSegm->Next() );
+
             PtSegm = newedge;
             PtSegm->m_Start = PtSegm->m_End;
             if( ii & 1 )
@@ -356,7 +365,9 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
         {
             newedge = new EDGE_MODULE( Module );
             newedge->Copy( PtSegm );
-            newedge->AddToChain( PtSegm );
+
+            Module->m_Drawings.Insert( newedge, PtSegm->Next() );
+
             PtSegm = newedge;
             PtSegm->m_Start  = PtSegm->m_End;
             PtSegm->m_End.x -= lextbrin;
@@ -364,7 +375,8 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
 
         newedge = new EDGE_MODULE( Module );
         newedge->Copy( PtSegm );
-        newedge->AddToChain( PtSegm );
+        Module->m_Drawings.Insert( newedge, PtSegm->Next() );
+
         PtSegm = newedge;
         PtSegm->m_Start.x = PtSegm->m_End.x; PtSegm->m_Start.y = PtSegm->m_End.y;
         PtSegm = gen_arc( PtSegm, PtSegm->m_End.x, PtSegm->m_End.y + Mself.rayon, 900 );
@@ -375,14 +387,17 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
         {
             newedge = new EDGE_MODULE( Module );
             newedge->Copy( PtSegm );
-            newedge->AddToChain( PtSegm );
+
+            Module->m_Drawings.Insert( newedge, PtSegm->Next() );
+
             PtSegm = newedge;
             PtSegm->m_Start  = PtSegm->m_End;
             PtSegm->m_End.x += lextbrin;
         }
         newedge = new EDGE_MODULE( Module );
         newedge->Copy( PtSegm );
-        newedge->AddToChain( PtSegm );
+
+        Module->m_Drawings.Insert( newedge, PtSegm->Next() );
         PtSegm = newedge;
         PtSegm->m_Start = PtSegm->m_End;
         PtSegm = gen_arc( PtSegm, PtSegm->m_End.x, PtSegm->m_End.y + Mself.rayon, -900 );
@@ -390,7 +405,7 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
 
     newedge = new EDGE_MODULE( Module );
     newedge->Copy( PtSegm );
-    newedge->AddToChain( PtSegm );
+    Module->m_Drawings.Insert( newedge, PtSegm->Next() );
     PtSegm = newedge;
     PtSegm->m_Start = PtSegm->m_End;
     PtSegm->m_End   = Mself.m_End;
@@ -420,9 +435,11 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
     Module->m_Pads.PushFront( PtPad );
 
     PtPad->SetPadName( wxT( "1" ) );
-    PtPad->m_Pos.x  = LastSegm->m_End.x; PtPad->m_Pos.y = LastSegm->m_End.y;
-    PtPad->m_Pos0.x = PtPad->m_Pos.x - Module->m_Pos.x;
-    PtPad->m_Pos0.y = PtPad->m_Pos.y - Module->m_Pos.y;
+
+    PtPad->m_Pos  = LastSegm->m_End;
+
+    PtPad->m_Pos0 = PtPad->m_Pos - Module->m_Pos;
+
     PtPad->m_Size.x = PtPad->m_Size.y = LastSegm->m_Width;
     PtPad->m_Masque_Layer = g_TabOneLayerMask[LastSegm->GetLayer()];
     PtPad->m_Attribut = PAD_SMD;
@@ -431,12 +448,15 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
 
     D_PAD* newpad = new D_PAD( Module );
     newpad->Copy( PtPad );
-    newpad->AddToChain( PtPad );
+
+    Module->m_Pads.Insert( newpad, PtPad->Next() );
+
     PtPad = newpad;
     PtPad->SetPadName( wxT( "2" ) );
-    PtPad->m_Pos.x  = FirstSegm->m_Start.x; PtPad->m_Pos.y = FirstSegm->m_Start.y;
-    PtPad->m_Pos0.x = PtPad->m_Pos.x - Module->m_Pos.x;
-    PtPad->m_Pos0.y = PtPad->m_Pos.y - Module->m_Pos.y;
+
+    PtPad->m_Pos = FirstSegm->m_Start;
+
+    PtPad->m_Pos0 = PtPad->m_Pos - Module->m_Pos;
 
     /* Modif des positions textes */
     Module->Display_Infos( this );
@@ -446,20 +466,19 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
                                                                 LastSegm->m_End.y ) / 2;
 
     Module->m_Reference->m_Pos.y -= Module->m_Reference->m_Size.y;
+
     Module->m_Value->m_Pos.y += Module->m_Value->m_Size.y;
 
-    Module->m_Reference->m_Pos0.x = Module->m_Reference->m_Pos.x - Module->m_Pos.x;
-    Module->m_Reference->m_Pos0.y = Module->m_Reference->m_Pos.y - Module->m_Pos.y;
-    Module->m_Value->m_Pos0.x = Module->m_Value->m_Pos.x - Module->m_Pos.x;
-    Module->m_Value->m_Pos0.y = Module->m_Value->m_Pos.y - Module->m_Pos.y;
+    Module->m_Reference->m_Pos0 = Module->m_Reference->m_Pos - Module->m_Pos;
+
+    Module->m_Value->m_Pos0 = Module->m_Value->m_Pos - Module->m_Pos;
 
     /* Init des Coord locales des segments */
-    for( PtSegm = FirstSegm; PtSegm != NULL; PtSegm = (EDGE_MODULE*) PtSegm->Next() )
+    for( PtSegm = FirstSegm;  PtSegm;  PtSegm = PtSegm->Next() )
     {
-        PtSegm->m_Start0.x = PtSegm->m_Start.x - Module->m_Pos.x;
-        PtSegm->m_Start0.y = PtSegm->m_Start.y - Module->m_Pos.y;
-        PtSegm->m_End0.x   = PtSegm->m_End.x - Module->m_Pos.x;
-        PtSegm->m_End0.y   = PtSegm->m_End.y - Module->m_Pos.y;
+        PtSegm->m_Start0 = PtSegm->m_Start - Module->m_Pos;
+
+        PtSegm->m_End0   = PtSegm->m_End - Module->m_Pos;
     }
 
     Module->Set_Rectangle_Encadrement();
@@ -487,11 +506,17 @@ static EDGE_MODULE* gen_arc( EDGE_MODULE* PtSegm, int cX, int cY, int angle )
     int          x0, xr0, y0, yr0;
     EDGE_MODULE* newedge;
 
+    // m_Drawings in the board
+    DLIST<BOARD_ITEM>*  list = (DLIST<BOARD_ITEM>*) PtSegm->GetList();
+
+    wxASSERT( list );
+
     angle = -angle;
     y0    = PtSegm->m_Start.x - cX; x0 = PtSegm->m_Start.y - cY;
 
     nb_seg = ( abs( angle ) ) / 225; if( nb_seg == 0 )
         nb_seg = 1;
+
     alpha  = ( (float) angle * 3.14159 / 1800 ) / nb_seg;
 
     for( ii = 1; ii <= nb_seg; ii++ )
@@ -501,9 +526,12 @@ static EDGE_MODULE* gen_arc( EDGE_MODULE* PtSegm, int cX, int cY, int angle )
             newedge = new EDGE_MODULE( (MODULE*) NULL );
             newedge->Copy( PtSegm );
             newedge->SetParent( PtSegm->GetParent() );
-            newedge->AddToChain( PtSegm );
+
+            list->Insert( newedge, PtSegm->Next() );
+
             PtSegm = newedge;
-            PtSegm->m_Start.x = PtSegm->m_End.x; PtSegm->m_Start.y = PtSegm->m_End.y;
+
+            PtSegm->m_Start = PtSegm->m_End;
         }
 
         beta = (alpha * ii);
@@ -511,7 +539,9 @@ static EDGE_MODULE* gen_arc( EDGE_MODULE* PtSegm, int cX, int cY, int angle )
 
         xr0 = (int) (x0 * fcos + y0 * fsin);
         yr0 = (int) (y0 * fcos - x0 * fsin);
-        PtSegm->m_End.x = cX + yr0; PtSegm->m_End.y = cY + xr0;
+
+        PtSegm->m_End.x = cX + yr0;
+        PtSegm->m_End.y = cY + xr0;
     }
 
     return PtSegm;
diff --git a/pcbnew/initpcb.cpp b/pcbnew/initpcb.cpp
index ae42e38812..9109de59df 100644
--- a/pcbnew/initpcb.cpp
+++ b/pcbnew/initpcb.cpp
@@ -134,7 +134,8 @@ bool WinEDA_BasePcbFrame::Clear_Pcb( bool query )
     while( g_UnDeleteStackPtr > 0 )
     {
         g_UnDeleteStackPtr--;
-        g_UnDeleteStack[g_UnDeleteStackPtr]->DeleteStructList();
+
+        delete g_UnDeleteStack[g_UnDeleteStackPtr];
     }
 
     /* init pointeurs  et variables */
@@ -214,7 +215,7 @@ void WinEDA_PcbFrame::Erase_Segments_Pcb( bool is_edges, bool query )
         case TYPE_COTATION:
         case TYPE_MIRE:
             if( g_TabOneLayerMask[ PtStruct->GetLayer()] & masque_layer )
-                PtStruct->DeleteStructure();
+                m_Pcb->Delete( PtStruct );
             break;
 
         default:
diff --git a/pcbnew/modedit_undo_redo.cpp b/pcbnew/modedit_undo_redo.cpp
index d12c9dcf29..2f19578542 100644
--- a/pcbnew/modedit_undo_redo.cpp
+++ b/pcbnew/modedit_undo_redo.cpp
@@ -76,10 +76,15 @@ void WinEDA_ModuleEditFrame::GetComponentFromUndoList()
 
     GetScreen()->AddItemToRedoList( m_Pcb->m_Modules.PopFront() );
 
-    m_Pcb->Add( (MODULE*) GetScreen()->GetItemFromUndoList() );
+    MODULE* module = (MODULE*) GetScreen()->GetItemFromUndoList();
+    if( module )
+        m_Pcb->Add( module, ADD_APPEND );
 
+/*  Add() calls PushBack(), no need for this
     if( m_Pcb->m_Modules )
         m_Pcb->m_Modules->SetNext( NULL );
+*/
+
     GetScreen()->SetModify();
     SetCurItem( NULL );;
     ReCreateHToolbar();
diff --git a/pcbnew/modules.cpp b/pcbnew/modules.cpp
index 0ff3f9e970..fe4711d9c2 100644
--- a/pcbnew/modules.cpp
+++ b/pcbnew/modules.cpp
@@ -239,8 +239,13 @@ MODULE* WinEDA_BasePcbFrame::Copie_Module( MODULE* module )
     m_Pcb->m_Status_Pcb = 0;
     newmodule = new MODULE( m_Pcb );
     newmodule->Copy( module );
+
+    /* no, Add() below does this
     newmodule->SetParent( m_Pcb );
-    newmodule->AddToChain( module );
+    */
+
+    m_Pcb->Add( newmodule, ADD_APPEND );
+
     newmodule->m_Flags = IS_NEW;
 
     build_liste_pads();
diff --git a/pcbnew/netlist.cpp b/pcbnew/netlist.cpp
index e135faa344..81fe8a8e7b 100644
--- a/pcbnew/netlist.cpp
+++ b/pcbnew/netlist.cpp
@@ -45,6 +45,7 @@ public:
                   int             timestamp,
                   const wxString& path );
     ~MODULEtoLOAD() { };
+
     MODULEtoLOAD* Next() const { return (MODULEtoLOAD*) Pnext; }
 };
 
@@ -1027,7 +1028,8 @@ void LoadListeModules( WinEDA_PcbFrame* aPcbFrame, wxDC* DC )
     for( ii = 0; ii < s_NbNewModules; ii++, cmp = cmp->Next() )
     {
         if( (ii == 0) || ( ref->m_LibName != cmp->m_LibName) )
-        {   /* New footprint : must be loaded from a library */
+        {
+            /* New footprint : must be loaded from a library */
             Module = aPcbFrame->Get_Librairie_Module( NULL, wxEmptyString, cmp->m_LibName, FALSE );
             ref    = cmp;
             if( Module == NULL )
@@ -1051,9 +1053,12 @@ void LoadListeModules( WinEDA_PcbFrame* aPcbFrame, wxDC* DC )
             MODULE* newmodule;
             if( Module == NULL )
                 continue; /* module non existant en libr */
+
             newmodule = new MODULE( aPcbFrame->m_Pcb );
             newmodule->Copy( Module );
-            newmodule->AddToChain( Module );
+
+            aPcbFrame->m_Pcb->Add( newmodule, ADD_APPEND );
+
             Module = newmodule;
             Module->m_Reference->m_Text = cmp->m_CmpName;
             Module->m_TimeStamp = cmp->m_TimeStamp;