Index: src/dgp/dgp1.cc
===================================================================
--- src/dgp/dgp1.cc	(revision acbabee74272f626d34fbc8e42126d06c76c7903)
+++ src/dgp/dgp1.cc	(revision 854bece668ae247836fe18dce65f8ea7cf674700)
@@ -173,5 +173,8 @@
   int newd = find_existing_node(sgraph[d].mnode, new_dep_prop, new_dep_edge);
   if( newd < 0  )
-    newd = create_new_node(d,new_dep_prop,new_dep_edge);
+    {
+      newd = create_new_node(d,new_dep_prop,new_dep_edge);
+      sgraph[newd].prop.has_head = true;
+    }
   
   Edge new_head_edge(sgraph[newd].edge,newd);
@@ -201,15 +204,19 @@
 
   Edge new_head_edge(sgraph[h].edge);
-  int newh = find_existing_node(sgraph[h].mnode, new_head_prop, new_head_edge);
+  int newh = -1;
+  if(!new_head_prop.forbidden[l.role]) newh = find_existing_node(sgraph[h].mnode, new_head_prop, new_head_edge);
   if( newh < 0 )
       {
 	newh = create_new_node(h,new_head_prop,new_head_edge);
-	sgraph[newh].visible_as_neighbour = false;
+	sgraph[newh].prop.visible_as_neighbour = false;
       }
 
   Edge new_dep_edge;
-  int newd = find_existing_node(sgraph[d].mnode, new_dep_prop, new_dep_edge);
-  if( newd < 0)
-    newd = create_new_node(d,new_dep_prop,new_dep_edge);
+  int newd = d;
+  if( ! (new_dep_edge == sgraph[d].edge) || ! (old_dep_prop == new_dep_prop) )
+    {
+      newd = create_new_node(d,new_dep_prop,new_dep_edge);
+      sgraph[newd].prop.has_head = true;
+    }
 
 
@@ -299,5 +306,5 @@
   int i;
   while((i=lvi.next()) >= 0)
-      if(sgraph.saturated(i))
+    if(sgraph.saturated(i) && ! sgraph.has_head(i))
 	{
 	  if(debug) {fprintf(stderr,"\t%d <-- %d",i,j); }
Index: src/dgp/sgraph.cc
===================================================================
--- src/dgp/sgraph.cc	(revision acbabee74272f626d34fbc8e42126d06c76c7903)
+++ src/dgp/sgraph.cc	(revision 854bece668ae247836fe18dce65f8ea7cf674700)
@@ -180,4 +180,5 @@
   
   buf+=sprintf(buf,"/");
+  buf+=sprintf(buf,nodes[n].prop.visible_as_neighbour ? "o" : "x");
   if(nodes[n].edge.self())
     buf += sprintf(buf,"* ");
Index: src/dgp/sgraph.hh
===================================================================
--- src/dgp/sgraph.hh	(revision acbabee74272f626d34fbc8e42126d06c76c7903)
+++ src/dgp/sgraph.hh	(revision 854bece668ae247836fe18dce65f8ea7cf674700)
@@ -55,4 +55,6 @@
   bool init_attached;
   bool fin_attached;
+  bool visible_as_neighbour;
+  bool has_head;
   
   FlagSet flags;
@@ -72,4 +74,6 @@
   if(init_attached != p.init_attached) return false;
   if(fin_attached != p.fin_attached) return false;
+  if(visible_as_neighbour != p.visible_as_neighbour) return false;
+  if(has_head != p.has_head) return false;
 
   list<Boubble*>::const_iterator b,b1;
@@ -106,10 +110,12 @@
 void NodeProp::copy(const NodeProp& p)
 {
-  required=p.required;
-  forbidden=p.forbidden;
-  attached=p.attached;
-  flags=p.flags;
-  init_attached=p.init_attached;
-  fin_attached=p.fin_attached;
+  required = p.required;
+  forbidden = p.forbidden;
+  attached = p.attached;
+  flags = p.flags;
+  init_attached = p.init_attached;
+  fin_attached = p.fin_attached;
+  visible_as_neighbour = p.visible_as_neighbour;
+  has_head = p.has_head;
   for(list<Boubble*>::const_iterator b = p.boubbles.begin(); b!=p.boubbles.end(); b++)
     boubbles.push_back(new Boubble(**b));
@@ -127,4 +133,6 @@
   init_attached=false;
   fin_attached=false;
+  visible_as_neighbour=true;
+  has_head=false;
   clear_boubbles();
 }
@@ -161,13 +169,10 @@
 struct SNode
 {
-  
-  SNode() { visible_as_neighbour = true; }
+  SNode() { prop.clear(); }
 
   int mnode;
 
   NodeProp prop;
-
   Edge edge;
-  bool visible_as_neighbour;
 
   bitset<MAXNODES> LV;
@@ -179,6 +184,7 @@
   vector<Arc> deps;
 
-  void clear();
-  bool saturated();
+  void clear() { prop.clear(), LV.reset(), LD.reset(), LH.reset(), heads.clear(), deps.clear(); }
+  bool saturated() { return prop.required.none(); }
+  
 
   // void edge_clear()               { edge.clear(); edge_contains_self=false;}
@@ -191,13 +197,4 @@
 };
 
-//----------------------------------------------------------------------------------------------------
-inline
-void SNode::clear()
-{ prop.clear(), LV.reset(), LD.reset(), LH.reset(), heads.clear(), deps.clear(); }
-//----------------------------------------------------------------------------------------------------
-inline
-bool SNode::saturated()
-{ return prop.required.none(); }
-
 //====================================================================================================
 // SGraph CLASS
@@ -219,6 +216,7 @@
   void update_left(int headind, int depind);
   void update_right(int headind, int depind);
-  bool visible(int left, int right);
-  bool saturated(int node);
+  bool visible(int left, int right) { return nodes[right].LV[left]; }
+  bool saturated(int node) { return nodes[node].saturated(); }
+  bool has_head(int node) { return nodes[node].prop.has_head; }
 
   Cat  cat(int i) const { return mgraph[nodes[i].mnode].cat; }    
@@ -251,18 +249,4 @@
   int sprint_node_debug(char* buf, const char* pref, int n, int anc);
 };
-
-//----------------------------------------------------------------------------------------------------
-
-inline bool SGraph::visible(int left, int right)
-{
-  return nodes[right].LV[left];
-}
-
-//----------------------------------------------------------------------------------------------------
-
-inline bool SGraph::saturated(int node)
-{
-  return nodes[node].saturated();
-}
 
 //----------------------------------------------------------------------------------------------------
@@ -413,5 +397,5 @@
       vector<int>& spredecessors = mgraph[*mp].snodes;
       for(vector<int>::iterator sp = spredecessors.begin(); sp != spredecessors.end(); ++sp )
-	if(sgraph[*sp].visible_as_neighbour || !strict)
+	if(sgraph[*sp].prop.visible_as_neighbour || !strict)
 	  {
 	    push(wayup,*sp);
