diff --git a/eeschema/block.cpp b/eeschema/block.cpp
index ea0b38c899..9a3875211a 100644
--- a/eeschema/block.cpp
+++ b/eeschema/block.cpp
@@ -932,7 +932,8 @@ void DeleteStruct( WinEDA_DrawPanel* panel, wxDC* DC, EDA_BaseStruct* DrawStruct
 
 
     if( DrawStruct->Type() == DRAW_SHEETLABEL_STRUCT_TYPE )
-    {   /* Cette stucture est rattachee a une feuille, et n'est pas
+    {
+        /* Cette stucture est rattachee a une feuille, et n'est pas
          *  accessible par la liste globale directement */
         frame->SaveCopyInUndoList( ( (DrawSheetLabelStruct*) DrawStruct )->m_Parent, IS_CHANGED );
         frame->DeleteSheetLabel( DC, (DrawSheetLabelStruct*) DrawStruct );
@@ -961,7 +962,14 @@ void DeleteStruct( WinEDA_DrawPanel* panel, wxDC* DC, EDA_BaseStruct* DrawStruct
     {
         screen->RemoveFromDrawList( DrawStruct );
 
-        RedrawOneStruct( panel, DC, DrawStruct, g_XorMode );
+        if( DrawStruct->Type() == DRAW_SEGMENT_STRUCT_TYPE )
+        {
+            D( printf("PostDirtyRect()\n"); )
+            panel->PostDirtyRect( ((EDA_DrawLineStruct*)DrawStruct)->GetBoundingBox() );
+        }
+        else
+            RedrawOneStruct( panel, DC, DrawStruct, g_XorMode );
+
         /* Unlink the structure */
         DrawStruct->Pnext = DrawStruct->Pback = NULL;   // Only one struct -> no link
         if( DrawStruct->Type() == DRAW_SHEET_STRUCT_TYPE )
diff --git a/eeschema/cmpclass.cpp b/eeschema/cmpclass.cpp
index f7678eb997..5dfc0cc4e6 100644
--- a/eeschema/cmpclass.cpp
+++ b/eeschema/cmpclass.cpp
@@ -147,14 +147,14 @@ wxString DrawMarkerStruct::GetComment()
 /**
  * Function Show
  * is used to output the object tree, currently for debugging only.
- * @param nestLevel An aid to prettier tree indenting, and is the level 
+ * @param nestLevel An aid to prettier tree indenting, and is the level
  *          of nesting of this object within the overall tree.
  * @param os The ostream& to output to.
  */
 void DrawMarkerStruct::Show( int nestLevel, std::ostream& os )
 {
     // for now, make it look like XML:
-    NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() <<  m_Pos 
+    NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() <<  m_Pos
         << "/>\n";
 }
 #endif
@@ -222,17 +222,17 @@ bool EDA_DrawLineStruct::IsOneEndPointAt( const wxPoint& pos )
 /**
  * Function Show
  * is used to output the object tree, currently for debugging only.
- * @param nestLevel An aid to prettier tree indenting, and is the level 
+ * @param nestLevel An aid to prettier tree indenting, and is the level
  *          of nesting of this object within the overall tree.
  * @param os The ostream& to output to.
  */
 void EDA_DrawLineStruct::Show( int nestLevel, std::ostream& os )
 {
-    NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << 
+    NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() <<
         " layer=\""             << m_Layer      << '"' <<
         " width=\""             << m_Width      << '"' <<
-        " startIsDangling=\""   << m_StartIsDangling  << '"' << 
-        " endIsDangling=\""     << m_EndIsDangling  << '"' << ">" <<  
+        " startIsDangling=\""   << m_StartIsDangling  << '"' <<
+        " endIsDangling=\""     << m_EndIsDangling  << '"' << ">" <<
         " <start"               << m_Start      << "/>" <<
         " <end"                 << m_End        << "/>" <<
         "</" << GetClass().Lower().mb_str() << ">\n";
@@ -240,6 +240,25 @@ void EDA_DrawLineStruct::Show( int nestLevel, std::ostream& os )
 #endif
 
 
+
+EDA_Rect EDA_DrawLineStruct::GetBoundingBox() const
+{
+    int width = 25;
+
+    int xmin = MIN( m_Start.x, m_End.x ) - width;
+    int ymin = MIN( m_Start.y, m_End.y ) - width;
+
+    int xmax = MAX( m_Start.x, m_End.x ) + width;
+    int ymax = MAX( m_Start.y, m_End.y ) + width;
+
+    // return a rectangle which is [pos,dim) in nature.  therefore the +1
+    EDA_Rect ret( wxPoint( xmin, ymin ), wxSize( xmax-xmin+1, ymax-ymin+1 ) );
+
+    return ret;
+}
+
+
+
 /****************************/
 /* Class DrawPolylineStruct */
 /****************************/
diff --git a/eeschema/delete.cpp b/eeschema/delete.cpp
index cd49c8e602..4d2e76a1bc 100644
--- a/eeschema/delete.cpp
+++ b/eeschema/delete.cpp
@@ -1,6 +1,6 @@
-	/************************************/
-	/* Delete.cpp: routines d'effacement */
-	/************************************/
+/************************************/
+/* Delete.cpp: routines d'effacement */
+/************************************/
 
 #include "fctsys.h"
 #include "gr_basic.h"
@@ -17,485 +17,561 @@
 
 
 /********************************************************************************/
-static int CountConnectedItems(WinEDA_SchematicFrame * frame,
-		EDA_BaseStruct * ListStruct, wxPoint pos, bool TstJunction)
+static int CountConnectedItems( WinEDA_SchematicFrame* frame,
+                                EDA_BaseStruct* ListStruct, wxPoint pos, bool TstJunction )
 /********************************************************************************/
+
 /*  Count number of items connected to point pos :
-		pins, end wire or bus, and junctions if TstJunction == TRUE
-	Return this count
-
-	Used by WinEDA_SchematicFrame::DeleteConnection()
-*/
+  *     pins, end wire or bus, and junctions if TstJunction == TRUE
+  * Return this count
+ *
+  * Used by WinEDA_SchematicFrame::DeleteConnection()
+ */
 {
-EDA_BaseStruct * Struct;
-int count = 0;
+    EDA_BaseStruct* Struct;
+    int             count = 0;
 
-	if ( frame->LocatePinEnd(ListStruct, pos) ) count++;
+    if( frame->LocatePinEnd( ListStruct, pos ) )
+        count++;
 
-	for ( Struct = ListStruct; Struct != NULL; Struct = Struct->Pnext)
-	{
-		if ( Struct->m_Flags & STRUCT_DELETED ) continue;
-		if ( Struct->m_Flags & SKIP_STRUCT ) continue;
+    for( Struct = ListStruct; Struct != NULL; Struct = Struct->Pnext )
+    {
+        if( Struct->m_Flags & STRUCT_DELETED )
+            continue;
+        if( Struct->m_Flags & SKIP_STRUCT )
+            continue;
 
-			
-		if ( TstJunction && (Struct->Type() == DRAW_JUNCTION_STRUCT_TYPE) )
-		{
-		#define JUNCTION ((DrawJunctionStruct*)Struct)
-			if ( (JUNCTION->m_Pos.x == pos.x) && (JUNCTION->m_Pos.y == pos.y) )
-				count++;
-		#undef JUNCTION
-		}
 
-		if ( Struct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) continue;
-		#define SEGM ((EDA_DrawLineStruct*)Struct)
-		if ( SEGM->IsOneEndPointAt(pos) ) count++;
-		#undef SEGM
-	}
+        if( TstJunction && (Struct->Type() == DRAW_JUNCTION_STRUCT_TYPE) )
+        {
+            #define JUNCTION ( (DrawJunctionStruct*) Struct )
+            if( (JUNCTION->m_Pos.x == pos.x) && (JUNCTION->m_Pos.y == pos.y) )
+                count++;
+            #undef JUNCTION
+        }
 
-	return count;
+        if( Struct->Type() != DRAW_SEGMENT_STRUCT_TYPE )
+            continue;
+
+        #define SEGM ( (EDA_DrawLineStruct*) Struct )
+        if( SEGM->IsOneEndPointAt( pos ) )
+            count++;
+        #undef SEGM
+    }
+
+    return count;
 }
 
+
 /************************************************************************************/
-static bool MarkConnected(WinEDA_SchematicFrame * frame, EDA_BaseStruct * ListStruct,
-		EDA_DrawLineStruct* segment)
+static bool MarkConnected( WinEDA_SchematicFrame* frame, EDA_BaseStruct* ListStruct,
+                           EDA_DrawLineStruct* segment )
 /************************************************************************************/
+
 /* Mark to "CANDIDATE" all wires or junction connected to "segment" in list "ListStruct"
-	Search wire stop at an any  pin
-
-	Used by WinEDA_SchematicFrame::DeleteConnection()
-*/
+  * Search wire stop at an any  pin
+ *
+  * Used by WinEDA_SchematicFrame::DeleteConnection()
+ */
 {
-EDA_BaseStruct * Struct;
+    EDA_BaseStruct* Struct;
 
-	for ( Struct = ListStruct; Struct != NULL; Struct = Struct->Pnext)
-	{
-		if ( Struct->m_Flags ) continue;
-		if ( Struct->Type() == DRAW_JUNCTION_STRUCT_TYPE )
-		{
-		#define JUNCTION ((DrawJunctionStruct*)Struct)
-			if ( segment->IsOneEndPointAt(JUNCTION->m_Pos) ) Struct->m_Flags |= CANDIDATE;
-			continue;
-		#undef JUNCTION
-		}
+    for( Struct = ListStruct; Struct != NULL; Struct = Struct->Pnext )
+    {
+        if( Struct->m_Flags )
+            continue;
+        if( Struct->Type() == DRAW_JUNCTION_STRUCT_TYPE )
+        {
+        #define JUNCTION ( (DrawJunctionStruct*) Struct )
+            if( segment->IsOneEndPointAt( JUNCTION->m_Pos ) )
+                Struct->m_Flags |= CANDIDATE;
+            continue;
+        #undef JUNCTION
+        }
 
-		if ( Struct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) continue;
+        if( Struct->Type() != DRAW_SEGMENT_STRUCT_TYPE )
+            continue;
 
-		#define SEGM ((EDA_DrawLineStruct*)Struct)
-		if ( segment->IsOneEndPointAt(SEGM->m_Start) )
-		{
-			if ( ! frame->LocatePinEnd(ListStruct,SEGM->m_Start) )
-			{
-				Struct->m_Flags |= CANDIDATE;
-				MarkConnected(frame, ListStruct, SEGM);
-			}
-		}
-		if ( segment->IsOneEndPointAt(SEGM->m_End) )
-		{
-			if ( ! frame->LocatePinEnd(ListStruct,SEGM->m_End) )
-			{
-				Struct->m_Flags |= CANDIDATE;
-				MarkConnected(frame, ListStruct, SEGM);
-			}
-		}
-		#undef SEGM
-	}
+        #define SEGM ( (EDA_DrawLineStruct*) Struct )
+        if( segment->IsOneEndPointAt( SEGM->m_Start ) )
+        {
+            if( !frame->LocatePinEnd( ListStruct, SEGM->m_Start ) )
+            {
+                Struct->m_Flags |= CANDIDATE;
+                MarkConnected( frame, ListStruct, SEGM );
+            }
+        }
+        if( segment->IsOneEndPointAt( SEGM->m_End ) )
+        {
+            if( !frame->LocatePinEnd( ListStruct, SEGM->m_End ) )
+            {
+                Struct->m_Flags |= CANDIDATE;
+                MarkConnected( frame, ListStruct, SEGM );
+            }
+        }
+        #undef SEGM
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
+
 /********************************************************************************/
-void WinEDA_SchematicFrame::DeleteConnection(wxDC * DC, bool DeleteFullConnection)
+void WinEDA_SchematicFrame::DeleteConnection( wxDC* DC, bool DeleteFullConnection )
 /********************************************************************************/
+
 /* Delete a connection, i.e wires or bus connected
-	stop on a node (more than 2 wires (bus) connected)
-*/
+  * stop on a node (more than 2 wires (bus) connected)
+ */
 {
-wxPoint refpos = GetScreen()->m_Curseur;
-EDA_BaseStruct * DelStruct ;
-DrawPickedStruct * PickedItem, *PickedList = NULL;
+    wxPoint refpos = GetScreen()->m_Curseur;
+    EDA_BaseStruct* DelStruct;
+    DrawPickedStruct* PickedItem, * PickedList = NULL;
 
-	/* Clear .m_Flags member for all items */
-	for(DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct=DelStruct->Pnext)
-		DelStruct->m_Flags = 0;
+    /* Clear .m_Flags member for all items */
+    for( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext )
+        DelStruct->m_Flags = 0;
 
-	BreakSegmentOnJunction( (SCH_SCREEN*)GetScreen() );
-	DelStruct = GetScreen()->EEDrawList;
-	
-	/* Locate all the wires, bus or junction under the mouse cursor, and put them in a list
-		of items to delete
-	*/
-	SCH_SCREEN* screen = (SCH_SCREEN*)GetScreen(); 
-	EDA_BaseStruct* savedEEDrawList = screen->EEDrawList;
-	while ( DelStruct &&
-			(DelStruct = PickStruct(screen->m_Curseur,
-				screen, JUNCTIONITEM|WIREITEM|BUSITEM)) != NULL )
-	{
-		
-		DelStruct->m_Flags = SELECTEDNODE|STRUCT_DELETED;
-		/* Put this structure in the picked list: */
-		PickedItem = new DrawPickedStruct(DelStruct);
-		PickedItem->Pnext = PickedList;
-		PickedList = PickedItem;
-		DelStruct=DelStruct->Pnext;
-		screen->EEDrawList = DelStruct; 
-	}
-	GetScreen()->EEDrawList = savedEEDrawList; 
-	 /* Mark all wires, junctions, .. connected to one of the item to delete
-	*/
-	if ( DeleteFullConnection )
-	{
-		for ( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext)
-		{
-			if ( ! (DelStruct->m_Flags & SELECTEDNODE) ) continue;
-			#define SEGM ((EDA_DrawLineStruct*)DelStruct)
-			if ( DelStruct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) continue;
-			MarkConnected(this, GetScreen()->EEDrawList, SEGM);
-			#undef SEGM
-		}
+    BreakSegmentOnJunction( (SCH_SCREEN*) GetScreen() );
+    DelStruct = GetScreen()->EEDrawList;
 
-		// Search all removable wires (i.e wire with one new dangling end )
-		for ( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext)
-		{
-			bool noconnect = FALSE;
+    /* Locate all the wires, bus or junction under the mouse cursor, and put them in a list
+      * of items to delete
+     */
+    SCH_SCREEN* screen = (SCH_SCREEN*) GetScreen();
+    EDA_BaseStruct* savedEEDrawList = screen->EEDrawList;
+    while( DelStruct
+           && ( DelStruct = PickStruct( screen->m_Curseur,
+                   screen, JUNCTIONITEM | WIREITEM | BUSITEM ) ) != NULL )
+    {
+        DelStruct->m_Flags = SELECTEDNODE | STRUCT_DELETED;
 
-			if ( DelStruct->m_Flags & STRUCT_DELETED ) continue;		// Already seen
-			if ( ! (DelStruct->m_Flags & CANDIDATE) ) continue;	// Already seen
-			if ( DelStruct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) continue;
-			DelStruct->m_Flags |= SKIP_STRUCT;
-			#define SEGM ((EDA_DrawLineStruct*)DelStruct)
-			/* Test the SEGM->m_Start point: if this point was connected to an STRUCT_DELETED wire,
-				and now is not connected, the wire can be deleted */
-			EDA_BaseStruct * removed_struct;
-			for ( removed_struct = GetScreen()->EEDrawList; removed_struct != NULL; removed_struct = removed_struct->Pnext)
-			{
-				if( (removed_struct->m_Flags & STRUCT_DELETED) == 0 ) continue;
-				if ( removed_struct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) continue;
-				#define WIRE ((EDA_DrawLineStruct*)removed_struct)
-				if ( WIRE->IsOneEndPointAt(SEGM->m_Start) ) break;
-			}
-			
-			if ( WIRE && ! CountConnectedItems(this, GetScreen()->EEDrawList, SEGM->m_Start, TRUE) )
-				noconnect = TRUE;
-			/* Test the SEGM->m_End point: if this point was connected to an STRUCT_DELETED wire,
-				and now is not connected, the wire can be deleted */
-			for ( removed_struct = GetScreen()->EEDrawList; removed_struct != NULL; removed_struct = removed_struct->Pnext)
-			{
-				if( (removed_struct->m_Flags & STRUCT_DELETED) == 0 ) continue;
-				if ( removed_struct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) continue;
-				if ( WIRE->IsOneEndPointAt(SEGM->m_End) ) break;
-			}
-			if ( removed_struct && ! CountConnectedItems(this, GetScreen()->EEDrawList, SEGM->m_End, TRUE) )
-				noconnect = TRUE;
-			DelStruct->m_Flags &= ~SKIP_STRUCT;
+        /* Put this structure in the picked list: */
+        PickedItem = new DrawPickedStruct( DelStruct );
 
-			if ( noconnect )
-			{
-				DelStruct->m_Flags |= STRUCT_DELETED;
-				/* Put this structure in the picked list: */
-				PickedItem = new DrawPickedStruct(DelStruct);
-				PickedItem->Pnext = PickedList;
-				PickedList = PickedItem;
-				DelStruct = GetScreen()->EEDrawList;
-			}
-			#undef SEGM
-		}
+        PickedItem->Pnext = PickedList;
+        PickedList = PickedItem;
+        DelStruct  = DelStruct->Pnext;
+        screen->EEDrawList = DelStruct;
+    }
 
-		// Delete redundant junctions (junctions which connect < 3 end wires and no pin are removed)
-		for ( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext)
-		{
-			int count;
-			if ( DelStruct->m_Flags & STRUCT_DELETED ) continue;
-			if ( ! (DelStruct->m_Flags & CANDIDATE) ) continue;
-			if ( DelStruct->Type() == DRAW_JUNCTION_STRUCT_TYPE )
-			{
-				#define JUNCTION ((DrawJunctionStruct*)DelStruct)
-				count = CountConnectedItems(this, GetScreen()->EEDrawList, JUNCTION->m_Pos, FALSE);
-				if ( count <= 2 )
-				{
-					DelStruct->m_Flags |= STRUCT_DELETED;
-					/* Put this structure in the picked list: */
-					PickedItem = new DrawPickedStruct(DelStruct);
-					PickedItem->Pnext = PickedList;
-					PickedList = PickedItem;
-				}
-				#undef JUNCTION
-			}
-		}
+    GetScreen()->EEDrawList = savedEEDrawList;
 
-		// Delete labels attached to wires
-		wxPoint pos = GetScreen()->m_Curseur;
-		for ( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext)
-		{
-			if ( DelStruct->m_Flags & STRUCT_DELETED ) continue;
-			if ( DelStruct->Type() != DRAW_LABEL_STRUCT_TYPE ) continue;
-			GetScreen()->m_Curseur = ((DrawTextStruct*)DelStruct)->m_Pos;
-			EDA_BaseStruct * TstStruct =
-				PickStruct(GetScreen()->m_Curseur, GetScreen(),WIREITEM|BUSITEM);
-			if ( TstStruct && TstStruct->m_Flags & STRUCT_DELETED )
-			{
-				DelStruct->m_Flags |= STRUCT_DELETED;
-				/* Put this structure in the picked list: */
-				PickedItem = new DrawPickedStruct(DelStruct);
-				PickedItem->Pnext = PickedList;
-				PickedList = PickedItem;
-			}
-		}
-		GetScreen()->m_Curseur = pos;
-	}
+    /* Mark all wires, junctions, .. connected to one of the item to delete
+     */
+    if( DeleteFullConnection )
+    {
+        for( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext )
+        {
+            if( !(DelStruct->m_Flags & SELECTEDNODE) )
+                continue;
 
-	for ( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext)
-		DelStruct->m_Flags = 0;
+            #define SEGM ( (EDA_DrawLineStruct*) DelStruct )
+            if( DelStruct->Type() != DRAW_SEGMENT_STRUCT_TYPE )
+                continue;
 
-	if ( PickedList )
-	{
-		DeleteStruct(DrawPanel, DC, PickedList);
-		GetScreen()->SetModify();
-	}
+            MarkConnected( this, GetScreen()->EEDrawList, SEGM );
+            #undef SEGM
+        }
 
+        // Search all removable wires (i.e wire with one new dangling end )
+        for( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext )
+        {
+            bool noconnect = FALSE;
+
+            if( DelStruct->m_Flags & STRUCT_DELETED )
+                continue;                                               // Already seen
+
+            if( !(DelStruct->m_Flags & CANDIDATE) )
+                continue;                                               // Already seen
+
+            if( DelStruct->Type() != DRAW_SEGMENT_STRUCT_TYPE )
+                continue;
+
+            DelStruct->m_Flags |= SKIP_STRUCT;
+            #define SEGM ( (EDA_DrawLineStruct*) DelStruct )
+
+            /* Test the SEGM->m_Start point: if this point was connected to an STRUCT_DELETED wire,
+              * and now is not connected, the wire can be deleted */
+            EDA_BaseStruct* removed_struct;
+            for( removed_struct = GetScreen()->EEDrawList;
+                 removed_struct != NULL;
+                 removed_struct = removed_struct->Pnext )
+            {
+                if( (removed_struct->m_Flags & STRUCT_DELETED) == 0 )
+                    continue;
+
+                if( removed_struct->Type() != DRAW_SEGMENT_STRUCT_TYPE )
+                    continue;
+
+                #define WIRE ( (EDA_DrawLineStruct*) removed_struct )
+                if( WIRE->IsOneEndPointAt( SEGM->m_Start ) )
+                    break;
+            }
+
+            if( WIRE && !CountConnectedItems( this, GetScreen()->EEDrawList, SEGM->m_Start, TRUE ) )
+                noconnect = TRUE;
+
+            /* Test the SEGM->m_End point: if this point was connected to an STRUCT_DELETED wire,
+              * and now is not connected, the wire can be deleted */
+            for( removed_struct = GetScreen()->EEDrawList;
+                 removed_struct != NULL;
+                 removed_struct = removed_struct->Pnext )
+            {
+                if( (removed_struct->m_Flags & STRUCT_DELETED) == 0 )
+                    continue;
+                if( removed_struct->Type() != DRAW_SEGMENT_STRUCT_TYPE )
+                    continue;
+                if( WIRE->IsOneEndPointAt( SEGM->m_End ) )
+                    break;
+            }
+
+            if( removed_struct &&
+               !CountConnectedItems( this, GetScreen()->EEDrawList, SEGM->m_End, TRUE ) )
+                noconnect = TRUE;
+
+            DelStruct->m_Flags &= ~SKIP_STRUCT;
+
+            if( noconnect )
+            {
+                DelStruct->m_Flags |= STRUCT_DELETED;
+                /* Put this structure in the picked list: */
+                PickedItem = new DrawPickedStruct( DelStruct );
+
+                PickedItem->Pnext = PickedList;
+                PickedList = PickedItem;
+                DelStruct  = GetScreen()->EEDrawList;
+            }
+            #undef SEGM
+        }
+
+        // Delete redundant junctions (junctions which connect < 3 end wires and no pin are removed)
+        for( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext )
+        {
+            int count;
+            if( DelStruct->m_Flags & STRUCT_DELETED )
+                continue;
+
+            if( !(DelStruct->m_Flags & CANDIDATE) )
+                continue;
+
+            if( DelStruct->Type() == DRAW_JUNCTION_STRUCT_TYPE )
+            {
+                #define JUNCTION ( (DrawJunctionStruct*) DelStruct )
+                count = CountConnectedItems( this, GetScreen()->EEDrawList, JUNCTION->m_Pos, FALSE );
+                if( count <= 2 )
+                {
+                    DelStruct->m_Flags |= STRUCT_DELETED;
+
+                    /* Put this structure in the picked list: */
+                    PickedItem = new DrawPickedStruct( DelStruct );
+
+                    PickedItem->Pnext = PickedList;
+                    PickedList = PickedItem;
+                }
+                #undef JUNCTION
+            }
+        }
+
+        // Delete labels attached to wires
+        wxPoint pos = GetScreen()->m_Curseur;
+        for( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext )
+        {
+            if( DelStruct->m_Flags & STRUCT_DELETED )
+                continue;
+
+            if( DelStruct->Type() != DRAW_LABEL_STRUCT_TYPE )
+                continue;
+
+            GetScreen()->m_Curseur = ( (DrawTextStruct*) DelStruct )->m_Pos;
+            EDA_BaseStruct* TstStruct =
+                PickStruct( GetScreen()->m_Curseur, GetScreen(), WIREITEM | BUSITEM );
+
+            if( TstStruct && TstStruct->m_Flags & STRUCT_DELETED )
+            {
+                DelStruct->m_Flags |= STRUCT_DELETED;
+
+                /* Put this structure in the picked list: */
+                PickedItem = new DrawPickedStruct( DelStruct );
+
+                PickedItem->Pnext = PickedList;
+                PickedList = PickedItem;
+            }
+        }
+
+        GetScreen()->m_Curseur = pos;
+    }
+
+    for( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext )
+        DelStruct->m_Flags = 0;
+
+    if( PickedList )
+    {
+        DeleteStruct( DrawPanel, DC, PickedList );
+        GetScreen()->SetModify();
+    }
 }
 
 
 /*****************************************************************/
-bool LocateAndDeleteItem(WinEDA_SchematicFrame * frame, wxDC * DC)
+bool LocateAndDeleteItem( WinEDA_SchematicFrame* frame, wxDC* DC )
 /*****************************************************************/
+
 /* Locate and delete the item found under the mouse cousor
-	If more than one item found: the priority order is:
-	1 : MARKER
-	2 : JUNCTION
-	2 : NOCONNECT
-	3 : WIRE ou BUS
-	4 : DRAWITEM
-	5 : TEXT
-	6 : COMPOSANT
-	7 : SHEET
-
-	return TRUE if an item was deleted
-*/
+  * If more than one item found: the priority order is:
+  * 1 : MARKER
+  * 2 : JUNCTION
+  * 2 : NOCONNECT
+  * 3 : WIRE ou BUS
+  * 4 : DRAWITEM
+  * 5 : TEXT
+  * 6 : COMPOSANT
+  * 7 : SHEET
+ *
+  * return TRUE if an item was deleted
+ */
 {
-EDA_BaseStruct * DelStruct;
-SCH_SCREEN * screen = (SCH_SCREEN*)(frame->GetScreen());
-bool item_deleted = FALSE;
-	
-	DelStruct = PickStruct(screen->m_Curseur,
-			screen, MARKERITEM);
-	if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur,
-			screen, JUNCTIONITEM);
-	if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur,
-			screen, NOCONNECTITEM);
-	if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur,
-			screen, RACCORDITEM);
-	if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur,
-			screen, WIREITEM|BUSITEM);
-	if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur,
-			screen, DRAWITEM);
-	if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur,
-			screen, TEXTITEM|LABELITEM);
-	if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur,
-			screen, LIBITEM);
-	if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur,
-			screen, SHEETITEM);
+    EDA_BaseStruct* DelStruct;
+    SCH_SCREEN* screen = (SCH_SCREEN*) ( frame->GetScreen() );
+    bool item_deleted  = FALSE;
 
-	if (DelStruct)
-	{
-		g_ItemToRepeat = NULL;
-		DeleteStruct(frame->DrawPanel, DC, DelStruct);
-		frame->TestDanglingEnds(frame->GetScreen()->EEDrawList, DC);
-		frame->GetScreen()->SetModify();
-		item_deleted = TRUE;
-	}
-	
-	return item_deleted;
+    DelStruct = PickStruct( screen->m_Curseur, screen, MARKERITEM );
+    if( DelStruct == NULL )
+        DelStruct = PickStruct( screen->m_Curseur, screen, JUNCTIONITEM );
+    if( DelStruct == NULL )
+        DelStruct = PickStruct( screen->m_Curseur, screen, NOCONNECTITEM );
+    if( DelStruct == NULL )
+        DelStruct = PickStruct( screen->m_Curseur, screen, RACCORDITEM );
+    if( DelStruct == NULL )
+        DelStruct = PickStruct( screen->m_Curseur, screen, WIREITEM | BUSITEM );
+    if( DelStruct == NULL )
+        DelStruct = PickStruct( screen->m_Curseur, screen, DRAWITEM );
+    if( DelStruct == NULL )
+        DelStruct = PickStruct( screen->m_Curseur, screen, TEXTITEM | LABELITEM );
+    if( DelStruct == NULL )
+        DelStruct = PickStruct( screen->m_Curseur, screen, LIBITEM );
+    if( DelStruct == NULL )
+        DelStruct = PickStruct( screen->m_Curseur, screen, SHEETITEM );
+
+    if( DelStruct )
+    {
+        g_ItemToRepeat = NULL;
+        DeleteStruct( frame->DrawPanel, DC, DelStruct );
+        frame->TestDanglingEnds( frame->GetScreen()->EEDrawList, DC );
+        frame->GetScreen()->SetModify();
+        item_deleted = TRUE;
+    }
+
+    return item_deleted;
 }
 
 
-
-
 /***************************************************************/
-void EraseStruct(EDA_BaseStruct *DrawStruct, SCH_SCREEN * Screen)
+void EraseStruct( EDA_BaseStruct* DrawStruct, SCH_SCREEN* Screen )
 /***************************************************************/
+
 /* Suppression definitive d'une structure dans une liste chainee
-	d'elements de dessin
-	DrawStruct = pointeur sur la structure
-	Screen = pointeur sur l'ecran d'appartenance
-	Le chainage de la liste est modifie.
-
- Remarque:
-	pour les structures DRAW_SHEET_STRUCT_TYPE, l'ecran et les structures
-		correspondantes ne sont pas touches.
-	Ils doivent etre traites separement
-*/
+  * d'elements de dessin
+  * DrawStruct = pointeur sur la structure
+  * Screen = pointeur sur l'ecran d'appartenance
+  * Le chainage de la liste est modifie.
+ *
+  * Remarque:
+  * pour les structures DRAW_SHEET_STRUCT_TYPE, l'ecran et les structures
+  *     correspondantes ne sont pas touches.
+  * Ils doivent etre traites separement
+ */
 {
-EDA_BaseStruct	*DrawList;
-DrawPickedStruct	*PickedList = NULL;
-DrawSheetLabelStruct* SheetLabel, *NextLabel;
+    EDA_BaseStruct* DrawList;
+    DrawPickedStruct* PickedList = NULL;
+    DrawSheetLabelStruct* SheetLabel, * NextLabel;
 
-	if( DrawStruct == NULL ) return;
-	if( Screen == NULL ) return;
+    if( DrawStruct == NULL )
+        return;
 
-		Screen->SetModify();
+    if( Screen == NULL )
+        return;
 
-	if (DrawStruct->Type() == DRAW_SHEETLABEL_STRUCT_TYPE)
-	{	/* Cette stucture est rattachee a une feuille, et n'est pas
-		accessible par la liste globale directement */
-		//this structure has a sheet attached, which we must find.
-		DrawList = Screen->EEDrawList;
-		for ( ; DrawList != NULL; DrawList = DrawList->Pnext )
-		{
-			if(DrawList->Type() != DRAW_SHEET_STRUCT_TYPE) continue;
-			/* Examen de la Sheet */
-			SheetLabel = ((DrawSheetStruct *) DrawList)->m_Label;
-			if (SheetLabel == NULL) continue;
-			if (SheetLabel == (DrawSheetLabelStruct*) DrawStruct)
-			{
-				((DrawSheetStruct *) DrawList)->m_Label =
-							(DrawSheetLabelStruct *)SheetLabel->Pnext;
-				SAFE_DELETE( DrawStruct );
-				return;
-			}
-			else while( SheetLabel->Pnext )/* Examen de la liste dependante */
-			{
-				NextLabel = (DrawSheetLabelStruct *)SheetLabel->Pnext;
-				if( NextLabel == (DrawSheetLabelStruct*) DrawStruct )
-				{
-					SheetLabel->Pnext = (EDA_BaseStruct *)NextLabel->Pnext;
-					SAFE_DELETE( DrawStruct );
-					return;
-				}
-				SheetLabel = NextLabel;
-			}
-		}
-		return;
-	}
+    Screen->SetModify();
 
-	if (DrawStruct->Type() == DRAW_PICK_ITEM_STRUCT_TYPE)
-	{
-		PickedList = (DrawPickedStruct *) DrawStruct;
-		while (PickedList)
-		{
-			if (PickedList->m_PickedStruct == Screen->EEDrawList)
-			{
-				Screen->EEDrawList = Screen->EEDrawList->Pnext;
-				SAFE_DELETE( DrawStruct );
-			}
-			else
-			{
-				DrawList = Screen->EEDrawList;
-				while ( DrawList && DrawList->Pnext)
-				{
-					if (DrawList->Pnext == PickedList->m_PickedStruct)
-					{
-						DrawList->Pnext = DrawList->Pnext->Pnext;
-						SAFE_DELETE( DrawStruct );
-						return;
-					}
-					DrawList = DrawList->Pnext;
-				}
-			}
-			PickedList = (DrawPickedStruct *)PickedList->Pnext;
-		}
-	}
-	else	// structure usuelle */
-	{
-		if (DrawStruct == Screen->EEDrawList)
-		{
-			Screen->EEDrawList = DrawStruct->Pnext;
-			SAFE_DELETE( DrawStruct );
-		}
-		else
-		{
-			DrawList = Screen->EEDrawList;
-			while (DrawList && DrawList->Pnext)
-			{
-				if (DrawList->Pnext == DrawStruct)
-				{
-					DrawList->Pnext = DrawStruct->Pnext;
-					SAFE_DELETE( DrawStruct );
-					return;
-				}
-				DrawList = DrawList->Pnext;
-			}
-		}
-	}
+    if( DrawStruct->Type() == DRAW_SHEETLABEL_STRUCT_TYPE )
+    {
+        /* Cette stucture est rattachee a une feuille, et n'est pas
+          * accessible par la liste globale directement */
+        //this structure has a sheet attached, which we must find.
+        DrawList = Screen->EEDrawList;
+        for( ; DrawList != NULL; DrawList = DrawList->Pnext )
+        {
+            if( DrawList->Type() != DRAW_SHEET_STRUCT_TYPE )
+                continue;
+
+            /* Examen de la Sheet */
+            SheetLabel = ( (DrawSheetStruct*) DrawList )->m_Label;
+            if( SheetLabel == NULL )
+                continue;
+
+            if( SheetLabel == (DrawSheetLabelStruct*) DrawStruct )
+            {
+                ( (DrawSheetStruct*) DrawList )->m_Label =
+                    (DrawSheetLabelStruct*) SheetLabel->Pnext;
+
+                SAFE_DELETE( DrawStruct );
+                return;
+            }
+            else
+            {
+                while( SheetLabel->Pnext ) /* Examen de la liste dependante */
+                {
+                    NextLabel = (DrawSheetLabelStruct*) SheetLabel->Pnext;
+                    if( NextLabel == (DrawSheetLabelStruct*) DrawStruct )
+                    {
+                        SheetLabel->Pnext = (EDA_BaseStruct*) NextLabel->Pnext;
+                        SAFE_DELETE( DrawStruct );
+                        return;
+                    }
+                    SheetLabel = NextLabel;
+                }
+            }
+        }
+
+        return;
+    }
+
+    if( DrawStruct->Type() == DRAW_PICK_ITEM_STRUCT_TYPE )
+    {
+        PickedList = (DrawPickedStruct*) DrawStruct;
+        while( PickedList )
+        {
+            if( PickedList->m_PickedStruct == Screen->EEDrawList )
+            {
+                Screen->EEDrawList = Screen->EEDrawList->Pnext;
+                SAFE_DELETE( DrawStruct );
+            }
+            else
+            {
+                DrawList = Screen->EEDrawList;
+                while( DrawList && DrawList->Pnext )
+                {
+                    if( DrawList->Pnext == PickedList->m_PickedStruct )
+                    {
+                        DrawList->Pnext = DrawList->Pnext->Pnext;
+                        SAFE_DELETE( DrawStruct );
+                        return;
+                    }
+                    DrawList = DrawList->Pnext;
+                }
+            }
+            PickedList = (DrawPickedStruct*) PickedList->Pnext;
+        }
+    }
+    else    // structure usuelle */
+    {
+        if( DrawStruct == Screen->EEDrawList )
+        {
+            Screen->EEDrawList = DrawStruct->Pnext;
+            SAFE_DELETE( DrawStruct );
+        }
+        else
+        {
+            DrawList = Screen->EEDrawList;
+            while( DrawList && DrawList->Pnext )
+            {
+                if( DrawList->Pnext == DrawStruct )
+                {
+                    DrawList->Pnext = DrawStruct->Pnext;
+                    SAFE_DELETE( DrawStruct );
+                    return;
+                }
+                DrawList = DrawList->Pnext;
+            }
+        }
+    }
 }
 
 
-
 /********************************/
-void DeleteAllMarkers(int type)
+void DeleteAllMarkers( int type )
 /********************************/
 /* Effacement des marqueurs du type "type" */
 {
-SCH_SCREEN * screen;
-EDA_BaseStruct * DrawStruct, * NextStruct;
-DrawMarkerStruct * Marker;
+    SCH_SCREEN* screen;
+    EDA_BaseStruct* DrawStruct, * NextStruct;
+    DrawMarkerStruct* Marker;
 
-	EDA_ScreenList ScreenList;
-	for ( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
-	{
-		for ( DrawStruct = screen->EEDrawList; DrawStruct != NULL; DrawStruct = NextStruct)
-		{
-			NextStruct = DrawStruct->Pnext;
-			if(DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE ) continue;
-			/* Marqueur trouve */
-			Marker = (DrawMarkerStruct * ) DrawStruct;
-			if( Marker->m_Type != type ) continue;
-			/* Suppression du marqueur */
-			EraseStruct( DrawStruct, screen);
-		}
-	}
+    EDA_ScreenList ScreenList;
+
+    for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
+    {
+        for( DrawStruct = screen->EEDrawList; DrawStruct != NULL; DrawStruct = NextStruct )
+        {
+            NextStruct = DrawStruct->Pnext;
+            if( DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE )
+                continue;
+
+            /* Marqueur trouve */
+            Marker = (DrawMarkerStruct*) DrawStruct;
+            if( Marker->m_Type != type )
+                continue;
+
+            /* Suppression du marqueur */
+            EraseStruct( DrawStruct, screen );
+        }
+    }
 }
 
+
 /********************************************************************/
-void DeleteOneLibraryDrawStruct(WinEDA_DrawPanel * panel, wxDC * DC,
-				EDA_LibComponentStruct * LibEntry,
-				LibEDA_BaseStruct * DrawItem, int Affiche)
+void DeleteOneLibraryDrawStruct( WinEDA_DrawPanel* panel, wxDC* DC,
+                                 EDA_LibComponentStruct* LibEntry,
+                                 LibEDA_BaseStruct* DrawItem, int Affiche )
 /********************************************************************/
+
 /* Routine d'effacement d'un "LibraryDrawStruct"
-	(d'un element de dessin d'un composant )
-
-	Parametres d'entree
-		Pointeur sur le composant comportant la structure
-			(Si NULL la structure a effacer est supposee non rattachee
-			a un composant)
-		Pointeur sur la structure a effacer
-
-	Efface egalement le graphique correspondant de l'ecran
-*/
+  * (d'un element de dessin d'un composant )
+ *
+  * Parametres d'entree
+  *     Pointeur sur le composant comportant la structure
+  *         (Si NULL la structure a effacer est supposee non rattachee
+  *         a un composant)
+  *     Pointeur sur la structure a effacer
+ *
+  * Efface egalement le graphique correspondant de l'ecran
+ */
 {
-LibEDA_BaseStruct *PreviousDrawItem;
+    LibEDA_BaseStruct* PreviousDrawItem;
 
-	/* Effacement du graphique  */
-	if( Affiche && DC)
-		DrawLibraryDrawStruct(panel, DC, LibEntry, 0 , 0, DrawItem, CurrentUnit, g_XorMode);
+    /* Effacement du graphique  */
+    if( Affiche && DC )
+        DrawLibraryDrawStruct( panel, DC, LibEntry, 0, 0, DrawItem, CurrentUnit, g_XorMode );
 
-	/* Effacement de la structure en memoire */
-	if( LibEntry ) /* Recherche du predecesseur */
-	{
-		PreviousDrawItem = LibEntry->m_Drawings;
+    /* Effacement de la structure en memoire */
+    if( LibEntry ) /* Recherche du predecesseur */
+    {
+        PreviousDrawItem = LibEntry->m_Drawings;
 
-		/* Cas du 1er symbole graphique = struct a supprimer */
-		if( LibEntry->m_Drawings == DrawItem )
-		{
-			LibEntry->m_Drawings = DrawItem->Next();
-			SAFE_DELETE( DrawItem );
-		}
+        /* Cas du 1er symbole graphique = struct a supprimer */
+        if( LibEntry->m_Drawings == DrawItem )
+        {
+            LibEntry->m_Drawings = DrawItem->Next();
+            SAFE_DELETE( DrawItem );
+        }
+        else  /* Cas des autres items */
+        {
+            while( PreviousDrawItem )
+            {
+                if( PreviousDrawItem->Pnext == DrawItem )
+                {
+                    PreviousDrawItem->Pnext = DrawItem->Pnext;
+                    SAFE_DELETE( DrawItem );
+                    break;
+                }
+                PreviousDrawItem = PreviousDrawItem->Next();
+            }
+        }
+    }
 
-		else	/* Cas des autres items */
-		while(PreviousDrawItem)
-		{
-			if(PreviousDrawItem->Pnext == DrawItem)
-			{
-				PreviousDrawItem->Pnext = DrawItem->Pnext;
-				SAFE_DELETE( DrawItem ); break;
-			}
-			PreviousDrawItem = PreviousDrawItem->Next();
-		}
-	}
-
-	else /* Structure non reliee a un composant */
-	{
-		SAFE_DELETE( DrawItem );
-	}
+    else /* Structure non reliee a un composant */
+    {
+        SAFE_DELETE( DrawItem );
+    }
 }
-
-
diff --git a/eeschema/erc.cpp b/eeschema/erc.cpp
index b0e21d50a2..673df192db 100644
--- a/eeschema/erc.cpp
+++ b/eeschema/erc.cpp
@@ -101,16 +101,17 @@ bool       DiagErcTableInit; // go to TRUE after DiagErc init
  */
 static int DefaultDiagErc[PIN_NMAX][PIN_NMAX] =
 { /*       I,   O,   Bi,  3S, Pas, UnS,PwrI,PwrO,  OC,  OE,  NC */
-/* I */  { OK,  OK,  OK,  OK,  OK,  WAR, OK,  OK,  OK,  OK,  WAR },
-/* O */  { OK,  ERR, OK,  WAR, OK,  WAR, OK,  ERR, ERR, ERR, WAR },
-/* Bi*/  { OK,  OK,  OK,  OK,  OK,  WAR, OK,  WAR, OK,  WAR, WAR },
-/* 3S*/  { OK,  WAR, OK,  OK,  OK,  WAR, WAR, ERR, WAR, WAR, WAR },
-/*Pas*/  { OK,  OK,  OK,  OK,  OK,  WAR, OK,  OK,  OK,  OK,  WAR },
+/* I */
+    { OK, OK, OK, OK, OK, WAR, OK, OK, OK, OK, WAR },
+/* O */ { OK, ERR, OK, WAR, OK, WAR, OK, ERR, ERR, ERR, WAR },
+/* Bi*/ { OK, OK, OK, OK, OK, WAR, OK, WAR, OK, WAR, WAR },
+/* 3S*/ { OK, WAR, OK, OK, OK, WAR, WAR, ERR, WAR, WAR, WAR },
+/*Pas*/ { OK, OK, OK, OK, OK, WAR, OK, OK, OK, OK, WAR },
 /*UnS */ { WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR },
-/*PwrI*/ { OK,  OK,  OK,  WAR, OK,  WAR, OK,  OK,  OK,  OK,  ERR },
-/*PwrO*/ { OK,  ERR, WAR, ERR, OK,  WAR, OK,  ERR, ERR, ERR, WAR },
-/* OC */ { OK,  ERR, OK,  WAR, OK,  WAR, OK,  ERR, OK,  OK,  WAR },
-/* OE */ { OK,  ERR, WAR, WAR, OK,  WAR, OK,  ERR, OK,  OK,  WAR },
+/*PwrI*/ { OK, OK, OK, WAR, OK, WAR, OK, OK, OK, OK, ERR },
+/*PwrO*/ { OK, ERR, WAR, ERR, OK, WAR, OK, ERR, ERR, ERR, WAR },
+/* OC */ { OK, ERR, OK, WAR, OK, WAR, OK, ERR, OK, OK, WAR },
+/* OE */ { OK, ERR, WAR, WAR, OK, WAR, OK, ERR, OK, OK, WAR },
 /* NC */ { WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR }
 };
 
@@ -124,29 +125,29 @@ static int DefaultDiagErc[PIN_NMAX][PIN_NMAX] =
 /* Look up table which gives the minimal drive for a pair of connected pins on a net
  *  Initial state of a net is NOC (No Connection)
  *  Can be updated to NET_NC, or NOD (Not Driven) or DRV (DRIven)
- * 
+ *
  *  Can be updated to NET_NC only if the previous state is NOC
- * 
+ *
  *  Nets are OK when their final state is NET_NC or DRV
  *  Nets with the state NOD have no source signal
  */
 static int MinimalReq[PIN_NMAX][PIN_NMAX] =
 {         /* In, Out,  Bi,  3S, Pas, UnS,PwrI,PwrO,  OC,  OE,  NC */
-/* In*/  {   NOD, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC },
-/*Out*/  {   DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, NOC },
-/* Bi*/  {   DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC },
-/* 3S*/  {   DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC },
-/*Pas*/  {   DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC },
-/*UnS*/  {   DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC },
+/* In*/
+    {   NOD, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC },
+/*Out*/ {   DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, NOC },
+/* Bi*/ {   DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC },
+/* 3S*/ {   DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC },
+/*Pas*/ {   DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC },
+/*UnS*/ {   DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC },
 /*PwrI*/ {   NOD, DRV, NOD, NOD, NOD, NOD, NOD, DRV, NOD, NOD, NOC },
 /*PwrO*/ {   DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, NOC },
-/* OC*/  {   DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC },
-/* OE*/  {   DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC },
-/* NC*/  {   NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC }
+/* OC*/ {   DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC },
+/* OE*/ {   DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC },
+/* NC*/ {   NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC }
 };
 
 
-
 /*********************************************/
 void WinEDA_ErcFrame::ReBuildMatrixPanel()
 /*********************************************/
@@ -174,7 +175,7 @@ void WinEDA_ErcFrame::ReBuildMatrixPanel()
 
     text_height = text->GetRect().GetHeight();
     bitmap_size = MAX( bitmap_size, text_height );
-	SAFE_DELETE( text );
+    SAFE_DELETE( text );
 
     // compute the Y pos interval:
     BoxMatrixMinSize.y = ( bitmap_size * (PIN_NMAX + 1) ) + 5;
@@ -273,7 +274,7 @@ void WinEDA_ErcFrame::TestErc( wxCommandEvent& event )
     ObjetNetListStruct* OldItem;
     ObjetNetListStruct* StartNet;
     ObjetNetListStruct* Lim;
-    
+
     int NetNbItems, MinConn;
 
     if( !DiagErcTableInit )
@@ -324,19 +325,19 @@ void WinEDA_ErcFrame::TestErc( wxCommandEvent& event )
     for( NetItemRef = g_TabObjNet;  NetItemRef < Lim;   NetItemRef++ )
         NetItemRef->m_FlagOfConnection = (IsConnectType) 0;
 
-    NetNbItems = 0; 
-    MinConn = NOC;
-    
+    NetNbItems = 0;
+    MinConn    = NOC;
+
     StartNet = OldItem = NetItemRef = g_TabObjNet;
-    
+
     for( ; NetItemRef < Lim; NetItemRef++ )
     {
         /* Tst changement de net */
         if( OldItem->GetNet() != NetItemRef->GetNet() )
         {
-            MinConn = NOC; 
-            NetNbItems = 0; 
-            StartNet = NetItemRef;
+            MinConn    = NOC;
+            NetNbItems = 0;
+            StartNet   = NetItemRef;
         }
 
         switch( NetItemRef->m_Type )
@@ -347,8 +348,8 @@ void WinEDA_ErcFrame::TestErc( wxCommandEvent& event )
         case NET_LABEL:
         case NET_BUSLABELMEMBER:
         case NET_PINLABEL:
-		case NET_GLOBLABEL: //not sure how to handle global labels -- they should be treated like other nets (just global!0
-		case NET_GLOBBUSLABELMEMBER:
+        case NET_GLOBLABEL: //not sure how to handle global labels -- they should be treated like other nets (just global!0
+        case NET_GLOBBUSLABELMEMBER:
             break;
 
         case NET_HIERLABEL:
@@ -366,7 +367,7 @@ void WinEDA_ErcFrame::TestErc( wxCommandEvent& event )
 
         case NET_PIN:
             TestOthersItems( m_Parent->DrawPanel, &dc,
-                             NetItemRef, StartNet, &NetNbItems, &MinConn );
+                NetItemRef, StartNet, &NetNbItems, &MinConn );
             break;
         }
 
@@ -389,17 +390,18 @@ void WinEDA_ErcFrame::TestErc( wxCommandEvent& event )
     if( WriteFichierERC == TRUE )
     {
         wxString ErcFullFileName;
-        ErcFullFileName = g_RootSheet->m_AssociatedScreen->m_FileName; 
+        ErcFullFileName = g_RootSheet->m_AssociatedScreen->m_FileName;
         ChangeFileNameExt( ErcFullFileName, wxT( ".erc" ) );
+
         ErcFullFileName = EDA_FileSelector( _( "ERC file:" ),
-                                            wxEmptyString,      /* Chemin par defaut */
-                                            ErcFullFileName,    /* nom fichier par defaut */
-                                            wxT( ".erc" ),      /* extension par defaut */
-                                            wxT( "*.erc" ),     /* Masque d'affichage */
-                                            this,
-                                            wxFD_SAVE,
-                                            TRUE
-                                            );
+            wxEmptyString,                                      /* Chemin par defaut */
+            ErcFullFileName,                                    /* nom fichier par defaut */
+            wxT( ".erc" ),                                      /* extension par defaut */
+            wxT( "*.erc" ),                                     /* Masque d'affichage */
+            this,
+            wxFD_SAVE,
+            TRUE
+            );
         if( ErcFullFileName.IsEmpty() )
             return;
 
@@ -434,6 +436,7 @@ void WinEDA_ErcFrame::DelERCMarkers( wxCommandEvent& event )
     {
         if( DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE )
             continue;
+
         /* Marqueur trouve */
         Marker = (DrawMarkerStruct*) DrawStruct;
         if( Marker->m_Type == MARQ_ERC )
@@ -466,7 +469,7 @@ void WinEDA_ErcFrame::ChangeErrorLevel( wxCommandEvent& event )
 {
     int             id, level, ii, x, y;
     wxBitmapButton* Butt;
-    const char**          new_bitmap_xpm = NULL;
+    const char**    new_bitmap_xpm = NULL;
     wxPoint         pos;
 
     id   = event.GetId();
@@ -545,11 +548,11 @@ static void Diagnose( WinEDA_DrawPanel* panel, wxDC* DC,
            || (NetItemRef->m_Type == NET_HIERBUSLABELMEMBER) )
         {
             Marker->m_Comment.Printf( _( "Warning HLabel %s not connected to SheetLabel" ),
-                                     NetItemRef->m_Label->GetData() );
+                NetItemRef->m_Label->GetData() );
         }
         else
             Marker->m_Comment.Printf( _( "Warning SheetLabel %s not connected to HLabel" ),
-                                     NetItemRef->m_Label->GetData() );
+                NetItemRef->m_Label->GetData() );
 
         if( screen == panel->GetScreen() )
             RedrawOneStruct( panel, DC, Marker, GR_COPY );
@@ -573,6 +576,7 @@ static void Diagnose( WinEDA_DrawPanel* panel, wxDC* DC,
             Marker->m_Comment.Printf(
                 _( "Warning Pin %s not driven (Net %d)" ),
                 MsgPinElectricType[ii], NetItemRef->GetNet() );
+
             if( screen == panel->GetScreen() )
                 RedrawOneStruct( panel, DC, Marker, GR_COPY );
             return;
@@ -582,6 +586,7 @@ static void Diagnose( WinEDA_DrawPanel* panel, wxDC* DC,
         {
             Marker->m_Comment.Printf(
                 _( "Warning More than 1 Pin connected to UnConnect symbol" ) );
+
             if( screen == panel->GetScreen() )
                 RedrawOneStruct( panel, DC, Marker, GR_COPY );
             return;
@@ -600,10 +605,10 @@ static void Diagnose( WinEDA_DrawPanel* panel, wxDC* DC,
         }
 
         Marker->m_Comment.Printf( _(
-                                      "%s: Pin %s connected to Pin %s (net %d)" ),
-                                  DiagLevel.GetData(),
-                                  MsgPinElectricType[ii],
-                                  MsgPinElectricType[jj], NetItemRef->GetNet() );
+                "%s: Pin %s connected to Pin %s (net %d)" ),
+            DiagLevel.GetData(),
+            MsgPinElectricType[ii],
+            MsgPinElectricType[jj], NetItemRef->GetNet() );
 
         if( screen == panel->GetScreen() )
             RedrawOneStruct( panel, DC, Marker, GR_COPY );
@@ -625,12 +630,12 @@ static void TestOthersItems( WinEDA_DrawPanel* panel, wxDC* DC,
 {
     ObjetNetListStruct* NetItemTst;
     ObjetNetListStruct* Lim;
-    
+
     int ref_elect_type, jj, erc = OK, local_minconn;
 
     /* Analyse de la table des connexions : */
     Lim = g_TabObjNet + g_NbrObjNet;    // pointe la fin de la liste
-    
+
     ref_elect_type = NetItemRef->m_ElectricalType;
 
     NetItemTst    = netstart;
@@ -644,7 +649,7 @@ static void TestOthersItems( WinEDA_DrawPanel* panel, wxDC* DC,
 
         /* Est - on toujours dans le meme net ? */
         if( (NetItemTst >= Lim)                                     // fin de liste (donc fin de net)
-           || (NetItemRef->GetNet() != NetItemTst->GetNet()) )    // fin de net
+           || ( NetItemRef->GetNet() != NetItemTst->GetNet() ) )    // fin de net
         {                                                           /* Fin de netcode trouve: Tst connexion minimum */
             if( (*MinConnexion < NET_NC )
                && (local_minconn < NET_NC ) )                       /* pin non connect�e ou non pilotee */
@@ -666,8 +671,8 @@ static void TestOthersItems( WinEDA_DrawPanel* panel, wxDC* DC,
         case NET_HIERBUSLABELMEMBER:
         case NET_SHEETBUSLABELMEMBER:
         case NET_SHEETLABEL:
-		case NET_GLOBLABEL:
-		case NET_GLOBBUSLABELMEMBER:
+        case NET_GLOBLABEL:
+        case NET_GLOBBUSLABELMEMBER:
         case NET_PINLABEL:
             break;
 
@@ -681,7 +686,7 @@ static void TestOthersItems( WinEDA_DrawPanel* panel, wxDC* DC,
 
             if( NetItemTst <= NetItemRef )
                 break;
-            
+
             *NetNbItems += 1;
             if( erc == OK )         // 1 marqueur par pin maxi
             {
@@ -712,7 +717,7 @@ static bool WriteDiagnosticERC( const wxString& FullFileName )
     DrawMarkerStruct* Marker;
     char Line[256];
     static FILE*      OutErc;
-    DrawSheetPath*  Sheet;
+    DrawSheetPath*    Sheet;
     wxString          msg;
 
     if( ( OutErc = wxFopen( FullFileName, wxT( "wt" ) ) ) == NULL )
@@ -720,23 +725,26 @@ static bool WriteDiagnosticERC( const wxString& FullFileName )
 
     DateAndTime( Line );
     msg = _( "ERC control" );
-    
+
     fprintf( OutErc, "%s (%s)\n", CONV_TO_UTF8( msg ), Line );
 
     EDA_SheetList SheetList( NULL );
 
     for( Sheet = SheetList.GetFirst(); Sheet != NULL; Sheet = SheetList.GetNext() )
     {
-		if(Sheet->Last() == g_RootSheet){
-        	msg.Printf( _( "\n***** Sheet / (Root) \n" ) ); 
-		}else{
-			wxString str = Sheet->PathHumanReadable(); 
-			msg.Printf( _("\n***** Sheet %s\n"), str.GetData() );
-		}
-        
+        if( Sheet->Last() == g_RootSheet )
+        {
+            msg.Printf( _( "\n***** Sheet / (Root) \n" ) );
+        }
+        else
+        {
+            wxString str = Sheet->PathHumanReadable();
+            msg.Printf( _( "\n***** Sheet %s\n" ), str.GetData() );
+        }
+
         fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) );
 
-		DrawStruct = Sheet->LastDrawList();
+        DrawStruct = Sheet->LastDrawList();
         for( ; DrawStruct != NULL; DrawStruct = DrawStruct->Pnext )
         {
             if( DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE )
@@ -746,13 +754,13 @@ static bool WriteDiagnosticERC( const wxString& FullFileName )
             Marker = (DrawMarkerStruct*) DrawStruct;
             if( Marker->m_Type != MARQ_ERC )
                 continue;
-            
+
             /* Write diag marqueur */
             msg.Printf( _( "ERC: %s (X= %2.3f inches, Y= %2.3f inches\n" ),
-                        Marker->GetComment().GetData(),
-                        (float) Marker->m_Pos.x / 1000,
-                        (float) Marker->m_Pos.y / 1000 );
-            
+                Marker->GetComment().GetData(),
+                (float) Marker->m_Pos.x / 1000,
+                (float) Marker->m_Pos.y / 1000 );
+
             fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) );
         }
     }
@@ -764,18 +772,24 @@ static bool WriteDiagnosticERC( const wxString& FullFileName )
     return TRUE;
 }
 
+
 bool TestLabel_( ObjetNetListStruct* a, ObjetNetListStruct* b )
 {
-	int at = a->m_Type; 
-	int bt = b->m_Type; 
-	if(    (at == NET_HIERLABEL || at == NET_HIERBUSLABELMEMBER)
-		 &&(bt == NET_SHEETLABEL || bt == NET_SHEETBUSLABELMEMBER) ){
-		 if( a->m_SheetList == b->m_SheetListInclude ){
-			return true; //connected!
-		 }
-	}
-	return false; //these two are unconnected
+    int at = a->m_Type;
+    int bt = b->m_Type;
+
+    if( (at == NET_HIERLABEL || at == NET_HIERBUSLABELMEMBER)
+       &&(bt == NET_SHEETLABEL || bt == NET_SHEETBUSLABELMEMBER) )
+    {
+        if( a->m_SheetList == b->m_SheetListInclude )
+        {
+            return true; //connected!
+        }
+    }
+    return false; //these two are unconnected
 }
+
+
 /***********************************************************************/
 void TestLabel( WinEDA_DrawPanel* panel, wxDC* DC,
                 ObjetNetListStruct* NetItemRef, ObjetNetListStruct* StartNet )
@@ -802,18 +816,20 @@ void TestLabel( WinEDA_DrawPanel* panel, wxDC* DC,
         /* Est - on toujours dans le meme net ? */
         if( ( NetItemTst ==  Lim )
            || ( NetItemRef->GetNet() != NetItemTst->GetNet() ) )
-        {           
+        {
             /* Fin de netcode trouve */
-            if( erc ){
+            if( erc )
+            {
                 /* GLabel ou SheetLabel orphelin */
                 Diagnose( panel, DC, NetItemRef, NULL, -1, WAR );
             }
             return;
         }
-		if(TestLabel_(NetItemRef, NetItemTst))
-			erc = 0; 
-		//same thing, different order. 
-		if(TestLabel_(NetItemTst, NetItemRef))
-			erc = 0; 
+        if( TestLabel_( NetItemRef, NetItemTst ) )
+            erc = 0;
+
+        //same thing, different order.
+        if( TestLabel_( NetItemTst, NetItemRef ) )
+            erc = 0;
     }
 }
diff --git a/eeschema/program.h b/eeschema/program.h
index 0a3f8fffce..956dd6aa03 100644
--- a/eeschema/program.h
+++ b/eeschema/program.h
@@ -76,7 +76,7 @@ public:
 public:
     EDA_DrawLineStruct( const wxPoint& pos, int layer );
     ~EDA_DrawLineStruct() { }
-    
+
     virtual wxString GetClass() const
     {
         return wxT( "EDA_DrawLine" );
@@ -92,19 +92,25 @@ public:
     }
 
 
+    /**
+     * Function GetBoundingBox
+     * returns the bounding box of this TRACK
+     */
+    EDA_Rect GetBoundingBox() const;
+
     virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode,
                        int Color = -1 );
-    
-#if defined(DEBUG)    
+
+#if defined(DEBUG)
     /**
      * Function Show
      * is used to output the object tree, currently for debugging only.
-     * @param nestLevel An aid to prettier tree indenting, and is the level 
+     * @param nestLevel An aid to prettier tree indenting, and is the level
      *          of nesting of this object within the overall tree.
      * @param os The ostream& to output to.
      */
     void Show( int nestLevel, std::ostream& os );
-#endif    
+#endif
 };
 
 
@@ -129,16 +135,16 @@ public:
     wxString            GetComment();
     virtual void        Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset,
                               int draw_mode, int Color = -1 );
-#if defined(DEBUG)    
+#if defined(DEBUG)
     /**
      * Function Show
      * is used to output the object tree, currently for debugging only.
-     * @param nestLevel An aid to prettier tree indenting, and is the level 
+     * @param nestLevel An aid to prettier tree indenting, and is the level
      *          of nesting of this object within the overall tree.
      * @param os The ostream& to output to.
      */
     void Show( int nestLevel, std::ostream& os );
-#endif    
+#endif
 };
 
 
@@ -177,7 +183,7 @@ public:
 public:
     DrawBusEntryStruct( const wxPoint& pos, int shape, int id );
     ~DrawBusEntryStruct() { }
-    
+
     virtual wxString GetClass() const
     {
         return wxT( "DrawBusEntry" );
@@ -201,7 +207,7 @@ public:
 public:
     DrawPolylineStruct( int layer );
     ~DrawPolylineStruct();
-    
+
     virtual wxString GetClass() const
     {
         return wxT( "DrawPolyline" );
@@ -222,7 +228,7 @@ public:
 public:
     DrawJunctionStruct( const wxPoint& pos );
     ~DrawJunctionStruct() { }
-    
+
     virtual wxString GetClass() const
     {
         return wxT( "DrawJunction" );
diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp
index da3e1f868e..1ca3deffc5 100644
--- a/eeschema/schedit.cpp
+++ b/eeschema/schedit.cpp
@@ -478,6 +478,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
             DrawPanel->MouseToCursorSchema();
             if( GetScreen()->GetCurItem()->m_Flags == 0 )
                 SaveCopyInUndoList( GetScreen()->GetCurItem(), IS_CHANGED );
+
             CmpRotationMiroir(
                 (EDA_SchComponentStruct*) GetScreen()->GetCurItem(),
                 &dc, option );
@@ -497,6 +498,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
                                                              GetScreen() ) );
         if( GetScreen()->GetCurItem() == NULL )
             break;
+
         EditComponentValue(
             (EDA_SchComponentStruct*) GetScreen()->GetCurItem(), &dc );
         break;
@@ -510,6 +512,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
                                                              GetScreen() ) );
         if( GetScreen()->GetCurItem() == NULL )
             break;
+
         EditComponentReference(
             (EDA_SchComponentStruct*) GetScreen()->GetCurItem(), &dc );
         break;