method deploy n =
    assert (self#is_root n);
    let s = self#service n in
    Hashtbl.add deployed s true;
    (* Show nodes *)
    self#iter_service_nodes (fun n' -> n'#show ()) n;
    (* Show or hide edges *)
    let show_or_hide_edge e =
      let n1, n2 = self#src e, self#dst e in
      (* Edge in the current service *)
      if self#service n1 = s && self#service n2 = s then begin
        match self#edge_type e with
        | Service.Inter_functions -> e#show ()
        | _ -> assert false
      end else 
        (* Edge starting from the current service *)
        if self#service n1 = s then begin
          match self#edge_type e with
          | Service.Inter_functions ->
              if self#is_deployed (self#service n2) then e#show ()
          | Service.Function_to_service ->
              if not (self#is_deployed (self#service n2)) then e#show ()
          | Service.Inter_services ->
              e#hide ()
        end else 
          (* Edges going to the current service *)
          if self#service n2 = s then begin
            match self#edge_type e with
            | Service.Inter_functions ->
                if self#is_deployed (self#service n1) then
                  e#show ()
            | Service.Function_to_service ->
                e#hide ()
            | Service.Inter_services ->
                if self#is_deployed (self#service n1) then
                  e#hide ()
          end 
    in
    self#iter_edges_e show_or_hide_edge