diff --git a/Makefile.in b/Makefile.in
index 9a6dd9fc52b47134cc455ec00f4d173362ed6870..df551941ad4c42d8ea0b1542e888118a01cc5a64 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -91,7 +91,7 @@ EXTCMXA = $(addsuffix .cmxa,$(EXTLIBS)) $(addsuffix .cmx,$(EXTOBJS))
 # main target
 ###############
 
-all: @OCAMLBEST@
+all: @OCAMLBEST@ plugins
 
 ifeq (@enable_local@,yes)
 all: install_local
@@ -133,7 +133,7 @@ LIB_TRANSFORM = simplify_recursive_definition simplify_formula \
 		introduction abstraction close_epsilon lift_epsilon \
 		eval_match instantiate_predicate smoke_detector
 
-LIB_PRINTER = alt_ergo why3printer smtv1 smtv2 coq tptp simplify gappa \
+LIB_PRINTER = alt_ergo why3printer smtv1 smtv2 coq simplify gappa \
 	      cvc3 yices
 
 LIBMODULES = src/config \
@@ -208,7 +208,6 @@ clean::
 
 install_no_local::
 	mkdir -p $(BINDIR)
-	mkdir -p $(LIBDIR)/why3/plugins
 	mkdir -p $(LIBDIR)/why3/coq
 	mkdir -p $(DATADIR)/why3/images
 	mkdir -p $(DATADIR)/why3/emacs
@@ -242,6 +241,84 @@ endif
 
 install-all: install install-lib
 
+##################
+# Why plugins
+##################
+
+PLUGGENERATED =
+
+PLUG_PARSER = genequlin
+PLUG_PRINTER = tptp
+PLUG_TRANSFORM =
+
+PLUGINS = genequlin tptp
+
+PLUGMODULES = $(addprefix plugins/parser/, $(PLUG_PARSER)) \
+	      $(addprefix plugins/printer/, $(PLUG_PRINTER)) \
+	      $(addprefix plugins/transform/, $(PLUG_TRANSFORM))
+
+PLUGML  = $(addsuffix .ml,  $(PLUGMODULES))
+PLUGMLI = $(addsuffix .mli, $(PLUGMODULES))
+PLUGCMO = $(addsuffix .cmo, $(PLUGMODULES))
+PLUGCMX = $(addsuffix .cmx, $(PLUGMODULES))
+
+PLUGDIRS = parser printer transform
+PLUGINCLUDES = $(addprefix -I plugins/, $(PLUGDIRS))
+
+$(PLUGCMO) $(PLUGCMX): INCLUDES += $(PLUGINCLUDES)
+
+plugins.byte: $(addsuffix .cmo, $(addprefix lib/plugins/, $(PLUGINS)))
+plugins.opt : $(addsuffix .cmxs, $(addprefix lib/plugins/, $(PLUGINS)))
+
+lib/plugins/%.cmxs: plugins/parser/%.cmx
+	$(if $(QUIET), @echo 'Linking  $@' &&) \
+	    $(OCAMLOPT) $(OFLAGS) -shared -o $@ $<
+
+lib/plugins/%.cmo: plugins/parser/%.cmo
+	$(if $(QUIET),@echo 'Linking  $@' &&) \
+	    $(OCAMLC) $(BFLAGS) -pack -o $@ $<
+
+lib/plugins/%.cmxs: plugins/printer/%.cmx
+	$(if $(QUIET), @echo 'Linking  $@' &&) \
+	    $(OCAMLOPT) $(OFLAGS) -shared -o $@ $<
+
+lib/plugins/%.cmo: plugins/printer/%.cmo
+	$(if $(QUIET),@echo 'Linking  $@' &&) \
+	    $(OCAMLC) $(BFLAGS) -pack -o $@ $<
+
+lib/plugins/%.cmxs: plugins/transform/%.cmx
+	$(if $(QUIET), @echo 'Linking  $@' &&) \
+	    $(OCAMLOPT) $(OFLAGS) -shared -o $@ $<
+
+lib/plugins/%.cmo: plugins/transform/%.cmo
+	$(if $(QUIET),@echo 'Linking  $@' &&) \
+	    $(OCAMLC) $(BFLAGS) -pack -o $@ $<
+
+include .depend.plugins
+
+.depend.plugins: $(PLUGGENERATED)
+	$(OCAMLDEP) -slash -I src -I plugins $(PLUGINCLUDES) \
+		$(PLUGML) $(PLUGMLI) > $@
+
+depend: .depend.plugins
+
+PLUGSDIRS = plugins $(addprefix plugins/, $(PLUGDIRS))
+PLUGCLEAN = $(addsuffix /*.cm[iox], $(PLUGSDIRS)) \
+	    $(addsuffix /*.annot, $(PLUGSDIRS)) \
+	    $(addsuffix /*.output, $(PLUGSDIRS)) \
+	    $(addsuffix /*.automaton, $(PLUGSDIRS)) \
+	    $(addsuffix /*.o, $(PLUGSDIRS)) \
+	    $(addsuffix /*~, $(PLUGSDIRS))
+
+clean::
+	rm -f $(PLUGCLEAN) $(PLUGGENERATED)
+	rm -f lib/plugins/*
+	rm -f .depend.plugins
+
+install_no_local::
+	mkdir -p $(LIBDIR)/why3/plugins
+	cp -f lib/plugins/* $(LIBDIR)/why3/plugins
+
 
 ##################
 # Why binary
@@ -443,7 +520,6 @@ clean::
 	rm -f src/config/*.annot src/config/*~
 	rm -f src/config/*.output src/config/*.automaton
 	rm -f bin/why3config.byte bin/why3config.opt bin/why3config
-	rm -f .why.conf
 	rm -f .depend.config
 
 local_config: bin/why3config.@OCAMLBEST@
@@ -922,7 +998,7 @@ install_local: bin/why3doc
 # bench
 ########
 
-.PHONY: bench test comp_bench_plugins
+.PHONY: bench test
 
 bench:: bin/why3.@OCAMLBEST@ bin/why3ml.@OCAMLBEST@ bin/why3config.@OCAMLBEST@ plugins $(TOOLS)
 	$(MAKE) test-api
@@ -930,18 +1006,6 @@ bench:: bin/why3.@OCAMLBEST@ bin/why3ml.@OCAMLBEST@ bin/why3config.@OCAMLBEST@ p
 	    "bin/why3.@OCAMLBEST@" \
 	    "bin/why3ml.@OCAMLBEST@"
 
-BENCH_PLUGINS_CMO := helloworld.cmo
-BENCH_PLUGINS_CMO := $(addprefix bench/plugins/,$(BENCH_PLUGINS_CMO))
-BENCH_PLUGINS_CMXS := $(BENCH_PLUGINS_CMO:.cmo=.cmxs)
-
-comp_bench_plugins:: $(BENCH_PLUGINS_CMO) $(BENCH_PLUGINS_CMXS)
-
-# bench_plugins:: $(BENCH_PLUGINS_CMO) $(BENCH_PLUGINS_CMXS) byte $(TOOLS)
-# 	bin/why3.byte -D bench/plugins/helloworld.drv \
-# 	tests/test-jcf.why -T Test -G G
-# 	bin/why3.$(OCAMLBEST) -D bench/plugins/helloworld.drv  \
-# 	tests/test-jcf.why -T Test -G G
-
 ###############
 # test targets
 ###############
@@ -992,47 +1056,6 @@ bts12244: src/why3.cma
 	ocaml -I src/ $(INCLUDES) $(EXTCMA) src/why3.cma examples/bts12244.ml
 
 
-## Examples : Plugins ##
-
-PLUGDIR = examples/plugins/
-PLUG_FILES = genequlin
-
-PLUGMODULES = $(addprefix $(PLUGDIR), $(PLUG_FILES))
-
-PLUGML  = $(addsuffix .ml,  $(PLUGMODULES))
-PLUGCMO = $(addsuffix .cmo, $(PLUGMODULES))
-PLUGCMX = $(addsuffix .cmx, $(PLUGMODULES))
-PLUGCMXS = $(addsuffix .cmxs, $(PLUGMODULES))
-
-# ifeq (@enable_plug_support@,yes)
-# byte: src/plug-plugin/whytac.cma
-# opt:  src/plug-plugin/whytac.cmxs
-# endif
-
-# $(PLUGCMO):  src/why3.cma
-# $(PLUGCMXS): src/why3.cmxa
-
-.PHONY: examples_plugins.byte examples_plugins.opt
-
-examples_plugins.byte : $(PLUGCMO)
-examples_plugins.opt : $(PLUGCMXS)
-
-# depend and clean targets
-
-include .depend.plug
-
-.depend.plug: $(PLUGGENERATED)
-	$(OCAMLDEP) -slash -I src -I $(PLUGDIR) $(PLUGML) | sed "s/cmx/cmxs/" > $@
-
-depend: .depend.plug
-
-clean::
-	rm -f $(PLUGDIR)/*.cm[iox] $(PLUGDIR)/*.o
-	rm -f $(PLUGDIR)/*.cma $(PLUGDIR)/*.cmxs
-	rm -f $(PLUGDIR)/*.annot $(PLUGDIR)/*~
-	rm -f $(PLUGGENERATED)
-	rm -f .depend.plug
-
 ################
 # documentation
 ################
diff --git a/examples/plugins/test.equlin b/examples/test.equlin
similarity index 100%
rename from examples/plugins/test.equlin
rename to examples/test.equlin
diff --git a/plugins/parser/.keepme b/plugins/parser/.keepme
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/examples/plugins/genequlin.ml b/plugins/parser/genequlin.ml
similarity index 94%
rename from examples/plugins/genequlin.ml
rename to plugins/parser/genequlin.ml
index 24a9127ffa16fe6f6ec2ecfb6314d3ec6a43da2c..c2b106faccba7e92908c22787257cc2e79f73fb7 100644
--- a/examples/plugins/genequlin.ml
+++ b/plugins/parser/genequlin.ml
@@ -68,7 +68,7 @@ let scanf s =
 
 
 (** the main function *)
-let read_channel env filename cin =
+let read_channel env path filename cin =
   (** Find the int theory and the needed operation *)
   let th_int = Env.find_theory env ["int"] "Int" in
   let leq = ns_find_ls th_int.th_export ["infix <"] in
@@ -76,17 +76,17 @@ let read_channel env filename cin =
   let mult_symbol = Theory.ns_find_ls th_int.Theory.th_export ["infix *"] in
 
 
-  let zero = t_const (ConstInt "0") in
+  let zero = t_int_const "0" in
 
   (** create a contraint : polynome <= constant *)
   let create_lit lvar k lits _ =
     let left = List.fold_left (fun acc e ->
       let const = string_of_int ((Random.int k) - (k/2)) in
-      let monome = t_app mult_symbol [e;t_const(ConstInt const)]
+      let monome = t_app mult_symbol [e;t_int_const const]
         (Some Ty.ty_int) in
       t_app plus_symbol [acc;monome] (Some Ty.ty_int)) zero lvar in
     let rconst = string_of_int ((Random.int k) - (k/2)) in
-    t_and_simp lits (t_app leq [left;t_const(ConstInt rconst)] None) in
+    t_and_simp lits (t_app leq [left;t_int_const rconst] None) in
 
   (** create a set of constraints *)
   let create_fmla nvar m k =
@@ -107,7 +107,7 @@ let read_channel env filename cin =
   end;
   (** Create the theory *)
   let th_uc_loc = Loc.user_position filename 1 0 0 in
-  let th_uc = create_theory (id_user "EqLin" th_uc_loc) in
+  let th_uc = create_theory ~path (id_user "EqLin" th_uc_loc) in
   let th_uc = Theory.use_export th_uc th_int in
   (** Read one line and add it to the theory *)
   let fold th_uc s =
@@ -130,6 +130,4 @@ let read_channel env filename cin =
   (** Return the map with the theory *)
   Mstr.singleton "EqLin" (close_theory th_uc)
 
-
-
 let () = Env.register_format "EquLin" ["equlin"] read_channel
diff --git a/plugins/printer/.keepme b/plugins/printer/.keepme
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/src/printer/tptp.ml b/plugins/printer/tptp.ml
similarity index 99%
rename from src/printer/tptp.ml
rename to plugins/printer/tptp.ml
index 9fa2eee7d79280fe2a398d96a2a81b29e1645f22..52dd4e7aa41c3ee8669e423c6854baa165a6ec40 100644
--- a/src/printer/tptp.ml
+++ b/plugins/printer/tptp.ml
@@ -18,6 +18,8 @@
 (**************************************************************************)
 
 open Format
+
+open Why3
 open Pp
 open Ident
 open Ty
diff --git a/src/printer/tptp.mli b/plugins/printer/tptp.mli
similarity index 100%
rename from src/printer/tptp.mli
rename to plugins/printer/tptp.mli