diff --git a/src/zmapWindow/zmapWindowColBump.c b/src/zmapWindow/zmapWindowColBump.c
index d969ad62d4841338179b1b48ae2c7b818d99ca7e..8f1e33ad595eec95d91423531f20a5aebb37ef78 100755
--- a/src/zmapWindow/zmapWindowColBump.c
+++ b/src/zmapWindow/zmapWindowColBump.c
@@ -27,9 +27,9 @@
  *
  * Exported functions: See zmapWindow_P.h
  * HISTORY:
- * Last edited: Apr 29 09:24 2010 (edgrif)
+ * Last edited: May 24 16:01 2010 (edgrif)
  * Created: Tue Sep  4 10:52:09 2007 (edgrif)
- * CVS info:   $Id: zmapWindowColBump.c,v 1.72 2010-04-30 08:37:15 edgrif Exp $
+ * CVS info:   $Id: zmapWindowColBump.c,v 1.73 2010-05-24 15:02:39 edgrif Exp $
  *-------------------------------------------------------------------
  */
 
@@ -112,6 +112,8 @@ typedef struct
   gboolean        protein ;
   GString        *temp_buffer;
 
+  ZMapWindowContainerFeatureSet feature_set ;
+
 } ComplexBumpStruct, *ComplexBump ;
 
 
@@ -121,8 +123,8 @@ typedef struct
   double         incr ;
   double         offset ;
   double         width; 	/* this will be removed! */
-  GList               *feature_list ;
-  ZMapWindowCanvasItem parent_item;
+  GList          *feature_list ;
+  ZMapWindowContainerFeatureSet feature_set ;
 } ComplexColStruct, *ComplexCol ;
 
 
@@ -217,11 +219,6 @@ static gboolean getFeatureFromListItem(GList *list_item, FooCanvasItem **item_ou
 static gboolean findRangeListItems(GList *search_start, int seq_start, int seq_end,
 				   GList **first_out, GList **last_out) ;
 static GList *removeNonColinear(GList *first_list_item, ZMapGListDirection direction, BumpCol bump_data) ;
-
-static gboolean column_clear_collections(FooCanvasGroup *column_features) ;
-static void make_parent_item_cb(gpointer data, gpointer user_data) ;
-
-
 static ColinearityType featureHomolIsColinear(ZMapWindow window,  unsigned int match_threshold,
 					      ZMapFeature feat_1, ZMapFeature feat_2) ;
 
@@ -230,7 +227,6 @@ static void printChild(gpointer data, gpointer user_data) ;
 static void printQuarks(gpointer data, gpointer user_data) ;
 #endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
 
-
 #ifdef ED_G_NEVER_INCLUDE_THIS_CODE
 static ZMapStyleBumpMode hack_initial_mode(ZMapFeatureTypeStyle style);
 #endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
@@ -353,10 +349,11 @@ void zmapWindowColumnBumpRange(FooCanvasItem *bump_item, ZMapStyleBumpMode bump_
   if(historic_bump_mode > ZMAPBUMP_UNBUMP && historic_bump_mode != bump_mode && bump_mode != ZMAPBUMP_UNBUMP)
       zmapWindowColumnBumpRange(bump_item,ZMAPBUMP_UNBUMP,compress_mode);
 
+
   column_features = (FooCanvasGroup *)zmapWindowContainerGetFeatures((ZMapWindowContainerGroup)container) ;
 
   /* always reset the column */
-  column_clear_collections(column_features);
+  zMapWindowContainerFeatureSetRemoveSubFeatures(ZMAP_CONTAINER_FEATURESET(container)) ;
 
   zmapWindowContainerShowAllHiddenFeatures(container);
 
@@ -520,7 +517,6 @@ void zmapWindowColumnBumpRange(FooCanvasItem *bump_item, ZMapStyleBumpMode bump_
 	complex.name_hash       = g_hash_table_new_full(NULL, NULL, /* NULL => use direct hash/comparison. */
 							NULL, hashDataDestroyCB) ;
 
-
 	if (bump_mode == ZMAPBUMP_NAME_BEST_ENDS ||
 	    bump_mode == ZMAPBUMP_NAME_COLINEAR  ||
 	    bump_mode == ZMAPBUMP_NAME_NO_INTERLEAVE)
@@ -632,6 +628,8 @@ void zmapWindowColumnBumpRange(FooCanvasItem *bump_item, ZMapStyleBumpMode bump_
 	    complex.curr_offset = 0.0 ;
 	    complex.incr = (width * COMPLEX_BUMP_COMPRESS) ;
 
+	    complex.feature_set = container ;
+
 	    if (bump_mode == ZMAPBUMP_NAME_INTERLEAVE)
 	      complex.overlap_func = listsOverlap ;
 	    else if (bump_mode == ZMAPBUMP_NAME_NO_INTERLEAVE || bump_mode == ZMAPBUMP_NAME_BEST_ENDS
@@ -645,45 +643,26 @@ void zmapWindowColumnBumpRange(FooCanvasItem *bump_item, ZMapStyleBumpMode bump_
 
 	    zMapPrintTimer(NULL, "offsets set for subsets of features") ;
 
-
-
 	    /* we reverse the offsets for reverse strand cols so as to mirror the forward strand. */
 	    if (zmapWindowContainerFeatureSetGetStrand(container) == ZMAPSTRAND_REVERSE)
 	      reverseOffsets(complex.bumpcol_list) ;
 
-	    g_list_foreach(complex.bumpcol_list, make_parent_item_cb, column_features);
-
 	    /* Bump all the features to their correct offsets. */
 	    g_list_foreach(complex.bumpcol_list, moveItemsCB, NULL) ;
 
 	    zMapPrintTimer(NULL, "bumped features to offsets") ;
 
 
-	    /* TRY JUST ADDING GAPS  IF A MARK IS SET */
-          if ((mark_set || zmapWindowContainerFeatureSetGetBumpUnmarked(container)) && bump_mode != ZMAPBUMP_NAME_INTERLEAVE)
+          if ((mark_set || zmapWindowContainerFeatureSetGetBumpUnmarked(container))
+	      && bump_mode != ZMAPBUMP_NAME_INTERLEAVE)
 	      {
 		/* NOTE THERE IS AN ISSUE HERE...WE SHOULD ADD COLINEAR STUFF FOR ALIGN FEATURES
 		 * THIS IS NOT EXPLICIT IN THE CODE WHICH IS NOT CORRECT....NEED TO THINK THIS
 		 * THROUGH, DON'T JUST MAKE THESE COMPLEX BUMP MODES SPECIFIC TO ALIGNMENTS,
 		 * ITS MORE COMPLICATED THAN THAT... */
 
-
-		/* for no interleave add background items.... */
-#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
-		g_list_foreach(complex.bumpcol_list, addBackgrounds, &container->extra_items) ;
-#endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
-
-#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
-		g_list_foreach(complex.bumpcol_list, addMultiBackgrounds, &container->extra_items) ;
-#endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
-
 		/* WE SHOULD ONLY BE DOING THIS FOR ALIGN FEATURES...TEST AT THIS LEVEL.... */
 
-#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
-		g_list_foreach(complex.bumpcol_list, NEWaddMultiBackgrounds, &container->extra_items) ;
-		g_list_foreach(complex.bumpcol_list, NEWaddMultiBackgrounds, container) ;
-#endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
-
                 g_list_foreach(complex.bumpcol_list, collection_add_colinear_cb, &complex);
 
                 zMapPrintTimer(NULL, "added inter align bars etc.") ;
@@ -773,23 +752,6 @@ void zmapWindowColumnUnbumpAll(FooCanvasItem *column_item)
 
 
 
-static void make_parent_item_cb(gpointer data, gpointer user_data)
-{
-  ComplexCol column_data = (ComplexCol)data;
-  FooCanvasGroup *column_features = FOO_CANVAS_GROUP(user_data);
-  ZMapFeature feature;
-
-  if((column_data->feature_list) &&
-     (column_data->feature_list->data) &&
-     (feature = zMapWindowCanvasItemGetFeature(FOO_CANVAS_ITEM(column_data->feature_list->data))))
-    {
-      if (feature->type == ZMAPSTYLE_MODE_ALIGNMENT)
-	column_data->parent_item = zMapWindowCollectionFeatureCreate(column_features);
-    }
-
-  return ;
-}
-
 static ColinearityType colinear_compare_features_cb(ZMapFeature feature_a,
 						    ZMapFeature feature_b,
 						    gpointer    user_data)
@@ -801,60 +763,27 @@ static ColinearityType colinear_compare_features_cb(ZMapFeature feature_a,
 				column_data->bump_properties->match_threshold,
 				feature_a, feature_b);
 
-  return type;
+  return type ;
 }
 
 
 static void collection_add_colinear_cb(gpointer data, gpointer user_data)
 {
   ComplexCol column_data = (ComplexCol)data;
-#ifdef RDS_UNUSED
+#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
   ComplexBump bump_data  = (ComplexBump)user_data;
-#endif
-
-  if(column_data->parent_item)
-    {
-      zMapWindowCollectionFeatureAddColinearMarkers(column_data->parent_item,
-						    colinear_compare_features_cb,column_data);
-      zMapWindowCollectionFeatureAddIncompleteMarkers(column_data->parent_item,
-						      column_data->bump_properties->window->revcomped_features);
-	zMapWindowCollectionFeatureAddSpliceMarkers(column_data->parent_item);
-    }
-
-  return ;
-}
-
-static gboolean column_clear_collections(FooCanvasGroup *column_features)
-  {
-    GList *list, *next;
-    gboolean result = FALSE;
-
-    if((list = g_list_first(column_features->item_list)))
-      {
-	do
-	  {
-	    next = list->next;
-	    if(ZMAP_IS_WINDOW_COLLECTION_FEATURE(list->data))
-	      {
-		ZMapWindowCanvasItem canvas_item;
-
-		canvas_item = ZMAP_CANVAS_ITEM(list->data);
+#endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
 
-		zMapWindowCollectionFeatureRemoveSubFeatures(canvas_item, FALSE, TRUE);
+  zMapWindowContainerFeatureSetAddColinearMarkers(column_data->feature_set, column_data->feature_list,
+						  colinear_compare_features_cb, column_data) ;
 
-		zMapWindowCanvasItemClearOverlay(canvas_item);
-		zMapWindowCanvasItemClearUnderlay(canvas_item);
+  zMapWindowContainerFeatureSetAddIncompleteMarkers(column_data->feature_set, column_data->feature_list,
+						    column_data->bump_properties->window->revcomped_features) ;
 
-		canvas_item = zMapWindowCanvasItemDestroy(canvas_item);
+  zMapWindowContainerFeatureSetAddSpliceMarkers(column_data->feature_set, column_data->feature_list) ;
 
-		result = TRUE;
-	      }
-	  }
-	while((list = next));
-      }
-
-    return result;
-  }
+  return ;
+}
 
 
 #warning this_needs_to_go
@@ -1731,17 +1660,6 @@ static gint sortByOverlapCB(gconstpointer a, gconstpointer b, gpointer user_data
   strand_1 = feature->strand ;
   bot_1 = feature->x2 ;
 
-
-#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
-  feature_list_1 = g_list_last(feature_list_1) ;
-  item = (FooCanvasItem *)feature_list_1->data ;
-  feature = zmapWindowItemGetFeature(item);
-  zMapAssert(feature) ;
-  bot_1 = feature->x2 ;
-#endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
-
-
-
   feature_list_2 = g_list_first(feature_list_2) ;
   item = (FooCanvasItem *)feature_list_2->data ;
   feature = zmapWindowItemGetFeature(item);
@@ -1750,17 +1668,6 @@ static gint sortByOverlapCB(gconstpointer a, gconstpointer b, gpointer user_data
   strand_2 = feature->strand ;
   bot_2 = feature->x2 ;
 
-
-#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
-  feature_list_2 = g_list_last(feature_list_2) ;
-  item = (FooCanvasItem *)feature_list_2->data ;
-  feature = zmapWindowItemGetFeature(item);
-  zMapAssert(feature) ;
-  bot_2 = feature->x2 ;
-#endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
-
-
-
   /* Strand first, then overlap. */
   if (strand_1 < strand_2)
     result = -1 ;
@@ -1865,28 +1772,25 @@ static void bestFitCB(gpointer data, gpointer user_data)
 
 static ComplexCol ComplexBumpComplexColCreate(ComplexBump complex, GList *name_list)
 {
-  ComplexCol col = NULL;
+  ComplexCol col ;
+  OffsetWidthStruct x1_width = {G_MAXDOUBLE, 0.0};
 
-  if((col = g_new0(ComplexColStruct, 1)))
-    {
-      OffsetWidthStruct x1_width = {G_MAXDOUBLE, 0.0};
+  col = g_new0(ComplexColStruct, 1) ;
 
-      col->bump_properties  = complex->bump_properties;
-      col->offset           = complex->curr_offset ;
-      col->feature_list     = name_list ;
+  col->bump_properties = complex->bump_properties ;
+  col->offset = complex->curr_offset ;
+  col->feature_list = name_list ;
+  col->feature_set = complex->feature_set ;
 
-      g_list_foreach(name_list, getMaxWidth, &x1_width) ;
+  g_list_foreach(name_list, getMaxWidth, &x1_width) ;
 
-      complex->bumpcol_list = g_list_append(complex->bumpcol_list, col) ;
-      complex->curr_offset += x1_width.width ;
+  complex->bumpcol_list = g_list_append(complex->bumpcol_list, col) ;
+  complex->curr_offset += x1_width.width ;
 
-      if(x1_width.x != G_MAXDOUBLE)
-	col->offset -= x1_width.x;
-    }
-  else
-    zMapLogCritical("%s", "Failed to allocate");
+  if(x1_width.x != G_MAXDOUBLE)
+    col->offset -= x1_width.x ;
 
-  return col;
+  return col ;
 }
 
 /* GFunc() to try to combine lists of features, if the lists have any overlapping features,
@@ -2121,15 +2025,7 @@ static void reverseOffsets(GList *bumpcol_list)
   return ;
 }
 
-static void reparentItemCB(gpointer data, gpointer user_data)
-{
-  ComplexCol col_data = (ComplexCol)user_data;
-
-  zMapWindowCollectionFeatureStaticReparent(ZMAP_CANVAS_ITEM(data),
-					    ZMAP_CANVAS_ITEM(col_data->parent_item));
 
-  return ;
-}
 
 /* These two callbacks go through the list of lists of features moving all their canvas items
  * into the correct place within their columns. */
@@ -2137,37 +2033,7 @@ static void moveItemsCB(gpointer data, gpointer user_data)
 {
   ComplexCol col_data = (ComplexCol)data ;
 
-  if(!col_data->parent_item)
-    g_list_foreach(col_data->feature_list, moveItemCB, col_data) ;
-  else
-    {
-      FooCanvasItem *first_item;
-      double x, y;
-
-      if((col_data->feature_list) && (col_data->feature_list->data))
-	{
-	  /* Firstly we need to move the parent_item to the same coords as
-	   * the first item in feature_list */
-
-	  first_item = FOO_CANVAS_ITEM(col_data->feature_list->data);
-
-	  g_object_get(G_OBJECT(first_item),
-		       "x", &x,
-		       "y", &y,
-		       NULL);
-
-	  foo_canvas_item_set(FOO_CANVAS_ITEM(col_data->parent_item),
-			      "x", x,
-			      "y", y,
-			      NULL);
-
-	  g_list_foreach(col_data->feature_list, reparentItemCB, col_data);
-
-	  foo_canvas_item_set(FOO_CANVAS_ITEM(col_data->parent_item),
-			      "x", x + col_data->offset,
-			      NULL);
-	}
-    }
+  g_list_foreach(col_data->feature_list, moveItemCB, col_data) ;
 
   return ;
 }