--- class_netinfo.h	Mon Jan 19 17:26:36 1970
+++ class_netinfo.h	Mon Jan 19 17:26:36 1970
@@ -11,8 +11,10 @@
 
 
 #include <vector>
+#include <list>
 
 #include <class_netclass.h>
+#include <class_Track.h>
 
 
 class wxDC;
@@ -184,11 +186,14 @@
      */
     void buildPadsFullList();
 
+    void buildFloatingTracksList();
+
     BOARD*                      m_Parent;
     std::vector<NETINFO_ITEM*>  m_NetBuffer;    ///< net list (name, design constraints ..)
 
     std::vector<D_PAD*>         m_PadsFullList; ///< contains all pads, sorted by pad's netname.
                                                 ///< can be used in ratsnest calculations.
+    std::list<TRACK*>			m_FloatingTracksList;///< FIXME - DAN C contains all tracks and segvia, sorted by netName
 };
 
 
--- class_netinfolist.cpp	Mon Jan 19 17:26:36 1970
+++ class_netinfolist.cpp	Mon Jan 19 17:26:36 1970
@@ -59,9 +59,8 @@
     return ( a->GetNetname().Cmp( b->GetNetname() ) ) < 0;
 }
 
-
 /**
- *  Compute and update the net_codes for PADS et and equipots (.m_NetCode member)
+ *  Compute and update the net_codes for PADS and floating tracks/vias (.m_NetCode member)
  *  net_codes are >= 1 (net_code = 0 means not connected)
  *  Update the net buffer
  *  Must be called after editing pads (netname, or deleting) or after read a netlist
@@ -87,6 +86,7 @@
 
     // Build the PAD list, sorted by net
     buildPadsFullList();
+    buildFloatingTracksList();
 
     // Build netnames list, and create a netcode for each netname
     D_PAD* last_pad = NULL;
@@ -107,7 +107,27 @@
          */
         if( last_pad == NULL || ( pad->GetNetname() != last_pad->GetNetname() ) )
         {
-            netcode++;
+        	//the netcode before it got switched;
+        	int oldNetCode = pad->GetNet();
+        	netcode++;
+        	//only ever get here once per net
+        	//Go through the track list and reset the netcode of all tracks
+        	//having the same netcode as pad.  Then remove it from the list
+        	std::list<TRACK*>::iterator iterator =m_FloatingTracksList.begin();
+        	while (iterator != m_FloatingTracksList.end())
+        	{
+
+        	    if ((*iterator)->GetNet()==oldNetCode)
+        	    {
+        			(*iterator)->SetNet(netcode);
+        	        m_FloatingTracksList.erase(iterator++);
+        	    }
+        	    else
+        	    {
+        	        ++iterator;
+        	    }
+        	}
+
             net_item = new NETINFO_ITEM( (BOARD_ITEM*)m_Parent );
             net_item->SetNet( netcode );
             net_item->SetNetname( pad->GetNetname() );
@@ -177,4 +197,25 @@
     sort( m_PadsFullList.begin(), m_PadsFullList.end(), padlistSortByNetnames );
 
     m_Parent->m_Status_Pcb = LISTE_PAD_OK;
+}
+
+/**
+ * Builds a list of floating tracks.
+ * Useful because tracks netcodes are propagateed from pads.
+ * if the track isn't connected to a pad its netcode is never updated
+ */
+void NETINFO_LIST::buildFloatingTracksList()
+{
+    // empty the old list
+    m_FloatingTracksList.clear();
+    m_Parent->m_FullRatsnest.clear();
+
+    // Add the track to the floating track list
+    for( TRACK* track = m_Parent->m_Track;  track;  track = track->Next() )
+    {
+    	if(track->GetFloating())
+    	{
+    		m_FloatingTracksList.push_back(track);
+    	}
+    }
 }
--- class_track.cpp	Mon Jan 19 17:26:36 1970
+++ class_track.cpp	Mon Jan 19 17:26:36 1970
@@ -122,6 +122,7 @@
 TRACK::TRACK( BOARD_ITEM* aParent, KICAD_T idtype ) :
     BOARD_CONNECTED_ITEM( aParent, idtype )
 {
+	m_Floating = true;
     m_Width = 0;
     m_Shape = S_SEGMENT;
     start   = end = NULL;
--- class_track.h	Mon Jan 19 17:26:36 1970
+++ class_track.h	Mon Jan 19 17:26:36 1970
@@ -92,6 +92,7 @@
     BOARD_CONNECTED_ITEM* end;
 
     double      m_Param;            // Auxiliary variable ( used in some computations )
+    bool		m_Floating;			// True if this track is not connected to a pad somewhere in its subnet.
 
 public:
     TRACK( BOARD_ITEM* aParent, KICAD_T idtype = PCB_TRACE_T );
@@ -110,6 +111,9 @@
     virtual void Rotate( const wxPoint& aRotCentre, double aAngle );
 
     virtual void Flip( const wxPoint& aCentre );
+
+    void SetFloating(bool aFloating)			{ m_Floating = aFloating; }
+    bool GetFloating()							{ return m_Floating; }
 
     void SetPosition( const wxPoint& aPos )     { m_Start = aPos; }     // was overload
     const wxPoint& GetPosition() const          { return m_Start; }     // was overload
--- connect.cpp	Mon Jan 19 17:26:36 1970
+++ connect.cpp	Mon Jan 19 17:26:36 1970
@@ -976,95 +976,107 @@
  */
 void PCB_BASE_FRAME::RecalculateAllTracksNetcode()
 {
-    TRACK*              curr_track;
+	TRACK*              curr_track;
 
-    // Build the net info list
-    GetBoard()->BuildListOfNets();
+	// Build the net info list
+	GetBoard()->BuildListOfNets();
 
-    // Reset variables and flags used in computation
-    curr_track = m_Pcb->m_Track;
-    for( ; curr_track != NULL; curr_track = curr_track->Next() )
-    {
-        curr_track->m_TracksConnected.clear();
-        curr_track->m_PadsConnected.clear();
-        curr_track->start = NULL;
-        curr_track->end = NULL;
-        curr_track->SetState( BUSY | IN_EDIT | BEGIN_ONPAD | END_ONPAD, OFF );
-        curr_track->SetZoneSubNet( 0 );
-        curr_track->SetNet( 0 );    // net code = 0 means not connected
-    }
-
-    // If no pad, reset pointers and netcode, and do nothing else
-    if( m_Pcb->GetPadCount() == 0 )
-        return;
-
-    CONNECTIONS connections( m_Pcb );
-    connections.BuildPadsList();
-    connections.BuildTracksCandidatesList(m_Pcb->m_Track);
-
-    // First pass: build connections between track segments and pads.
-    connections.SearchTracksConnectedToPads();
-
-    /* For tracks connected to at least one pad,
-     * set the track net code to the pad netcode
-     */
-    curr_track = m_Pcb->m_Track;
-    for( ; curr_track != NULL; curr_track = curr_track->Next() )
-    {
-        if( curr_track->m_PadsConnected.size() )
-            curr_track->SetNet( curr_track->m_PadsConnected[0]->GetNet() );
-    }
-
-    // Pass 2: build connections between track ends
-    for( curr_track = m_Pcb->m_Track; curr_track != NULL; curr_track = curr_track->Next() )
-    {
-        connections.SearchConnectedTracks( curr_track );
-        connections.GetConnectedTracks( curr_track );
-    }
-
-    // Propagate net codes from a segment to other connected segments
-    bool new_pass_request = true;   // set to true if a track has its netcode changed from 0
-                                    // to a known netcode to re-evaluate netcodes
-                                    // of connected items
-    while( new_pass_request )
-    {
-        new_pass_request = false;
-
-        for( curr_track = m_Pcb->m_Track; curr_track; curr_track = curr_track->Next() )
-        {
-            int netcode = curr_track->GetNet();
-            if( netcode == 0 )
-            {   // try to find a connected item having a netcode
-                for( unsigned kk = 0; kk < curr_track->m_TracksConnected.size(); kk++ )
-                {
-                    int altnetcode = curr_track->m_TracksConnected[kk]->GetNet();
-                    if( altnetcode )
-                    {
-                        new_pass_request = true;
-                        netcode = altnetcode;
-                        curr_track->SetNet(netcode);
-                        break;
-                    }
-                }
-            }
-            if( netcode )    // this track has a netcode
-            {   // propagate this netcode to connected tracks having no netcode
-                for( unsigned kk = 0; kk < curr_track->m_TracksConnected.size(); kk++ )
-                {
-                    int altnetcode = curr_track->m_TracksConnected[kk]->GetNet();
-                    if( altnetcode == 0 )
-                    {
-                        curr_track->m_TracksConnected[kk]->SetNet(netcode);
-                        new_pass_request = true;
-                    }
-                }
-            }
-        }
-    }
+	// Reset variables and flags used in computation
+	curr_track = m_Pcb->m_Track;
+	for( ; curr_track != NULL; curr_track = curr_track->Next() )
+	{
+		curr_track->m_TracksConnected.clear();
+		curr_track->m_PadsConnected.clear();
+		curr_track->start = NULL;
+		curr_track->end = NULL;
+		curr_track->SetState( BUSY | IN_EDIT | BEGIN_ONPAD | END_ONPAD, OFF );
+		curr_track->SetFloating(true); //Set all tracks to be floating
+		curr_track->SetZoneSubNet( 0 );
+//		curr_track->SetNet( 0 );    // net code = 0 means not connected
+
+	}
+
+	// If no pad, reset pointers and netcode, and do nothing else
+	if( m_Pcb->GetPadCount() == 0 )
+		return;
+
+	CONNECTIONS connections( m_Pcb );
+	connections.BuildPadsList();
+	connections.BuildTracksCandidatesList(m_Pcb->m_Track);
+
+	// First pass: build connections between track segments and pads.
+	connections.SearchTracksConnectedToPads();
+
+	/* For tracks connected to at least one pad,
+	 * set the track net code to the pad netcode
+	 */
+	curr_track = m_Pcb->m_Track;
+	for( ; curr_track != NULL; curr_track = curr_track->Next() )
+	{
+		if( curr_track->m_PadsConnected.size() )
+		{
+			curr_track->SetNet( curr_track->m_PadsConnected[0]->GetNet() );
+			curr_track->SetFloating(false);
+		}
+
+	}
+
+	// Pass 2: build connections between track ends
+	for( curr_track = m_Pcb->m_Track; curr_track != NULL; curr_track = curr_track->Next() )
+	{
+		connections.SearchConnectedTracks( curr_track );
+		connections.GetConnectedTracks( curr_track );
+	}
+
+	// Propagate net codes from a segment to other connected segments
+	bool new_pass_request = true;   // set to true if a track has its netcode changed from 0
+	// to a known netcode to re-evaluate netcodes
+	// of connected items
+	while( new_pass_request )
+	{
+		new_pass_request = false;
+
+		for( curr_track = m_Pcb->m_Track; curr_track; curr_track = curr_track->Next() )
+		{
+			int netcode = curr_track->GetNet();
+			bool isFloating = curr_track->GetFloating();
+			if( isFloating ) //this track is floating
+			{   // try to find a connected item having a which is not floating
+				for( unsigned kk = 0; kk < curr_track->m_TracksConnected.size(); kk++ )
+				{
+					int altnetcode = curr_track->m_TracksConnected[kk]->GetNet();
+					bool altFloating = curr_track->m_TracksConnected[kk]->GetFloating();
+					if( !altFloating )
+					{
+						new_pass_request = true;
+						netcode = altnetcode;
+						curr_track->SetNet(netcode);
+						curr_track->SetFloating(false);
+						isFloating=altFloating;
+						break;
+					}
+				}
+			}
+			if( !isFloating )    // this track is connected to something
+			{   // propagate this netcode to connected tracks that are still marked as floating
+				for( unsigned kk = 0; kk < curr_track->m_TracksConnected.size(); kk++ )
+				{
+					bool altFloating = curr_track->m_TracksConnected[kk]->GetFloating();
+					if( altFloating )
+					{
+						curr_track->m_TracksConnected[kk]->SetNet(netcode);
+						curr_track->SetFloating(false);
+						new_pass_request = true;
+					}
+				}
+			}
+		}
+	}
 
-    // Sort the track list by net codes:
-    RebuildTrackChain( m_Pcb );
+	// Sort the track list by net codes:
+	RebuildTrackChain( m_Pcb );
 }
+
 
 
 
