diff --git a/src/Makefile b/src/Makefile
index 19230d7a8943a4c9316fcb0c9f75890769c886bc..64016490ee19df0afde63ed801d4eac038500a9f 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -8,7 +8,6 @@ ifndef SOURCES
 SOURCES =  \
 	./version.ml \
 	./global.ml \
-	./parserUtils.ml \
 	./verbose.mli \
 	./verbose.ml \
 	./ident.mli \
@@ -18,6 +17,7 @@ SOURCES =  \
 	./errors.ml \
 	./syntaxTreeCore.ml \
 	./syntaxTree.ml \
+	./parserUtils.ml \
 	./parser.mly \
 	./lexer.mll \
 	./syntaxTreeDump.mli \
diff --git a/src/TODO b/src/TODO
index 36b117dcbe2d2e8306427d17d8bee3c257e7e819..5c9413900aba11d5e80f62e891479bd6519c5318 100644
--- a/src/TODO
+++ b/src/TODO
@@ -34,21 +34,7 @@ implicite. Autorise-t'on ce genre de truc ?
 * verifier que chacun des exemples du repertoire "should_fail" à une
 correspondance dans le manuel, et reciproquement...
 
-* Que ce soit pour les types, les constantes, ou les noeuds, il est
-possible syntaxiquement de ne pas leur donner de definition.
 
-Pour les noeuds, si cela arrive
- - dans la partie "provide", cela correspond à un item abtrait
- - dans la partie "body", cela  correspond à un item externe
-
-pour les types et les constantes, le meme objet syntaxique est généré
-par le parseur (ExternalConst et ExternalType).
-
-Mais pour les noeuds, il y en a 2 : ExtNone et AbstractNode.
-
-Il faudrait faire quelque chose, 
- - soit rajouter un AbstractConst et un AbstractType
- - soit merger ExtNone et AbstractNode
 
 ***********************************************************************************
 *** a faire
@@ -62,7 +48,12 @@ Il faudrait faire quelque chose,
 une solution crade serait de faire un coup des sed pour rajouter un
 espace devant tous les "..".
 
-une solution propre serait de ne plus utiliser lex...
+une solution propre serait de ne plus utiliser lex... Une autre
+solution serait de reconstruire la bonne onfo au niveau du yacc. Par
+exemple, si apres un "[", on trouve un reel, on bidouille pour
+generer les lexemes qui vont bien, à savoir :
+
+	tk_real+tk_real -> tk_int+tk_dotdot+tk_int
 
 
 
diff --git a/src/compiledData.ml b/src/compiledData.ml
index 51d3f24353d054a2d27116e71cba3305b57dc828..2ddfe2c3a90f03d2a58d9b004db054e02cb308fb 100644
--- a/src/compiledData.ml
+++ b/src/compiledData.ml
@@ -1,4 +1,4 @@
-(** Time-stamp: <modified the 10/03/2008 (at 17:55) by Erwan Jahier> *)
+(** Time-stamp: <modified the 11/03/2008 (at 16:34) by Erwan Jahier> *)
 
 (** 
 
@@ -34,12 +34,12 @@
 	construit à partir d'une val_exp => IL S'AGIT DE LA REPRESENTATION
 	INTERNE DES CONSTANTES STATIQUES 
 
-	- var_eff :
+	- var_info_eff :
 	déclaration de variable,
 	construit à partir de var_info.
 
 	- val_eff :
-	union entre const_eff et var_eff.
+	union entre const_eff et var_info_eff.
 
 	- slice_eff :
 	dénotation de tranche de tableau,
@@ -51,25 +51,11 @@
 	- eq_eff :
 	version compilée de eq_info 
 
-	- ext_node_eff :
-	déclaration de fonction chéckée 
-	(info conservée dans la table des symboles pour résoudre les call)
-
-	- node_half_eff : (N.B. utilise dans pack_env)
-	déclaration de node/template half-chéckée.
-	(info conservée dans la table des symboles pour résoudre les call)
-
-	- node_half_eff : (N.B. utilise dans pack_env)
-	union de ext_node_eff et node_half_eff.
-
-	- node_eff :
+	- node_exp_eff :
 	dénotation d'opération,
-	peut être externe, predef ou utilisateur,
+	peut être  predef ou utilisateur,
 	construit à partir de node_exp.
 
-	- user_node_eff :
-	noeud/template + arguments statiques effectifs,
-
 	- static_arg_eff :
 	déclaration d'un static arg
 
@@ -117,7 +103,7 @@ N.B. On fournit les constructeurs des id_solver courants, voir :
 type id_solver = {
   id2const : Ident.idref -> Lxm.t -> const_eff ;
   id2type  : Ident.idref -> Lxm.t -> type_eff ;
-  id2node  : Ident.idref -> static_arg_eff list -> Lxm.t -> node_eff ;
+  id2node  : Ident.idref -> static_arg_eff list -> Lxm.t -> node_exp_eff ;
 }
 
 (*---------------------------------------------------------------------
@@ -133,10 +119,10 @@ and type_eff =
   | Bool_type_eff
   | Int_type_eff
   | Real_type_eff
-  | External_type_eff  of Ident.long
-  | Enum_type_eff      of Ident.long * (Ident.long list)
-  | Array_type_eff     of type_eff * int
-  | Struct_type_eff    of Ident.long * (Ident.t * type_eff * const_eff option) list
+  | External_type_eff of Ident.long
+  | Enum_type_eff     of Ident.long * (Ident.long list)
+  | Array_type_eff    of type_eff * int
+  | Struct_type_eff   of Ident.long * (Ident.t * type_eff * const_eff option) list
 (*---------------------------------------------------------------------
 Type : slice_eff
 -----------------------------------------------------------------------
@@ -164,7 +150,7 @@ Type : left_eff
 	N.B. On garde aussi l'info source des idents au cas ou.
 ----------------------------------------------------------------------*)
 and left_eff =
-    LeftEffVar of (var_eff * Lxm.t)
+    LeftEffVar of (var_info_eff * Lxm.t)
   | LeftEffField of (left_eff * Ident.t * type_eff)
   | LeftEffArray of (left_eff * int * type_eff)
   | LeftEffSlice of (left_eff * slice_eff * type_eff)
@@ -176,7 +162,7 @@ Type : eq_eff
 ----------------------------------------------------------------------*)
 and eq_eff = {
   eqf_left_list : left_eff list ;
-(* il manque la partie droite!!! *)
+(* XXX il manque la partie droite!!! *)
 }
 (*---------------------------------------------------------------------
 Type : const_eff
@@ -208,122 +194,84 @@ Type: val_eff
 ----------------------------------------------------------------------*)
 and val_eff =
     ConstEff of const_eff
-  | VarEff of var_eff
+  | VarEff of var_info_eff
 (*---------------------------------------------------------------------
-Type: var_eff	
+Type: var_info_eff	
 -----------------------------------------------------------------------
 	Info associée à un ident de variable
 ----------------------------------------------------------------------*)
 (* ICI à completer/modifier sans doute *)
-and var_eff = {
-  vf_name : Ident.t ;
-  vf_nature : var_nature ;
-  vf_type : type_eff ;
-  vf_clock : clock_eff	
+and var_info_eff = {
+  var_name_eff   : Ident.t ;
+  var_nature_eff : var_nature ;
+  var_type_eff   : type_eff ;
+  var_clock_eff  : clock_eff	
 }
-and clock_eff = 
+and clock_eff = (* XXX generalize me!*)
     BaseClockEff
-  | VarClockEff of var_eff
-(*---------------------------------------------------------------------
-Type : node_half_eff
------------------------------------------------------------------------
-	Union des déclarations de node et de function.
-	N.B. dans le cas des fonctions, on a un info complétement chéckée
-	(ext_node_eff), par contre pour les nodes on a une info
-	à peine chéckée, d'où le nom node_half_eff.
-	=> item de la table des symboles d'opération
-----------------------------------------------------------------------*)
-and node_half_eff = 
-    ExtNodeRef of ext_node_eff
-  | NodeRef of node_half_eff
-(*---------------------------------------------------------------------
-Type : ext_node_eff
------------------------------------------------------------------------
-	Construit à partir de ext_ node_info
-----------------------------------------------------------------------*)
-and ext_node_eff = {
-  fe_name : Ident.t;
-  fe_in_types  : type_eff list;
-  fe_out_types : type_eff list;
-  fe_has_memory : bool;
-}
-(*---------------------------------------------------------------------
-Type : user_node_half_eff
------------------------------------------------------------------------
-	correspond à un noeud half-checked : on conserve simplement
-	la node_info (on pourra sophistiquer plus tard)
-----------------------------------------------------------------------*)
-and user_node_half_eff = SyntaxTreeCore.node_info srcflagged
-(*---------------------------------------------------------------------
-Type : user_node_eff
------------------------------------------------------------------------
-	correspond à une instance de template (ou, cas limite,
-	de noeud sans param statique). La clé est un couple ident/liste
-	d'arguments statiques effectifs
-	N.B. une horloge formelle est soit None (base)
-	soit l'index d'une entrée (0..nb entrées-1)
-	Les formal-clocks sont crées au cours du type-checking
-	(et pas du clock-checking)
+  | VarClockEff of var_info_eff
+
+
 
-----------------------------------------------------------------------*)
 
-and user_node_eff = {
-  nf_key : node_key ;
-  nf_in_types  : type_eff list ;
-  nf_out_types : type_eff list ;
-  nf_in_formal_clocks  : int option list ;
-  nf_out_formal_clocks : int option list ;
-  nf_asserts : val_eff list;
-  nf_eqs : eq_eff list;
-  nf_has_memory : bool;
+(**********************************************************************************)
+(** [node_info_eff] correspond à une instance de template (ou, cas
+    limite, de noeud sans param statique).
+
+    La clé est un couple ident/liste d'arguments statiques effectifs
+
+    N.B. une horloge formelle est soit None (base) soit l'index d'une
+    entrée (0..nb entrées-1). Les formal-clocks sont crées au cours du
+    type-checking (et pas du clock-checking)
+*)
+and node_info_eff = {
+  node_key_eff : node_key ;
+  inlist_eff   : type_eff list ;
+  outlist_eff  : type_eff list ;
+  clock_inlist_eff  : int option list ;
+  clock_outlist_eff : int option list ;
+  def_eff      : node_def_eff;
+  has_mem_eff  : bool;
+  is_safe_eff  : bool;
 }
-(*---------------------------------------------------------------------
-Type : XXX_key
------------------------------------------------------------------------
-les clés sont des idents complets en général,
-un peu plus compliqué pour les nodes... 
-----------------------------------------------------------------------*)
+and node_def_eff =
+  | ExternEff
+  | AbstractEff
+  | BodyEff of node_body_eff
+
+and node_body_eff = {
+  asserts_eff : val_eff list;
+  eqs_eff     : eq_eff list;
+}
+
+(* key used  for type, constant, and clock tables *)
 and item_key = Ident.long
 and node_key = item_key * static_arg_eff list
-
-(*---------------------------------------------------------------------
-Type : static_arg_eff
------------------------------------------------------------------------
-	associer à un nom de noeud une liste
-	de static_arg_eff permet d'identifier de manière unique une
-	instance de template.
-	N.B. si la liste d'args est vide, c'est un noeud simple.
-----------------------------------------------------------------------*)
 and static_arg_eff =
   | ConstStaticArgEff of (Ident.t * const_eff)
   | TypeStaticArgEff  of (Ident.t * type_eff)
-  | NodeStaticArgEff  of (Ident.t * node_eff)
-(*---------------------------------------------------------------------
-Type : node_eff
------------------------------------------------------------------------
+  | NodeStaticArgEff  of (Ident.t * node_exp_eff)
+
+(** [node_exp_eff]
+
 	Version chéckée des node_exp (expression dénotant une opération).
 	Utilisée dans les expressions call, mais aussi comme argument statique
 	ou comme définition de noeud (alias). 
-	Union entre opérateur prédéfini, user_ext_node_eff et user_node_eff
-----------------------------------------------------------------------*)
-and node_eff = 
+	Union entre opérateur prédéfini, user_ext_node_exp_eff et user_node_exp_eff
+*)
+and node_exp_eff = 
+(* XXX faire sauter ce niveau egalement ???? 
+   ce serait cool. Mais ca necessite d'etre capable de produire un 
+   node_info_eff à chacun des operateurs predefinis.
+
+   Sans la surcharge de + (and friends), ce serait finger in the nose...
+*)
   | PredefEff of by_pos_op 
-  | ExtNodeEff of ext_node_eff
-  | UserNodeEff of user_node_eff
+  | NodeEff of node_info_eff
 
-(*---------------------------------------------------------------------
-Type : node_alias
------------------------------------------------------------------------
-	item utilisé pour ``résoudre'' les idents d'operation dans
-	local_env : dans un local_env, un identificateur utilisé
-	dans une expression "call" peut pointer sur un opérateur
-	parfaitement défini (node_eff), ou sur un noeud half_checké
-----------------------------------------------------------------------*)
-and node_alias =
-    CheckedNode of node_eff
-  | HalfCheckedNode of node_half_eff
 
 
+(****************************************************************************)
 (** Type check_flag
 
    Au cours du check, on conserve le statut des idents :
@@ -339,13 +287,10 @@ type 'a check_flag =
   | Incorrect
 
 
-(****************************************************************************)
-let (profile_of_node_eff : node_eff -> type_eff list * type_eff list) =
+let (profile_of_node_exp_eff : node_exp_eff -> type_eff list * type_eff list) =
   function
-  | PredefEff   _  -> assert false (* finish me? *)
-  | ExtNodeEff  ne -> ne.fe_in_types, ne.fe_out_types
-  | UserNodeEff ne -> ne.nf_in_types, ne.nf_out_types
-      
+    | PredefEff _ -> assert false (* finish me? *)
+    | NodeEff  ne -> (ne.inlist_eff, ne.outlist_eff)
 
 (****************************************************************************)
 (* currently not used *)
@@ -363,7 +308,7 @@ let (profile_of_node_eff : node_eff -> type_eff list * type_eff list) =
 (*   penv_type_table  : (Ident.t, type_eff check_flag)   Hashtbl.t ; *)
 (*   penv_const_table : (Ident.t, const_eff check_flag)  Hashtbl.t ; *)
 (*   penv_oper_table  : (Ident.t, node_half_eff) Hashtbl.t ; *)
-(*   penv_node_table : (node_key, node_eff check_flag) Hashtbl.t *)
+(*   penv_node_table : (node_key, node_exp_eff check_flag) Hashtbl.t *)
 (* } *)
 
 (* the local tables are indexed by Ident.t, because local idents (var,const, flow)
@@ -388,7 +333,7 @@ type local_env = {
 (*   lenv_globals : pack_env ; *)
   lenv_types : (Ident.t, type_eff) Hashtbl.t ;
   lenv_vals  : (Ident.t, val_eff) Hashtbl.t ; 
-  lenv_nodes : (Ident.t, node_eff) Hashtbl.t ; 
+  lenv_nodes : (Ident.t, node_exp_eff) Hashtbl.t ; 
 }
 
 
@@ -397,7 +342,7 @@ let (lookup_type: local_env -> Ident.idref -> Lxm.t -> type_eff) =
     Hashtbl.find env.lenv_types (Ident.name_of_idref id)
 
 let (lookup_node: local_env -> Ident.idref -> static_arg_eff list -> Lxm.t -> 
-      node_eff) = 
+      node_exp_eff) = 
   fun env id sargs lmx -> Hashtbl.find env.lenv_nodes (Ident.name_of_idref id)
     
 let (lookup_const: local_env -> Ident.idref -> Lxm.t -> const_eff) = 
@@ -446,7 +391,7 @@ Effets de bord :
 let const_and_type_id_solver
     (i2c : Ident.idref -> Lxm.t -> const_eff)
     (i2t : Ident.idref -> Lxm.t -> type_eff)
-    (i2o : Ident.idref -> static_arg_eff list -> Lxm.t -> node_eff)
+    (i2o : Ident.idref -> static_arg_eff list -> Lxm.t -> node_exp_eff)
     = 
   {
     id2const = i2c ;
@@ -490,7 +435,7 @@ Effets de bord :
 ----------------------------------------------------------------------*)
 let type_of_left_eff l =
 match l with
-    LeftEffVar (v,lxm) -> v.vf_type 
+    LeftEffVar (v,lxm) -> v.var_type_eff
   | LeftEffField (l, n, te) -> te
   | LeftEffArray (l, i, te) -> te
   | LeftEffSlice (l, s, te) -> te
@@ -566,10 +511,8 @@ let rec string_of_node_key (nkey: node_key) = (
 	  match opeff with
 	    | PredefEff posop -> 
 		sprintf "operator %s" (SyntaxTreeDump.op2string posop)
-	    | ExtNodeEff feff -> 
-		sprintf "extern node %s" (Ident.to_string feff.fe_name)
-	    | UserNodeEff neff -> 
-		sprintf "node %s" (string_of_node_key neff.nf_key)
+	    | NodeEff neff -> 
+		sprintf "node %s" (string_of_node_key neff.node_key_eff)
 	) 
   in
     match nkey with
@@ -579,35 +522,30 @@ let rec string_of_node_key (nkey: node_key) = (
 	    sprintf "%s<<%s>>" (Ident.string_of_long ik) (String.concat ", " astrings)
 )
 
-let (string_of_user_node_eff: user_node_eff -> string) =
-  fun neff -> 
-    (string_of_node_key neff.nf_key) ^ 
-      "(" ^
-      (String.concat ", " (List.map string_of_type_eff neff.nf_in_types)) ^
-      ") returns (" ^
-      (String.concat ", " (List.map string_of_type_eff neff.nf_out_types)) ^
-      ") on clock XXX\n"
 
-let (string_of_ext_node_eff: ext_node_eff -> string) =
+
+let (string_of_node_info_eff: node_info_eff -> string) =
   fun neff -> 
-    "extern " ^ (Ident.to_string neff.fe_name) ^ 
+    (string_of_node_key neff.node_key_eff) ^ 
       "(" ^
-      (String.concat ", " (List.map string_of_type_eff neff.fe_in_types)) ^
+      (String.concat ", " (List.map string_of_type_eff neff.inlist_eff)) ^
       ") returns (" ^
-      (String.concat ", " (List.map string_of_type_eff neff.fe_out_types)) ^
-      ")\n"
+      (String.concat ", " (List.map string_of_type_eff neff.outlist_eff)) ^
+      ") on clock XXX" ^
+(*       (if neff.body_eff = None then "<abstract or extern>" else "< ... a body ...>" ) ^ *)
+      "\n"
+
 
-let (string_of_node_eff: node_eff -> string) =
+let (string_of_node_exp_eff: node_exp_eff -> string) =
   fun neff -> 
     match neff with
-      | PredefEff pn -> SyntaxTreeDump.op2string  pn
-      | ExtNodeEff eneff -> string_of_ext_node_eff eneff 
-      | UserNodeEff uneff -> string_of_user_node_eff uneff
+      | PredefEff pn -> SyntaxTreeDump.op2string pn
+      | NodeEff neff -> string_of_node_info_eff neff
 
 let string_of_clock (ck : clock_eff) = (
   match ck with
       BaseClockEff -> "<base>"
-   |  VarClockEff veff -> (Ident.to_string veff.vf_name)
+   |  VarClockEff veff -> (Ident.to_string veff.var_name_eff)
 )
 
 
diff --git a/src/evalNode.ml b/src/evalNode.ml
index 5117278ff4e4eeafa23a533f890978fb1fe3dcb5..001d8dd74baa36f29849a74ce9f01817a47a8708 100644
--- a/src/evalNode.ml
+++ b/src/evalNode.ml
@@ -1,4 +1,4 @@
-(** Time-stamp: <modified the 10/03/2008 (at 17:39) by Erwan Jahier> *)
+(** Time-stamp: <modified the 11/03/2008 (at 15:09) by Erwan Jahier> *)
 
 
 open Lxm
@@ -24,7 +24,7 @@ let (get_static_params_from_idref : SymbolTab.t -> Lxm.t -> Ident.idref  ->
     
 
 let rec (f : CompiledData.id_solver -> SymbolTab.t -> 
-	  SyntaxTreeCore.node_exp srcflagged -> CompiledData.node_eff) =
+	  SyntaxTreeCore.node_exp srcflagged -> CompiledData.node_exp_eff) =
   fun id_solver symbols { src = lxm; it=(idref, static_args) } ->
     let static_params = get_static_params_from_idref symbols lxm idref in
     let static_args_eff = 
diff --git a/src/expandPack.ml b/src/expandPack.ml
index 2d137e21a98272d7b11d4e88f0bbc3b74ae905e4..05d52074d3f83588090eb07e6a5093b6b4f48709 100644
--- a/src/expandPack.ml
+++ b/src/expandPack.ml
@@ -1,4 +1,4 @@
-(** Time-stamp: <modified the 10/03/2008 (at 17:35) by Erwan Jahier> *)
+(** Time-stamp: <modified the 11/03/2008 (at 15:48) by Erwan Jahier> *)
 
 open Lxm
 open SyntaxTree
@@ -89,8 +89,7 @@ let (doit:
 		      name = s;
 		      static_params = None;
 		      vars = Some (ParserUtils.build_node_var inl outl None);
-		      alias = Some ne;
-		      body = None;
+		      def = Alias ne;
 		      has_mem = has_memory;
 		      is_safe = true;
 		    } 
diff --git a/src/lazyCompiler.ml b/src/lazyCompiler.ml
index efaf5c240a6002832c39f636371152b4984fa8de..e19b2c891883ac05ff8c27c917c36f565b11e14a 100644
--- a/src/lazyCompiler.ml
+++ b/src/lazyCompiler.ml
@@ -1,4 +1,4 @@
-(** Time-stamp: <modified the 11/03/2008 (at 11:04) by Erwan Jahier> *)
+(** Time-stamp: <modified the 11/03/2008 (at 16:34) by Erwan Jahier> *)
 
 
 open Lxm
@@ -35,13 +35,13 @@ let recursion_error (lxm : Lxm.t) (stack : string list) =
 type t = {
   src_tab : SyntaxTab.t;
   (* table des defs *)
-  types  : (item_key, CompiledData.type_eff  check_flag) Hashtbl.t;
-  consts : (item_key, CompiledData.const_eff check_flag) Hashtbl.t;
-  nodes  : (node_key, CompiledData.node_eff  check_flag) Hashtbl.t;
+  types  : (item_key, CompiledData.type_eff     check_flag) Hashtbl.t;
+  consts : (item_key, CompiledData.const_eff    check_flag) Hashtbl.t;
+  nodes  : (node_key, CompiledData.node_exp_eff check_flag) Hashtbl.t;
   (* table des prov *)
-  prov_types  : (item_key, CompiledData.type_eff  check_flag) Hashtbl.t;
-  prov_consts : (item_key, CompiledData.const_eff check_flag) Hashtbl.t;
-  prov_nodes  : (node_key, CompiledData.node_eff  check_flag) Hashtbl.t
+  prov_types  : (item_key, CompiledData.type_eff     check_flag) Hashtbl.t;
+  prov_consts : (item_key, CompiledData.const_eff    check_flag) Hashtbl.t;
+  prov_nodes  : (node_key, CompiledData.node_exp_eff check_flag) Hashtbl.t
 }
 
 (******************************************************************************)
@@ -189,9 +189,9 @@ let (lookup_const_eff:(item_key, CompiledData.const_eff check_flag) Hashtbl.t ->
       Ident.long -> Lxm.t -> CompiledData.const_eff) = 
   lookup_x_eff "const ref " (fun k -> k)
 
-let (lookup_node_eff:
-       (CompiledData.node_key, CompiledData.node_eff check_flag) Hashtbl.t -> 
-      CompiledData.node_key -> Lxm.t -> CompiledData.node_eff) = 
+let (lookup_node_exp_eff:
+       (CompiledData.node_key, CompiledData.node_exp_eff check_flag) Hashtbl.t -> 
+      CompiledData.node_key -> Lxm.t -> CompiledData.node_exp_eff) = 
   lookup_x_eff "node ref "  (fun k -> fst k)
 
 
@@ -457,24 +457,39 @@ and (const_check_do : t -> Ident.long -> Lxm.t -> SymbolTab.t -> Ident.pack_name
 
 and (node_check_interface_do: t -> CompiledData.node_key -> Lxm.t -> 
 	  SymbolTab.t -> Ident.pack_name -> SyntaxTreeCore.node_info srcflagged -> 
-	  CompiledData.node_eff) =
+	  CompiledData.node_exp_eff) =
   fun this nk lxm symbols pack_name node_def ->
-    let body_node_eff = node_check this nk lxm in
-    let prov_node_eff = node_check_do this nk lxm symbols pack_name node_def in
-      if prov_node_eff = body_node_eff then
-	prov_node_eff
+    let body_node_exp_eff = node_check this nk lxm in
+    let prov_node_exp_eff = node_check_do this nk lxm symbols pack_name node_def in
+      if 
+	match prov_node_exp_eff, body_node_exp_eff with
+	  | NodeEff prov_node_exp_eff, NodeEff body_node_exp_eff -> (
+	      prov_node_exp_eff.node_key_eff      = body_node_exp_eff.node_key_eff      &&
+		prov_node_exp_eff.inlist_eff        = body_node_exp_eff.inlist_eff        &&
+		prov_node_exp_eff.outlist_eff       = body_node_exp_eff.outlist_eff       &&
+		prov_node_exp_eff.clock_inlist_eff  = body_node_exp_eff.clock_inlist_eff  &&
+		prov_node_exp_eff.clock_outlist_eff = body_node_exp_eff.clock_outlist_eff &&
+		prov_node_exp_eff.has_mem_eff       = body_node_exp_eff.has_mem_eff       &&
+		prov_node_exp_eff.is_safe_eff       = body_node_exp_eff.is_safe_eff       &&
+		match prov_node_exp_eff.def_eff, body_node_exp_eff.def_eff with
+		  | (AbstractEff,_) -> true
+		  | (_,_) -> prov_node_exp_eff.def_eff = body_node_exp_eff.def_eff
+	    )
+	  | _,_ -> assert false 
+      then
+	prov_node_exp_eff
       else
-	raise(Compile_error (
-		node_def.src,
-		("provided node \n\t" ^
-		   (string_of_node_eff prov_node_eff) ^
-		   "\n is not compatible with its implementation \n\t" ^
-		   (string_of_node_eff body_node_eff))))
+	raise(
+	  Compile_error (
+	    node_def.src,
+	    ("provided node \n\t" ^ (string_of_node_exp_eff prov_node_exp_eff) ^
+	       "\n is not compatible with its implementation \n\t" ^
+	       (string_of_node_exp_eff body_node_exp_eff))))
 
 
 and (node_check_do: t -> CompiledData.node_key -> Lxm.t -> SymbolTab.t -> 
       Ident.pack_name -> SyntaxTreeCore.node_info srcflagged -> 
-      CompiledData.node_eff) =
+      CompiledData.node_exp_eff) =
   fun this nk lxm symbols pack_name node_def ->
     (*
       - verifier les params statiques ?
@@ -504,17 +519,44 @@ and (node_check_do: t -> CompiledData.node_key -> Lxm.t -> SymbolTab.t ->
 	   with Not_found -> solve_node_idref  this symbols pack_name id sargs lxm);
     }
     in
-      match node_def.it.body, node_def.it.alias with
-	| None, None -> (
-	    (* bodyless node that are not alias are abstract or extern;
-	       they may have a profile 
-
-	       XXX do we compile in the same way ?
-	       XXX add a flag or something to distinguish extern and abstract nodes?
-	    *)
+    let make_node_eff node_def_eff =
+      (* building abstract and normal (i.e., with body) nodes *)
+      match node_def.it.vars with
+	| None -> assert false (* a node with a body should have a profile *)
+	| Some vars ->
+	    let type_args id =	      
+	      let vi = Hashtbl.find vars.vartable id in
+		EvalType.f node_id_solver vi.it.var_type
+	    in
+	    let (type_eq : eq_info srcflagged -> eq_eff) =
+	      fun eq_info -> 
+		finish_me "with with body compilation"; assert false
+	    in
+	      NodeEff {
+		node_key_eff  = nk ;
+		inlist_eff    = List.map type_args vars.inlist ;
+		outlist_eff   = List.map type_args vars.outlist;
+		clock_inlist_eff  = [];(* XXX finish me! *)
+		clock_outlist_eff = [];(* XXX finish me! *)
+		def_eff = node_def_eff;
+		has_mem_eff  = node_def.it.has_mem;
+		is_safe_eff  = node_def.it.is_safe;
+	      }
+    in
+      match node_def.it.def with
+	| Abstract -> 
+	    make_node_eff AbstractEff
+	| Body nb ->
+	    make_node_eff ( 
+	      BodyEff {
+		asserts_eff = []; (* XXX finish me! *)
+		eqs_eff = []; (* List.map type_eq  nb.eqs;  *)
+	      }
+	    )
+	| Extern -> (
 	    match node_def.it.vars with
 	      | None -> 
-		  finish_me " abstract or extern node without profile"; 
+		  finish_me "extern node without profile"; 
 		  assert false
 	      | Some vars -> 
 		  let vi_il, vi_ol = 
@@ -526,42 +568,32 @@ and (node_check_do: t -> CompiledData.node_key -> Lxm.t -> SymbolTab.t ->
 		    let vi = Hashtbl.find vars.vartable id in
 		      EvalType.f node_id_solver vi.it.var_type
 		  in
-(* 		    make_user_node_eff  *)
-(* 		      (List.map aux vi_il)  *)
-(* 		      (List.map aux vi_ol)  *)
-(* 		      node_def.it.has_mem; *)
-
-
-(* 	      ExtNodeEff { *)
-(* 		fe_name = en.eni_name; *)
-(* 		fe_in_types =(List.map type_args en.eni_inputs); *)
-(* 		fe_out_types = (List.map type_args en.eni_outputs); *)
-(* 		fe_has_memory = en.eni_has_mem; *)
-(* 	      } *)
-
-		    UserNodeEff {
-		      nf_key = nk;
-		      nf_in_types = List.map type_args vars.inlist;
-		      nf_out_types = List.map type_args vars.outlist;
-		      nf_in_formal_clocks  = []; (* XXX finish me! *)
-		      nf_out_formal_clocks = []; (* XXX finish me! *)
-		      nf_asserts = []; (* XXX finish me! *)
-		      nf_eqs = []; (* List.map type_eq  nb.eqs;  *)
-		      nf_has_memory = node_def.it.has_mem;
+		    NodeEff {
+		      node_key_eff  = nk ;
+		      inlist_eff    = List.map type_args vars.inlist ;
+		      outlist_eff   = List.map type_args vars.outlist;
+		      clock_inlist_eff  = [];(* XXX finish me! *)
+		      clock_outlist_eff = [];(* XXX finish me! *)
+		      def_eff     = ExternEff;
+		      has_mem_eff  = node_def.it.has_mem;
+		      is_safe_eff  = node_def.it.is_safe;
 		    }
 	  )
-	| None, Some node_alias -> (
+
+
+
+	| Alias node_alias -> (
+	    (* just check that the declared profile (if any) matches with the alias *)
 	    let res = EvalNode.f node_id_solver symbols node_alias in
 	      match node_def.it.vars with
 		| None -> res
-		| Some vars -> 
-		    (* check that the declared profile matched with the result *)
+		| Some vars ->
 		    let vi_il, vi_ol = 
 		      List.map (fun id -> Hashtbl.find vars.vartable id) vars.inlist,
 		      List.map (fun id -> Hashtbl.find vars.vartable id) vars.outlist
 		    in
 		    let aux vi = EvalType.f node_id_solver vi.it.var_type in
-		    let (il,ol) = CompiledData.profile_of_node_eff res in
+		    let (il,ol) = CompiledData.profile_of_node_exp_eff res in
 		      if 
 			List.map aux vi_il <> il 
 			|| List.map aux vi_ol <> ol 
@@ -571,37 +603,12 @@ and (node_check_do: t -> CompiledData.node_key -> Lxm.t -> SymbolTab.t ->
 			  (* that error msg could be more precise *)
 		      else
 			res
-	  )
-	| Some _, Some _ -> assert false 
-	    (* we cannot have a body and an alias...*) 
-	    
-	| Some nb, None -> (
-	    match node_def.it.vars with
-	      | None -> assert false (* a node with a body have a profile *)
-	      | Some vars ->
-		  let type_args id =	      
-		    let vi = Hashtbl.find vars.vartable id in
-		      EvalType.f node_id_solver vi.it.var_type
-		  in
-		  let (type_eq : eq_info srcflagged -> eq_eff) =
-		    fun eq_info -> 
-		     finish_me "with with body compilation"; assert false
-		  in
-		    UserNodeEff {
-		      nf_key = nk;
-		      nf_in_types = List.map type_args vars.inlist;
-		      nf_out_types = List.map type_args vars.outlist;
-		      nf_in_formal_clocks  = []; (* XXX finish me! *)
-		      nf_out_formal_clocks = []; (* XXX finish me! *)
-		      nf_asserts = []; (* XXX finish me! *)
-		      nf_eqs = []; (* List.map type_eq  nb.eqs;  *)
-		      nf_has_memory = node_def.it.has_mem;
-		    }
-	  )
+	  ) 
+
 		
 (** builds and node_key and calls [node_check] *)
 and (solve_node_idref : t -> SymbolTab.t -> Ident.pack_name -> Ident.idref ->
-      static_arg_eff list -> Lxm.t -> CompiledData.node_eff) =
+      static_arg_eff list -> Lxm.t -> CompiledData.node_exp_eff) =
   fun this symbols currpack idr sargs lxm ->
     solve_x_idref
       node_check_interface node_check SymbolTab.find_node "node"
@@ -614,18 +621,18 @@ and (solve_node_idref : t -> SymbolTab.t -> Ident.pack_name -> Ident.idref ->
       )
       this symbols currpack idr sargs lxm
 
-and (node_check: t -> CompiledData.node_key -> Lxm.t -> CompiledData.node_eff) =
+and (node_check: t -> CompiledData.node_key -> Lxm.t -> CompiledData.node_exp_eff) =
   fun this nk ->
-    x_check this.nodes SymbolTab.find_node node_check_do lookup_node_eff
+    x_check this.nodes SymbolTab.find_node node_check_do lookup_node_exp_eff
       (fun nk -> Ident.pack_of_long (fst nk))
       (fun nk -> Ident.of_long (fst nk))
       this nk
 
 and (node_check_interface:
-       t -> CompiledData.node_key -> Lxm.t -> CompiledData.node_eff) =
+       t -> CompiledData.node_key -> Lxm.t -> CompiledData.node_exp_eff) =
   fun this nk ->
     x_check_interface this.prov_nodes SymbolTab.find_node node_check
-      node_check_interface_do lookup_node_eff
+      node_check_interface_do lookup_node_exp_eff
       (fun nk -> Ident.pack_of_long (fst nk))
       (fun nk -> Ident.of_long (fst nk)) this nk
       
@@ -679,7 +686,7 @@ let test_nodes pack_name this id ni_f =
 	flush stdout
     | None ->
 	test_item this "node" node_check_interface CompiledData.string_of_node_key
-	  string_of_node_eff (fun id -> (Ident.make_long pack_name id, [])) id ni_f
+	  string_of_node_exp_eff (fun id -> (Ident.make_long pack_name id, [])) id ni_f
 
 
 let test (this: t) = (
diff --git a/src/lazyCompiler.mli b/src/lazyCompiler.mli
index e3a3e370067bdfce287f51c5e8f1a0c0dbc09a61..0b1cb90f00f498f05e63e75fd11c69654174569d 100644
--- a/src/lazyCompiler.mli
+++ b/src/lazyCompiler.mli
@@ -1,4 +1,4 @@
-(** Time-stamp: <modified the 14/02/2008 (at 17:08) by Erwan Jahier> *)
+(** Time-stamp: <modified the 11/03/2008 (at 16:28) by Erwan Jahier> *)
 
 (** nb: compiling = type checking + constant evaluation *)
 
diff --git a/src/parser.mly b/src/parser.mly
index 1c196e4f813050ab8cd7ccbd3ce86e81b3321cb1..dafc587602b5b18fe20cf12dd4b85945d1914f3c 100644
--- a/src/parser.mly
+++ b/src/parser.mly
@@ -224,8 +224,7 @@ let (treat_node_decl : bool -> Lxm.t -> static_param srcflagged list ->
       name = nstr;
       static_params = Some statics;
       vars    = Some vars;
-      alias   = None;
-      body    = Some  { asserts = asserts ; eqs  = eqs };
+      def     = Body { asserts = asserts ; eqs  = eqs };
       has_mem = has_memory;
       is_safe = true;
     }
@@ -249,8 +248,7 @@ let (treat_node_alias : bool -> Lxm.t -> static_param srcflagged list ->
       name = nstr;
       static_params = Some statics;
       vars    = vars;
-      alias   = Some value;
-      body    = None;
+      def     = Alias value;
       has_mem = has_memory;
       is_safe = true;
     }
@@ -274,8 +272,7 @@ let treat_abstract_node_do (* cf the profile of [treat_abstract_node] *)
     name = Lxm.id lxm;
     static_params = None;
     vars    = Some vars;
-    alias   = None;
-    body    = None;
+    def     = Abstract;
     has_mem = has_memory;
     is_safe = true;
   }
diff --git a/src/syntaxTreeCore.ml b/src/syntaxTreeCore.ml
index 0af9947e1589b05327ef372407dbea8e9f1ae9b1..6f88b5ccab610bd65bcc9ddcc8a555d37a7e1daa 100644
--- a/src/syntaxTreeCore.ml
+++ b/src/syntaxTreeCore.ml
@@ -1,4 +1,4 @@
-(** Time-stamp: <modified the 11/03/2008 (at 11:41) by Erwan Jahier> *)
+(** Time-stamp: <modified the 11/03/2008 (at 15:44) by Erwan Jahier> *)
 
 
 (** (Raw) Abstract syntax tree of source programs. *)
@@ -27,8 +27,7 @@ and node_info = {
   name    : Ident.t;
   static_params : static_param srcflagged list option;
   vars    : node_vars option;  (* aliased node may have no i/o decl *)
-  alias   : node_exp srcflagged option;
-  body    : node_body option;
+  def     : node_def;
   has_mem : bool;
   is_safe : bool;
 }
@@ -57,6 +56,12 @@ and var_nature =
   | VarOutput
   | VarLocal
 
+and node_def = 
+  | Extern
+  | Abstract
+  | Body of node_body
+  | Alias of node_exp srcflagged
+
 and node_body = {
   asserts : (val_exp srcflagged) list;
   eqs     : (eq_info srcflagged) list;
@@ -168,13 +173,13 @@ and by_name_op =
 
 and node_exp = 
       (Ident.idref * (static_arg srcflagged list))
-      (*
-	Params statiques effectifs :
-	- val_exp (pour les constantes)
-	- type_exp (pour les types)
-	- node_exp (pour les node)
-	- ident : a résoudre, peut etre const, type ou node 
-      *)
+	
+(** Params statiques effectifs :
+    - val_exp (pour les constantes)
+    - type_exp (pour les types)
+    - node_exp (pour les node)
+    - ident : a résoudre, peut etre const, type ou node 
+*)
 and static_arg =
   | StaticArgIdent of Ident.idref
   | StaticArgConst of val_exp
diff --git a/src/syntaxTreeDump.ml b/src/syntaxTreeDump.ml
index f24e3d2273ef087cfdb66d6dc046d3d0338b2576..b5c20780ca138109fe4cf9381f3a229a1cbf0011 100644
--- a/src/syntaxTreeDump.ml
+++ b/src/syntaxTreeDump.ml
@@ -1,4 +1,4 @@
-(** Time-stamp: <modified the 10/03/2008 (at 17:06) by Erwan Jahier> *)
+(** Time-stamp: <modified the 11/03/2008 (at 15:48) by Erwan Jahier> *)
 
 
 open Lxm
@@ -271,13 +271,12 @@ and dump_node (os: Format.formatter) (x: node_info srcflagged) = (
 		    fprintf os "@[<b 3>   %a;@]@\n" dump_var_decl_list loclst;
     );
         
-    (match ninfo.alias with
-      | None -> ()
-      | Some {it = nexp; src = lxm} -> fprintf os " = @,%a;@\n" dump_node_exp nexp
-    );
-    (match ninfo.body with
-      | None -> ()
-      | Some body -> dump_node_body os body
+    (match ninfo.def with
+       | Extern    -> fprintf os "extern"
+       | Abstract  -> fprintf os "abstract" 
+       | Body body -> dump_node_body os body
+       | Alias {it = nexp; src = lxm} -> fprintf os " = @,%a;@\n" dump_node_exp nexp
+
     );
     if ninfo.has_mem then () else ();
     if ninfo.is_safe then () else ();