diff --git a/src/grew_ast.ml b/src/grew_ast.ml
index c4c35e9716707a753d84a2e5109b56f8ddbc5779..8281025ae6ce981ed7cec91ae44c7ce692718acd 100644
--- a/src/grew_ast.ml
+++ b/src/grew_ast.ml
@@ -266,16 +266,21 @@ module Ast = struct
     | Modul of modul
     | Includ of (string * Loc.t)
 
+  type domain = {
+      feature_domain: Feature_domain.feature_spec list;
+      label_domain: (string * string list) list;
+    }
+
+  let empty_domain = { feature_domain=[]; label_domain=[] }
+
   type grs_with_include = {
-    domain_wi: Feature_domain.feature_spec list;
-    labels_wi: (string * string list) list;    (* the list of global edge labels *)
+    domain_wi: domain;
     modules_wi: module_or_include list;
     sequences_wi: sequence list;
   }
 
   type grs = {
-    domain: Feature_domain.feature_spec list;
-    labels: (string * string list) list;
+    domain: domain;
     modules: modul list;
     sequences: sequence list;
   }
@@ -286,6 +291,6 @@ module Ast = struct
     edges: edge list;
   }
 
-  let empty_grs = { domain = []; labels = []; modules = []; sequences= [] }
+  let empty_grs = { domain = empty_domain; modules = []; sequences= [] }
 
 end (* module Ast *)
diff --git a/src/grew_ast.mli b/src/grew_ast.mli
index 60729e28337cd0553b898a27b6ce41ab692b9065..7afcdc7108f20bed0f2adaa3c87155b2c6acb2fd 100644
--- a/src/grew_ast.mli
+++ b/src/grew_ast.mli
@@ -181,17 +181,20 @@ module Ast : sig
     | Modul of modul
     | Includ of (string * Loc.t)
 
+  type domain = {
+      feature_domain: Feature_domain.feature_spec list;
+      label_domain: (string * string list) list;
+    }
+
   type grs_with_include = {
-      domain_wi: Feature_domain.feature_spec list;
-      labels_wi: (string * string list) list;    (* the list of global edge labels *)
+      domain_wi: domain;
       modules_wi: module_or_include list;
       sequences_wi: sequence list;
     }
 
   (* a GRS: graph rewriting system *)
   type grs = {
-      domain: Feature_domain.feature_spec list;
-      labels: (string * string list) list;
+      domain: domain;
       modules: modul list;
       sequences: sequence list;
     }
diff --git a/src/grew_grs.ml b/src/grew_grs.ml
index 39000bbef71411b33b89df4f89eb7f251b1ee7fe..000fb7fc3803df2a9f592504838fe48982f5bcd4 100644
--- a/src/grew_grs.ml
+++ b/src/grew_grs.ml
@@ -250,11 +250,14 @@ module Grs = struct
       | s::tail -> loop (s.Sequence.name :: already_defined) tail in
     loop [] t.sequences
 
+  let domain_build ast_domain =
+    Domain.build
+      (Label_domain.build ast_domain.Ast.label_domain)
+      (Feature_domain.build ast_domain.Ast.feature_domain)
+
   let build filename =
     let ast = Loader.grs filename in
-    let domain = Domain.build 
-      (Label_domain.build ast.Ast.labels) 
-      (Feature_domain.build ast.Ast.domain) in
+    let domain = domain_build ast.Ast.domain in
     let modules = List.map (Modul.build domain) ast.Ast.modules in
     let grs = {domain; sequences = List.map (Sequence.build modules) ast.Ast.sequences; modules; ast; filename} in
     check grs;
diff --git a/src/grew_grs.mli b/src/grew_grs.mli
index f9743bfb149095efc06ca16121d07882650b510a..55c4dffdedfcdcdf7d4749af513aeb6de2a72d95 100644
--- a/src/grew_grs.mli
+++ b/src/grew_grs.mli
@@ -92,6 +92,8 @@ module Grs: sig
 
   val sequence_names: t -> string list
 
+  val domain_build: Ast.domain -> Domain.t
+
   (** [build filename] returns the GRS defined in the file [filename] *)
   val build: string -> t
 
diff --git a/src/grew_html.ml b/src/grew_html.ml
index 5037adf23ef1f192c4f8c92007399badd1475ec3..5c65eebebecd0642cd04ffb9d0043a60393daf84 100644
--- a/src/grew_html.ml
+++ b/src/grew_html.ml
@@ -405,12 +405,12 @@ module Html_doc = struct
         | Feature_domain.Closed (feat_name,values) -> wnl "<b>%s</b> : %s<br/>" feat_name (String.concat " | " values)
         | Feature_domain.Open feat_name -> wnl "    <b>%s</b> : *<br/>" feat_name
         | Feature_domain.Num feat_name -> wnl "    <b>%s</b> : #<br/>" feat_name
-      ) ast.Ast.domain;
+      ) ast.Ast.feature_domain;
     wnl "  </code>";
 
     wnl "  <h6>Labels</h6>";
     wnl "  <code class=\"code\">";
-    (match ast.Ast.labels with
+    (match ast.Ast.label_domain with
       | [] -> wnl "No labels defined!"
       | (l,c)::t -> w "<font color=\"%s\">%s</font>" (of_opt_color c) l;
         List.iter
@@ -489,7 +489,7 @@ module Html_doc = struct
     let domain = Filename.concat output_dir "domain.html" in
 
     let domain_out_ch = open_out domain in
-    output_string domain_out_ch (domain_text ~corpus ast);
+    output_string domain_out_ch (domain_text ~corpus ast.Ast.domain);
     close_out domain_out_ch;
 
     (** Modules + rules **)
diff --git a/src/grew_loader.ml b/src/grew_loader.ml
index 07ed37d3f8361bffb0a40923ce8b96250056214d..ae97e1a9b7c0ed70f3ecdc31bb7667a966abe241 100644
--- a/src/grew_loader.ml
+++ b/src/grew_loader.ml
@@ -58,6 +58,17 @@ module Loader = struct
       module_list
     with Sys_error msg-> raise (Error (msg, None))
 
+  (* ------------------------------------------------------------------------------------------*)
+  let domain file =
+    try
+      Global.init file;
+      let in_ch = open_in file in
+      let lexbuf = Lexing.from_channel in_ch in
+      let gr = parse_handle file (Grew_parser.domain Grew_lexer.global) lexbuf in
+      close_in in_ch;
+      gr
+    with Sys_error msg-> raise (Error (msg, None))
+
   (* ------------------------------------------------------------------------------------------*)
   (**
      [parse_string file] where [file] is a file following the grew syntax
@@ -80,7 +91,6 @@ module Loader = struct
         @ (flatten_modules current_file tail) in
     {
       Ast.domain = grs_with_includes.Ast.domain_wi;
-      Ast.labels = grs_with_includes.Ast.labels_wi;
       Ast.modules = flatten_modules main_file grs_with_includes.Ast.modules_wi;
       Ast.sequences = grs_with_includes.Ast.sequences_wi;
     }
diff --git a/src/grew_loader.mli b/src/grew_loader.mli
index 3975946da32b01526bba64324db5fbe98374c0c9..5d12c2b4611b0d04ecf43a6d8308a32bbe266007 100644
--- a/src/grew_loader.mli
+++ b/src/grew_loader.mli
@@ -17,6 +17,8 @@ module Loader: sig
   (* message and location *)
   exception Error of (string * Loc.t option)
 
+  val domain: string -> Ast.domain
+
   val grs: string -> Ast.grs
 
   val gr: string -> Ast.gr
diff --git a/src/grew_parser.mly b/src/grew_parser.mly
index 59a7b2a1eff6eb06a59d0dee944052ffb9fc6a8d..8dff7820b71fd72c971858d2018361ed3f56b8bd 100644
--- a/src/grew_parser.mly
+++ b/src/grew_parser.mly
@@ -110,6 +110,7 @@ let localize t = (t,get_loc ())
 %start <Grew_ast.Ast.gr> gr
 %start <Grew_ast.Ast.module_or_include list> included
 %start <Grew_ast.Ast.pattern> pattern
+%start <Grew_ast.Ast.domain> domain
 
 %left SEMIC
 %left PLUS
@@ -192,24 +193,33 @@ gr_item:
         | n1_loc=simple_id_with_loc label=delimited(LTR_EDGE_LEFT,label_ident,LTR_EDGE_RIGHT) n2=simple_id
             { Graph_edge ({Ast.edge_id = None; src=fst n1_loc; edge_label_cst=([label],false); tar=n2}, snd n1_loc) }
 
+/*=============================================================================================*/
+/*  DOMAIN DEFINITION                                                                          */
+/*=============================================================================================*/
+domain:
+        | f=features_group g=labels
+            {
+              {  Ast.feature_domain = f;
+                 label_domain = g;
+              }
+            }
+
 /*=============================================================================================*/
 /*  GREW GRAPH REWRITING SYSTEM                                                                */
 /*=============================================================================================*/
 grs_with_include:
-        | f=features_group g=labels m=module_or_include_list s=option(sequences) EOF
+        | d=domain m=module_or_include_list s=option(sequences) EOF
             {
-             { Ast.domain_wi=f;
-               labels_wi=g;
+             { Ast.domain_wi=d;
                modules_wi=m;
                sequences_wi=match s with Some seq -> seq | None -> [];
              }
            }
 
 grs:
-        | f=features_group g=labels m=modules s=option(sequences) EOF
+        | d=domain m=modules s=option(sequences) EOF
             {
-             { Ast.domain=f;
-               labels=g;
+             { Ast.domain=d;
                modules=m;
                sequences=match s with Some seq -> seq | None -> [];
              }
diff --git a/src/libgrew.ml b/src/libgrew.ml
index afdacb98f5a39181ee1a2ea7024c963428dc52f2..caa04111871b7bbfd672142e02fecb8886f93aa6 100644
--- a/src/libgrew.ml
+++ b/src/libgrew.ml
@@ -20,6 +20,7 @@ ENDIF
 open Grew_fs
 open Grew_base
 open Grew_types
+open Grew_ast
 open Grew_graph
 open Grew_rule
 open Grew_grs
@@ -57,114 +58,76 @@ let handle ?(name="") ?(file="No file defined") fct () =
     | exc -> raise (Bug (sprintf "[Libgrew.%s] UNCATCHED EXCEPTION: %s" name (Printexc.to_string exc), None))
 
 
-
 (* -------------------------------------------------------------------------------- *)
-(** {2 Graph Rewriting System} *)
-type grs = Grs.t
-
-let empty_grs = Grs.empty
-
-let load_grs file =
-  handle ~name:"load_grs" ~file
-    (fun () ->
-      if not (Sys.file_exists file)
-      then raise (File_dont_exists file)
-      else Grs.build file
-    ) ()
-
-let get_sequence_names grs =
-  handle ~name:"get_sequence_names"
-    (fun () ->
-      Grs.sequence_names grs
-    ) ()
-
-IFDEF DEP2PICT THEN
-let build_html_doc ?(corpus=false) dir grs =
-  handle ~name:"build_doc [with Dep2pict]"
-    (fun () ->
-      Html_doc.build ~corpus ~dep:true dir grs;
-
-      (* draw pattern graphs for all rules and all filters *)
-      let fct module_ rule_ =
-        let dep_code = Rule.to_dep (Grs.get_domain grs) rule_ in
-        let dep_png_file = sprintf "%s/%s_%s-patt.png" dir module_ (Rule.get_name rule_) in
-        let d2p = Dep2pict.from_dep ~dep:dep_code in
-        Dep2pict.save_png ~filename:dep_png_file d2p in
-      Grs.rule_iter fct grs;
-      Grs.filter_iter fct grs
-    ) ()
-ELSE
-let build_html_doc ?(corpus=false) dir grs =
-  handle ~name:"build_doc [without Dep2pict]" (fun () -> Html_doc.build ~corpus ~dep:false dir grs) ()
-END
+(** {2 Domain} *)
+type domain = Domain.t
 
-let feature_names grs =  handle ~name:"feature_names" (fun () ->  Domain.feature_names (Grs.get_domain grs)) ()
+let load_domain filename =
+  let ast = Loader.domain filename in
+  Grs.domain_build ast
 
 (* -------------------------------------------------------------------------------- *)
 (** {2 Graph} *)
 type graph = G_graph.t
 
-let load_gr grs file =
+let load_gr domain file =
   if not (Sys.file_exists file)
   then raise (File_dont_exists file)
   else
     handle ~name:"load_gr" ~file
       (fun () ->
         let gr_ast = Loader.gr file in
-        G_graph.build (Grs.get_domain grs) gr_ast
+        G_graph.build domain gr_ast
       ) ()
 
-let load_conll grs file =
+let load_conll domain file =
   handle ~name:"load_conll" ~file
     (fun () ->
-      G_graph.of_conll ~loc:(Loc.file file) (Grs.get_domain grs) (Conll.load file)
+      G_graph.of_conll ~loc:(Loc.file file) domain (Conll.load file)
     ) ()
 
-let load_brown grs file =
+let load_brown domain file =
   handle ~name:"load_brown"
     (fun () ->
       let brown = File.load file in
-      G_graph.of_brown (Grs.get_domain grs) brown
+      G_graph.of_brown domain brown
     ) ()
 
-let load_graph grs file =
+let load_graph domain file =
   handle ~name:"load_graph" ~file
     (fun () ->
       match File.get_suffix file with
-      | Some ".gr" -> load_gr grs file
-      | Some ".conll" -> load_conll grs file
-      | Some ".br" | Some ".melt" -> load_brown grs file 
+      | Some ".gr" -> load_gr domain file
+      | Some ".conll" -> load_conll domain file
+      | Some ".br" | Some ".melt" -> load_brown domain file
       | _ ->
           Log.fwarning "Unknown file format for input graph '%s', try to guess..." file;
           let rec loop = function
           | [] -> Log.fcritical "[Libgrew.load_graph] Cannot guess input file format of file '%s'. Use .gr or .conll file extension" file
-          | load_fct :: tail -> try load_fct grs file with _ -> loop tail in
+          | load_fct :: tail -> try load_fct domain file with _ -> loop tail in
           loop [load_gr; load_conll; load_brown]
     ) ()
 
-let of_conll grs file_name line_list =
+let of_conll domain file_name line_list =
   handle ~name:"of_conll"
     (fun () ->
-      G_graph.of_conll ~loc:(Loc.file file_name) (Grs.get_domain grs) (Conll.parse file_name line_list)
+      G_graph.of_conll ~loc:(Loc.file file_name) domain (Conll.parse file_name line_list)
     ) ()
 
-let of_brown grs ?sentid brown =
-  handle ~name:"of_brown"
-    (fun () ->
-      G_graph.of_brown (Grs.get_domain grs) ?sentid brown
-    ) ()
+let of_brown domain ?sentid brown =
+  handle ~name:"of_brown" (fun () -> G_graph.of_brown domain ?sentid brown) ()
 
-let to_dot_graph grs ?main_feat ?(deco=G_deco.empty) graph =
-  handle ~name:"to_dot_graph" (fun () -> G_graph.to_dot (Grs.get_domain grs) ?main_feat graph ~deco) ()
+let to_dot_graph domain ?main_feat ?(deco=G_deco.empty) graph =
+  handle ~name:"to_dot_graph" (fun () -> G_graph.to_dot domain ?main_feat graph ~deco) ()
 
-let to_dep_graph grs ?filter ?main_feat ?(deco=G_deco.empty) graph =
-  handle ~name:"to_dep_graph" (fun () -> G_graph.to_dep (Grs.get_domain grs) ?filter ?main_feat ~deco graph) ()
+let to_dep_graph domain ?filter ?main_feat ?(deco=G_deco.empty) graph =
+  handle ~name:"to_dep_graph" (fun () -> G_graph.to_dep domain ?filter ?main_feat ~deco graph) ()
 
-let to_gr_graph grs graph =
-  handle ~name:"to_gr_graph" (fun () -> G_graph.to_gr (Grs.get_domain grs) graph) ()
+let to_gr_graph domain graph =
+  handle ~name:"to_gr_graph" (fun () -> G_graph.to_gr domain graph) ()
 
-let to_conll_graph grs graph =
-  handle ~name:"to_conll_graph" (fun () -> G_graph.to_conll (Grs.get_domain grs) graph) ()
+let to_conll_graph domain graph =
+  handle ~name:"to_conll_graph" (fun () -> G_graph.to_conll domain graph) ()
 
 let to_sentence ?main_feat gr =
   handle ~name:"to_sentence"
@@ -172,15 +135,57 @@ let to_sentence ?main_feat gr =
       G_graph.to_sentence ?main_feat gr
     ) ()
 
-let save_graph_conll grs filename graph =
+let save_graph_conll domain filename graph =
   handle ~name:"save_graph_conll" (fun () ->
     let out_ch = open_out filename in
-    fprintf out_ch "%s" (G_graph.to_conll (Grs.get_domain grs) graph);
+    fprintf out_ch "%s" (G_graph.to_conll domain graph);
     close_out out_ch
   ) ()
 
-let raw_graph grs gr =
-  handle ~name:"raw_graph" (fun () -> G_graph.to_raw (Grs.get_domain grs) gr) ()
+let raw_graph domain gr =
+  handle ~name:"raw_graph" (fun () -> G_graph.to_raw domain gr) ()
+
+(* -------------------------------------------------------------------------------- *)
+(** {2 Graph Rewriting System} *)
+type grs = Grs.t
+
+let empty_grs = Grs.empty
+
+let load_grs file =
+  handle ~name:"load_grs" ~file
+    (fun () ->
+      if not (Sys.file_exists file)
+      then raise (File_dont_exists file)
+      else Grs.build file
+    ) ()
+
+let get_sequence_names grs =
+  handle ~name:"get_sequence_names"
+    (fun () ->
+      Grs.sequence_names grs
+    ) ()
+
+IFDEF DEP2PICT THEN
+let build_html_doc ?(corpus=false) dir grs =
+  handle ~name:"build_doc [with Dep2pict]"
+    (fun () ->
+      Html_doc.build ~corpus ~dep:true dir grs;
+
+      (* draw pattern graphs for all rules and all filters *)
+      let fct module_ rule_ =
+        let dep_code = Rule.to_dep (Grs.get_domain grs) rule_ in
+        let dep_png_file = sprintf "%s/%s_%s-patt.png" dir module_ (Rule.get_name rule_) in
+        let d2p = Dep2pict.from_dep ~dep:dep_code in
+        Dep2pict.save_png ~filename:dep_png_file d2p in
+      Grs.rule_iter fct grs;
+      Grs.filter_iter fct grs
+    ) ()
+ELSE
+let build_html_doc ?(corpus=false) dir grs =
+  handle ~name:"build_doc [without Dep2pict]" (fun () -> Html_doc.build ~corpus ~dep:false dir grs) ()
+END
+
+let feature_names domain =  handle ~name:"feature_names" (fun () ->  Domain.feature_names domain) ()
 
 (* -------------------------------------------------------------------------------- *)
 (** {2 rew_display: data for the GUI } *)
@@ -204,16 +209,11 @@ let num_sol rh =
 
 
 
-
-
-
-
-
 let write_stat filename rew_hist =
   handle ~name:"write_stat" (fun () -> Gr_stat.save filename (Gr_stat.from_rew_history rew_hist)) ()
 
-let write_annot grs ~title static_dir annot_dir base_name_rew_hist_list =
-  handle ~name:"write_annot" (fun () -> Html_annot.build (Grs.get_domain grs) ~title static_dir annot_dir base_name_rew_hist_list) ()
+let write_annot domain ~title static_dir annot_dir base_name_rew_hist_list =
+  handle ~name:"write_annot" (fun () -> Html_annot.build domain ~title static_dir annot_dir base_name_rew_hist_list) ()
 
 let save_index ~dirname ~base_names =
   handle ~name:"save_index" (fun () ->
@@ -223,28 +223,28 @@ let save_index ~dirname ~base_names =
   ) ()
 
 
-let save_gr grs base rew_hist =
-  handle ~name:"save_gr" (fun () -> Rewrite_history.save_gr (Grs.get_domain grs) base rew_hist) ()
+let save_gr domain base rew_hist =
+  handle ~name:"save_gr" (fun () -> Rewrite_history.save_gr domain base rew_hist) ()
 
-let save_conll grs base rew_hist =
-  handle ~name:"save_conll" (fun () -> Rewrite_history.save_conll (Grs.get_domain grs) base rew_hist) ()
+let save_conll domain base rew_hist =
+  handle ~name:"save_conll" (fun () -> Rewrite_history.save_conll domain base rew_hist) ()
 
-let save_full_conll grs base rew_hist =
-  handle ~name:"save_full_conll" (fun () -> Rewrite_history.save_full_conll (Grs.get_domain grs) base rew_hist) ()
+let save_full_conll domain base rew_hist =
+  handle ~name:"save_full_conll" (fun () -> Rewrite_history.save_full_conll domain base rew_hist) ()
 
-let save_det_gr grs base rew_hist =
-  handle ~name:"save_det_gr" (fun () -> Rewrite_history.save_det_gr (Grs.get_domain grs) base rew_hist) ()
+let save_det_gr domain base rew_hist =
+  handle ~name:"save_det_gr" (fun () -> Rewrite_history.save_det_gr domain base rew_hist) ()
 
-let save_det_conll grs ?header base rew_hist =
-  handle ~name:"save_deeeet_conll" (fun () -> Rewrite_history.save_det_conll (Grs.get_domain grs) ?header base rew_hist) ()
+let save_det_conll domain ?header base rew_hist =
+  handle ~name:"save_deeeet_conll" (fun () -> Rewrite_history.save_det_conll domain ?header base rew_hist) ()
 
-let det_dep_string grs rew_hist =
-  handle ~name:"det_dep_string" (fun () -> Rewrite_history.det_dep_string (Grs.get_domain grs) rew_hist) ()
+let det_dep_string domain rew_hist =
+  handle ~name:"det_dep_string" (fun () -> Rewrite_history.det_dep_string domain rew_hist) ()
 
-let conll_dep_string grs ?keep_empty_rh rew_hist =
-  handle ~name:"conll_dep_string" (fun () -> Rewrite_history.conll_dep_string (Grs.get_domain grs) ?keep_empty_rh rew_hist) ()
+let conll_dep_string domain ?keep_empty_rh rew_hist =
+  handle ~name:"conll_dep_string" (fun () -> Rewrite_history.conll_dep_string domain ?keep_empty_rh rew_hist) ()
 
-let write_html grs
+let write_html domain
     ?(no_init=false)
     ?(out_gr=false)
     ?filter
@@ -257,7 +257,7 @@ let write_html grs
   handle ~name:"write_html" (fun () ->
     ignore (
       Html_rh.build
-        (Grs.get_domain grs)
+        domain
         ?filter
         ?main_feat
         ?dot
@@ -269,7 +269,7 @@ let write_html grs
     )
   ) ()
 
-let error_html grs
+let error_html domain
     ?(no_init=false)
     ?main_feat
     ?dot
@@ -280,7 +280,7 @@ let error_html grs
   handle ~name:"error_html" (fun () ->
     ignore (
       Html_rh.error
-        (Grs.get_domain grs)
+        domain
         ?main_feat
         ?dot
         ~init_graph: (not no_init)
@@ -310,9 +310,9 @@ let html_sentences ~title = handle ~name:"html_sentences" (fun () -> Html_senten
 type pattern = Rule.pattern
 type matching = Rule.matching
 
-let load_pattern grs file =
-  handle ~name:"load_pattern" (fun () -> Rule.build_pattern (Grs.get_domain grs) (Loader.pattern file)) ()
+let load_pattern domain file =
+  handle ~name:"load_pattern" (fun () -> Rule.build_pattern domain (Loader.pattern file)) ()
 
-let match_in_graph grs pattern graph = Rule.match_in_graph (Grs.get_domain grs) pattern graph
+let match_in_graph domain pattern graph = Rule.match_in_graph domain pattern graph
 
 let match_deco pattern matching = Rule.match_deco pattern matching
diff --git a/src/libgrew.mli b/src/libgrew.mli
index aa1ca92c3ac86da4ebb2e2576573fadd1fde9665..36f2c506b6f46bb2a6d35008217a1d141a27a576 100644
--- a/src/libgrew.mli
+++ b/src/libgrew.mli
@@ -37,25 +37,11 @@ exception Run of string * loc option
 
 exception Bug of string * loc option
 
-
 (* -------------------------------------------------------------------------------- *)
-(** {2 Graph Rewriting System} *)
-type grs
-val empty_grs: grs
-
-(** [load_grs filename] loads a graph rewriting system from [filename]
-    @raise Parsing_err if libgrew can't parse the file
-    @raise File_dont_exists if the file doesn't exists *)
-val load_grs: string -> grs
+(** {2 Domain} *)
+type domain
 
-(** [get_sequence_names grs] returns the list of sequence names defined in a GRS *)
-val get_sequence_names: grs -> string list
-
-(** [build_html_doc ?corpus directory grs]
-    @[corpus] is a flag (default is [false]) for complete html doc with corpus sentence. *)
-val build_html_doc: ?corpus:bool -> string -> grs -> unit
-
-val feature_names: grs -> string list option
+val load_domain: string -> domain
 
 (* -------------------------------------------------------------------------------- *)
 (** {2 Graph} *)
@@ -64,12 +50,12 @@ val feature_names: grs -> string list option
     File extension should be '.gr' or '.conll'.
     @raise Parsing_err if libgrew can't parse the file
     @raise File_dont_exists if the file doesn't exists. *)
-val load_graph: grs -> string -> graph
+val load_graph: domain -> string -> graph
 
 (** [of_conll filename line_list] *)
-val of_conll: grs -> string -> (int * string) list -> graph
+val of_conll: domain -> string -> (int * string) list -> graph
 
-val of_brown: grs -> ?sentid:string -> string -> graph
+val of_brown: domain -> ?sentid:string -> string -> graph
 
 val to_sentence: ?main_feat:string -> graph -> string
 
@@ -78,18 +64,38 @@ val to_sentence: ?main_feat:string -> graph -> string
     - the list of node (node is a list of feature (feature is string * string))
     - the list of edge (src, label, tar) where src and tar refers to the position in the node list
 *)
-val raw_graph: grs -> graph ->
+val raw_graph: domain -> graph ->
     (string * string) list *
     (string * string) list list *
     (int * string * int) list
 
-val to_dot_graph : grs -> ?main_feat:string -> ?deco:deco -> graph -> string
+val to_dot_graph : domain -> ?main_feat:string -> ?deco:deco -> graph -> string
+
+val to_dep_graph : domain -> ?filter: string list -> ?main_feat:string -> ?deco:deco -> graph -> string
+
+val to_gr_graph: domain -> graph -> string
 
-val to_dep_graph : grs -> ?filter: string list -> ?main_feat:string -> ?deco:deco -> graph -> string
+val to_conll_graph: domain -> graph -> string
 
-val to_gr_graph: grs -> graph -> string
 
-val to_conll_graph: grs -> graph -> string
+(* -------------------------------------------------------------------------------- *)
+(** {2 Graph Rewriting System} *)
+type grs
+val empty_grs: grs
+
+(** [load_grs filename] loads a graph rewriting system from [filename]
+    @raise Parsing_err if libgrew can't parse the file
+    @raise File_dont_exists if the file doesn't exists *)
+val load_grs: string -> grs
+
+(** [get_sequence_names grs] returns the list of sequence names defined in a GRS *)
+val get_sequence_names: grs -> string list
+
+(** [build_html_doc ?corpus directory grs]
+    @[corpus] is a flag (default is [false]) for complete html doc with corpus sentence. *)
+val build_html_doc: ?corpus:bool -> string -> grs -> unit
+
+val feature_names: domain -> string list option
 
 (* -------------------------------------------------------------------------------- *)
 (** {2 rew_display: data for the GUI } *)
@@ -114,29 +120,29 @@ val num_sol: rewrite_history -> int
 
 val write_stat: string -> rewrite_history -> unit
 
-val save_gr: grs -> string -> rewrite_history -> unit
+val save_gr: domain -> string -> rewrite_history -> unit
 
-val save_conll: grs -> string -> rewrite_history -> unit
+val save_conll: domain -> string -> rewrite_history -> unit
 
 (** [save_full_conll base_name rh] saves one conll_file for each normal form defined in [rh].
     Output files are named according to [base_name] and a secondary index after "__".
     The number of conll file produced is returned. *)
-val save_full_conll: grs -> string -> rewrite_history -> int
+val save_full_conll: domain -> string -> rewrite_history -> int
 
-val save_det_gr: grs -> string -> rewrite_history -> unit
+val save_det_gr: domain -> string -> rewrite_history -> unit
 
-val save_det_conll: grs -> ?header:string -> string -> rewrite_history -> unit
+val save_det_conll: domain -> ?header:string -> string -> rewrite_history -> unit
 
-val det_dep_string: grs -> rewrite_history -> string option
+val det_dep_string: domain -> rewrite_history -> string option
 
-val conll_dep_string: grs -> ?keep_empty_rh:bool -> rewrite_history -> string option
+val conll_dep_string: domain -> ?keep_empty_rh:bool -> rewrite_history -> string option
 
 val save_index: dirname:string -> base_names: string list -> unit
 
-val write_annot: grs -> title:string -> string -> string -> (string * rewrite_history) list -> unit
+val write_annot: domain -> title:string -> string -> string -> (string * rewrite_history) list -> unit
 
 val write_html:
-    grs ->
+    domain ->
     ?no_init: bool ->
     ?out_gr: bool ->
     ?filter: string list ->
@@ -149,7 +155,7 @@ val write_html:
     unit
 
 val error_html:
-    grs ->
+    domain ->
     ?no_init:bool ->
     ?main_feat:string ->
     ?dot: bool ->
@@ -179,11 +185,11 @@ val html_sentences: title:string -> string -> (bool * string * int * string) lis
 type pattern
 type matching
 
-(** [load_pattern filename] returns the pattern describer in the fuile *)
-val load_pattern: grs -> string -> pattern
+(** [load_pattern filename] returns the pattern described in the file *)
+val load_pattern: domain -> string -> pattern
 
-(** [match_in_graph patern graph] returns the list of the possible matching og [pattern] in [graph] *)
-val match_in_graph: grs -> pattern -> graph -> matching list
+(** [match_in_graph pattern graph] returns the list of the possible matching og [pattern] in [graph] *)
+val match_in_graph: domain -> pattern -> graph -> matching list
 
 (** [match_deco pattern matching] returns the deco to be used in the graphical representation.
     WARNING: the function supposes that [matching] was find with the given [pattern]! *)