diff --git a/met4j-graph/pom.xml b/met4j-graph/pom.xml
index 92ec55c7e68574a2ef4d6bccc3a000cf77cc1df1..4fc31ca7cece8252d04648c72070159d2fc2f5f8 100644
--- a/met4j-graph/pom.xml
+++ b/met4j-graph/pom.xml
@@ -52,6 +52,12 @@
             <artifactId>met4j-chemUtils</artifactId>
             <version>1.5.5-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>com.googlecode.json-simple</groupId>
+            <artifactId>json-simple</artifactId>
+            <version>1.1.1</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/ChokePoint.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/ChokePoint.java
index a7dd47c13bcbf33e2c92e76f32ce2161a0c77876..31d8a80b9347174da4ffb6f7f143bb021ac781e6 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/ChokePoint.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/ChokePoint.java
@@ -35,16 +35,16 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze;
 
-import java.util.HashSet;
-import java.util.Set;
-import java.util.stream.Collectors;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * Class to compute choke points, i.e. reaction that are required to consume or produce one compound.
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphLocalMeasure.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphLocalMeasure.java
index 5844eb3cbeabe71899ce681275db21fe798caead..5e4ef888c8ddd77f9eb192091d76e06b641ed96b 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphLocalMeasure.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphLocalMeasure.java
@@ -35,18 +35,18 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.utils.ComputeAdjacencyMatrix;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.EjmlMatrix;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
 /**
  * compute several measures of the proximity or relatedness of two nodes
  *
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
index e4d2de39423d36959a192e5c7f8fe096baf5b915..e7e6fd5646f324d167e42fc6d6c3229b9803d6a4 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
@@ -36,8 +36,8 @@
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze;
 
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.FloydWarshall;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.centrality.PathBasedCentrality;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.FloydWarshall;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
@@ -45,12 +45,8 @@ import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
 import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
 import org.jgrapht.alg.connectivity.ConnectivityInspector;
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
-import java.util.Comparator;
 
 /**
  * compute several measures of the level or connectivity, size or shape of a given graph using lazy builder to avoid redundant calculus
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphSimilarity.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphSimilarity.java
index 627c7ab2d5f773fa6ec124e8b69d8ad24e976c63..3a49bd4284232bc372354495bd9a86f4e51165a8 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphSimilarity.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphSimilarity.java
@@ -35,11 +35,10 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze;
 
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.EdgeMerger;
-
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 
 
 /**
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/LoadPoint.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/LoadPoint.java
index 1f15992579b966bf2f24ee96f911b859744e5ac4..dc022a66dc8513afdbe120720186662043980a3a 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/LoadPoint.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/LoadPoint.java
@@ -35,23 +35,16 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-
-
-
-
-
-
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.KShortestPath;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.centrality.PathBasedCentrality;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.KShortestPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * Class to compute load points, i.e. hotspot in metabolic networks.
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/ScopeCompounds.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/ScopeCompounds.java
index 715f03f9c028872393e399df00243c1715ec57cc..4a68280b0272746717778fc30fbf94c933f11245 100755
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/ScopeCompounds.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/ScopeCompounds.java
@@ -35,14 +35,14 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze;
 
-import java.util.*;
-
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
+
+import java.util.*;
  
  
 /**
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/centrality/PathBasedCentrality.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/centrality/PathBasedCentrality.java
index 91703306c3fc1181dad3f50db2a09e4a4a16ef87..87f4a990114caf19d3de84c7d07caa31308762c4 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/centrality/PathBasedCentrality.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/centrality/PathBasedCentrality.java
@@ -35,19 +35,18 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.centrality;
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.ShortestPath;
-
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
 
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
 /**
  * The Class used to compute several centrality measure and other classical vertex' global measures
  *
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/AStar.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/AStar.java
index 59f122d10f98ab620e752a8ea196c2323fc2154e..c70f6030a4e17f3ef577b646caf921a5a15a2744 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/AStar.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/AStar.java
@@ -35,17 +35,12 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.heuristic.AStarHeuristic;
-
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+
+import java.util.*;
 
 /**
  * implementation of the A* algorithm (shortest path with estimated remaining distance computed at each step)
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/FloydWarshall.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/FloydWarshall.java
index bd93cfd122ba42baf0332804359e17fd21be8dc0..3d36803d22f75b64785d8102f1d2d3c206c0dd97 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/FloydWarshall.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/FloydWarshall.java
@@ -35,19 +35,18 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.utils.ComputeAdjacencyMatrix;
-
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * The Class FloydWarshall. This class is used to compute all shortest paths in a graph.
  * A light implementation allows to compute only the distance matrix, while another perform node tracking during traversal
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/KShortestPath.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/KShortestPath.java
index 7dfb8244253dd4da43dd3c5998233b3b6241436c..7359aea2c1dd2c0dc6b881e449f8d712387ea385 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/KShortestPath.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/KShortestPath.java
@@ -35,19 +35,13 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 import org.jgrapht.GraphPath;
 
-import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+import java.util.*;
 
 /**
  * <p>KShortestPath class.</p>
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/ShortestPath.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/ShortestPath.java
index 17a32a8b2639ffb1d07e0969ed968bc79f2f7d73..5dbf17b5b964fcf638ccc8b77ce5a103b01f051c 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/ShortestPath.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/ShortestPath.java
@@ -35,8 +35,7 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect;
 
-import java.util.*;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPathUtils;
@@ -44,13 +43,13 @@ import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compressed.CompressedGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compressed.PathEdge;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
-import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.EjmlMatrix;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import org.jgrapht.GraphPath;
 import org.jgrapht.alg.interfaces.ManyToManyShortestPathsAlgorithm;
 import org.jgrapht.alg.shortestpath.DijkstraManyToManyShortestPaths;
 import org.jgrapht.graph.AsUndirectedGraph;
 
+import java.util.*;
+
 /**
  * Class to use the shortest paths in a graph
  *
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/SteinerTreeApprox.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/SteinerTreeApprox.java
index 27423a251356264199b6307be5d27c0b11d9b6d0..12e3d906c75c6887e24b61aca8b6c7d22345559c 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/SteinerTreeApprox.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/SteinerTreeApprox.java
@@ -35,21 +35,16 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.GraphFactory;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compressed.CompressedGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compressed.PathEdge;
 import org.jgrapht.alg.spanning.KruskalMinimumSpanningTree;
 import org.jgrapht.graph.DirectedWeightedMultigraph;
 
-import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.compressed.CompressedGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.compressed.PathEdge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+import java.util.*;
 
 /**
  * Class to compute approximation of Steiner Tree (minimum cost tree between nodes of interest), using minimum spanning tree
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/heuristic/ChemicalSimilarityHeuristic.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/heuristic/ChemicalSimilarityHeuristic.java
index 0d8a9504f64d8078b82fa641ae926609d51e8172..4285dc7cd865206de98849751b5883df46c28193 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/heuristic/ChemicalSimilarityHeuristic.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/heuristic/ChemicalSimilarityHeuristic.java
@@ -35,13 +35,13 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.heuristic;
 
-import java.util.BitSet;
-import java.util.HashMap;
-
 import fr.inrae.toulouse.metexplore.met4j_chemUtils.chemicalSimilarity.FingerprintBuilder;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.similarity.SimilarityComputor;
 
+import java.util.BitSet;
+import java.util.HashMap;
+
 /**
  * The A* heuristic using chemical similarity
  *
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/AtomMappingWeightPolicy.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/AtomMappingWeightPolicy.java
index f7f35beb4e62da101422ed0feaf537fce8055191..678480e4215025b092de5c4b6a30671c5d374fb7 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/AtomMappingWeightPolicy.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/AtomMappingWeightPolicy.java
@@ -4,7 +4,6 @@ import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
-import org.apache.commons.lang3.StringUtils;
 
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/DegreeWeightPolicy.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/DegreeWeightPolicy.java
index aa4a54229d47b6c8d6dc7533e4fe734f11d5e87b..0dd44e318fb0ab3fc1a98b403cad46ef5d002b03 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/DegreeWeightPolicy.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/DegreeWeightPolicy.java
@@ -35,10 +35,10 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting;
 
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 
 /**
  * The Class DegreeWeightPolicy which set as edge weight the target node's degree to the power of n.
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/ProbabilityWeightPolicy.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/ProbabilityWeightPolicy.java
index 8fe82cff4144771b482fefcd42bc6adb8c2d7196..c46e43e9063fa9e5f79416e0408ac94b4ee393be 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/ProbabilityWeightPolicy.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/ProbabilityWeightPolicy.java
@@ -35,10 +35,10 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting;
 
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 
 /**
  * The Class ProbabilityWeightPolicy use to set probability as edge weight (resulting in stochastic network)
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
index 269cbcf03e6ee7f9e3378b058b353b1c1a740822..d19952d3536814e93b67a87d78c6b547a273cde2 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
@@ -5,14 +5,14 @@ import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphMeasure;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.GraphFilter;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.GraphFactory;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 
-import java.util.*;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 /**
  * Weighting policy that mimic RPAIRS's now discontinued tags. Define Main and Side transitions within each reaction.
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/ReactionProbabilityWeight.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/ReactionProbabilityWeight.java
index fecc9306f99c992b2104277b8b29b139f4d57ff5..746cd8b712751f195834616899ae825399c104f9 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/ReactionProbabilityWeight.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/ReactionProbabilityWeight.java
@@ -35,14 +35,14 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting;
 
-import java.util.HashMap;
-import java.util.Map;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+
+import java.util.HashMap;
+import java.util.Map;
 
 
 /**
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/SimilarityWeightPolicy.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/SimilarityWeightPolicy.java
index 7a157d79da2661a9063173ba618bf9975938d123..a27d044e37da91bd2c153203d5235c46eb874f7e 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/SimilarityWeightPolicy.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/SimilarityWeightPolicy.java
@@ -35,18 +35,18 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting;
 
-import java.util.BitSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Set;
-
+import fr.inrae.toulouse.metexplore.met4j_chemUtils.chemicalSimilarity.FingerprintBuilder;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollections;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.similarity.SimilarityComputor;
-import fr.inrae.toulouse.metexplore.met4j_chemUtils.chemicalSimilarity.FingerprintBuilder;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollections;
+
+import java.util.BitSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * The Chemical Similarity weighting policy.
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/StochasticWeightPolicy.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/StochasticWeightPolicy.java
index e9a40b39aba2c62a66795a83c123d0411789b0eb..f0587e026e38ffd749e129e8eaae54e502cd3ec7 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/StochasticWeightPolicy.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/StochasticWeightPolicy.java
@@ -35,6 +35,10 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting;
 
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
+
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
@@ -42,10 +46,6 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Set;
 
-import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
-
 /**
  * The Stochastic weighting policy based on chemical similarity.
  *
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/UnweightedPolicy.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/UnweightedPolicy.java
index dfa95e12451d5b3625a28d1f81aee094c60f0a3a..f2cf8edd7acdc7b32c40e22e819d1c7ee1b2c104 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/UnweightedPolicy.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/UnweightedPolicy.java
@@ -35,10 +35,10 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting;
 
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 
 /**
  * The default Weighting policy (each weight is set to 1.0).
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/WeightUtils.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/WeightUtils.java
index 1a9819936240d551ac40083f41323b844b315413..946d92780e1879be5b74c1dc5d26528e4c9f39f3 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/WeightUtils.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/WeightUtils.java
@@ -35,6 +35,9 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting;
 
+import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
+
 import java.io.BufferedWriter;
 import java.io.FileWriter;
 import java.io.IOException;
@@ -42,9 +45,6 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.function.DoubleFunction;
 
-import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-
 /**
  * Class used to perform mathematical operation and IO methods on weights in graph
  *
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/WeightsFromFile.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/WeightsFromFile.java
index 9edd8fc262668bc7caeaf0d8522c54300fc8eaa9..09a4aa04f03feea10df70f39ad6f882b641d5027 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/WeightsFromFile.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/WeightsFromFile.java
@@ -35,6 +35,11 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting;
 
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
+
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
@@ -44,11 +49,6 @@ import java.util.HashSet;
 import java.util.Set;
 import java.util.function.Function;
 
-import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
-
 
 /**
  * Weighting policy using weights in file
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphFilter.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphFilter.java
index 427c609b3fd539ee7163d724c9e80fd7be06051b..805b4de30078eaa75b7777c1e0e1ee06745af66f 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphFilter.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphFilter.java
@@ -35,17 +35,16 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.transform;
 
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
+import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 
-import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
-import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
-
-import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
-
 
 
 
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
index be5c8da3013cadcc441147cabded865cd8b1038d..723bfa7ef5a0565da91c92cced1ca6a4bb89673e 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
@@ -35,10 +35,10 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.transform;
 
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.GraphFactory;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 
 /**
  * Provide static method to compute some basic set operation on graph such as union or interesct.
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/utils/ComputeAdjacencyMatrix.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/utils/ComputeAdjacencyMatrix.java
index a2beea35f105d4c14e3a2764386dcc964a00b61b..2ebda0e03db686e61cd4420d498b7435a74ae2fc 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/utils/ComputeAdjacencyMatrix.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/utils/ComputeAdjacencyMatrix.java
@@ -35,16 +35,16 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.utils;
 
-import java.util.Arrays;
-import java.util.Set;
-import java.util.function.DoubleBinaryOperator;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.EjmlMatrix;
 
+import java.util.Arrays;
+import java.util.Set;
+import java.util.function.DoubleBinaryOperator;
+
 /**
  * The adjacency Matrix computor.
  *
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/utils/GraphSampler.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/utils/GraphSampler.java
index 73c74e003ef267f10c46ecd8722aa4a626c7ceab..2d8130dd8cfcb6a8f8c073d6ef01233d97052e7c 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/utils/GraphSampler.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/utils/GraphSampler.java
@@ -35,16 +35,16 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.utils;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Random;
-import java.util.Set;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.EjmlMatrix;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Random;
+import java.util.Set;
 
 /**
  * Provide graph random sampling method on edges or vertex (with or without scope or defined compartment)
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/utils/RankUtils.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/utils/RankUtils.java
index 685b14b718b7be2f8354298d4adf199133854d4e..2489270a5fc52a11baccf34f9f62956bec58c927 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/utils/RankUtils.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/utils/RankUtils.java
@@ -35,12 +35,12 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.utils;
 
-import java.io.Serializable;
-import java.util.*;
-
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 
+import java.io.Serializable;
+import java.util.*;
+
 
 /**
  * provide static method to build reaction ranking from graph edges' score, and measure distance/dissimilarity between two ranking
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/BioPath.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/BioPath.java
index 8ca1b68212cc6092888e8b99c016f9db3f54c561..02a851a72c3e59e9cfe89d6e56bf210f3e21e190 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/BioPath.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/BioPath.java
@@ -35,15 +35,15 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.core;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Objects;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import org.jgrapht.Graph;
 import org.jgrapht.GraphPath;
 import org.jgrapht.graph.GraphWalk;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
 
 
 /**
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/BioPathUtils.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/BioPathUtils.java
index 59f1a65df5e500d2705197d36813a3089cbc7be4..a01b838a6604174bceff08a20fc16d0b42406dac 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/BioPathUtils.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/BioPathUtils.java
@@ -35,13 +35,12 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.core;
 
-import java.util.*;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.EjmlMatrix;
 import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+import java.util.*;
 
 /**
  * A utility class used to filter list of paths, according to various criterion such as length, weight, presence/absence of a given vertex or edges ...
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/Edge.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/Edge.java
index fbd91040aa8ae57d9d68ce1bbc0b7752e7a5d220..31843fa11b8649c83a9c3992e1e1b8671cb04fbc 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/Edge.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/Edge.java
@@ -39,11 +39,10 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.core;
 
-import java.util.HashMap;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import org.jgrapht.graph.DefaultWeightedEdge;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+import java.util.HashMap;
 
 /**
  * <p>Abstract Edge class.</p>
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/GraphFactory.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/GraphFactory.java
index c2810095c40793404e28f7d02cfef2123ddb9188..b1f5d1254fcad06f593b7330e8d3a34dbf1f4786 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/GraphFactory.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/GraphFactory.java
@@ -35,15 +35,10 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.core;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 
+import java.util.*;
+
 /**
  * <p>Abstract GraphFactory class.</p>
  *
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/bipartite/BipartiteEdge.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/bipartite/BipartiteEdge.java
index 2d45ec762f448453afbaaaa8b6f0d3215db0ee4d..a77966655a756cb1d1bfc041ce0a1735ba282c54 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/bipartite/BipartiteEdge.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/bipartite/BipartiteEdge.java
@@ -35,10 +35,10 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite;
 
-import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 
 /**
  * The Class BipartiteEdge.
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/compound/ReactionEdge.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/compound/ReactionEdge.java
index 57725664225fd07a5ccc167af1ae79eb7ed043bc..3f96fc19042303fd73c0dea137ebc2d9919364e3 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/compound/ReactionEdge.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/compound/ReactionEdge.java
@@ -35,11 +35,11 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.core.compound;
 
-import java.util.Objects;
-
-import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
+
+import java.util.Objects;
 
 /**
  * The edge Class linking two {@link fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite}, associated with a {@link fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction}
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/compressed/PathEdge.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/compressed/PathEdge.java
index faac3d4b1cf969d877fef5aaaf2fe0d3e602985a..2743d06165e6f7cd19f20dcf8e26ba69ad28e3cb 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/compressed/PathEdge.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/compressed/PathEdge.java
@@ -35,9 +35,9 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.core.compressed;
 
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 
 /**
  * <p>PathEdge class.</p>
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/parallel/MetaEdge.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/parallel/MetaEdge.java
index 73e88661b66850d309d501d8e415d02d22313c17..104c56afe10aa381cc9183a0a62689087aba2603 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/parallel/MetaEdge.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/parallel/MetaEdge.java
@@ -35,13 +35,13 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.core.parallel;
 
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
+
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
-
 /**
  * Edges that represent a set of sub-edges
  * It can be used to store the merging of edges sharing same source and target
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/pathway/PathwayGraph.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/pathway/PathwayGraph.java
index 0422478f39f5d4025f5f111dde957b7d5b5bcc51..4297657656ea5fa8efcfe69d64e81d8e826f2947 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/pathway/PathwayGraph.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/pathway/PathwayGraph.java
@@ -36,12 +36,10 @@
 package fr.inrae.toulouse.metexplore.met4j_graph.core.pathway;
 
 
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioPathway;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioPathway;
-
 /**
  * The Class PathwayGraph allow to build a directed graph representing connections between pathways in a bionetwork.
  * It first identify the sources and inner compounds of a pathways.
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/pathway/PathwayGraphEdge.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/pathway/PathwayGraphEdge.java
index 8ffb8d8788ddbc422e3d1b3b781bedc8e4308a4e..a2e77c454d4aa0edd3c905f5cf445622b0a817af 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/pathway/PathwayGraphEdge.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/pathway/PathwayGraphEdge.java
@@ -35,10 +35,10 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.core.pathway;
 
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioPathway;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioPathway;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 
 import java.util.stream.Collectors;
 
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/reaction/CompoundEdge.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/reaction/CompoundEdge.java
index 960691062e7325d6633ed6b901216c6ba3eddd18..868ae54d0b9def824819b04bb6188c32186f91fa 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/reaction/CompoundEdge.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/reaction/CompoundEdge.java
@@ -35,11 +35,11 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.core.reaction;
 
-import java.util.Objects;
-
-import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
+
+import java.util.Objects;
 
 /**
  * The edge Class linking two {@link fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction}, associated with a {@link fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite}
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/AttributeExporter.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/AttributeExporter.java
new file mode 100644
index 0000000000000000000000000000000000000000..850dc26471a792632e9fcf50d2b05df9dbddb9a6
--- /dev/null
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/AttributeExporter.java
@@ -0,0 +1,298 @@
+package fr.inrae.toulouse.metexplore.met4j_graph.io;
+
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteEdge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.CompoundEdge;
+import lombok.Getter;
+import lombok.Setter;
+import org.jgrapht.nio.Attribute;
+import org.jgrapht.nio.DefaultAttribute;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.function.Function;
+
+/**
+ * This class is used to define the attributes that will be exported with the graph.
+ */
+public class AttributeExporter {
+
+    private Boolean exportMass = false; // Boolean variable to check if the COMPOUND mass is exported
+    private Boolean exportFormula = false; // Boolean variable to check if the COMPOUND formula is exported
+    private Boolean exportEC = false; // Boolean variable to check if the REACTION EC number is exported
+    private Boolean exportReversible = false; // Boolean variable to check if the REACTION reversibility is exported
+    private Boolean exportName = false; // Boolean variable to check if the name is exported
+    private Boolean exportType = false; // Boolean variable to check if the bioentity type is exported
+    private TreeMap<String,Function<BioEntity,Object>> nodeExtraAtt = new TreeMap<>(); // TreeMap to store the node attributes
+    private TreeMap<String,Function<Edge<?extends BioEntity>,Object>> edgeExtraAtt = new TreeMap<>(); // TreeMap to store the edge attributes
+
+    /**
+     * Gets the list of node attribute labels
+     * @return the list of node attribute labels
+     */
+    public List<String> getNodeAttributeLabels(){
+        return new ArrayList<>(nodeExtraAtt.keySet());
+    }
+
+    /**
+     * Gets the list of edge attribute labels
+     * @return the list of edge attribute labels
+     */
+    public List<String> getEdgeAttributeLabels(){
+        return new ArrayList<>(edgeExtraAtt.keySet());
+    }
+
+    /**
+     *  Exports compounds' mass
+      */
+    public AttributeExporter exportMass() {
+        this.exportMass = true;
+        return this;
+    }
+    /**
+     *  Exports compounds' chemical formula
+     */
+    public AttributeExporter exportFormula() {
+        this.exportFormula = true;
+        return this;
+    }
+    /**
+     *  Exports reactions' EC number
+     */
+    public AttributeExporter exportEC() {
+        this.exportEC = true;
+        return this;
+    }
+    /**
+     *  Exports reactions' EC reversibility
+     */
+    public AttributeExporter exportReversible() {
+        this.exportReversible = true;
+        return this;
+    }
+    /**
+     *  Exports bio-entities' name
+     */
+    public AttributeExporter exportName() {
+        this.exportName = true;
+        return this;
+    }
+    /**
+     *  Exports bio-entities' type
+     */
+    public AttributeExporter exportType() {
+        this.exportType = true;
+        return this;
+    }
+
+    /**
+     * Exports a node attribute
+     * @param attributeName the name of the attribute
+     * @param values the function that computes the attribute value
+     * @return an instance of the AttributeExporter
+     */
+    public AttributeExporter exportNodeAttribute(String attributeName, Function<BioEntity,Object> values) {
+        nodeExtraAtt.put(attributeName, values);
+        return this;
+    }
+    /**
+     * Exports an edge attribute
+     * @param attributeName the name of the attribute
+     * @param values the function that computes the attribute value
+     * @return an instance of the AttributeExporter
+     */
+    public AttributeExporter exportEdgeAttribute(String attributeName, Function<Edge<?extends BioEntity>,Object> values) {
+        edgeExtraAtt.put(attributeName, values);
+        return this;
+    }
+
+    /*
+     * Creates an attribute object from a value
+     */
+    private Attribute createAttribute(Object value){
+        if(value.getClass().isPrimitive()){
+            if(value instanceof Boolean) return DefaultAttribute.createAttribute((Boolean) value);
+            else if(value instanceof Double) return DefaultAttribute.createAttribute((Double)value);
+            else if(value instanceof Float) return DefaultAttribute.createAttribute((Float)value);
+            else if(value instanceof Integer) return DefaultAttribute.createAttribute((Integer)value);
+            else if(value instanceof Long) return DefaultAttribute.createAttribute((Long)value);
+            else return DefaultAttribute.createAttribute(value.toString());
+        }else{
+            return DefaultAttribute.createAttribute(value.toString());
+        }
+    }
+    /*
+     * Initializes the map to store the node attributes
+     */
+    private Map<String, Attribute> initNodeAtt(BioEntity v){
+        Map<String, Attribute> map = new TreeMap<>();
+        for(Map.Entry<String,Function<BioEntity,Object>> entry : nodeExtraAtt.entrySet()){
+            try{
+                Object value = entry.getValue().apply(v);
+                if(value!=null) map.put(entry.getKey(), createAttribute(value));
+            }catch (Exception e){
+                System.err.println("Error while computing attribute "+entry.getKey()+" for node "+v.getId());
+                e.printStackTrace();
+            }
+        }
+        return map;
+    }
+    /*
+     * Initializes the map to store the edge attributes
+     */
+    private Map<String, Attribute> initEdgeAtt(Edge<? extends BioEntity> e){
+        Map<String, Attribute> map = new TreeMap<>();
+        for(Map.Entry<String,Function<Edge<? extends BioEntity>,Object>> entry : edgeExtraAtt.entrySet()){
+            try{
+                Object value = entry.getValue().apply(e);
+                if(value!=null) map.put(entry.getKey(), createAttribute(value));
+            }catch (Exception ex){
+                System.err.println("Error while computing attribute "+entry.getKey()+" for edge "+e.getV1().getId()+"->"+e.getV2().getId());
+                ex.printStackTrace();
+            }
+        }
+        return map;
+    }
+
+    /**
+     * Function to provide attributes for a compound node
+     */
+    @Setter
+    @Getter
+    public Function<BioMetabolite, Map<String, Attribute>> compoundAttProvider = (v -> {
+        Map<String, Attribute> att = initNodeAtt(v);
+        if(exportName && v.getName()!=null) att.put("Name", DefaultAttribute.createAttribute(v.getName()));
+        if(exportType) att.put("Type",DefaultAttribute.createAttribute("Compound"));
+        if(exportFormula && v.getChemicalFormula()!=null) att.put("Formula", DefaultAttribute.createAttribute(v.getChemicalFormula()));
+        if(exportMass && v.getMolecularWeight()!=null) att.put("Mass", DefaultAttribute.createAttribute(v.getMolecularWeight()));
+        return att;
+    });
+
+    /**
+     * Function to provide attributes for a reaction node
+     */
+    @Setter
+    @Getter
+    public Function<BioReaction, Map<String, Attribute>> reactionAttProvider = (v -> {
+        Map<String, Attribute> att = initNodeAtt(v);
+        if(exportName && v.getName()!=null) att.put("Name", DefaultAttribute.createAttribute(v.getName()));
+        if(exportType) att.put("Type",DefaultAttribute.createAttribute("Reaction"));
+        if(exportReversible && v.isReversible()!=null) att.put("Reversible", DefaultAttribute.createAttribute(v.isReversible()));
+        if(exportEC && v.getEcNumber()!=null) att.put("EC", DefaultAttribute.createAttribute(v.getEcNumber()));
+        return att;
+    });
+
+    /**
+     * Function to provide attributes for a bipartite node
+     */
+    @Setter
+    @Getter
+    public Function<BioEntity, Map<String, Attribute>> bipNodeAttProvider = (v -> {
+        Map<String, Attribute> att = initNodeAtt(v);
+        if (v instanceof BioMetabolite) return compoundAttProvider.apply((BioMetabolite) v);
+        if (v instanceof BioReaction) return reactionAttProvider.apply((BioReaction) v);
+        return att;
+    });
+
+    /**
+     * Function to provide a label for a reaction edge (compound graph)
+     */
+    @Setter
+    @Getter
+    public Function<ReactionEdge, String> reactionEdgeLabelProvider = (e -> {
+        if(e.getReaction()!=null) return e.getReaction().getId(); return "NA";
+    });
+
+    /**
+     * Function to provide a label for a compound edge (reaction graph)
+     */
+    @Setter
+    @Getter
+    public Function<CompoundEdge, String> compoundEdgeLabelProvider = (e -> {
+        if(e.getCompound()!=null) return e.getCompound().getId(); return "NA";
+    });
+
+    /**
+     * Function to provide a label for an edge in a bipartite graph
+     */
+    @Setter
+    @Getter
+    public Function<BipartiteEdge, String> bipEdgeLabelProvider = (e -> e.getV1() instanceof BioReaction ? "product" : "substrate of");
+
+    /**
+     * Function to provide attributes for a reaction edge (compound graph)
+     */
+    @Setter
+    @Getter
+    public Function<ReactionEdge, Map<String, Attribute>> reactionEdgeAttProvider = (e -> {
+        Map<String, Attribute> att  = initEdgeAtt(e);
+        att.put("Name", DefaultAttribute.createAttribute(reactionEdgeLabelProvider.apply(e)));
+        if(e.getReaction()!=null) att.putAll(reactionAttProvider.apply(e.getReaction()));
+        return att;
+    });
+
+    /**
+     * Function to provide attributes for a compound edge (reaction graph)
+     */
+    @Setter
+    @Getter
+    public Function<CompoundEdge, Map<String, Attribute>>compoundEdgeAttProvider = (e -> {
+        Map<String, Attribute> att = initEdgeAtt(e);
+        att.put("Name", DefaultAttribute.createAttribute(compoundEdgeLabelProvider.apply(e)));
+        if(e.getCompound()!=null) att.putAll(compoundAttProvider.apply(e.getCompound()));
+        return att;
+    });
+
+    /**
+     * Function to provide attributes for an edge in a bipartite graph
+     */
+    @Setter
+    @Getter
+    public Function<BipartiteEdge, Map<String, Attribute>>bipEdgeAttProvider = (e -> {
+        Map<String, Attribute> att = initEdgeAtt(e);
+        att.put("Name", DefaultAttribute.createAttribute(bipEdgeLabelProvider.apply(e)));
+        return att;
+    });
+
+
+    /**
+     * Function to provide attributes for a generic node
+     */
+    @Setter
+    @Getter
+    public Function<BioEntity, Map<String, Attribute>> defaultNodeAttProvider =
+         (v -> {
+            Map<String, Attribute> att = initNodeAtt(v);
+            if(v.getName()!=null) att.put("Name", DefaultAttribute.createAttribute(v.getName()));
+            att.put("Type", DefaultAttribute.createAttribute(v.getClass().getSimpleName()));
+            return att;
+        });
+
+
+    /**
+     * Function to provide attributes for a generic edge
+     */
+    @Setter
+    @Getter
+    public Function<Edge<BioEntity>, Map<String, Attribute>> defaultEdgeAttProvider =
+        (e -> {
+            Map<String, Attribute> att = initEdgeAtt(e);
+            att.put("Name", DefaultAttribute.createAttribute(e.toString()));
+            return att;
+        });
+
+    /**
+     * Exports the default attributes (name and type for bioentity as nodes and/or edge attribute, and reversibility for reactions)
+     * @return an instance of the AttributeExporter
+     */
+    public static AttributeExporter minimal(){
+        return new AttributeExporter().exportName().exportType().exportReversible();
+    }
+
+}
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/BioGraph2Sif.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/BioGraph2Sif.java
index 529685f5f2f691791acedc489b574eb0704695f4..243856edc4486d4a5b65080703313e1ed898eede 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/BioGraph2Sif.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/BioGraph2Sif.java
@@ -36,13 +36,13 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph.io;
 
-import java.io.FileWriter;
-import java.io.IOException;
-
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 
+import java.io.FileWriter;
+import java.io.IOException;
+
 /**
  * <p>BioGraph2Sif class.</p>
  *
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/BioGraph2XGMML.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/BioGraph2XGMML.java
index cb0ea59ac37aa44a35487ba358107e8a74cd0e19..1ffdb04959eb69984df5e9f2d578b636d610a0cd 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/BioGraph2XGMML.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/BioGraph2XGMML.java
@@ -34,12 +34,14 @@
  *
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.io;
-import java.io.File;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
+
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteEdge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -49,15 +51,12 @@ import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteEdge;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import java.io.File;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
  
 /**
  * The Class BioGraph2XGMML.
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/Bionetwork2BioGraph.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/Bionetwork2BioGraph.java
index 32f4fe690db7ffe1f0052d6f8e2cea793eed8a46..642578107b750ecebc9e1e1cbca3bb590e2d3414 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/Bionetwork2BioGraph.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/Bionetwork2BioGraph.java
@@ -35,10 +35,11 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.io;
 
-import java.util.*;
-import java.util.stream.Collectors;
-
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.*;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioPathway;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
@@ -47,7 +48,11 @@ import fr.inrae.toulouse.metexplore.met4j_graph.core.pathway.PathwayGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.pathway.PathwayGraphEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.CompoundEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.ReactionGraph;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.stream.Collectors;
 
 
 /**
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/ExportGraph.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/ExportGraph.java
index 06b296ce4c8bfcd36d4d232cf27a3f104e218763..831ee105a36a29c13a3673c87ac1db11ab8efaa4 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/ExportGraph.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/io/ExportGraph.java
@@ -35,562 +35,311 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.io;
 
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.HashMap;
-import java.util.Map;
-
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.*;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
-
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollections;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.pathway.PathwayGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.pathway.PathwayGraphEdge;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.CompoundEdge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.ReactionGraph;
 import org.jgrapht.nio.Attribute;
-import org.jgrapht.nio.DefaultAttribute;
 import org.jgrapht.nio.gml.GmlExporter;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeSet;
+import java.util.function.Function;
 
 /**
- * Export informations from graphs generated from {@link Bionetwork2BioGraph} into Cytoscape-readable files
+ * Export information from graphs generated from {@link Bionetwork2BioGraph} into Cytoscape-readable files
  * @author clement
  * @version $Id: $Id
  */
-public class ExportGraph {
+public class ExportGraph<V extends BioEntity, E extends Edge<V>, G extends BioGraph<V,E>> {
+
+	private final G graph;
+	private final AttributeExporter att;
 
 	/**
 	 * Instantiates a new export graph.
+	 * @param graph the graph to export
 	 */
-	private ExportGraph() {}
-	
-	/**
-	 * Export edge weight in Cytoscape Edge Attribute File
-	 * WARNING: equals sign aren't allowed in node name space
-	 * Use in Cytoscape2:
-	 * File>import>Edge_Attributes...
-	 * @param graph the graph
-	 * @param attName the Name of the attribute represented by weight
-	 * @param outputPath the Path to the output file. Note that standard extension for Cytoscape edge attributes file is .eda
-	 */
-	public static void exportEdgeWeight(CompoundGraph graph, String attName, String outputPath){
-		attName=attName.replaceAll("\\s+", "_");
-		try {	    	
-    		BufferedWriter bw = new BufferedWriter(new FileWriter(outputPath, true));
-    		bw.write(attName+" (class=Double)");
-    		bw.newLine();
-    		for(ReactionEdge e:graph.edgeSet()){
-    			String edgeID = e.getV1().getId()+" ("+ e +") "+e.getV2().getId();
-    			if(edgeID.contains("=")){
-    				bw.close();
-    				throw new IOException("input badly formated : equal sign in namespace");
-    			}
-				String entry=edgeID+" = "+graph.getEdgeWeight(e);
-				bw.write(entry);
-	    		bw.newLine();
-	    	}
-			bw.close();
-		} catch (IOException e1) {
-			e1.printStackTrace();
-		}
+	public ExportGraph(G graph) {
+		this.graph=graph;
+		this.att = new AttributeExporter().exportName().exportType().exportReversible();
 	}
-	
+
 	/**
-	 * Export edge score.
-	 *
-	 * @param graph the graph
-	 * @param attName the attribute name
-	 * @param outputPath the output path
+	 * Instantiates a new export graph.
+	 * @param graph the graph to export
+	 * @param att the object that will provide the attributes to export
 	 */
-	public static void exportEdgeScore(CompoundGraph graph, String attName, String outputPath){
-		attName=attName.replaceAll("\\s+", "_");
-		try {	    	
-    		BufferedWriter bw = new BufferedWriter(new FileWriter(outputPath, true));
-    		bw.write(attName+" (class=Double)");
-    		bw.newLine();
-    		for(ReactionEdge e:graph.edgeSet()){
-    			String edgeID = e.getV1().getId()+" ("+ e +") "+e.getV2().getId();
-    			if(edgeID.contains("=")){
-    				bw.close();
-    				throw new IOException("input badly formated : equal sign in namespace");
-    			}
-    			
-				String entry=edgeID+" = "+graph.getEdgeScore(e);
-				bw.write(entry);
-				bw.newLine();
-				
-	    	}
-			bw.close();
-		} catch (IOException e1) {
-			e1.printStackTrace();
-		}
+	public ExportGraph(G graph, AttributeExporter att) {
+		this.graph=graph;
+		this.att = att;
 	}
-	
+
 	/**
-	 * Export edge attribute.
+	 * Export node in tabular format. Each line is a node, with its identifier as first column,
+	 * and its attributes (if set) as following columns
 	 *
-	 * @param graph the graph
-	 * @param attName the attribute name
-	 * @param outputPath the output path
+	 * @param output the output writer
 	 */
-	public static void exportEdgeAtt(CompoundGraph graph, String attName, String outputPath){
-		attName=attName.replaceAll("\\s+", "_");
-		try {	    	
-    		BufferedWriter bw = new BufferedWriter(new FileWriter(outputPath, true));
-    		bw.write(attName);
-    		bw.newLine();
-    		for(ReactionEdge e:graph.edgeSet()){
-    			String edgeID = e.getV1().getId()+" ("+ e +") "+e.getV2().getId();
-    			if(edgeID.contains("=")){
-    				bw.close();
-    				throw new IOException("input badly formated : equal sign in namespace");
-    			}
-    			
-				String entry=edgeID+" = "+ e.getAttributes().get(attName);
-				bw.write(entry);
-				bw.newLine();
-				
-	    	}
-			bw.close();
-		} catch (IOException e1) {
-			e1.printStackTrace();
+	public void toNodeTab(Writer output){
+		if(graph instanceof CompoundGraph){
+			toNodeTab((CompoundGraph) graph, output, att.compoundAttProvider);
+		} else if (graph instanceof ReactionGraph){
+			toNodeTab((ReactionGraph) graph, output, att.reactionAttProvider);
+		} else if (graph instanceof BipartiteGraph){
+			toNodeTab((BipartiteGraph) graph, output, att.bipNodeAttProvider);
+		} else if (graph != null){
+			toNodeTab((BioGraph<BioEntity, Edge<BioEntity>>) graph, output, att.defaultNodeAttProvider);
 		}
 	}
-	
-	/**
-	 * Export nodes name in Cytoscape Node Attribute File
-	 * WARNING: equals sign aren't allowed in node name space or id
-	 * Use in Cytoscape2:
-	 * File>import>Node_Attributes...
-	 * @param graph the graph
-	 * @param outputPath Path to the output file. Note that standard extension for Cytoscape node attributes file is .noa
-	 */
-	public static void exportNodeName(CompoundGraph graph, String outputPath){
-		try {	    	
-    		BufferedWriter bw = new BufferedWriter(new FileWriter(outputPath, true));
-    		bw.write("Name (class=String)");
-    		bw.newLine();
-    		for(BioMetabolite e:graph.vertexSet()){
-    			String nodeID = e.getId();
-    			String nodeName = e.getName();
-    			if(nodeID.contains("=") || nodeName.contains("=")){
-    				bw.close();
-    				throw new IOException("input badly formated : equal sign in namespace");
-    			}
-				String entry=nodeID+" = "+nodeName;
-				bw.write(entry);
-	    		bw.newLine();
-	    	}
-			bw.close();
-		} catch (IOException e1) {
-			e1.printStackTrace();
-		}
-	}
-	
+
 	/**
-	 * Export node name.
+	 * export graph in GML format
 	 *
-	 * @param bn the bioNetwork
-	 * @param outputPath the output path
+	 * @param output the output writer
 	 */
-	public static void exportNodeName(BioNetwork bn, String outputPath){
-		try {	    	
-    		BufferedWriter bw = new BufferedWriter(new FileWriter(outputPath, true));
-    		bw.write("Name (class=String)");
-    		bw.newLine();
-    		for(BioMetabolite e:bn.getMetabolitesView()){
-    			String nodeID = e.getId();
-    			String nodeName = e.getName();
-    			if(nodeID.contains("=") || nodeName.contains("=")){
-    				bw.close();
-    				throw new IOException("input badly formated : equal sign in namespace");
-    			}
-				String entry=nodeID+" = "+nodeName;
-				bw.write(entry);
-	    		bw.newLine();
-	    	}
-			bw.close();
-		} catch (IOException e1) {
-			e1.printStackTrace();
+	public void toGml(Writer output){
+		if(graph instanceof CompoundGraph){
+			toGml((CompoundGraph) graph, output, att.compoundAttProvider, att.reactionEdgeAttProvider);
+		} else if (graph instanceof ReactionGraph){
+			toGml((ReactionGraph) graph, output, att.reactionAttProvider, att.compoundEdgeAttProvider);
+		} else if (graph instanceof BipartiteGraph){
+			toGml((BipartiteGraph) graph, output, att.bipNodeAttProvider, att.bipEdgeAttProvider);
+		} else if (graph != null){
+			toGml((BioGraph<BioEntity, Edge<BioEntity>>) graph, output, (Function<BioEntity, Map<String, Attribute>>) att.defaultNodeAttProvider, att.defaultEdgeAttProvider);
 		}
 	}
-	
+
 	/**
-	 * Export some edges attributes in tabular format, with Cytoscape-readable ids for mapping
-	 * Format:
-	 * EdgeId	substrateId	substrateName	substrateCompartmnt	reactionId	reactionName	productId	productName	productCompartmnt	EdgeWeight
-	 * Use in Cytoscape2:
-	 * File>import>Attribute_from_Table
-	 * 	Mapping column and attributes' names have to been set manually
-	 * @param graph the graph
-	 * @param outputPath the output path
+	 * export graph in tabulated format : [source_label]\t[edge_label]\t[target_label]
+	 * extra columns are added for edge attributes if set.
+	 * @param output the output writer
 	 */
-	public static void exportEdgeTabular(CompoundGraph graph, String outputPath){
-		try {	    	
-    		BufferedWriter bw = new BufferedWriter(new FileWriter(outputPath, true));
-    		bw.write("CanonicalName\tSubstrateId\tSubstrateName\tSubstrateComp\tReactionId\tReactionName\tProductId\tProductName\tProductComp\tWeight\tScore");
-    		bw.newLine();
-    		for(ReactionEdge e:graph.edgeSet()){
-    			BioReaction r = e.getReaction();
-    			BioCollection<BioReactant> substrates = r.isReversible() ? BioCollections.union(r.getLeftReactantsView(), r.getRightReactantsView()) : r.getLeftReactantsView();
-    			BioCollection<BioReactant> products = r.isReversible() ? BioCollections.union(r.getLeftReactantsView(), r.getRightReactantsView()) : r.getRightReactantsView();
-    			BioMetabolite v1 = e.getV1();
-    			BioMetabolite v2 = e.getV2();
-				String entry=v1.getId()+" ("+ e +") "+v2.getId()+"\t"
-						+v1.getId()+"\t"+v1.getName()+"\t"+substrates.get(v1.getId()).getLocation().getId()+"\t"+ e +"\t"+e.getReaction().getName()+"\t"+e.getV2().getId()+"\t"+e.getV2().getName()+"\t"+products.get(v2.getId()).getLocation().getId()+"\t"+graph.getEdgeWeight(e)+"\t"+graph.getEdgeScore(e);
-				bw.write(entry);
-	    		bw.newLine();
-	    	}
-			bw.close();
-		} catch (IOException e1) {
-			e1.printStackTrace();
+	public void toTab(Writer output){
+//		//TODO switch java 21
+//		switch (graph) {
+//			case CompoundGraph cg -> toTab(cg, outputPath,att.reactionEdgeLabelProvider);
+//			case ReactionGraph rg -> toTab(rg, outputPath,att.compoundEdgeLabelProvider);
+//			case BipartiteGraph bg -> toTab(bg, outputPath,att.bipEdgeLabelProvider);
+//			default -> toTab(graph, outputPath, Edge::toString);
+//		}
+		if(graph instanceof CompoundGraph){
+			toTab((CompoundGraph) graph, output, att.reactionEdgeLabelProvider, att.reactionEdgeAttProvider, att.getEdgeAttributeLabels());
 		}
-	}
-	
-	/**
-	 * Export node in tabular format.
-	 *
-	 * @param graph the graph
-	 * @param outputPath the output path
-	 */
-	public static void exportNodeTabular(CompoundGraph graph, String outputPath){
-		try {	    	
-    		BufferedWriter bw = new BufferedWriter(new FileWriter(outputPath, true));
-    		bw.write("CanonicalName\tName");
-    		bw.newLine();
-    		for(BioMetabolite v : graph.vertexSet()){
-				String entry = v.getId()+"\t"+v.getName();
-				bw.write(entry);
-	    		bw.newLine();
-	    	}
-			bw.close();
-		} catch (IOException e1) {
-			e1.printStackTrace();
+		else if(graph instanceof ReactionGraph){
+			toTab((ReactionGraph) graph, output, att.compoundEdgeLabelProvider, att.compoundEdgeAttProvider, att.getEdgeAttributeLabels());
 		}
-	}
-	
-	/**
-	 * Export node in tabular format.
-	 *
-	 * @param graph the graph
-	 * @param outputPath the output path
-	 * @param weights the weights
-	 */
-	public static void exportNodeTabular(CompoundGraph graph, String outputPath, HashMap<String, Double> weights){
-		try {	    	
-    		BufferedWriter bw = new BufferedWriter(new FileWriter(outputPath, true));
-    		bw.write("CanonicalName\tName\tWeight");
-    		bw.newLine();
-    		for(BioMetabolite v : graph.vertexSet()){
-    			double weight = (weights.get(v.getId())==null) ? 0 : weights.get(v.getId());
-				String entry = v.getId()+"\t"+v.getName()+"\t"+weight;
-				bw.write(entry);
-	    		bw.newLine();
-	    	}
-			bw.close();
-		} catch (IOException e1) {
-			e1.printStackTrace();
+		else if(graph instanceof BipartiteGraph){
+			toTab((BipartiteGraph) graph, output, att.bipEdgeLabelProvider, att.bipEdgeAttProvider, att.getEdgeAttributeLabels());
 		}
-	}
-	
-	/**
-	 * Export jgrapht graph into gml format
-	 *
-	 * @param graph the graph
-	 * @param outputPath the output path
-	 * @param <V> a V object.
-	 * @param <E> a E object.
-	 * @param <G> a G object.
-	 */
-	public static <V extends BioEntity, E extends Edge<V>, G extends BioGraph<V,E>>void toGml(G graph, String outputPath){
-
-		try {
-			GmlExporter<V, E> gml
-				= new GmlExporter<>();
-			gml.setParameter(GmlExporter.Parameter.EXPORT_EDGE_LABELS, true);
-			gml.setParameter(GmlExporter.Parameter.EXPORT_VERTEX_LABELS, true);
-			FileWriter fw = new FileWriter(new File(outputPath).getAbsoluteFile());
-			PrintWriter pw = new PrintWriter(fw);
-			gml.exportGraph(graph, pw);
-			System.out.println(outputPath+" created.");
-		} catch (IOException e) {
-			System.err.println("Error in file export!");
-			e.printStackTrace();
+		else{
+			toTab(graph, output, Edge::toString);
 		}
-	}
-	public static <V extends BioEntity, E extends Edge<V>, G extends BioGraph<V,E>> void toGmlWithAttributes(G graph, String outputPath, Map<V,?> att, String attName){
-		toGmlWithAttributes(graph, outputPath, att, attName,false);
-	}
 
-	public static <V extends BioEntity, E extends Edge<V>, G extends BioGraph<V,E>> void toGmlWithAttributes(G graph, String outputPath, Map<V,?> att, String attName, boolean weight){
-		try {
-			GmlExporter<V, E> gml
-					= new GmlExporter<>();
-			gml.setParameter(GmlExporter.Parameter.EXPORT_EDGE_LABELS, true);
-			gml.setParameter(GmlExporter.Parameter.EXPORT_VERTEX_LABELS, true);
-			gml.setParameter(GmlExporter.Parameter.EXPORT_CUSTOM_VERTEX_ATTRIBUTES, true);
-			gml.setParameter(GmlExporter.Parameter.EXPORT_CUSTOM_EDGE_ATTRIBUTES, true);
-			gml.setVertexAttributeProvider(v -> {
-				Map<String, Attribute> att2 = new HashMap<>();
-				att2.put(attName, DefaultAttribute.createAttribute(att.get(v).toString()));
-				att2.put("Name",DefaultAttribute.createAttribute(v.getName()));
-				return att2;
-			});
-			if(weight){
-				gml.setEdgeAttributeProvider(e -> {
-					Map<String, Attribute> att3 = new HashMap<>();
-					att3.put("Weight", DefaultAttribute.createAttribute(graph.getEdgeWeight(e)));
-					return att3;
-				});
-			}
-
-			FileWriter fw = new FileWriter(new File(outputPath).getAbsoluteFile());
-			PrintWriter pw = new PrintWriter(fw);
-			gml.exportGraph(graph, pw);
-			System.out.println(outputPath+" created.");
-		} catch (IOException e) {
-			System.err.println("Error in file export!");
-			e.printStackTrace();
-		}
 	}
 
 	/**
-	 * Export jgrapht graph into gml format
+	 * export graph in JSONgraph format
 	 *
-	 * @param graph the graph
-	 * @param outputPath the output path
+	 * @param output the output writer
 	 */
-	public static <EdgeNameProvider> void toGmlWithAttributes(CompoundGraph graph, String outputPath){
-		ExportGraph.toGmlWithAttributes(graph, outputPath,false);
-	}
-
-	public static <EdgeNameProvider> void toGmlWithAttributes(CompoundGraph graph, String outputPath, Boolean weight){
-		try {
-			GmlExporter<BioMetabolite, ReactionEdge> gml
-					= new GmlExporter<>();
-			gml.setParameter(GmlExporter.Parameter.EXPORT_EDGE_LABELS, true);
-			gml.setParameter(GmlExporter.Parameter.EXPORT_VERTEX_LABELS, true);
-			gml.setParameter(GmlExporter.Parameter.EXPORT_CUSTOM_EDGE_ATTRIBUTES, true);
-			gml.setParameter(GmlExporter.Parameter.EXPORT_CUSTOM_VERTEX_ATTRIBUTES, true);
-			gml.setVertexAttributeProvider(v -> {
-				Map<String, Attribute> att = new HashMap<>();
-				if(v.getName()!=null) att.put("Name", DefaultAttribute.createAttribute(v.getName()));
-				if(v.getChemicalFormula()!=null) att.put("Formula", DefaultAttribute.createAttribute(v.getChemicalFormula()));
-				if(v.getMolecularWeight()!=null) att.put("Mass", DefaultAttribute.createAttribute(v.getMolecularWeight()));
-				return att;
-			});
-			gml.setEdgeAttributeProvider(e -> {
-				Map<String, Attribute> att = new HashMap<>();
-				if(e.getReaction()!=null && e.getReaction().getName()!=null) att.put("Name", DefaultAttribute.createAttribute(e.getReaction().getName()));
-				if(e.getReaction()!=null && e.getReaction().isReversible()!=null) att.put("Reversible", DefaultAttribute.createAttribute(e.getReaction().isReversible()));
-				if(e.getReaction()!=null && e.getReaction().getEcNumber()!=null) att.put("EC", DefaultAttribute.createAttribute(e.getReaction().getEcNumber()));
-				if(weight) att.put("Weight", DefaultAttribute.createAttribute(graph.getEdgeWeight(e)));
-				return att;
-			});
-			FileWriter fw = new FileWriter(new File(outputPath).getAbsoluteFile());
-			PrintWriter pw = new PrintWriter(fw);
-			gml.exportGraph(graph, pw);
-			System.out.println(outputPath+" created.");
-		} catch (IOException e) {
-			System.err.println("Error in file export!");
-			e.printStackTrace();
+	public void toJSONgraph(Writer output) throws IOException {
+		if(graph instanceof CompoundGraph){
+			toJSONgraph((CompoundGraph) graph, output, att.compoundAttProvider, att.reactionEdgeAttProvider);
+		} else if (graph instanceof ReactionGraph){
+			toJSONgraph((ReactionGraph) graph, output, att.reactionAttProvider, att.compoundEdgeAttProvider);
+		} else if (graph instanceof BipartiteGraph){
+			toJSONgraph((BipartiteGraph) graph, output, att.bipNodeAttProvider, att.bipEdgeAttProvider);
+		} else if (graph != null){
+			toJSONgraph((BioGraph<BioEntity, Edge<BioEntity>>) graph, output, att.defaultNodeAttProvider, att.defaultEdgeAttProvider);
 		}
 	}
 
-	public static <EdgeNameProvider> void toGmlWithAttributes(ReactionGraph graph, String outputPath){
-	ExportGraph.toGmlWithAttributes(graph, outputPath,false);
-	}
 
-	public static <EdgeNameProvider> void toGmlWithAttributes(ReactionGraph graph, String outputPath, Boolean weight){
-		try {
-			GmlExporter<BioReaction, CompoundEdge> gml
-					= new GmlExporter<>();
-			gml.setParameter(GmlExporter.Parameter.EXPORT_EDGE_LABELS, true);
-			gml.setParameter(GmlExporter.Parameter.EXPORT_VERTEX_LABELS, true);
-			gml.setParameter(GmlExporter.Parameter.EXPORT_CUSTOM_EDGE_ATTRIBUTES, true);
-			gml.setParameter(GmlExporter.Parameter.EXPORT_CUSTOM_VERTEX_ATTRIBUTES, true);
-			gml.setVertexAttributeProvider(v -> {
-				Map<String, Attribute> att = new HashMap<>();
-				if(v.getName()!=null) att.put("Name", DefaultAttribute.createAttribute(v.getName()));
-				if(v.isReversible()!=null) att.put("Reversible", DefaultAttribute.createAttribute(v.isReversible()));
-				if(v.getEcNumber()!=null) att.put("EC", DefaultAttribute.createAttribute(v.getEcNumber()));
-				return att;
-			});
-			gml.setEdgeAttributeProvider(e -> {
-				Map<String, Attribute> att = new HashMap<>();
-				if(e.getCompound()!=null && e.getCompound().getName()!=null) att.put("Name", DefaultAttribute.createAttribute(e.getCompound().getName()));
-				if(e.getCompound()!=null && e.getCompound().getChemicalFormula()!=null) att.put("Formula", DefaultAttribute.createAttribute(e.getCompound().getChemicalFormula()));
-				if(e.getCompound()!=null && e.getCompound().getMolecularWeight()!=null) att.put("Mass", DefaultAttribute.createAttribute(e.getCompound().getMolecularWeight()));
-				if(weight) att.put("Weight", DefaultAttribute.createAttribute(graph.getEdgeWeight(e)));
-				return att;
-			});
-			FileWriter fw = new FileWriter(new File(outputPath).getAbsoluteFile());
-			PrintWriter pw = new PrintWriter(fw);
-			gml.exportGraph(graph, pw);
-			System.out.println(outputPath+" created.");
-		} catch (IOException e) {
-			System.err.println("Error in file export!");
-			e.printStackTrace();
-		}
-	}
 
 	/**
-	 * Export bipartite edge.
+	 * Export node in tabular format. Each line is a node, with its identifier as first column,
+	 * and its attributes as following columns
 	 *
-	 * @param bip the bipartite graph
-	 * @param outputPath the output path
+	 * @param <V> node type
+	 * @param <E> edge type
+	 * @param graph the graph
+	 * @param output the output writer
+	 * @param vertexAttProvider a function that takes a node and return a map with each attribute name as key and the attribute value as value.
 	 */
-	public static void exportBipartiteEdge(BipartiteGraph bip, String outputPath){
-		try {	    	
-    		BufferedWriter bw = new BufferedWriter(new FileWriter(outputPath, true));
-//    		bw.write("Reversible");
-    		bw.write("edgeId\tReversible\tSide");
-    		bw.newLine();
-    		for(BipartiteEdge e:bip.edgeSet()){
-    			BioEntity src = e.getV1();
-    			BioEntity trg = e.getV2();
-    			if(!(src==null || trg== null)){
-	    			String interaction = (src instanceof BioReaction) ? "product" : "substrate of";
-	    			String edgeID = src.getId()+" ("+interaction+") "+trg.getId();
-	    			if(edgeID.contains("=")){
-	    				bw.close();
-	    				throw new IOException("input badly formated : equal sign in namespace");
-	    			}
-	    			
-//					String entry=edgeID+" = "+e.isReversible();
-	    			String entry=edgeID+"\t"+e.isReversible()+"\t"+e.isSide();
-					bw.write(entry);
-					bw.newLine();
-    			}
-	    	}
-			bw.close();
+	public static <V extends BioEntity, E extends Edge<V>, G extends BioGraph<V,E>> void toNodeTab(G graph, Writer output, Function<V, Map<String, Attribute>> vertexAttProvider){
+		String sep = "\t";
+		TreeSet<String> attSet = new TreeSet<>();
+		Map<String, Map<String,Attribute>> attMap = new HashMap<>();
+		graph.vertexSet().forEach(v -> attMap.put(v.getId(),vertexAttProvider.apply(v)));
+		attMap.values().forEach(m -> attSet.addAll(m.keySet()));
+		StringBuilder header = new StringBuilder("Node_id").append(sep);
+		int count = 0;
+		for(String att:attSet){
+			header.append(att);
+			count++;
+			if(count!=attSet.size()) header.append(sep);
+		}
+		header.append("\n");
+		try {
+			output.write(header.toString());
+			for(Map.Entry<String,Map<String,Attribute>> v : attMap.entrySet()){
+				StringBuilder line = new StringBuilder(v.getKey()).append(sep);
+				for(String att:attSet){
+					Attribute a = v.getValue().get(att);
+					line.append(a==null ? "NA" : a.getValue()).append(sep);
+				}
+				line.append("\n");
+				output.write(line.toString());
+			}
+			output.close();
 		} catch (IOException e1) {
 			e1.printStackTrace();
 		}
 	}
-	
-	
+
 	/**
-	 * Export bipartite graph node in tabular format.
+	 * Export node in gml format.
 	 *
-	 * @param bip the bipartite graph
-	 * @param outputPath the output path
+	 * @param <V> node type
+	 * @param <E> edge type
+	 * @param graph the graph
+	 * @param output the output writer
+	 * @param vertexAttProvider a function that takes a node and return a map with each attribute name as key and the attribute value as value.
+	 * @param edgeAttProvider a function that takes an edge and return a map with each attribute name as key and the attribute value as value.
 	 */
-	public static void exportBipNodeTabular(BipartiteGraph bip, String outputPath ){
-		
-		BufferedWriter bw = null;
-		try {	    	
-    		bw = new BufferedWriter(new FileWriter(outputPath, true));
-    		bw.write("CanonicalName\tName\tClass");
-    		bw.newLine();
-    		for(BioEntity v : bip.vertexSet()){
-    			String entry=null;
-    			if(v instanceof BioMetabolite){
-    				BioMetabolite e = (BioMetabolite) v;
-//    				boolean side = (graph.hasVertex(v.getId())) ? false : true ;
-    				entry=e.getId()+"\t"+e.getName()+"\tcompound";
-    			}
-    			else if(v instanceof BioReaction){
-    				BioReaction r = (BioReaction) v;
-    				entry=r.getId()+"\t"+r.getName()+"\treaction";
-    			}
-    			if(entry!=null){
-	    			bw.write(entry);
-		    		bw.newLine();
-    			}
-	    	}
-			bw.close();
-		} catch (IOException e1) {
-			e1.printStackTrace();
-		} finally {
-			if (bw != null) {
-				try {
-					bw.close();
-				} catch(Exception e) {
-					e.printStackTrace();
-				}
-			}
-		}
-	}
-	
+	public static <V extends BioEntity, E extends Edge<V>, G extends BioGraph<V,E>> void toGml(G graph, Writer output,  Function<V, Map<String, Attribute>> vertexAttProvider,  Function<E, Map<String, Attribute>> edgeAttProvider){
+        GmlExporter<V, E> gml
+                = new GmlExporter<>();
+        gml.setParameter(GmlExporter.Parameter.EXPORT_EDGE_LABELS, true);
+        gml.setParameter(GmlExporter.Parameter.EXPORT_VERTEX_LABELS, true);
+        if(vertexAttProvider!=null){
+            gml.setParameter(GmlExporter.Parameter.EXPORT_CUSTOM_VERTEX_ATTRIBUTES, true);
+            gml.setVertexAttributeProvider(vertexAttProvider);
+        }
+        if(edgeAttProvider!=null) {
+            gml.setParameter(GmlExporter.Parameter.EXPORT_CUSTOM_EDGE_ATTRIBUTES, true);
+            gml.setEdgeAttributeProvider(edgeAttProvider);
+        }
+        gml.exportGraph(graph, output);
+        System.out.println("GML created.");
+    }
+
+
 	/**
-	 * export graph in tabulated format : [source-label]\t[edge-label]\t[target_label]
+	 * export graph in tabulated format : [source_label]\t[edgeLabel]\t[target_label]
 	 *
-	 * @param cmpdGraph the compound graph
-	 * @param outputPath the output path
+	 * @param <V> node type
+	 * @param <E> edge type
+	 * @param graph the compound graph
+	 * @param output the output writer
+	 * @param interactionProvider a function that takes an edge and return a string characterizing the interaction
 	 */
-	public static void toTab(CompoundGraph cmpdGraph, String outputPath){
-		try {	    	
-    		BufferedWriter bw = new BufferedWriter(new FileWriter(outputPath, true));
-    		bw.write("source\tinteraction\ttarget");
-    		bw.newLine();
-    		for(ReactionEdge e:cmpdGraph.edgeSet()){
-				String entry=e.getV1().getId()+"\t"+e.getReaction().getId()+"\t"+e.getV2().getId();
-				bw.write(entry);
-	    		bw.newLine();
-	    	}
-			bw.close();
-		} catch (IOException e1) {
-			e1.printStackTrace();
-		}
+	public static <V extends BioEntity,E extends Edge<V>> void toTab(BioGraph<V,E> graph, Writer output, Function<E,String> interactionProvider){
+		ExportGraph.toTab(graph, output, interactionProvider, null, null);
 	}
 
 	/**
-	 * export graph in tabulated format : [source-label]\t[edge-label]\t[target_label]
+	 * export graph in tabulated format : [source_label]\t[edgeLabel]\t[target_label]
 	 *
-	 * @param rxnGraph the reaction graph
-	 * @param outputPath the output path
+	 * @param <V> node type
+	 * @param <E> edge type
+	 * @param graph the compound graph
+	 * @param output the output writer
+	 * @param interactionProvider a function that takes an edge and return a string characterizing the interaction
+	 * @param edgeAttProvider a function that takes an edge and return a map with each attribute name as key and the attribute value as value.
+	 * @param edgeAttributes the edge attributes to export. Define the order of the columns in the output file.
 	 */
-	public static void toTab(ReactionGraph rxnGraph, String outputPath){
+	public static <V extends BioEntity,E extends Edge<V>> void toTab(BioGraph<V,E> graph, Writer output, Function<E,String> interactionProvider, Function<E, Map<String, Attribute>> edgeAttProvider, List<String> edgeAttributes){
 		try {
-			BufferedWriter bw = new BufferedWriter(new FileWriter(outputPath, true));
-			bw.write("source\tinteraction\ttarget");
-			bw.newLine();
-			for(CompoundEdge e:rxnGraph.edgeSet()){
-				String entry=e.getV1().getId()+"\t"+e.getCompound().getId()+"\t"+e.getV2().getId();
-				bw.write(entry);
-				bw.newLine();
+			System.err.println("[warning] tabulated format will obfuscate isolated nodes");
+			StringBuilder header = new StringBuilder("source\tinteraction\ttarget");
+			if(edgeAttProvider!=null){
+				for(String att : edgeAttributes){
+					header.append("\t").append(att);
+				}
 			}
-			bw.close();
+			header.append("\n");
+			output.write(header.toString());
+			for(E e: graph.edgeSet()){
+				StringBuilder entry= new StringBuilder(e.getV1().getId() + "\t" + interactionProvider.apply(e) + "\t" + e.getV2().getId());
+				if(edgeAttProvider!=null){
+					Map<String, Attribute> attMap = edgeAttProvider.apply(e);
+					for(String att : edgeAttributes){
+						Attribute val = attMap.get(att);
+						entry.append("\t").append(val==null ? "NA" : val.getValue());
+					}
+				}
+				entry.append("\n");
+				output.write(entry.toString());
+			}
+			output.close();
 		} catch (IOException e1) {
 			e1.printStackTrace();
 		}
 	}
-	
+
+
 	/**
-	 * export bipartite graph in tabulated format : [source-label]\t[edge-label]\t[target_label]
+	 * export graph as JSONgraph
 	 *
-	 * @param bip the bipartite graph
-	 * @param outputPath the output path
+	 * @param graph the bio-graph
+	 * @param output the output writer
+	 * @param vertexAttProvider a function that takes a node and return a map with each attribute name as key and the attribute value as value.
+	 * @param edgeAttProvider a function that takes an edge and return a map with each attribute name as key and the attribute value as value.
+	 * @param <V> node type
+	 * @param <E> edge type
+	 * @throws IOException if unable to create output file
 	 */
-	public static void toTab(BipartiteGraph bip, String outputPath){
-		try {	    	
-    		BufferedWriter bw = new BufferedWriter(new FileWriter(outputPath, true));
-    		bw.write("source\tinteraction\ttarget");
-    		bw.newLine();
-    		for(BipartiteEdge e:bip.edgeSet()){
-    			BioEntity src = e.getV1();
-    			BioEntity trg = e.getV2();
-    			if(!(src==null || trg== null)){
-	    			String interaction = (src instanceof BioReaction) ? "product" : "substrate of";
-					String entry=src.getId()+"\t"+interaction+"\t"+trg.getId();
-					bw.write(entry);
-					bw.newLine();
-    			}
-	    	}
-			bw.close();
-		} catch (IOException e1) {
-			e1.printStackTrace();
-		}
+	public static <V extends BioEntity, E extends Edge<V>> void toJSONgraph(BioGraph<V,E> graph, Writer output, Function<V, Map<String, Attribute>> vertexAttProvider,  Function<E, Map<String, Attribute>> edgeAttProvider) throws IOException {
+		JSONObject jo = new JSONObject();
+			JSONObject jgraph = new JSONObject();
+			jgraph.put("directed",true);
+			jgraph.put("label","Met4J generated "+graph.getClass().getSimpleName());
+			JSONObject jnodes = new JSONObject();
+				for(V node : graph.vertexSet()){
+					JSONObject jnodeAtt = new JSONObject();
+						jnodeAtt.put("label", node.getName());
+						JSONObject jnodeMetadata = new JSONObject();
+							if(vertexAttProvider!=null){
+								for(Map.Entry<String,Attribute> entry : vertexAttProvider.apply(node).entrySet()){
+									jnodeMetadata.put(entry.getKey(),entry.getValue().getValue());
+								}
+							}else{
+								jnodeMetadata.put("type",node.getClass().getSimpleName());
+							}
+						jnodeAtt.put("metadata",jnodeMetadata);
+					jnodes.put(node.getId(),jnodeAtt);
+				}
+			jgraph.put("nodes",jnodes);
+			JSONArray jedges = new JSONArray();
+				for(E edge : graph.edgeSet()){
+					JSONObject jedge = new JSONObject();
+					jedge.put("source",edge.getV1().getId());
+					jedge.put("target",edge.getV2().getId());
+					jedge.put("label",edge.toString());
+					if(vertexAttProvider!=null){
+						JSONObject jnodeMetadata = new JSONObject();
+						for(Map.Entry<String,Attribute> entry : edgeAttProvider.apply(edge).entrySet()){
+							jnodeMetadata.put(entry.getKey(),entry.getValue().getValue());
+						}
+						jedge.put("metadata",jnodeMetadata);
+					}
+					jedges.add(jedge);
+				}
+			jgraph.put("edges",jedges);
+		jo.put("graph", jgraph);
+
+		output.write(jo.toJSONString());
+		output.close();
 	}
 	
 }
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestAStar.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestAStar.java
index c6780e79ac32390c2df1317f98e4e03c8fef6c97..46049455fd5c16fdad00d14f2ddf4161e3a67f20 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestAStar.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestAStar.java
@@ -35,12 +35,8 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.AStar;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.heuristic.ChemicalSimilarityHeuristic;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.SimilarityWeightPolicy;
@@ -49,8 +45,12 @@ import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Test {@link AStar} algorithm
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestBioPath.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestBioPath.java
index 7e794229bac15644a93f66ec97e8aaf384146d39..0343eb20d0b61ede7cfa4a386eccd420d064853f 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestBioPath.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestBioPath.java
@@ -35,20 +35,19 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import static org.junit.Assert.*;
 
 /**
  * The Class TestBioPath.
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestBionetwork2BioGraph.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestBionetwork2BioGraph.java
index 876ce8005d4544636d7fffe2a69dc93697a46f1a..fa0f199b11150062049bcc64d43dd6cd21769739 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestBionetwork2BioGraph.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestBionetwork2BioGraph.java
@@ -36,19 +36,18 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.pathway.PathwayGraph;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.*;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.pathway.PathwayGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.ReactionGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph;
+import static org.junit.Assert.*;
 
 public class TestBionetwork2BioGraph {
 	/** The graph. */
@@ -141,8 +140,6 @@ public class TestBionetwork2BioGraph {
 	@Test
 	public void testGetReactionGraph() {
 		ReactionGraph g = builder.getReactionGraph();
-		System.out.println(g.vertexSet().size());
-		System.out.println(g.getAllEdges(r1,r2));
 		assertEquals("wrong number of vertices",7, g.vertexSet().size());
 		assertEquals("wrong number of edges",9, g.edgeSet().size());
 		assertEquals("wrong in-degree of reaction "+r1.getId(), 1,g.inDegreeOf(r1));
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestBipartiteGraph.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestBipartiteGraph.java
index 087f021ac929c3bf6c2064fdbccb18f3ac171835..2a5cab1acb9c4aca08c424c33faa6cf54d29c474 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestBipartiteGraph.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestBipartiteGraph.java
@@ -36,19 +36,18 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.Set;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.Set;
+
+import static org.junit.Assert.*;
 
 public class TestBipartiteGraph {
 
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestChokePoint.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestChokePoint.java
index e5f82818fac03d3a92215a4eca2476b102ff016a..2e3c704799cac53de1fb105992f3e3b90636d0c5 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestChokePoint.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestChokePoint.java
@@ -36,22 +36,22 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.HashSet;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.ChokePoint;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteEdge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteEdge;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
+import java.util.HashSet;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class TestChokePoint {
 
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestCompoundGraph.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestCompoundGraph.java
index e76de06db5590d8dd2cf69f5bda58be0f7c54c0f..04d29cb10cc7a6dd1efb5954ac209af5c3442c6e 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestCompoundGraph.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestCompoundGraph.java
@@ -36,22 +36,18 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-import java.util.HashSet;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.*;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioPathway;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class TestCompoundGraph {
 
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestCompressedGraph.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestCompressedGraph.java
index 85d93f8d537f470343e3eca91afb0ea88bacc6af..5610360e52a505b759d68eb1f8e94be0b6178535 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestCompressedGraph.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestCompressedGraph.java
@@ -36,22 +36,22 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.ArrayList;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compressed.CompressedGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compressed.PathEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.compressed.CompressedGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.compressed.PathEdge;
+import java.util.ArrayList;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class TestCompressedGraph {
 
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestEdgeMerger.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestEdgeMerger.java
index 3fd51575573e5a1be69ba085c04813eb1c0020f0..05a28e916c10a44201a7eafc69cd03fe0c9394a4 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestEdgeMerger.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestEdgeMerger.java
@@ -39,11 +39,8 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.*;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.EdgeMerger;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.GraphFactory;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.parallel.MergedGraph;
@@ -52,15 +49,10 @@ import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEnzyme;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioProtein;
-
 import java.util.Comparator;
 
+import static org.junit.Assert.assertTrue;
+
 public class TestEdgeMerger {
 	
 	public static CompoundGraph g;
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestEigenVectorCentrality.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestEigenVectorCentrality.java
index b676e4722374939aa4e29d85f0e4061097bd54dd..3ed50b6ac23857d157256a56d2eaae7526c61a5a 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestEigenVectorCentrality.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestEigenVectorCentrality.java
@@ -35,21 +35,20 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-import java.util.HashSet;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.centrality.EigenVectorCentrality;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.utils.ComputeAdjacencyMatrix;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
+import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
-import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import static org.junit.Assert.assertArrayEquals;
 
 
 /**
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestExportGraph.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestExportGraph.java
new file mode 100644
index 0000000000000000000000000000000000000000..7e67f9c8ce97dcd0f3eaec35b131f10b185342bf
--- /dev/null
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestExportGraph.java
@@ -0,0 +1,594 @@
+package fr.inrae.toulouse.metexplore.met4j_graph;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.*;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteEdge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.pathway.PathwayGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.pathway.PathwayGraphEdge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.CompoundEdge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.ReactionGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.io.AttributeExporter;
+import fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.io.ExportGraph;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.*;
+
+public class TestExportGraph {
+
+    /** The graph. */
+    public static BioNetwork bn;
+    public static CompoundGraph cg;
+    public static BipartiteGraph bg;
+    public static ReactionGraph rg;
+    public static PathwayGraph pg;
+
+    /** The nodes. */
+    public static BioMetabolite a,b,c,d,e,f,h;
+
+    /** The edges. */
+    public static BioReaction r1,r2,r3,r4,r5,r6,r7;
+
+    /** The pathways */
+    public static BioPathway p1,p2,p3,p4;
+
+    /** The compartment */
+    public static BioCompartment comp;
+    /**
+     * Inits the graph.
+     */
+    @BeforeClass
+    public static void init(){
+        bn = new BioNetwork();
+        comp = new BioCompartment("comp"); bn.add(comp);
+
+        a = new BioMetabolite("a","1"); bn.add(a);bn.affectToCompartment(comp, a); a.setMolecularWeight(1.1);a.setChemicalFormula("BaCoN");
+        b = new BioMetabolite("b","2"); bn.add(b);bn.affectToCompartment(comp, b); b.setMolecularWeight(2.2);b.setChemicalFormula("BaCoN");
+        c = new BioMetabolite("c","3"); bn.add(c);bn.affectToCompartment(comp, c); c.setMolecularWeight(3.3);c.setChemicalFormula("BaCoN");
+        d = new BioMetabolite("d","4"); bn.add(d);bn.affectToCompartment(comp, d); d.setMolecularWeight(4.4);d.setChemicalFormula("BaCoN");
+        e = new BioMetabolite("e","5"); bn.add(e);bn.affectToCompartment(comp, e); e.setMolecularWeight(5.5);e.setChemicalFormula("BaCoN");
+        f = new BioMetabolite("f","6"); bn.add(f);bn.affectToCompartment(comp, f); f.setMolecularWeight(6.6);f.setChemicalFormula("BaCoN");
+        h = new BioMetabolite("h","7"); bn.add(h);bn.affectToCompartment(comp, h); h.setMolecularWeight(7.7);h.setChemicalFormula("BaCoN");
+
+        p1= new BioPathway("p1"); bn.add(p1);
+        p2= new BioPathway("p2"); bn.add(p2);
+        p3= new BioPathway("p3"); bn.add(p3);
+        p4= new BioPathway("p4"); bn.add(p4);
+
+        r1 = new BioReaction("r1","1"); bn.add(r1);
+        bn.affectLeft(r1, 1.0, comp, a);
+        bn.affectRight(r1, 1.0, comp, b);
+        bn.affectRight(r1, 1.0, comp, h);
+        r1.setReversible(false); r1.setEcNumber("EC:1");
+        bn.affectToPathway(p1, r1);
+        r2 = new BioReaction("r2","2");  bn.add(r2);
+        bn.affectLeft(r2, 1.0, comp, b);
+        bn.affectLeft(r2, 1.0, comp, d);
+        bn.affectLeft(r2, 1.0, comp, h);
+        bn.affectRight(r2, 1.0, comp, c);
+        r2.setReversible(false); r2.setEcNumber("EC:2");
+        bn.affectToPathway(p4, r2);
+        r3 = new BioReaction("r3","3");  bn.add(r3);
+        bn.affectLeft(r3, 1.0, comp, e);
+        bn.affectRight(r3, 1.0, comp, b);
+        r3.setReversible(true); r3.setEcNumber("EC:3");
+        bn.affectToPathway(p1, r3);
+        bn.affectToPathway(p3, r3);
+        r4 = new BioReaction("r4","4");  bn.add(r4);
+        bn.affectLeft(r4, 1.0, comp, e);
+        bn.affectRight(r4, 1.0, comp, c);
+        bn.affectRight(r4, 1.0, comp, f);
+        r4.setReversible(false); r4.setEcNumber("EC:4");
+        bn.affectToPathway(p3, r4);
+        r5 = new BioReaction("r5","5");  bn.add(r5);
+        bn.affectLeft(r5, 1.0, comp, a);
+        bn.affectRight(r5, 1.0, comp, e);
+        r5.setReversible(true); r5.setEcNumber("EC:5");
+        bn.affectToPathway(p3, r5);
+        r6 = new BioReaction("r6","6");  bn.add(r6);
+        bn.affectLeft(r6, 1.0, comp, d);
+        bn.affectRight(r6, 1.0, comp, f);
+        r6.setReversible(false); r6.setEcNumber("EC:6");
+        //not in any pathway
+        r7 = new BioReaction("r7","7");  bn.add(r7);
+        bn.affectLeft(r7, 1.0, comp, d);
+        bn.affectRight(r7, 1.0, comp, f);
+        r7.setReversible(false); r7.setEcNumber("EC:7");
+        bn.affectToPathway(p2, r7);
+
+        try{
+            Bionetwork2BioGraph builder = new Bionetwork2BioGraph(bn);
+            cg = builder.getCompoundGraph();
+            bg = builder.getBipartiteGraph();
+            rg = builder.getReactionGraph();
+            pg = builder.getPathwayGraph();
+
+        }catch(Exception e){
+            fail("error while creating reaction graph builder");
+        }
+    }
+
+
+//-------------------------------------------
+    @Test
+    public void testCompoundGraph2Tab() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioMetabolite, ReactionEdge, CompoundGraph> export = new ExportGraph<>(cg);
+        export.toTab(w);
+        String output = w.toString();
+        ArrayList<String> lines = new ArrayList<>(Arrays.asList(output.split("\\n")));
+
+        String header = lines.remove(0);;
+        assertEquals("wrong header","source\tinteraction\ttarget",header);
+
+        HashSet<String> nodes = new HashSet<>();
+        for(String line : lines){
+           String[] column = line.split("\t");
+           assertEquals("wrong number of columns",3, column.length);
+           nodes.add(column[0]);
+           nodes.add(column[2]);
+        }
+
+        int nbNodes = nodes.size();
+        int nbEdges = lines.size();
+        assertEquals("wrong number of edges",13, nbEdges);
+        assertEquals("wrong number of nodes",7, nbNodes);
+    }
+    @Test
+    public void testCompoundGraph2nodeList() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioMetabolite, ReactionEdge, CompoundGraph> export = new ExportGraph<>(cg);
+        export.toNodeTab(w);
+        String output = w.toString();
+        ArrayList<String> lines = new ArrayList<>(Arrays.asList(output.split("\\n")));
+
+        String header = lines.remove(0);;
+        assertEquals("wrong header","Node_id\tName\tType",header);
+
+        for(String line : lines){
+            String[] column = line.split("\t");
+            assertEquals("wrong number of columns",3, column.length);
+            assertEquals("wrong type","Compound", column[2]);
+        }
+
+        int nbNodes = lines.size();
+        assertEquals("wrong number of nodes",7, nbNodes);
+    }
+    @Test
+    public void testCompoundGraph2gml() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioMetabolite, ReactionEdge, CompoundGraph> export = new ExportGraph<>(cg);
+        export.toGml(w);
+        String output = w.toString();
+
+        Pattern nodeRegex = Pattern.compile("node\n?\\s*\\[");
+        Pattern edgeRegex = Pattern.compile("edge\n?\\s*\\[");
+
+        long nbNodes = nodeRegex.matcher(output).results().count();
+        long nbEdges = edgeRegex.matcher(output).results().count();
+        assertEquals("wrong number of edges",13, nbEdges);
+        assertEquals("wrong number of nodes",7, nbNodes);
+    }
+    @Test
+    public void testCompoundGraph2json() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioMetabolite, ReactionEdge, CompoundGraph> export = new ExportGraph<>(cg);
+        try {
+            export.toJSONgraph(w);
+        } catch (IOException ex) {
+            fail("error while exporting to json");
+        }
+        JsonObject output = JsonParser.parseString(w.toString()).getAsJsonObject();
+
+        JsonObject graph = output.getAsJsonObject("graph");
+        assertNotNull("graph from json is null", graph);
+
+        long nbNodes = graph.getAsJsonObject("nodes").size();
+        long nbEdges = graph.getAsJsonArray("edges").size();
+        assertEquals("wrong number of edges",13, nbEdges);
+        assertEquals("wrong number of nodes",7, nbNodes);
+
+    }
+//-------------------------------------------
+    @Test
+    public void testBipartiteGraph2Tab() {
+
+        StringWriter w = new StringWriter();
+        ExportGraph<BioEntity, BipartiteEdge, BipartiteGraph> export = new ExportGraph<>(bg);
+        export.toTab(w);
+        String output = w.toString();
+        ArrayList<String> lines = new ArrayList<>(Arrays.asList(output.split("\\n")));
+
+        String header = lines.remove(0);;
+        assertEquals("wrong header","source\tinteraction\ttarget",header);
+
+        HashSet<String> nodes = new HashSet<>();
+        for(String line : lines){
+            String[] column = line.split("\t");
+            assertEquals("wrong number of columns",3, column.length);
+            nodes.add(column[0]);
+            nodes.add(column[2]);
+        }
+
+        int nbNodes = nodes.size();
+        int nbEdges = lines.size();
+        assertEquals("wrong number of edges",22, nbEdges);
+        assertEquals("wrong number of nodes",14, nbNodes);
+    }
+    @Test
+    public void testBipartiteGraph2nodeList() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioEntity, BipartiteEdge, BipartiteGraph> export = new ExportGraph<>(bg);
+        export.toNodeTab(w);
+        String output = w.toString();
+        ArrayList<String> lines = new ArrayList<>(Arrays.asList(output.split("\\n")));
+
+        String header = lines.remove(0);;
+        assertEquals("wrong header","Node_id\tName\tReversible\tType",header);
+
+        for(String line : lines){
+            String[] column = line.split("\t");
+            assertEquals("wrong number of columns",4, column.length);
+            assertTrue("wrong type",column[3].equals("Compound") || column[3].equals("Reaction"));
+        }
+
+        int nbNodes = lines.size();
+        assertEquals("wrong number of nodes",14, nbNodes);
+    }
+    @Test
+    public void testBipartiteGraph2gml() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioEntity, BipartiteEdge, BipartiteGraph> export = new ExportGraph<>(bg);
+        export.toGml(w);
+        String output = w.toString();
+
+        Pattern nodeRegex = Pattern.compile("node\n?\\s*\\[");
+        Pattern edgeRegex = Pattern.compile("edge\n?\\s*\\[");
+
+        long nbNodes = nodeRegex.matcher(output).results().count();
+        long nbEdges = edgeRegex.matcher(output).results().count();
+        assertEquals("wrong number of edges",22, nbEdges);
+        assertEquals("wrong number of nodes",14, nbNodes);
+    }
+    @Test
+    public void testBipartiteGraph2json() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioEntity, BipartiteEdge, BipartiteGraph> export = new ExportGraph<>(bg);
+        try {
+            export.toJSONgraph(w);
+        } catch (IOException ex) {
+            fail("error while exporting to json");
+        }
+        JsonObject output = JsonParser.parseString(w.toString()).getAsJsonObject();
+
+        JsonObject graph = output.getAsJsonObject("graph");
+        assertNotNull("graph from json is null", graph);
+
+        long nbNodes = graph.getAsJsonObject("nodes").size();
+        long nbEdges = graph.getAsJsonArray("edges").size();
+        assertEquals("wrong number of edges",22, nbEdges);
+        assertEquals("wrong number of nodes",14, nbNodes);
+    }
+//-------------------------------------------
+    @Test
+    public void testReactionGraph2Tab() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioReaction, CompoundEdge, ReactionGraph> export = new ExportGraph<>(rg);
+        export.toTab(w);
+        String output = w.toString();
+        ArrayList<String> lines = new ArrayList<>(Arrays.asList(output.split("\\n")));
+
+        String header = lines.remove(0);;
+        assertEquals("wrong header","source\tinteraction\ttarget",header);
+
+        HashSet<String> nodes = new HashSet<>();
+        for(String line : lines){
+            String[] column = line.split("\t");
+            assertEquals("wrong number of columns",3, column.length);
+            nodes.add(column[0]);
+            nodes.add(column[2]);
+        }
+
+        int nbNodes = nodes.size();
+        int nbEdges = lines.size();
+        assertEquals("wrong number of edges",9, nbEdges);
+        assertEquals("wrong number of nodes",5, nbNodes); //two isolated node not represented
+    }
+    @Test
+    public void testReactionGraph2nodeList() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioReaction, CompoundEdge, ReactionGraph> export = new ExportGraph<>(rg);
+        export.toNodeTab(w);
+        String output = w.toString();
+        ArrayList<String> lines = new ArrayList<>(Arrays.asList(output.split("\\n")));
+
+        String header = lines.remove(0);;
+        assertEquals("wrong header","Node_id\tName\tReversible\tType",header);
+
+        for(String line : lines){
+            String[] column = line.split("\t");
+            assertEquals("wrong number of columns",4, column.length);
+            assertTrue("wrong type",column[3].equals("Reaction"));
+        }
+
+        int nbNodes = lines.size();
+        assertEquals("wrong number of nodes",7, nbNodes);
+    }
+    @Test
+    public void testReactionGraph2gml() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioReaction, CompoundEdge, ReactionGraph> export = new ExportGraph<>(rg);
+        export.toGml(w);
+        String output = w.toString();
+
+        Pattern nodeRegex = Pattern.compile("node\n?\\s*\\[");
+        Pattern edgeRegex = Pattern.compile("edge\n?\\s*\\[");
+
+        long nbNodes = nodeRegex.matcher(output).results().count();
+        long nbEdges = edgeRegex.matcher(output).results().count();
+        assertEquals("wrong number of edges",9, nbEdges);
+        assertEquals("wrong number of nodes",7, nbNodes);
+    }
+    @Test
+    public void testReactionGraph2json() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioReaction, CompoundEdge, ReactionGraph> export = new ExportGraph<>(rg);
+        try {
+            export.toJSONgraph(w);
+        } catch (IOException ex) {
+            fail("error while exporting to json");
+        }
+        JsonObject output = JsonParser.parseString(w.toString()).getAsJsonObject();
+
+        JsonObject graph = output.getAsJsonObject("graph");
+        assertNotNull("graph from json is null", graph);
+
+        long nbNodes = graph.getAsJsonObject("nodes").size();
+        long nbEdges = graph.getAsJsonArray("edges").size();
+        assertEquals("wrong number of edges",9, nbEdges);
+        assertEquals("wrong number of nodes",7, nbNodes);
+    }
+
+//-------------------------------------------
+    @Test
+    public void testPathwayGraph2Tab() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioPathway, PathwayGraphEdge, PathwayGraph> export = new ExportGraph<>(pg);
+        export.toTab(w);
+        String output = w.toString();
+        ArrayList<String> lines = new ArrayList<>(Arrays.asList(output.split("\\n")));
+
+        String header = lines.remove(0);;
+        assertEquals("wrong header","source\tinteraction\ttarget",header);
+
+        HashSet<String> nodes = new HashSet<>();
+        for(String line : lines){
+            String[] column = line.split("\t");
+            assertEquals("wrong number of columns",3, column.length);
+            nodes.add(column[0]);
+            nodes.add(column[2]);
+        }
+
+        int nbNodes = nodes.size();
+        int nbEdges = lines.size();
+        assertEquals("wrong number of edges",3, nbEdges);
+        assertEquals("wrong number of nodes",3, nbNodes);//one isolated node not represented
+    }
+    @Test
+    public void testPathwayGraph2nodeList() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioPathway, PathwayGraphEdge, PathwayGraph> export = new ExportGraph<>(pg);
+        export.toNodeTab(w);
+        String output = w.toString();
+        ArrayList<String> lines = new ArrayList<>(Arrays.asList(output.split("\\n")));
+
+        String header = lines.remove(0);;
+        assertEquals("wrong header","Node_id\tName\tType",header);
+
+        for(String line : lines){
+            String[] column = line.split("\t");
+            assertEquals("wrong number of columns",3, column.length);
+            assertTrue("wrong type",column[2].equals("BioPathway"));
+        }
+
+        int nbNodes = lines.size();
+        assertEquals("wrong number of nodes",4, nbNodes);
+    }
+    @Test
+    public void testPathwayGraph2gml() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioPathway, PathwayGraphEdge, PathwayGraph> export = new ExportGraph<>(pg);
+        export.toGml(w);
+        String output = w.toString();
+
+        Pattern nodeRegex = Pattern.compile("node\n?\\s*\\[");
+        Pattern edgeRegex = Pattern.compile("edge\n?\\s*\\[");
+
+        long nbNodes = nodeRegex.matcher(output).results().count();
+        long nbEdges = edgeRegex.matcher(output).results().count();
+        assertEquals("wrong number of edges",3, nbEdges);
+        assertEquals("wrong number of nodes",4, nbNodes);
+    }
+    @Test
+    public void testPathwayGraph2json() {
+        StringWriter w = new StringWriter();
+        ExportGraph<BioPathway, PathwayGraphEdge, PathwayGraph> export = new ExportGraph<>(pg);
+        try {
+            export.toJSONgraph(w);
+        } catch (IOException ex) {
+            fail("error while exporting to json");
+        }
+        JsonObject output = JsonParser.parseString(w.toString()).getAsJsonObject();
+
+        JsonObject graph = output.getAsJsonObject("graph");
+        assertNotNull("graph from json is null", graph);
+
+        long nbNodes = graph.getAsJsonObject("nodes").size();
+        long nbEdges = graph.getAsJsonArray("edges").size();
+        assertEquals("wrong number of edges",3, nbEdges);
+        assertEquals("wrong number of nodes",4, nbNodes);
+    }
+//----------------------------------------------------------------------
+    @Test
+    public void testGraph2TabAtt() {
+        StringWriter w = new StringWriter();
+        AttributeExporter attExport = AttributeExporter.minimal()
+                .exportEC()
+                .exportMass()
+                .exportFormula()
+                .exportEdgeAttribute("test", e -> e.getV1().getId())
+                .exportNodeAttribute("test2", BioEntity::getName);
+        ExportGraph export = new ExportGraph<>(bg, attExport);
+        export.toTab(w);
+        String output = w.toString();
+        ArrayList<String> lines = new ArrayList<>(Arrays.asList(output.split("\\n")));
+
+        String header = lines.remove(0);;
+        assertEquals("wrong Bipartite header","source\tinteraction\ttarget\ttest",header);
+
+        for(String line : lines){
+            String[] column = line.split("\t");
+            assertEquals("wrong number of Bipartite columns",4, column.length);
+            assertEquals(column[3], column[0]);
+        }
+    }
+
+    @Test
+    public void testGraph2nodeListAtt() {
+        StringWriter w = new StringWriter();
+        AttributeExporter attExport = AttributeExporter.minimal()
+                .exportEC()
+                .exportMass()
+                .exportFormula()
+                .exportEdgeAttribute("Test", e -> e.getV1().getId())
+                .exportNodeAttribute("Test2", BioEntity::getName);
+
+        // bipartite graph
+        ExportGraph export = new ExportGraph<>(bg, attExport);
+        export.toNodeTab(w);
+        String output = w.toString();
+        ArrayList<String> lines = new ArrayList<>(Arrays.asList(output.split("\\n")));
+
+        String header = lines.remove(0);;
+        assertEquals("wrong Bipartite header","Node_id\tEC\tFormula\tMass\tName\tReversible\tTest2\tType",header);
+
+        for(String line : lines){
+            String[] column = line.split("\t");
+            assertEquals("wrong number of Bipartite columns",8, column.length);
+            assertEquals(column[6], column[4]);
+            if(column[7].equals("Compound")){
+                assertEquals("wrong Bipartite formula","BaCoN", column[2]);
+                assertEquals("wrong Bipartite mass",column[4]+"."+column[4], column[3]);
+                assertEquals("wrong Bipartite EC number","NA", column[1]);
+            }else{
+                assertEquals("wrong Bipartite formula","NA", column[2]);
+                assertEquals("wrong Bipartite mass","NA", column[3]);
+                assertEquals("wrong Bipartite EC","EC:"+column[4], column[1]);
+            }
+        }
+
+        // reaction graph
+        export = new ExportGraph<>(rg, attExport);
+        w = new StringWriter();
+        export.toNodeTab(w);
+        output = w.toString();
+        lines = new ArrayList<>(Arrays.asList(output.split("\\n")));
+
+        header = lines.remove(0);;
+        assertEquals("wrong Reaction header","Node_id\tEC\tName\tReversible\tTest2\tType",header);
+
+        for(String line : lines){
+            String[] column = line.split("\t");
+            assertEquals("wrong number of Reaction columns",6, column.length);
+            assertEquals(column[2], column[4]);
+            assertEquals("wrong Reaction type","Reaction",column[5]);
+            assertEquals("wrong Reaction EC","EC:"+column[4], column[1]);
+        }
+    }
+
+    @Test
+    public void testGraph2gmlAtt() {
+        StringWriter w = new StringWriter();
+        AttributeExporter attExport = AttributeExporter.minimal()
+                .exportEC()
+                .exportMass()
+                .exportFormula()
+                .exportEdgeAttribute("Test", e -> e.getV1().getId())
+                .exportNodeAttribute("Test2", BioEntity::getName);
+        ExportGraph<BioEntity, BipartiteEdge, BipartiteGraph> export = new ExportGraph<>(bg, attExport);
+        export.toGml(w);
+        String output = w.toString();
+
+        //EC	Formula	Mass	Name	Reversible	Test2	Type
+        Pattern ECAttRegex = Pattern.compile("EC\\s+\"EC:[0-9]\"");
+        Pattern FormulaAttRegex = Pattern.compile("Formula \"BaCoN\"");
+        Pattern MassAttRegex = Pattern.compile("Mass [0-9]+\\.[0-9]+");
+        Pattern NameAttRegex = Pattern.compile("Name\\s+\"\\w\"");
+        Pattern ReversibleAttRegex = Pattern.compile("Reversible\\s+\"(true|false)\"");
+        Pattern Test2AttRegex = Pattern.compile("Test2\\s+\"\\w\"");
+        Pattern TestAttRegex = Pattern.compile("Test\\s+\"[a-z][0-9]?\"");
+        Pattern TypeAttRegex = Pattern.compile("Type\\s+\"(Compound|Reaction)\"");
+
+
+        assertEquals("anomaly in Bipartite EC attributes",7, ECAttRegex.matcher(output).results().count());
+        assertEquals("anomaly in Bipartite Formula attributes",7, FormulaAttRegex.matcher(output).results().count());
+        assertEquals("anomaly in Bipartite mass attributes",7, MassAttRegex.matcher(output).results().count());
+        assertEquals("anomaly in Bipartite name attributes",14, NameAttRegex.matcher(output).results().count());
+        assertEquals("anomaly in Bipartite reversibility attributes",7, ReversibleAttRegex.matcher(output).results().count());
+        assertEquals("anomaly in Bipartite test attributes",14, Test2AttRegex.matcher(output).results().count());
+        assertEquals("anomaly in Bipartite test attributes",22, TestAttRegex.matcher(output).results().count());
+        assertEquals("anomaly in Bipartite type attributes",14, TypeAttRegex.matcher(output).results().count());
+    }
+
+
+    @Test
+    public void testGraph2jsonAtt() {
+        StringWriter w = new StringWriter();
+        AttributeExporter attExport = AttributeExporter.minimal()
+                .exportEC()
+                .exportMass()
+                .exportFormula()
+                .exportEdgeAttribute("Test", e -> e.getV1().getId())
+                .exportNodeAttribute("Test2", BioEntity::getName);
+        ExportGraph<BioEntity, BipartiteEdge, BipartiteGraph> export = new ExportGraph<>(bg, attExport);
+        try {
+            export.toJSONgraph(w);
+            String output = w.toString();
+
+            //EC	Formula	Mass	Name	Reversible	Test2	Type
+            Pattern ECAttRegex = Pattern.compile("\"EC\":\"EC:[0-9]\"");
+            Pattern FormulaAttRegex = Pattern.compile("\"Formula\":\"BaCoN\"");
+            Pattern MassAttRegex = Pattern.compile("\"Mass\":\"[0-9]+\\.[0-9]+\"");
+            Pattern NameAttRegex = Pattern.compile("\"Name\":\"\\w\"");
+            Pattern ReversibleAttRegex = Pattern.compile("\"Reversible\":\"(true|false)\"");
+            Pattern Test2AttRegex = Pattern.compile("\"Test2\":\"\\w\"");
+            Pattern TestAttRegex = Pattern.compile("\"Test\":\"[a-z][0-9]?\"");
+            Pattern TypeAttRegex = Pattern.compile("\"Type\":\"(Compound|Reaction)\"");
+
+
+            assertEquals("anomaly in Bipartite EC attributes",7, ECAttRegex.matcher(output).results().count());
+            assertEquals("anomaly in Bipartite Formula attributes",7, FormulaAttRegex.matcher(output).results().count());
+            assertEquals("anomaly in Bipartite mass attributes",7, MassAttRegex.matcher(output).results().count());
+            assertEquals("anomaly in Bipartite name attributes",14, NameAttRegex.matcher(output).results().count());
+            assertEquals("anomaly in Bipartite reversibility attributes",7, ReversibleAttRegex.matcher(output).results().count());
+            assertEquals("anomaly in Bipartite test attributes",14, Test2AttRegex.matcher(output).results().count());
+            assertEquals("anomaly in Bipartite test attributes",22, TestAttRegex.matcher(output).results().count());
+            assertEquals("anomaly in Bipartite type attributes",14, TypeAttRegex.matcher(output).results().count());
+        } catch (IOException ex) {
+           fail("error while exporting to json");
+        }
+    }
+
+}
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphFactory.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphFactory.java
index e901122c34e6d65150912387aa92c9dbba248b8c..b29c338be7dfa6cee12780392fc74a57032319e3 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphFactory.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphFactory.java
@@ -36,11 +36,10 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.GraphFactory;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
@@ -48,10 +47,11 @@ import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import java.util.ArrayList;
+import java.util.HashSet;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class TestGraphFactory {
 	
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphFilter.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphFilter.java
index 4c73fdbd9762e50c46c77e51b4ae477032d59bbc..a807e92e910fdf9445d42f73bc5be11e385d030e 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphFilter.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphFilter.java
@@ -35,20 +35,19 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.HashSet;
-import java.util.Set;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.GraphFilter;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.GraphFilter;
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
 /**
  * The Class TestGraphFilter.
  * @author clement
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphLocalMeasure.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphLocalMeasure.java
index 3d00518282bb8451c1da540568caae2e5a33ff31..8c76e7687ed0b4a4ab636ce4994ee438d8c736dd 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphLocalMeasure.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphLocalMeasure.java
@@ -36,16 +36,15 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphLocalMeasure;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import static org.junit.Assert.assertEquals;
 
 public class TestGraphLocalMeasure {
 	
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphMeasure.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphMeasure.java
index 8acae167f639e64e9db8999c09eab315873bbc9f..390f76baf167880c383bc75a1a2c51a07ad65dee 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphMeasure.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphMeasure.java
@@ -35,16 +35,15 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphMeasure;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import static org.junit.Assert.*;
 
 /**
  * Test {@link GraphMeasure}
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphOperation.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphOperation.java
index 43186994ab2a395d7f0563727db100a92b6c71b7..875e11e1f7a710b5a726812e197974f4c815f1f9 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphOperation.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphOperation.java
@@ -35,18 +35,18 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.Arrays;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.GraphOperation;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import java.util.Arrays;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 /**
  *  Test {@link GraphOperation}
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphPruning.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphPruning.java
index ea5e8dac7822d6acc31c6f69d7468365c3d3b9af..926a64ac80bdeabee8545104c4f33fe6e4531b67 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphPruning.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphPruning.java
@@ -44,7 +44,8 @@ import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.ReactionGraph;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class TestGraphPruning {
 
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphSampler.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphSampler.java
index a2099d6ed76a565890ff9e79e241b1bdb0546c8a..9f89ed27057734755aaac7b7194207676c8300a6 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphSampler.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphSampler.java
@@ -36,22 +36,21 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.Set;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.utils.GraphSampler;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
+import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
+import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.EjmlMatrix;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
-import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
-import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.EjmlMatrix;
+import java.util.Set;
+
+import static org.junit.Assert.*;
 
 public class TestGraphSampler {
 	
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphSimilarity.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphSimilarity.java
index 4426d83f7d57670f19b900b92d6cf7eecb0a971d..ed4143bb0bf91eb80239719a9349bed5806e6a3f 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphSimilarity.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestGraphSimilarity.java
@@ -36,16 +36,15 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphSimilarity;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import static org.junit.Assert.assertEquals;
 
 public class TestGraphSimilarity {
 	
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestLoadPoint.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestLoadPoint.java
index be5962984ad1d73028f9057cf55e3d2be9ccf5e9..4c499258075e02f72e3f115935efdc7b5d13ae22 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestLoadPoint.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestLoadPoint.java
@@ -36,18 +36,17 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.Map;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.LoadPoint;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
 
 public class TestLoadPoint {
 
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestMatrix.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestMatrix.java
index 01f657e3cfb69384a65fe74c53c55d894be9fa5f..2f63f6ae9a73e006d2f8434540eb85c0253ad64b 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestMatrix.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestMatrix.java
@@ -35,7 +35,18 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.utils.ComputeAdjacencyMatrix;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
+import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
+import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.EjmlMatrix;
+import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.ExportMatrix;
+import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.MtjMatrix;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -45,19 +56,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Map;
 
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.utils.ComputeAdjacencyMatrix;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
-import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
-import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.EjmlMatrix;
-import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.ExportMatrix;
-import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.MtjMatrix;
+import static org.junit.Assert.*;
 
 /**
  * The Matrix related classes : {@link ExportMatrix}, {@link ComputeAdjacencyMatrix}, {@link BioMatrix}
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestMergedGraph.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestMergedGraph.java
index 950485b0bd0f30501002f419343e24e00434f13a..0e0c55e41186bcba8b2f746da57b5cfe0de64ed3 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestMergedGraph.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestMergedGraph.java
@@ -36,10 +36,10 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.HashSet;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.parallel.MergedGraph;
@@ -47,10 +47,10 @@ import fr.inrae.toulouse.metexplore.met4j_graph.core.parallel.MetaEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import java.util.HashSet;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class TestMergedGraph {
 
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestPathBasedCentrality.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestPathBasedCentrality.java
index c142af5e04004e8129d3acd90469d74a4a013e71..d71d5af3119cf27141c501aefdebddcafb2f54dc 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestPathBasedCentrality.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestPathBasedCentrality.java
@@ -36,20 +36,20 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.Map;
-
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.FloydWarshall;
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.centrality.PathBasedCentrality;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphMeasure;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.centrality.PathBasedCentrality;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.FloydWarshall;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import java.util.Map;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
 
 public class TestPathBasedCentrality {
 	
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestPathwayGraph.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestPathwayGraph.java
index feb9e18eddf9d1c4f317d09c1452e05605f74600..916d2e76b081381014b9224cbc03fe2319ed9a31 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestPathwayGraph.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestPathwayGraph.java
@@ -36,19 +36,15 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.*;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.pathway.PathwayGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.pathway.PathwayGraphEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioPathway;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.pathway.PathwayGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.pathway.PathwayGraphEdge;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class TestPathwayGraph {
 
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java
index 4a1be9dbba4b5873f65ea6f840fdd3dcb9c02d71..1f4090e6c1e785fdca949cda2c3296b316fe0286 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java
@@ -1,19 +1,14 @@
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import fr.inrae.toulouse.metexplore.met4j_chemUtils.chemicalSimilarity.FingerprintBuilder;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.AtomMappingWeightPolicy;
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.DefaultWeightPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.RPAIRSlikePolicy;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.After;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.openscience.cdk.exception.CDKException;
-import org.openscience.cdk.similarity.Tanimoto;
 
 import java.util.HashMap;
 import java.util.HashSet;
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRanking.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRanking.java
index 0d29b0a36e66d649cb894add989f9369d0b9abb8..6ec1c29c55c9c360d918e9933834f6120b0272b4 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRanking.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRanking.java
@@ -35,17 +35,17 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.utils.RankUtils;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import java.util.HashMap;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Test {@link RankUtils}
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestReactionGraph.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestReactionGraph.java
index 0e57d534fd90c4f42480bc42d14587627ede8a57..3188d4f84bb47050162d3ed69ba05b71ae0ba1d1 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestReactionGraph.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestReactionGraph.java
@@ -36,21 +36,17 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-import java.util.HashSet;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.*;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.CompoundEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.ReactionGraph;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioCompartment;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioPathway;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class TestReactionGraph {
 
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestScopeCompounds.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestScopeCompounds.java
index 669f9f792ccba025beee0893d6692c45b6b861f3..0be2a929f479c9e0eff44d6de1e7856e656f4fe0 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestScopeCompounds.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestScopeCompounds.java
@@ -36,18 +36,18 @@
 
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.*;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.ScopeCompounds;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.GraphFactory;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.ScopeCompounds;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestScopeCompounds {
 	
 	
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestShortestPaths.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestShortestPaths.java
index 788116daf49aa7fc32ed464759f49a49069e26d2..ea50285b1b61d6055b6d2e9d1bfa2cea58256180 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestShortestPaths.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestShortestPaths.java
@@ -35,35 +35,28 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.centrality.PathBasedCentrality;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.FloydWarshall;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.KShortestPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.ShortestPath;
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.centrality.PathBasedCentrality;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.utils.ComputeAdjacencyMatrix;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.GraphFactory;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compressed.CompressedGraph;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
+import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.ExportMatrix;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.compressed.CompressedGraph;
-import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.ExportMatrix;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.*;
 
 /**
  * Test {@link ShortestPath}
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestSimilarityComputor.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestSimilarityComputor.java
index 8de643cff533bd0e104d9d50753bf618a10a36c8..84ec8e145592645a20fc341d46beedc4911e50da 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestSimilarityComputor.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestSimilarityComputor.java
@@ -35,14 +35,13 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.BitSet;
-
+import fr.inrae.toulouse.metexplore.met4j_mathUtils.similarity.SimilarityComputor;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_mathUtils.similarity.SimilarityComputor;
+import java.util.BitSet;
+
+import static org.junit.Assert.assertEquals;
 
 /**
  * Test {@link SimilarityComputor}
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestSteinerTreeApprox.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestSteinerTreeApprox.java
index 7c504714f71dc122b0a747c55b8058b1104c2977..bda69f2b830e2409fadce805a7a99d86ef2c11b7 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestSteinerTreeApprox.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestSteinerTreeApprox.java
@@ -35,20 +35,19 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.SteinerTreeApprox;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+
+import static org.junit.Assert.*;
 
 
 /**
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestUtils.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestUtils.java
index 3d59978c52c8bd6e3dc6a161c93d95eeb1feca9c..71ff396d549c71da94e1c6321003767e691d3daf 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestUtils.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestUtils.java
@@ -35,17 +35,10 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-
 import org.junit.rules.TemporaryFolder;
 
+import java.io.*;
+
 /**
  * @author lcottret
  * 10 déc. 2013
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestVertexContraction.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestVertexContraction.java
index 6e72798d0277ff4ba8a3b550af4ba2648d2e973f..0c83a2fc975df4fafb67ebe76ade54e243d9bfa4 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestVertexContraction.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestVertexContraction.java
@@ -42,7 +42,7 @@ import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
 
 public class TestVertexContraction {
     public static CompoundGraph g;
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestWeightUtils.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestWeightUtils.java
index b7df0ec723895a9f0ca7b8146b334526377a4f6f..5c71db7a91be806c9c82248a3c327a84b63ba0de 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestWeightUtils.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestWeightUtils.java
@@ -36,12 +36,10 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.WeightUtils;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.WeightsFromFile;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import org.junit.After;
@@ -49,10 +47,11 @@ import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.WeightUtils;
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.WeightsFromFile;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import static org.junit.Assert.assertEquals;
 
 
 public class TestWeightUtils {
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestWeightingPolicy.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestWeightingPolicy.java
index 08ad8f683f83b2c42df0953b770b9a0fc51e7c76..738fe058f8632c07a711b06716e180b905bf5e2d 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestWeightingPolicy.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestWeightingPolicy.java
@@ -35,14 +35,9 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph;
 
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.*;
-
 import fr.inrae.toulouse.metexplore.met4j_chemUtils.chemicalSimilarity.FingerprintBuilder;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.*;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
@@ -51,12 +46,16 @@ import org.junit.After;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
-
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 import org.openscience.cdk.exception.CDKException;
 import org.openscience.cdk.similarity.Tanimoto;
 
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.*;
+
+import static org.junit.Assert.*;
+
 /**
  * Test {@link fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph} with {@link WeightingPolicy <BioMetabolite, ReactionEdge , CompoundGraph >}
  * @author clement
diff --git a/met4j-toolbox/README.md b/met4j-toolbox/README.md
index fb0340938ca9928a28ba654703e33d45a2107bff..e34685dc7a320481eab3a0d785b24c97a3f976f7 100644
--- a/met4j-toolbox/README.md
+++ b/met4j-toolbox/README.md
@@ -161,22 +161,7 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
 <table>
 <thead><tr><th colspan="2">Package fr.inrae.toulouse.metexplore.met4j_toolbox.attributes</th></tr></thead>
 <tbody>
-<tr><td>DecomposeSBML</td><td>Parse SBML to render list of composing entities: metabolites, reactions, genes and others.<details><summary><small>more</small></summary>Parse SBML to render list of composing entities: metabolites, reactions, genes, pathways and compartments. The output file is a tsv with two columns, one with entities identifiers, and one with the entity type. If no entity type is selected, by default all of them are taken into account. Only identifiers are written, attributes can be extracted from dedicated apps or from the SBML2Tab.<br/><br/><pre><code> -c (--compartments) : Extract Compartments (default: false)
- -g (--genes)        : Extract Genes (default: false)
- -h                  : prints the help (default: false)
- -i VAL              : Input SBML file
- -m (--metabolites)  : Extract Metabolites (default: false)
- -nt (--noTypeCol)   : Do not output type column (default: false)
- -o VAL              : Output file
- -p (--pathways)     : Extract Pathways (default: false)
- -r (--reactions)    : Extract Reactions (default: false)
-</code></pre></details></td></tr>
-<tr><td>ExtractPathways</td><td>Extract pathway(s) from GSMN<details><summary><small>more</small></summary>"Extract pathway(s) from GSMN: From a SBML file, Create a sub-network SBML file including only a selection of pathways<br/><br/><pre><code> -h     : prints the help (default: false)
- -i VAL : input SBML file
- -o VAL : output SBML file
- -p VAL : pathway identifiers, separated by "+" sign if more than one
-</code></pre></details></td></tr>
-<tr><td>ExtractSbmlAnnot</td><td>Extract databases' references from SBML annotations or notes.<details><summary><small>more</small></summary>Extract databases' references from SBML annotations or notes. The references are exported as a tabulated file with one column with the SBML compound, reaction or gene identifiers, and one column with the corresponding database identifier.The name of the targeted database need to be provided under the same form than the one used in the notes field or the identifiers.org uri<br/><br/><pre><code> -db VAL                                : name of the referenced database to
+<tr><td>ExtractAnnotations</td><td>Extract databases' references from SBML annotations or notes.<details><summary><small>more</small></summary>Extract databases' references from SBML annotations or notes. The references are exported as a tabulated file with one column with the SBML compound, reaction or gene identifiers, and one column with the corresponding database identifier.The name of the targeted database need to be provided under the same form than the one used in the notes field or the identifiers.org uri.<br/><br/><pre><code> -db VAL                                : name of the referenced database to
                                           export annotations from, as listed in
                                           notes or identifiers.org base uri
  -export [METABOLITE | REACTION | GENE] : the type of entity to extract
@@ -192,7 +177,22 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
                                           are referenced for the same entity
                                           (default: false)
 </code></pre></details></td></tr>
-<tr><td>GetGenesFromReactions</td><td>Get gene lists from a list of reactions and a GSMN.<details><summary><small>more</small></summary>Get associated gene list from a list of reactions and a GSMN. Parse GSMN GPR annotations and output a tab-separated file with one row per gene, associated reaction identifiers from input file in first column, gene identifiers in second column.<br/><br/><pre><code> -col N   : Column number in reaction file (first as 1) (default: 1)
+<tr><td>ExtractPathways</td><td>Extract pathway(s) from a SBML file and create a sub-network SBML file<details><summary><small>more</small></summary>Extract pathway(s) from a SBML file and create a sub-network SBML file<br/><br/><pre><code> -h     : prints the help (default: false)
+ -i VAL : input SBML file
+ -o VAL : output SBML file
+ -p VAL : pathway identifiers, separated by "+" sign if more than one
+</code></pre></details></td></tr>
+<tr><td>GetEntities</td><td>Parse a SBML file to return a list of entities composing the network: metabolites, reactions, genes and others.<details><summary><small>more</small></summary>Parse a SBML file to return a list of entities composing the network: metabolites, reactions, genes and others.The output file is a tabulated file with two columns, one with entity identifiers, and one with the entity type. If no entity type is selected, all of them are returned by default. Only identifiers are written, attributes can be extracted from dedicated apps or from the Sbml2Tab app.<br/><br/><pre><code> -c (--compartments) : Extract Compartments (default: false)
+ -g (--genes)        : Extract Genes (default: false)
+ -h                  : prints the help (default: false)
+ -i VAL              : Input SBML file
+ -m (--metabolites)  : Extract Metabolites (default: false)
+ -nt (--noTypeCol)   : Do not write type column (default: false)
+ -o VAL              : Output file
+ -p (--pathways)     : Extract Pathways (default: false)
+ -r (--reactions)    : Extract Reactions (default: false)
+</code></pre></details></td></tr>
+<tr><td>GetGenesFromReactions</td><td>Get gene lists from a list of reactions and a SBML file.<details><summary><small>more</small></summary>Get associated gene list from a list of reactions and a SBML file. Parse SBML GPR annotations and output a tab-separated file with one row per gene, associated reaction identifiers from input file in first column, gene identifiers in second column.<br/><br/><pre><code> -col N   : Column number in reaction file (first as 1) (default: 1)
  -h       : prints the help (default: false)
  -header  : Skip reaction file header (default: false)
  -i VAL   : Input SBML file
@@ -200,7 +200,11 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
  -r VAL   : Input Reaction file
  -sep VAL : Separator in reaction file (default: 	)
 </code></pre></details></td></tr>
-<tr><td>GetReactantsFromReactions</td><td>Get reactants lists from a list of reactions and a GSMN.<details><summary><small>more</small></summary>Get reactants lists from a list of reactions and a GSMN. Output a tab-separated file with one row per reactant, reaction identifiers in first column, reactant identifiers in second column. It can provides substrates, products, or both (by default). In the case of reversible reactions, all reactants are considered both substrates and products<br/><br/><pre><code> -col N            : Column number in reaction file (first as 1) (default: 1)
+<tr><td>GetMetaboliteAttributes</td><td>Create a tabulated file with metabolite attributes from a SBML file<details><summary><small>more</small></summary>Create a tabulated file with metabolite attributes from a SBML file<br/><br/><pre><code> -h     : prints the help (default: false)
+ -i VAL : Input SBML file
+ -o VAL : Output file
+</code></pre></details></td></tr>
+<tr><td>GetReactantsFromReactions</td><td>Get reactant lists from a list of reactions and a SBML file.<details><summary><small>more</small></summary>Get reactant lists from a list of reactions and a Sbml file. Output a tab-separated file with one row per reactant, reaction identifiers in first column, reactant identifiers in second column. It can provides substrates, products, or both (by default). In the case of reversible reactions, all reactants are considered as both substrates and products<br/><br/><pre><code> -col N            : Column number in reaction file (first as 1) (default: 1)
  -h                : prints the help (default: false)
  -header           : Skip reaction file header (default: false)
  -i VAL            : Input SBML file
@@ -210,63 +214,63 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
  -s (--substrates) : Extract substrates only (default: false)
  -sep VAL          : Separator in reaction file (default: 	)
 </code></pre></details></td></tr>
-<tr><td>SbmlSetChargesFromFile</td><td>Set charge to network metabolites from a tabulated file containing the metabolite ids and the formulas<details><summary><small>more</small></summary>Set charge to network metabolites from a tabulated file containing the metabolite ids and the formulas<br/>The charge must be a number. The ids must correspond between the tabulated file and the SBML file.<br/>If prefix or suffix is different in the SBML file, use the -p or the -s options.<br/>The charge will be written in the SBML file in two locations:+<br/>- in the reaction notes (e.g. <p>charge: -1</p>)<br/>- as fbc attribute (e.g. fbc:charge="1")<br/><br/><pre><code> -c VAL    : [#] Comment String in the tabulated file. The lines beginning by
-             this string won't be read (default: #)
- -cc N     : [2] number of the column where are the charges (default: 2)
- -ci N     : [1] number of the column where are the metabolite ids (default: 1)
- -h        : prints the help (default: false)
- -n N      : [0] Number of lines to skip at the beginning of the tabulated file
-             (default: 0)
- -out VAL  : [out.sbml] Out sbml file (default: out.sbml)
- -p        : [deactivated] To match the objects in the sbml file, adds the
-             prefix M_ to metabolite ids (default: false)
- -s        : [deactivated] To match the objects in the sbml file, adds the
-             suffix _comparmentID to metabolites (default: false)
- -sbml VAL : Original sbml file
- -tab VAL  : Tabulated file
-</code></pre></details></td></tr>
-<tr><td>SbmlSetEcsFromFile</td><td>Set EC numbers to reactions from a tabulated file containing the reaction ids and the EC<details><summary><small>more</small></summary>Set EC numbers to reactions from a tabulated file containing the reaction ids and the EC<br/>The ids must correspond between the tabulated file and the SBML file.<br/>If prefix R_ is present in the ids in the SBML file and not in the tabulated file, use the -p option.<br/>The EC will be written in the SBML file in two locations:<br/>- in the reaction notes (e.g. <p>EC_NUMBER: 2.4.2.14</p>)<br/>- as a reaction annotation (e.g. <rdf:li rdf:resource="http://identifiers.org/ec-code/2.4.2.14"/>)<br/><br/><pre><code> -c VAL    : [#] Comment String in the tabulated file. The lines beginning by
-             this string won't be read (default: #)
- -cec N    : [2] number of the column where are the ecs (default: 2)
- -ci N     : [1] number of the column where are the reaction ids (default: 1)
- -h        : prints the help (default: false)
- -n N      : [0] Number of lines to skip at the beginning of the tabulated file
-             (default: 0)
- -out VAL  : [out.sbml] Out sbml file (default: out.sbml)
- -p        : [deactivated] To match the objects in the sbml file, adds the
-             prefix R_ to reactions (default: false)
- -sbml VAL : Original sbml file
- -tab VAL  : Tabulated file
-</code></pre></details></td></tr>
-<tr><td>SbmlSetFormulasFromFile</td><td>Set Formula to network metabolites from a tabulated file containing the metabolite ids and the formulas<details><summary><small>more</small></summary>Set Formula to network metabolites from a tabulated file containing the metabolite ids and the formulas<br/>The ids must correspond between the tabulated file and the SBML file.<br/>If prefix or suffix is different in the SBML file, use the -p or the -s options.<br/>The formula will be written in the SBML file in two locations:+<br/>- in the metabolite notes (e.g. <p>formula: C16H29O2</p><br/><br/>- as a fbc attribute (e.g. fbc:chemicalFormula="C16H29O2")<br/><br/><pre><code> -c VAL    : [#] Comment String in the tabulated file. The lines beginning by
-             this string won't be read (default: #)
- -cf N     : [2] number of the column where are the formulas (default: 2)
- -ci N     : [1] number of the column where are the metabolite ids (default: 1)
- -h        : prints the help (default: false)
- -n N      : [0] Number of lines to skip at the beginning of the tabulated file
-             (default: 0)
- -out VAL  : [out.sbml] Out sbml file (default: out.sbml)
- -p        : [deactivated] To match the objects in the sbml file, adds the
-             prefix M_ to metabolite ids (default: false)
- -s        : [deactivated] To match the objects in the sbml file, adds the
-             suffix _comparmentID to metabolites (default: false)
- -sbml VAL : Original sbml file
- -tab VAL  : Tabulated file
-</code></pre></details></td></tr>
-<tr><td>SbmlSetGprsFromFile</td><td>Create a new SBML file from an original sbml file and a tabulated file containing reaction ids and Gene association written in a cobra way<details><summary><small>more</small></summary>Create a new SBML file from an original sbml file and a tabulated file containing reaction ids and Gene association written in a cobra way<br/>The ids must correspond between the tabulated file and the SBML file.<br/>If prefix R_ is present in the ids in the SBML file and not in the tabulated file, use the -p option.<br/>GPR must be written in a cobra way in the tabulated file as described in Schellenberger et al 2011 Nature Protocols 6(9):1290-307<br/>(The GPR will be written in the SBML file in two locations:<br/>- in the reaction notes <p>GENE_ASSOCIATION: ( XC_0401 ) OR ( XC_3282 )</p><br/>- as fbc gene product association :<fbc:geneProductAssociation><br/> <fbc:or><br/>  <fbc:geneProductRef fbc:geneProduct="XC_3282"/><br/>  <fbc:geneProductRef fbc:geneProduct="XC_0401"/><br/> </fbc:or><br/></fbc:geneProductAssociation><br/><br/><br/><pre><code> -c VAL    : [#] Comment String in the tabulated file. The lines beginning by
-             this string won't be read (default: #)
- -cgpr N   : [2] number of the column where are the gprs (default: 2)
- -ci N     : [1] number of the column where are the reaction ids (default: 1)
- -h        : prints the help (default: false)
- -n N      : [0] Number of lines to skip at the beginning of the tabulated file
-             (default: 0)
- -out VAL  : [out.sbml] Out sbml file (default: out.sbml)
- -p        : [deactivated] To match the objects in the sbml file, adds the
-             prefix R_ to reactions (default: false)
- -sbml VAL : Original sbml file
- -tab VAL  : Tabulated file
-</code></pre></details></td></tr>
-<tr><td>SbmlSetIdsFromFile</td><td>Set new ids to network objects from a tabulated file containing the old ids and the new ids<details><summary><small>more</small></summary>Set new ids to network objects from a tabulated file containing the old ids and the new ids<br/>The ids must correspond between the tabulated file and the SBML file.<br/>If prefix or suffix is different in the SBML file, use the -p or the -s options.<br/><br/><br/><pre><code> -c VAL                                 : [#] Comment String in the tabulated
+<tr><td>SetCharges</td><td>Set charge to metabolites in a SBML file from a tabulated file containing the metabolite ids and the charges<details><summary><small>more</small></summary>Set charge to metabolites in a SBML file from a tabulated file containing the metabolite ids and the charges<br/>The charge must be a number. The ids must correspond between the tabulated file and the SBML file.<br/>If prefix or suffix is different in the SBML file, use the -p or the -s options.<br/>The charge will be written in the SBML file in two locations:+<br/>- in the reaction notes (e.g. charge: -1)<br/>- as fbc attribute (e.g. fbc:charge="1")<br/><br/>References:<br/><a href="https://doi.org/10.1515/jib-2017-0082">Olivier et al.; SBML Level 3 Package: Flux Balance Constraints version 2; Journal of Integrative Bioinformatics; 2018</a><br/><br/><br/><pre><code> -c VAL   : [#] Comment String in the tabulated file. The lines beginning by
+            this string won't be read (default: #)
+ -cc N    : [2] number of the column where are the charges (default: 2)
+ -ci N    : [1] number of the column where are the metabolite ids (default: 1)
+ -h       : prints the help (default: false)
+ -i VAL   : Original SBML file
+ -n N     : [0] Number of lines to skip at the beginning of the tabulated file
+            (default: 0)
+ -o VAL   : [out.sbml] SBML output file (default: out.sbml)
+ -p       : [deactivated] To match the objects in the sbml file, adds the
+            prefix M_ to metabolite ids (default: false)
+ -s       : [deactivated] To match the objects in the sbml file, adds the
+            suffix _comparmentID to metabolites (default: false)
+ -tab VAL : Input Tabulated file
+</code></pre></details></td></tr>
+<tr><td>SetChemicalFormulas</td><td>Set Formula to network metabolites from a tabulated file containing the metabolite ids and the formulas<details><summary><small>more</small></summary>Set Formula to network metabolites from a tabulated file containing the metabolite ids and the formulas<br/>The ids must correspond between the tabulated file and the SBML file.<br/>If prefix or suffix is different in the SBML file, use the -p or the -s options.<br/>The formula will be written in the SBML file in two locations:+<br/>- in the metabolite HTML notes (e.g. formula: C16H29O2)<br/>- as a fbc attribute (e.g. fbc:chemicalFormula="C16H29O2")<br/><br/>References:<br/><a href="https://doi.org/10.1515/jib-2017-0082">Olivier et al.; SBML Level 3 Package: Flux Balance Constraints version 2; Journal of Integrative Bioinformatics; 2018</a><br/><br/><br/><pre><code> -c VAL   : [#] Comment String in the tabulated file. The lines beginning by
+            this string won't be read (default: #)
+ -cf N    : [2] number of the column where are the formulas (default: 2)
+ -ci N    : [1] number of the column where are the metabolite ids (default: 1)
+ -h       : prints the help (default: false)
+ -i VAL   : Original SBML file
+ -n N     : [0] Number of lines to skip at the beginning of the tabulated file
+            (default: 0)
+ -o VAL   : [out.sbml] SBML output file (default: out.sbml)
+ -p       : [deactivated] To match the objects in the sbml file, adds the
+            prefix M_ to metabolite ids (default: false)
+ -s       : [deactivated] To match the objects in the sbml file, adds the
+            suffix _comparmentID to metabolites (default: false)
+ -tab VAL : Input Tabulated file
+</code></pre></details></td></tr>
+<tr><td>SetEcNumbers</td><td>Set EC numbers to reactions in a SBML file from a tabulated file containing the reaction ids and the EC numbers<details><summary><small>more</small></summary>Set EC numbers to reactions in a SBML file from a tabulated file containing the reaction ids and the EC numbers<br/>The ids must correspond between the tabulated file and the SBML file.<br/>If prefix R_ is present in the ids in the SBML file and not in the tabulated file, use the -p option.<br/>The EC will be written in the SBML file in two locations:<br/>- in the reaction HTML notes (e.g. EC_NUMBER: 2.4.2.14)<br/>- as a reaction MIRIAM annotation (see https://pubmed.ncbi.nlm.nih.gov/16333295/) with ec-code identifiers link (https://registry.identifiers.org/registry/ec-code)<br/><br/>References:<br/><a href="https://doi.org/10.1038/nbt1156">Novère et al.; Minimum information requested in the annotation of biochemical models (MIRIAM); Nature Biotechnology; 2005</a><br/><br/><br/><pre><code> -c VAL   : [#] Comment String in the tabulated file. The lines beginning by
+            this string won't be read (default: #)
+ -cec N   : [2] number of the column where are the ecs (default: 2)
+ -ci N    : [1] number of the column where are the reaction ids (default: 1)
+ -h       : prints the help (default: false)
+ -i VAL   : Original SBML file
+ -n N     : [0] Number of lines to skip at the beginning of the tabulated file
+            (default: 0)
+ -o VAL   : [out.sbml] SBML output file (default: out.sbml)
+ -p       : [deactivated] To match the objects in the sbml file, adds the
+            prefix R_ to reactions (default: false)
+ -tab VAL : Input Tabulated file
+</code></pre></details></td></tr>
+<tr><td>SetGprs</td><td>Create a new SBML file from an original sbml file and a tabulated file containing reaction ids and Gene association written in a cobra way<details><summary><small>more</small></summary>Create a new SBML file from an original sbml file and a tabulated file containing reaction ids and Gene association written in a cobra way<br/>The ids must correspond between the tabulated file and the SBML file.<br/>If prefix R_ is present in the ids in the SBML file and not in the tabulated file, use the -p option.<br/>GPR must be written in a cobra way in the tabulated file as described in Schellenberger et al 2011 Nature Protocols 6(9):1290-307<br/>(The GPR will be written in the SBML file in two locations:<br/>- in the reaction html notes (GENE_ASSOCIATION: ( XC_0401 ) OR ( XC_3282 ))<br/>- as fbc gene product association (see FBC package specifications: https://doi.org/10.1515/jib-2017-0082)<br/><br/>References:<br/><a href="https://doi.org/10.1038/nprot.2011.308">Schellenberger et al.; Quantitative prediction of cellular metabolism with constraint-based models: the COBRA Toolbox v2.0; Nature Protocols; 2011</a><br/><a href="https://doi.org/10.1515/jib-2017-0082">Olivier et al.; SBML Level 3 Package: Flux Balance Constraints version 2; Journal of Integrative Bioinformatics; 2018</a><br/><br/><br/><pre><code> -c VAL   : [#] Comment String in the tabulated file. The lines beginning by
+            this string won't be read (default: #)
+ -cgpr N  : [2] number of the column where are the gprs (default: 2)
+ -ci N    : [1] number of the column where are the reaction ids (default: 1)
+ -h       : prints the help (default: false)
+ -i VAL   : Original SBML file
+ -n N     : [0] Number of lines to skip at the beginning of the tabulated file
+            (default: 0)
+ -o VAL   : [out.sbml] SBML output file (default: out.sbml)
+ -p       : [deactivated] To match the objects in the sbml file, adds the
+            prefix R_ to reactions (default: false)
+ -tab VAL : Input Tabulated file
+</code></pre></details></td></tr>
+<tr><td>SetIds</td><td>Set new ids to network objects in a SBML file from a tabulated file containing the old ids and the new ids<details><summary><small>more</small></summary>Set new ids to network objects in a SBML file from a tabulated file containing the old ids and the new ids<br/>The ids must correspond between the tabulated file and the SBML file.<br/>If prefix or suffix is different in the SBML file, use the -p or the -s options.<br/><br/><br/><pre><code> -c VAL                                 : [#] Comment String in the tabulated
                                           file. The lines beginning by this
                                           string won't be read (default: #)
  -ci N                                  : [1] number of the column where are
@@ -274,13 +278,11 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
  -cnew N                                : [2] number of the column where are
                                           the new ids (default: 2)
  -h                                     : prints the help (default: false)
+ -i VAL                                 : Original SBML file
  -n N                                   : [0] Number of lines to skip at the
                                           beginning of the tabulated file
                                           (default: 0)
- -o [REACTION | METABOLITE | GENE |     : [REACTION] Object type in the column
- PROTEIN | PATHWAY | COMPARTMENT]         id : REACTION;METABOLITE;GENE;PATHWAY
-                                          (default: REACTION)
- -out VAL                               : [out.sbml] Out sbml file (default:
+ -o VAL                                 : [out.sbml] SBML output file (default:
                                           out.sbml)
  -p                                     : [deactivated] To match the objects in
                                           the sbml file, adds the prefix R_ to
@@ -290,10 +292,12 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
                                           the sbml file, adds the suffix
                                           _comparmentID to metabolites
                                           (default: false)
- -sbml VAL                              : Original sbml file
- -tab VAL                               : Tabulated file
+ -t [REACTION | METABOLITE | GENE |     : [REACTION] Object type in the column
+ PROTEIN | PATHWAY | COMPARTMENT]         id : REACTION;METABOLITE;GENE;PATHWAY
+                                          (default: REACTION)
+ -tab VAL                               : Input Tabulated file
 </code></pre></details></td></tr>
-<tr><td>SbmlSetNamesFromFile</td><td>Set names to network objects from a tabulated file containing the object ids and the names<details><summary><small>more</small></summary>Set names to network objects from a tabulated file containing the object ids and the names<br/>The ids must correspond between the tabulated file and the SBML file.<br/>If prefix or suffix is different in the SBML file, use the -p or the -s options.<br/><br/><br/><pre><code> -c VAL                                 : [#] Comment String in the tabulated
+<tr><td>SetNames</td><td>Set names to network objects in a SBML file from a tabulated file containing the object ids and the names<details><summary><small>more</small></summary>Set names to network objects in a SBML file from a tabulated file containing the object ids and the names<br/>The ids must correspond between the tabulated file and the SBML file.<br/>If prefix or suffix is different in the SBML file, use the -p or the -s options.<br/><br/><br/><pre><code> -c VAL                                 : [#] Comment String in the tabulated
                                           file. The lines beginning by this
                                           string won't be read (default: #)
  -ci N                                  : [1] number of the column where are
@@ -301,13 +305,11 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
  -cname N                               : [2] number of the column where are
                                           the names (default: 2)
  -h                                     : prints the help (default: false)
+ -i VAL                                 : Original SBML file
  -n N                                   : [0] Number of lines to skip at the
                                           beginning of the tabulated file
                                           (default: 0)
- -o [REACTION | METABOLITE | GENE |     : [REACTION] Object type in the column
- PROTEIN | PATHWAY | COMPARTMENT]         id : REACTION;METABOLITE;GENE;PATHWAY
-                                          (default: REACTION)
- -out VAL                               : [out.sbml] Out sbml file (default:
+ -o VAL                                 : [out.sbml] SBML output file (default:
                                           out.sbml)
  -p                                     : [deactivated] To match the objects in
                                           the sbml file, adds the prefix R_ to
@@ -317,24 +319,26 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
                                           the sbml file, adds the suffix
                                           _comparmentID to metabolites
                                           (default: false)
- -sbml VAL                              : Original sbml file
- -tab VAL                               : Tabulated file
+ -t [REACTION | METABOLITE | GENE |     : [REACTION] Object type in the column
+ PROTEIN | PATHWAY | COMPARTMENT]         id : REACTION;METABOLITE;GENE;PATHWAY
+                                          (default: REACTION)
+ -tab VAL                               : Input Tabulated file
 </code></pre></details></td></tr>
-<tr><td>SbmlSetPathwaysFromFile</td><td>Set pathway to reactions in a network from a tabulated file containing the reaction ids and the pathways<details><summary><small>more</small></summary>Set pathway to reactions in a network from a tabulated file containing the reaction ids and the pathways<br/>The ids must correspond between the tabulated file and the SBML file.<br/>If prefix R_ is present in the ids in the SBML file and not in the tabulated file, use the -p option.<br/>Pathways will be written in the SBML file in two ways:- as reaction note (e.g. <p>SUBSYSTEM: purine_biosynthesis</p>)- as SBML group:<br/><groups:group groups:id="purine_biosynthesis" groups:kind="classification" groups:name="purine_biosynthesis"><br/> <groups:listOfMembers><br/>  <groups:member groups:idRef="R_GLUPRT"/><br/>  <groups:member groups:idRef="R_RNDR1b"/><br/>...<br/><br/><br/><pre><code> -c VAL    : [#] Comment String in the tabulated file. The lines beginning by
-             this string won't be read (default: #)
- -ci N     : [1] number of the column where are the reaction ids (default: 1)
- -cp N     : [2] number of the column where are the pathways (default: 2)
- -h        : prints the help (default: false)
- -n N      : [0] Number of lines to skip at the beginning of the tabulated file
-             (default: 0)
- -out VAL  : [out.sbml] Out sbml file (default: out.sbml)
- -p        : [deactivated] To match the objects in the sbml file, adds the
-             prefix R_ to reactions (default: false)
- -sbml VAL : Original sbml file
- -sep VAL  : [|] Separator of pathways in the tabulated file (default: |)
- -tab VAL  : Tabulated file
-</code></pre></details></td></tr>
-<tr><td>SbmlSetRefsFromFile</td><td>Add refs to network objects from a tabulated file containing the metabolite ids and the formulas<details><summary><small>more</small></summary>Add refs to network objects from a tabulated file containing the metabolite ids and the formulas<br/>Reference name given as parameter (-ref) must correspond to an existing id the registry of  identifiers.org (https://registry.identifiers.org/registry)<br/>The corresponding key:value pair will be written as metabolite or reaction annotation<br/><br/><pre><code> -c VAL                                 : [#] Comment String in the tabulated
+<tr><td>SetPathways</td><td>Set pathway to reactions in a network from a tabulated file containing the reaction ids and the pathways<details><summary><small>more</small></summary>Set pathway to reactions in a network from a tabulated file containing the reaction ids and the pathways<br/>The ids must correspond between the tabulated file and the SBML file.<br/>If prefix R_ is present in the ids in the SBML file and not in the tabulated file, use the -p option.<br/>Pathways will be written in the SBML file in two ways:- as reaction note (e.g. SUBSYSTEM: purine_biosynthesis)- as SBML group (see Group package specifications: https://pmc.ncbi.nlm.nih.gov/articles/PMC5451322/)<br/><br/>References:<br/><a href="https://doi.org/10.1515/jib-2016-290">Hucka et al.; SBML Level 3 package: Groups, Version 1 Release 1; Journal of Integrative Bioinformatics; 2016</a><br/><br/><br/><pre><code> -c VAL   : [#] Comment String in the tabulated file. The lines beginning by
+            this string won't be read (default: #)
+ -ci N    : [1] number of the column where are the reaction ids (default: 1)
+ -cp N    : [2] number of the column where are the pathways (default: 2)
+ -h       : prints the help (default: false)
+ -i VAL   : Original SBML file
+ -n N     : [0] Number of lines to skip at the beginning of the tabulated file
+            (default: 0)
+ -o VAL   : [out.sbml] SBML output file (default: out.sbml)
+ -p       : [deactivated] To match the objects in the sbml file, adds the
+            prefix R_ to reactions (default: false)
+ -sep VAL : [|] Separator of pathways in the tabulated file (default: |)
+ -tab VAL : Input Tabulated file
+</code></pre></details></td></tr>
+<tr><td>SetReferences</td><td>Add references to network objects in a SBML file from a tabulated file containing the metabolite ids and the references<details><summary><small>more</small></summary>Add references to network objects in a SBML file from a tabulated file containing the metabolite ids and the references<br/>Reference name given as parameter (-ref) must correspond to an existing id in the registry of identifiers.org (https://registry.identifiers.org/registry)<br/>The corresponding key:value pair will be written as metabolite or reaction MIRIAM annotation (see https://pubmed.ncbi.nlm.nih.gov/16333295/)<br/><br/>References:<br/><a href="https://doi.org/10.1038/nbt1156">Novère et al.; Minimum information requested in the annotation of biochemical models (MIRIAM); Nature Biotechnology; 2005</a><br/><br/><br/><pre><code> -c VAL                                 : [#] Comment String in the tabulated
                                           file. The lines beginning by this
                                           string won't be read (default: #)
  -ci N                                  : [1] number of the column where are
@@ -342,37 +346,34 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
  -cr N                                  : [2] number of the column where are
                                           the references (default: 2)
  -h                                     : prints the help (default: false)
+ -i VAL                                 : Original SBML file
  -n N                                   : [0] Number of lines to skip at the
                                           beginning of the tabulated file
                                           (default: 0)
- -o [REACTION | METABOLITE | GENE |     : [REACTION] Object type in the column
- PROTEIN | PATHWAY | COMPARTMENT]         id : REACTION;METABOLITE;GENE;PATHWAY
-                                          (default: REACTION)
- -out VAL                               : [out.sbml] Out sbml file (default:
+ -o VAL                                 : [out.sbml] SBML output file (default:
                                           out.sbml)
  -p                                     : [deactivated] To match the objects in
                                           the sbml file, adds the prefix R_ to
                                           reactions and M_ to metabolites
                                           (default: false)
- -ref VAL                               : Name of the ref. Must exist in
-                                          identifiers.org
+ -ref VAL                               : Name of the reference. Must exist in
+                                          identifiers.org (https://registry.iden
+                                          tifiers.org/registry)
  -s                                     : [deactivated] To match the objects in
                                           the sbml file, adds the suffix
                                           _comparmentID to metabolites
                                           (default: false)
- -sbml VAL                              : Original sbml file
- -tab VAL                               : Tabulated file
-</code></pre></details></td></tr>
-<tr><td>SbmlToMetaboliteTable</td><td>Create a tabulated file with metabolite attributes from a SBML file<details><summary><small>more</small></summary>Create a tabulated file with metabolite attributes from a SBML file<br/><br/><pre><code> -h     : prints the help (default: false)
- -o VAL : Output file
- -s VAL : Sbml file
+ -t [REACTION | METABOLITE | GENE |     : [REACTION] Object type in the column
+ PROTEIN | PATHWAY | COMPARTMENT]         id : REACTION;METABOLITE;GENE;PATHWAY
+                                          (default: REACTION)
+ -tab VAL                               : Input Tabulated file
 </code></pre></details></td></tr>
 </tbody>
 </table>
 <table>
 <thead><tr><th colspan="2">Package fr.inrae.toulouse.metexplore.met4j_toolbox.bigg</th></tr></thead>
 <tbody>
-<tr><td>GetModelProteome</td><td>Get proteome in fasta format of a model present in BIGG<details><summary><small>more</small></summary>Get proteome in fasta format of a model present in BIGG<br/><br/><pre><code> -h     : prints the help (default: false)
+<tr><td>GetBiggModelProteome</td><td>Get proteome in fasta format of a model present in the BIGG database<details><summary><small>more</small></summary>Get proteome in fasta format of a model present in the BIGG database<br/><br/>References:<br/><a href="https://doi.org/10.1093/nar/gkv1049">King et al.; BiGG Models: A platform for integrating, standardizing and sharing genome-scale models; Nucleic Acids Research; 2016</a><br/><br/><br/><pre><code> -h     : prints the help (default: false)
  -m VAL : [ex: iMM904] id of the BIGG model
  -o VAL : [proteome.fas] path of the output file (default: proteome.fas)
 </code></pre></details></td></tr>
@@ -381,15 +382,126 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
 <table>
 <thead><tr><th colspan="2">Package fr.inrae.toulouse.metexplore.met4j_toolbox.convert</th></tr></thead>
 <tbody>
-<tr><td>FbcToNotes</td><td>Convert FBC package annotations to sbml notes<details><summary><small>more</small></summary>Convert FBC package annotations to sbml notes<br/><br/><pre><code> -h     : prints the help (default: false)
- -i VAL : input file
- -o VAL : output file
+<tr><td>FbcToNotes</td><td>Convert FBC package annotations to sbml html notes<details><summary><small>more</small></summary>Convert FBC package annotations to sbml html notes (see https://www.degruyter.com/document/doi/10.1515/jib-2017-0082/html)<br/><br/>References:<br/><a href="https://doi.org/10.1515/jib-2017-0082">Olivier et al.; SBML Level 3 Package: Flux Balance Constraints version 2; Journal of Integrative Bioinformatics; 2018</a><br/><br/><br/><pre><code> -h     : prints the help (default: false)
+ -i VAL : input SBML file
+ -o VAL : output SBML file
 </code></pre></details></td></tr>
-<tr><td>Kegg2Sbml</td><td>Build a SBML file from KEGG organism-specific pathways. Uses Kegg API.<details><summary><small>more</small></summary>Build a SBML file from KEGG organism-specific pathways. Uses Kegg API.<br/>Errors returned by this program could be due to Kegg API dysfunctions or limitations. Try later if this problem occurs.<br/><br/><pre><code> -h        : prints the help (default: false)
- -org VAL  : [] Kegg org id. Must be 3 letters ( (default: )
- -sbml VAL : [out.sbml] Out sbml file (default: out.sbml)
+<tr><td>Kegg2Sbml</td><td>Build a SBML file from KEGG organism-specific pathways. Uses Kegg API.<details><summary><small>more</small></summary>Build a SBML file from KEGG organism-specific pathways. Uses Kegg API.<br/>Errors returned by this program could be due to Kegg API dysfunctions or limitations. Try later if this problem occurs.<br/><br/><pre><code> -h       : prints the help (default: false)
+ -o VAL   : [out.sbml] Out sbml file (default: out.sbml)
+ -org VAL : [] Kegg org id. Must be 3 letters ( (default: )
+</code></pre></details></td></tr>
+<tr><td>Sbml2CarbonSkeletonNet</td><td>Create a carbon skeleton graph representation of a SBML file content, using GSAM atom-mapping file (see https://forgemia.inra.fr/metexplore/gsam)<details><summary><small>more</small></summary>Metabolic networks used for quantitative analysis often contain links that are irrelevant for graph-based structural analysis. For example, inclusion of side compounds or modelling artifacts such as 'biomass' nodes. Focusing on links between compounds that share parts of their carbon skeleton allows to avoid many transitions involving side compounds, and removes entities without defined chemical structure. This app produces a Carbon Skeleton Network relevant for graph-based analysis of metabolism, in GML or matrix format, from a SBML and an GSAM atom mapping file. GSAM (see https://forgemia.inra.fr/metexplore/gsam) performs atom mapping at genome-scale level using the Reaction Decoder Tool (https://github.com/asad/ReactionDecoder) and allows to compute the number of conserved atoms of a given type between reactants.This app also enables Markov-chain based analysis of metabolic networks by computing reaction-normalized transition probabilities on the Carbon Skeleton Network.<br/><br/><pre><code> -f (--format) [gml | tab | nodeList |  : Format of the exported graphTabulated
+ json | matrix]                           edge list by default (source id 	
+                                          edge type 	 target id). Other options
+                                          include GML, JsonGraph, and tabulated
+                                          node list (label 	 node id 	 node
+                                          type). (default: tab)
+ -fi (--fromIndexes)                    : Use GSAM output with carbon indexes
+                                          (default: false)
+ -g VAL                                 : input GSAM file
+ -h                                     : prints the help (default: false)
+ -i VAL                                 : input SBML file
+ -ks (--keepSingleCarbon)               : keep edges involving single-carbon
+                                          compounds, such as CO2 (requires
+                                          formulas in SBML) (default: false)
+ -main (--onlyMainTransition)           : Compute RPAIRS-like tags and keep
+                                          only main transitions for each
+                                          reaction (default: false)
+ -mc (--nocomp)                         : merge compartments (requires unique
+                                          compound names that are consistent
+                                          across compartments) (default: false)
+ -me (--simple)                         : merge parallel edges to produce a
+                                          simple graph (default: false)
+ -o VAL                                 : output file: path to the tabulated
+                                          file where the resulting network will
+                                          be exported
+ -ri (--removeIsolatedNodes)            : remove isolated nodes (default: false)
+ -tp (--transitionproba)                : set transition probability as weight
+                                          (default: false)
+ -un (--undirected)                     : create as undirected (default: false)
 </code></pre></details></td></tr>
-<tr><td>SBMLwizard</td><td>General SBML model processing<details><summary><small>more</small></summary>General SBML model processing including compound removal (such as side compounds or isolated compounds), reaction removal (ex. blocked or exchange reaction), and compartment merging<br/><br/><pre><code> -h                                     : prints the help (default: false)
+<tr><td>Sbml2CompoundGraph</td><td>Advanced creation of a compound graph representation of a SBML file content<details><summary><small>more</small></summary>Metabolic networks used for quantitative analysis often contain links that are irrelevant for graph-based structural analysis. For example, inclusion of side compounds or modelling artifacts such as 'biomass' nodes.<br/>While Carbon Skeleton Graph offer a relevant alternative topology for graph-based analysis, it requires compounds' structure information, usually not provided in model, and difficult to retrieve for model with sparse cross-reference annotations.<br/>In contrary to the Sbml2Graph app that performs a raw conversion of the SBML content, the present app propose a fine-tuned creation of compound graph from predefined list of side compounds and degree weighting to get relevant structure without structural data.This app also enables Markov-chain based analysis of metabolic networks by computing reaction-normalized transition probabilities on the network.<br/><br/><pre><code> -cw (--customWeights) VAL              : an optional file containing weights
+                                          for compound pairs
+ -dw (--degreeWeights)                  : penalize traversal of hubs by using
+                                          degree square weighting (default:
+                                          false)
+ -f (--format) [gml | tab | nodeList |  : Format of the exported graphTabulated
+ json | matrix]                           edge list by default (source id 	
+                                          edge type 	 target id). Other options
+                                          include GML, JsonGraph, and tabulated
+                                          node list (label 	 node id 	 node
+                                          type). (default: tab)
+ -h                                     : prints the help (default: false)
+ -i VAL                                 : input SBML file
+ -mc (--mergecomp) [no | by_name |      : merge compartments. Use names if
+ by_id]                                   consistent and unambiguous across
+                                          compartments, or identifiers if
+                                          compartment suffix is present (id in
+                                          form "xxx_y" with xxx as base
+                                          identifier and y as compartment
+                                          label). (default: no)
+ -me (--simple)                         : merge parallel edges to produce a
+                                          simple graph (default: false)
+ -o VAL                                 : output file: path to the tabulated
+                                          file where the resulting network will
+                                          be exported
+ -ri (--removeIsolatedNodes)            : remove isolated nodes (default: false)
+ -sc VAL                                : input Side compound file
+ -tp (--transitionproba)                : set weight as random walk transition
+                                          probability, normalized by reaction
+                                          (default: false)
+ -un (--undirected)                     : create as undirected (default: false)
+</code></pre></details></td></tr>
+<tr><td>Sbml2Graph</td><td>Create a graph representation of a SBML file content, and export it in graph file format.<details><summary><small>more</small></summary>Create a graph representation of a SBML file content, and export it in graph file format.<br/>The graph can be either a compound graph, a reaction graph or a bipartite graph, and can be exported in gml or tabulated file format.<br/><br/>References:<br/><a href="https://doi.org/10.1109/tcbb.2008.79">Lacroix et al.; An Introduction to Metabolic Networks and Their Structural Analysis; IEEE/ACM Transactions on Computational Biology and Bioinformatics; 2008</a><br/><br/><br/><pre><code> -b (--bipartite)                       : create bipartite graph (default:
+                                          false)
+ -c (--compound)                        : create compound graph (default: true)
+ -f (--format) [gml | tab | nodeList |  : Format of the exported graphTabulated
+ json | matrix]                           edge list by default (source id 	
+                                          edge type 	 target id). Other options
+                                          include GML, JsonGraph, and tabulated
+                                          node list (label 	 node id 	 node
+                                          type). (default: tab)
+ -h                                     : prints the help (default: false)
+ -i VAL                                 : input SBML file
+ -o VAL                                 : output file: path to the tabulated
+                                          file where the resulting network will
+                                          be exported
+ -r (--reaction)                        : create reaction graph (default: false)
+</code></pre></details></td></tr>
+<tr><td>Sbml2PathwayNet</td><td>Creation of a Pathway Network representation of a SBML file content<details><summary><small>more</small></summary>Creation of a Pathway Network representation of a SBML file content<br/>Genome-scale metabolic networks are often partitioned into metabolic pathways. Pathways are frequently considered independently despite frequent coupling in their activity due to shared metabolites. In order to decipher the interconnections linking overlapping pathways, this app proposes the creation of "Pathway Network", where two pathways are linked if they share compounds.<br/><br/><pre><code> -cw (--customWeights) VAL              : an optional file containing weights
+                                          for pathway pairs
+ -f (--format) [gml | tab | nodeList |  : Format of the exported graphTabulated
+ json | matrix]                           edge list by default (source id 	
+                                          edge type 	 target id). Other options
+                                          include GML, JsonGraph, and tabulated
+                                          node list (label 	 node id 	 node
+                                          type). (default: tab)
+ -h                                     : prints the help (default: false)
+ -i VAL                                 : input SBML file
+ -ncw (--connectorWeights)              : set number of connecting compounds as
+                                          weight (default: false)
+ -o VAL                                 : output Graph file
+ -oss (--onlySourcesAndSinks)           : consider only metabolites that are
+                                          source or sink in the pathway (i.e
+                                          non-intermediary compounds) (default:
+                                          false)
+ -ri (--removeIsolatedNodes)            : remove isolated nodes (default: false)
+ -sc VAL                                : input Side compound file (recommended)
+</code></pre></details></td></tr>
+<tr><td>Sbml2Tab</td><td>Create a tabulated file listing reaction attributes from a SBML file<details><summary><small>more</small></summary>Create a tabulated file listing reaction attributes from a SBML file<br/><br/><pre><code> -h       : prints the help (default: false)
+ -i VAL   : Sbml file
+ -irr VAL : [-->] String for irreversible reaction (default: -->)
+ -o VAL   : [out.tsv] Tabulated file (default: out.tsv)
+ -rev VAL : [<==>] String for reversible reaction (default: <==>)
+</code></pre></details></td></tr>
+<tr><td>SbmlWizard</td><td>General SBML model processing<details><summary><small>more</small></summary>General SBML model processing including compound removal (such as side compounds or isolated compounds), reaction removal (ex. blocked or exchange reaction), and compartment merging<br/><br/><pre><code> -h                                     : prints the help (default: false)
+ -i VAL                                 : input SBML file
+ -kc (--retainC) VAL                    : file containing identifiers of
+                                          compounds to keep from the metabolic
+                                          network
+ -kr (--retainR) VAL                    : file containing identifiers of
+                                          reactions to keep from the metabolic
+                                          network
  -mc (--mergecomp) [no | by_name |      : merge compartments using the provided
  by_id]                                   strategy. No merge by default.
                                           "by_name" can be used if names are
@@ -407,7 +519,7 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
  -rEX (--removeExchange) VAL            : remove exchange reactions and species
                                           from given exchange compartment
                                           identifier
- -rc VAL                                : file containing identifiers of
+ -rc (--removeC) VAL                    : file containing identifiers of
                                           compounds to remove from the
                                           metabolic network
  -rdr (--noDuplicated)                  : remove duplicated reactions (same
@@ -415,25 +527,9 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
  -ric (--noIsolated)                    : remove isolated compounds (not
                                           involved in any reaction) (default:
                                           false)
- -rr VAL                                : file containing identifiers of
+ -rr (--removeR) VAL                    : file containing identifiers of
                                           reactions to remove from the
                                           metabolic network
- -s VAL                                 : input SBML file
-</code></pre></details></td></tr>
-<tr><td>Sbml2Graph</td><td>Create a graph representation of a SBML file content, and export it in graph file format.<details><summary><small>more</small></summary>Create a graph representation of a SBML file content, and export it in graph file format.<br/>The graph can be either a compound graph or a bipartite graph, and can be exported in gml or tabulated file format.<br/><br/><pre><code> -b (--bipartite) : create bipartite graph (default: false)
- -c (--compound)  : create compound graph (default: true)
- -gml             : export in GML file (default: true)
- -h               : prints the help (default: false)
- -i VAL           : input SBML file
- -o VAL           : output Graph file
- -r (--reaction)  : create reaction graph (default: false)
- -tab             : export in tabulated file (default: false)
-</code></pre></details></td></tr>
-<tr><td>Sbml2Tab</td><td>Create a tabulated file from a SBML file<details><summary><small>more</small></summary>Create a tabulated file from a SBML file<br/><br/><pre><code> -h       : prints the help (default: false)
- -i VAL   : [-->] String for irreversible reaction (default: -->)
- -in VAL  : Sbml file
- -out VAL : [out.tsv] Tabulated file (default: out.tsv)
- -r VAL   : [<==>] String for reversible reaction (default: <==>)
 </code></pre></details></td></tr>
 <tr><td>Tab2Sbml</td><td>Create a Sbml File from a tabulated file that contains the reaction ids and the formulas<details><summary><small>more</small></summary>Create a Sbml File from a tabulated file that contains the reaction ids and the formulas<br/><br/><pre><code> -cf N     : [2] number of the column where are the reaction formulas (default:
              2)
@@ -444,17 +540,17 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
  -dcpt VAL : [c] Default compartment (default: c)
  -e VAL    : [_b] flag to assign metabolite as external (default: _b)
  -h        : prints the help (default: false)
- -i VAL    : [-->] String for irreversible reaction (default: -->)
+ -i VAL    : Tabulated file
  -id VAL   : [NA] Model id written in the SBML file (default: NA)
- -in VAL   : Tabulated file
+ -irr VAL  : [-->] String for irreversible reaction (default: -->)
  -mp       : [deactivated] format the metabolite ids in a Palsson way (M_***_c)
              (default: false)
  -n N      : [0] Number of lines to skip at the beginning of the tabulated file
              (default: 0)
- -r VAL    : [<==>] String for reversible reaction (default: <==>)
+ -o VAL    : [out.sbml] Out sbml file (default: out.sbml)
+ -rev VAL  : [<==>] String for reversible reaction (default: <==>)
  -rp       : [deactivated] format the reaction ids in a Palsson way (R_***)
              (default: false)
- -sbml VAL : [out.sbml] Out sbml file (default: out.sbml)
 </code></pre></details></td></tr>
 </tbody>
 </table>
@@ -467,26 +563,26 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
  -compound VAL : Compound file containing one column with compound names to
                  search among the SBML entries
  -h            : prints the help (default: false)
- -nMatch N     : [1] Number of match to return per name (default: 1)
- -o VAL        : Output file
- -sbml VAL     : Original sbml file
+ -i VAL        : Original sbml file
+ -nMatch N     : [1] Number of matchs to return per name (default: 1)
+ -o VAL        : Output tabulated file
  -sep VAL      : [\t] separator in the compound file to split the colmumns.
                  (default: 	)
  -skip N       : [0] Number of lines to skip at the beginning of the compound
                  file (default: 0)
 </code></pre></details></td></tr>
-<tr><td>ORApathwayEnrichment</td><td>Perform Over Representation Analysis for Pathway Enrichment, using one-tailed exact Fisher Test.<details><summary><small>more</small></summary>Perform Over Representation Analysis for Pathway Enrichment, using one-tailed exact Fisher Test.<br/>The fisher exact test compute the probability p to randomly get the given set of value. <br/>This version compute the probability to get at least the given overlap between the given set and the given modality :<br/>Sum the hypergeometric probability with increasing target/query intersection cardinality.<br/><br/>The hypergeometric probability is computed from the following contingency table entries.<br/>(value in cells correspond to the marginal totals of each intersection groups)<br/>				Query	!Query<br/>	Target		a		b<br/>	!Target		c		d<br/><br/>The probability of obtaining the set of value is computed as following:<br/>p = ((a+b)!(c+d)!(a+c)!(b+d)!)/(a!b!c!d!(a+b+c+d)!)<br/><br/>The obtained p-value is then adjusted for multiple testing using one of the following methods:<br/> - Bonferroni: adjusted p-value = p*n<br/> - Benjamini-Hochberg: adjusted p-value = p*n/k<br/> - Holm-Bonferroni: adjusted p-value = p*(n+1-k)<br/>n : number of tests; k : pvalue rank<br/><br/><pre><code> -c (--correction) [Bonferroni |        : Method for multiple testing p-value
+<tr><td>ORApathwayEnrichment</td><td>Perform Over Representation Analysis for Pathway Enrichment, using one-tailed exact Fisher Test.<details><summary><small>more</small></summary>Perform Over Representation Analysis for Pathway Enrichment, using one-tailed exact Fisher Test.<br/>The fisher exact test computes the probability p to randomly get the given set of values. <br/>This version computes the probability to get at least the given overlap between the given set and the given modality :<br/>Sum the hypergeometric probability with increasing target/query intersection cardinality.<br/><br/>The hypergeometric probability is computed from the following contingency table entries.<br/>(values in cells correspond to the marginal totals of each intersection groups)<br/>				Query	!Query<br/>	Target		a		b<br/>	!Target		c		d<br/><br/>The probability of obtaining the set of value is computed as following:<br/>p = ((a+b)!(c+d)!(a+c)!(b+d)!)/(a!b!c!d!(a+b+c+d)!)<br/><br/>The obtained p-value is then adjusted for multiple testing using one of the following methods:<br/> - Bonferroni: adjusted p-value = p*n<br/> - Benjamini-Hochberg: adjusted p-value = p*n/k<br/> - Holm-Bonferroni: adjusted p-value = p*(n+1-k)<br/>n : number of tests; k : pvalue rank<br/><br/><pre><code> -c (--correction) [Bonferroni |        : Method for multiple testing p-value
  BenjaminiHochberg | HolmBonferroni]      adjustment. (default: BenjaminiHochber
                                           g)
- -h                                     : prints the help (default: false)
- -i (--data) VAL                        : Input data : Compounds of interest
+ -d (--data) VAL                        : Input data : Compounds of interest
                                           file, as one SBML specie identifier
                                           per line
+ -h                                     : prints the help (default: false)
+ -i (--sbml) VAL                        : Input model : SBML file with pathway
+                                          annotation
  -o (--output) VAL                      : Output file : tabulated file with
                                           pathway identifier, pathway name,
                                           adjusted p-value.
- -s (--sbml) VAL                        : Input model : SBML file with pathway
-                                          annotation
  -th (--threshold) N                    : threshold to select significant
                                           pathways. No filtering if <=0
                                           (default: 0.0)
@@ -496,7 +592,7 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
 <table>
 <thead><tr><th colspan="2">Package fr.inrae.toulouse.metexplore.met4j_toolbox.networkAnalysis</th></tr></thead>
 <tbody>
-<tr><td>BipartiteDistanceMatrix</td><td>Create a compound to reactions distance matrix.<details><summary><small>more</small></summary>Create a compound to reactions distance matrix.<br/>The distance between two nodes (metabolite or reaction) is computed as the length of the shortest path connecting the two in the bipartite graph, Bipartite graph are composed of two distinct sets of nodes and two nodes can be linked only if they are from distinct sets.<br/>Therefore a metabolite node can be linked to a reaction node if the metabolite is a substrate or product of the reaction.<br/>An optional custom edge weighting can be used, turning the distances into the sum of edge weights in the lightest path, rather than the length of the shortest path.Custom weighting can be provided in a file. In that case, edges without weight are ignored during path search.<br/>If no edge weighting is set, it is recommended to provide a list of side compounds to ignore during network traversal.<br/><br/><pre><code> -f (--full)          : compute full pairwise matrix from both reactions and
+<tr><td>BipartiteDistanceMatrix</td><td>Create a compound to reactions distance matrix.<details><summary><small>more</small></summary>Create a compound to reactions distance matrix.<br/>The distance between two nodes (metabolite or reaction) is computed as the length of the shortest path connecting the two in the bipartite graph, Bipartite graphs are composed of two distinct sets of nodes and two nodes can be linked only if they are from distinct sets.<br/>Therefore a metabolite node can be linked to a reaction node if the metabolite is a substrate or product of the reaction.<br/>An optional custom edge weighting can be used, turning the distances into the sum of edge weights in the lightest path, rather than the length of the shortest path.Custom weighting can be provided in a file. In that case, edges without weight are ignored during path search.<br/>If no edge weighting is set, it is recommended to provide a list of side compounds to ignore during network traversal.<br/><br/><pre><code> -f (--full)          : compute full pairwise matrix from both reactions and
                         compounds lists (default: false)
  -h                   : prints the help (default: false)
  -i VAL               : input SBML file
@@ -511,30 +607,6 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
  -u (--undirected)    : Ignore reaction direction (default: false)
  -w (--weights) VAL   : an optional file containing weights for compound pairs
 </code></pre></details></td></tr>
-<tr><td>CarbonSkeletonNet</td><td>Create a carbon skeleton graph representation of a SBML file content, using GSAM atom-mapping file (see https://forgemia.inra.fr/metexplore/gsam)<details><summary><small>more</small></summary>Metabolic networks used for quantitative analysis often contain links that are irrelevant for graph-based structural analysis. For example, inclusion of side compounds or modelling artifacts such as 'biomass' nodes. Focusing on links between compounds that share parts of their carbon skeleton allows to avoid many transitions involving side compounds, and removes entities without defined chemical structure. This app produce a Carbon Skeleton Network relevant for graph-based analysis of metabolism, in GML or matrix format, from a SBML and an GSAM atom mapping file. GSAM (see https://forgemia.inra.fr/metexplore/gsam) perform atom mapping at genome-scale level using the Reaction Decoder Tool (https://github.com/asad/ReactionDecoder) and allows to compute the number of conserved atoms of a given type between reactants.This app also enable Markov-chain based analysis of metabolic networks by computing reaction-normalized transition probabilities on the Carbon Skeleton Network.<br/><br/><pre><code> -am (--asmatrix)             : export as matrix (implies simple graph
-                                conversion). Default export as GML file
-                                (default: false)
- -g VAL                       : input GSAM file
- -h                           : prints the help (default: false)
- -i (--fromIndexes)           : Use GSAM output with carbon indexes (default:
-                                false)
- -ks (--keepSingleCarbon)     : keep edges involving single-carbon compounds,
-                                such as CO2 (requires formulas in SBML)
-                                (default: false)
- -main (--onlyMainTransition) : Compute RPAIRS-like tags and keep only main
-                                transitions for each reaction (default: false)
- -mc (--nocomp)               : merge compartments (requires unique compound
-                                names that are consistent across compartments)
-                                (default: false)
- -me (--simple)               : merge parallel edges to produce a simple graph
-                                (default: false)
- -o VAL                       : output Graph file
- -ri (--removeIsolatedNodes)  : remove isolated nodes (default: false)
- -s VAL                       : input SBML file
- -tp (--transitionproba)      : set transition probability as weight (default:
-                                false)
- -un (--undirected)           : create as undirected (default: false)
-</code></pre></details></td></tr>
 <tr><td>ChemSimilarityWeighting</td><td>Provides tabulated compound graph edge list, with one column with reactant pair's chemical similarity.<details><summary><small>more</small></summary>Provides tabulated compound graph edge list, with one column with reactant pair's chemical similarity.Chemical similarity has been proposed as edge weight for finding meaningful paths in metabolic networks, using shortest (lightest) path search.<br/><br/>References:<br/><a href="https://doi.org/10.1093/bioinformatics/bti116">Rahman et al.; Metabolic pathway analysis web service (Pathway Hunter Tool at CUBIC); Bioinformatics; 2005</a><br/><a href="https://doi.org/10.1093/bioinformatics/btg217">McShan et al.; PathMiner: predicting metabolic pathways by heuristic search; Bioinformatics; 2003</a><br/><a href="https://doi.org/10.1093/bioinformatics/btu760">Pertusi et al.; Efficient searching and annotation of metabolic networks using chemical similarity; Bioinformatics; 2015</a><br/><br/><br/><pre><code> -d (--asDist)                          : Use distance rather than similarity
                                           (default: false)
  -f (--fingerprint) [EState | Extended  : The chemical fingerprint to use
@@ -570,36 +642,9 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
                                           (default: false)
  -un (--undirected)                     : create as undirected (default: false)
 </code></pre></details></td></tr>
-<tr><td>ChokePoint</td><td>Compute the Choke points of a metabolic network.<details><summary><small>more</small></summary>Compute the Choke points of a metabolic network.<br/>Choke points constitute an indicator of lethality and can help identifying drug target Choke points are reactions that are required to consume or produce one compound. Targeting of choke point can lead to the accumulation or the loss of some metabolites, thus choke points constitute an indicator of lethality and can help identifying drug target.<br/><br/>References:<br/><a href="https://doi.org/10.1093/bioinformatics/btl181">Rahman et al.; Observing local and global properties of metabolic pathways: ‘load points’ and ‘choke points’ in the metabolic networks; Bioinformatics; 2006</a><br/><br/><br/><pre><code> -h     : prints the help (default: false)
+<tr><td>ChokePoint</td><td>Compute the Choke points of a metabolic network.<details><summary><small>more</small></summary>Compute the Choke points of a metabolic network.<br/>Choke points are reactions that are required to consume or produce one compound. Targeting of choke point can lead to the accumulation or the loss of some metabolites, thus choke points constitute an indicator of lethality and can help identifying drug target.<br/><br/>References:<br/><a href="https://doi.org/10.1093/bioinformatics/btl181">Rahman et al.; Observing local and global properties of metabolic pathways: ‘load points’ and ‘choke points’ in the metabolic networks; Bioinformatics; 2006</a><br/><br/><br/><pre><code> -h     : prints the help (default: false)
  -i VAL : input SBML file
- -o VAL : output results file
-</code></pre></details></td></tr>
-<tr><td>CompoundNet</td><td>Advanced creation of a compound graph representation of a SBML file content<details><summary><small>more</small></summary>Metabolic networks used for quantitative analysis often contain links that are irrelevant for graph-based structural analysis. For example, inclusion of side compounds or modelling artifacts such as 'biomass' nodes.<br/>While Carbon Skeleton Graph offer a relevant alternative topology for graph-based analysis, it requires compounds' structure information, usually not provided in model, and difficult to retrieve for model with sparse cross-reference annotations.<br/>In contrary to the SBML2Graph app that performs a raw conversion of the SBML content, the present app propose a fine-tuned creation of compound graph from predefined list of side compounds and degree² weighting to get relevant structure without structural data.This app also enable Markov-chain based analysis of metabolic networks by computing reaction-normalized transition probabilities on the network.<br/><br/><pre><code> -am (--asmatrix)                       : export as matrix (implies simple
-                                          graph conversion). Default export as
-                                          GML file (default: false)
- -cw (--customWeights) VAL              : an optional file containing weights
-                                          for compound pairs
- -dw (--degreeWeights)                  : penalize traversal of hubs by using
-                                          degree square weighting (default:
-                                          false)
- -h                                     : prints the help (default: false)
- -mc (--mergecomp) [no | by_name |      : merge compartments. Use names if
- by_id]                                   consistent and unambiguous across
-                                          compartments, or identifiers if
-                                          compartment suffix is present (id in
-                                          form "xxx_y" with xxx as base
-                                          identifier and y as compartment
-                                          label). (default: no)
- -me (--simple)                         : merge parallel edges to produce a
-                                          simple graph (default: false)
- -o VAL                                 : output Graph file
- -ri (--removeIsolatedNodes)            : remove isolated nodes (default: false)
- -s VAL                                 : input SBML file
- -sc VAL                                : input Side compound file
- -tp (--transitionproba)                : set weight as random walk transition
-                                          probability, normalized by reaction
-                                          (default: false)
- -un (--undirected)                     : create as undirected (default: false)
+ -o VAL : output result file
 </code></pre></details></td></tr>
 <tr><td>DegreeWeighting</td><td>Provides tabulated compound graph edge list, with one column with target's degree.<details><summary><small>more</small></summary>Provides tabulated compound graph edge list, with one column with target's degree.Degree has been proposed as edge weight for finding meaningful paths in metabolic networks, using shortest (lightest) path search.<br/><br/>References:<br/><a href="https://doi.org/10.1016/j.jmb.2005.09.079">Croes et al.; Inferring Meaningful Pathways in Weighted Metabolic Networks; Journal of Molecular Biology; 2006</a><br/><br/><br/><pre><code> -h                                     : prints the help (default: false)
  -mc (--mergecomp) [no | by_name |      : merge compartments. Use names if
@@ -637,59 +682,83 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
  -u (--undirected)  : Ignore reaction direction (default: false)
  -w (--weights) VAL : an optional file containing weights for compound pairs
 </code></pre></details></td></tr>
-<tr><td>ExtractSubBipNetwork</td><td>Create a subnetwork from a GSMN in SBML format, and two files containing lists of compounds and/or reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.<details><summary><small>more</small></summary>Create a subnetwork from a GSMN in SBML format, and two files containing lists of compounds and/or reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.<br/>The subnetwork corresponds to part of the network that connects reactions and compounds from the first list to reactions and compounds from the second list.<br/>Sources and targets list can have elements in common. The connecting part can be defined as the union of shortest or k-shortest paths between sources and targets, or the Steiner tree connecting them. Contrary to compound graph, bipartite graph often lacks weighting policy for edge relevance. In order to ensure appropriate network density, a list of side compounds and blocked reactions to ignore during path build must be provided. An optional edge weight file, if available, can also be used.<br/><br/><pre><code> -br (--blokedReactions) VAL : a file containing list of blocked reactions to
-                               ignore
- -cw (--customWeights) VAL   : an optional file containing weights for
-                               reactions pairs
- -h                          : prints the help (default: false)
- -i VAL                      : input SBML file
- -k N                        : Extract k-shortest paths (default: 1)
- -o VAL                      : output gml file
- -s VAL                      : input sources txt file
- -sc (--side) VAL            : a file containing list of side compounds to
-                               ignore
- -st (--steinertree)         : Extract Steiner Tree (default: false)
- -t VAL                      : input targets txt file
- -tab (--asTable)            : Export in tabulated file instead of .GML
-                               (default: false)
- -u (--undirected)           : Ignore reaction direction (default: false)
-</code></pre></details></td></tr>
-<tr><td>ExtractSubNetwork</td><td>Create a subnetwork from a GSMN in SBML format, and two files containing lists of compounds of interests ids, one per row.<details><summary><small>more</small></summary>Create a subnetwork from a GSMN in SBML format, and two files containing lists of compounds of interests ids, one per row.<br/>The subnetwork correspond to part of the network that connects compounds from the first list to compounds from the second list.<br/>Sources and targets list can have elements in common. The connecting part can be defined as the union of shortest or k-shortest paths between sources and targets, or the Steiner tree connecting them. The relevance of considered path can be increased by weighting the edges using degree squared, chemical similarity (require InChI or SMILES annotations) or any provided weighting.<br/><br/>See previous works on subnetwork extraction for parameters recommendations.<br/><br/>References:<br/><a href="https://doi.org/10.1016/j.biosystems.2011.05.004">Faust et al.; Prediction of metabolic pathways from genome-scale metabolic networks; Biosystems; 2011</a><br/><a href="https://doi.org/10.1093/nar/gki437">Croes et al.; Metabolic PathFinding: inferring relevant pathways in biochemical networks; Nucleic Acids Research; 2005</a><br/><a href="https://doi.org/10.1093/bioinformatics/bti116">Rahman et al.; Metabolic pathway analysis web service (Pathway Hunter Tool at CUBIC); Bioinformatics; 2005</a><br/><a href="https://doi.org/10.1016/j.jmb.2005.09.079">Croes et al.; Inferring Meaningful Pathways in Weighted Metabolic Networks; Journal of Molecular Biology; 2006</a><br/><a href="https://doi.org/10.1093/bioinformatics/btg217">McShan et al.; PathMiner: predicting metabolic pathways by heuristic search; Bioinformatics; 2003</a><br/><a href="https://doi.org/10.1093/bioinformatics/btu760">Pertusi et al.; Efficient searching and annotation of metabolic networks using chemical similarity; Bioinformatics; 2015</a><br/><a href="https://doi.org/10.1093/bib/bbv115">Frainay et al.; Computational methods to identify metabolic sub-networks based on metabolomic profiles; Briefings in Bioinformatics; 2017</a><br/><br/><br/><pre><code> -cw (--customWeights) VAL : an optional file containing weights for compound
-                             pairs
- -dw (--degreeWeights)     : penalize traversal of hubs by using degree square
-                             weighting (default: false)
- -h                        : prints the help (default: false)
- -i VAL                    : input SBML file
- -k N                      : Extract k-shortest paths (default: 1)
- -o VAL                    : output gml file
- -s VAL                    : input sources txt file
- -sc (--side) VAL          : an optional file containing list of side compounds
-                             to ignore
- -st (--steinertree)       : Extract Steiner Tree (default: false)
- -sw (--chemSimWeights)    : penalize traversal of non-relevant edges by using
-                             chemical similarity weighting (default: false)
- -t VAL                    : input targets txt file
- -tab (--asTable)          : Export in tabulated file instead of .GML (default:
-                             false)
- -u (--undirected)         : Ignore reaction direction (default: false)
-</code></pre></details></td></tr>
-<tr><td>ExtractSubReactionNetwork</td><td>Create a subnetwork from a GSMN in SBML format, and two files containing lists of reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.<details><summary><small>more</small></summary>Create a subnetwork from a GSMN in SBML format, and two files containing lists of reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.<br/>The subnetwork corresponds to part of the network that connects reactions from the first list to reactions from the second list.<br/>Sources and targets list can have elements in common. The connecting part can be defined as the union of shortest or k-shortest paths between sources and targets, or the Steiner tree connecting them. Contrary to compound graph, reaction graph often lacks weighting policy for edge relevance. In order to ensure appropriate network density, a list of side compounds to ignore for linking reactions must be provided. An optional edge weight file, if available, can also be used.<br/><br/><pre><code> -cw (--customWeights) VAL : an optional file containing weights for reactions
-                             pairs
- -h                        : prints the help (default: false)
- -i VAL                    : input SBML file
- -k N                      : Extract k-shortest paths (default: 1)
- -o VAL                    : output gml file
- -re (--rExclude) VAL      : an optional file containing list of reactions to
-                             ignore
- -s VAL                    : input sources txt file
- -sc (--side) VAL          : a file containing list of side compounds to ignore
- -st (--steinertree)       : Extract Steiner Tree (default: false)
- -t VAL                    : input targets txt file
- -tab (--asTable)          : Export in tabulated file instead of .GML (default:
-                             false)
- -u (--undirected)         : Ignore reaction direction (default: false)
-</code></pre></details></td></tr>
-<tr><td>LoadPoint</td><td>Compute the Load points of a metabolic network. Load points constitute an indicator of lethality and can help identifying drug target.<details><summary><small>more</small></summary>Compute the Load points of a metabolic network. Load points constitute an indicator of lethality and can help identifying drug target.<br/>From Rahman et al. Observing local and global properties of metabolic pathways: ‘load points’ and ‘choke points’ in the metabolic networks. Bioinf. (2006):<br/>For a given metabolic network, the load L on metabolite m can be defined as :<br/>ln [(pm/km)/(∑Mi=1Pi)/(∑Mi=1Ki)]<br/>p is the number of shortest paths passing through a metabolite m;<br/>k is the number of nearest neighbour links for m in the network;<br/>P is the total number of shortest paths;<br/>K is the sum of links in the metabolic network of M metabolites (where M is the number of metabolites in the network).<br/>Use of the logarithm makes the relevant values more distinguishable.<br/><br/><pre><code> -h              : prints the help (default: false)
+<tr><td>ExtractSubBipNetwork</td><td>Create a subnetwork from a metabolic network in SBML format, and two files containing lists of compounds and/or reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.<details><summary><small>more</small></summary>Create a subnetwork from a metabolic network in SBML format, and two files containing lists of compounds and/or reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.<br/>The subnetwork corresponds to the part of the network that connects reactions and compounds from the first list to reactions and compounds from the second list.<br/>Sources and targets list can have elements in common. The connecting part can be defined as the union of shortest or k-shortest paths between sources and targets, or the Steiner tree connecting them. Contrary to compound graph, bipartite graph often lacks weighting policy for edge relevance. In order to ensure appropriate network density, a list of side compounds and blocked reactions to ignore during path build must be provided. An optional edge weight file, if available, can also be used.<br/><br/><pre><code> -br (--blokedReactions) VAL            : a file containing list of blocked
+                                          reactions to ignore
+ -cw (--customWeights) VAL              : an optional file containing weights
+                                          for reactions pairs
+ -f (--format) [gml | tab | nodeList |  : Format of the exported graphTabulated
+ json | matrix]                           edge list by default (source id 	
+                                          edge type 	 target id). Other options
+                                          include GML, JsonGraph, and tabulated
+                                          node list (label 	 node id 	 node
+                                          type). (default: tab)
+ -h                                     : prints the help (default: false)
+ -i VAL                                 : input SBML file
+ -k N                                   : Extract k-shortest paths (default: 1)
+ -o VAL                                 : output file: path to the tabulated
+                                          file where the resulting network will
+                                          be exported
+ -s VAL                                 : input sources txt file
+ -sc (--side) VAL                       : a file containing list of side
+                                          compounds to ignore
+ -st (--steinertree)                    : Extract Steiner Tree (default: false)
+ -t VAL                                 : input targets txt file
+ -u (--undirected)                      : Ignore reaction direction (default:
+                                          false)
+</code></pre></details></td></tr>
+<tr><td>ExtractSubNetwork</td><td>Create a subnetwork from a metabolic network in SBML format, and two files containing lists of compounds of interests ids, one per row.<details><summary><small>more</small></summary>Create a subnetwork from a metabolic network in SBML format, and two files containing lists of compounds of interests ids, one per row.<br/>The subnetwork corresponds to the part of the network that connects compounds from the first list to compounds from the second list.<br/>Sources and targets list can have elements in common. The connecting part can be defined as the union of shortest or k-shortest paths between sources and targets, or the Steiner tree connecting them. The relevance of considered path can be increased by weighting the edges using degree squared, chemical similarity (require InChI or SMILES annotations) or any provided weighting.<br/><br/>See previous works on subnetwork extraction for parameters recommendations.<br/><br/>References:<br/><a href="https://doi.org/10.1093/nar/gki437">Croes et al.; Metabolic PathFinding: inferring relevant pathways in biochemical networks; Nucleic Acids Research; 2005</a><br/><a href="https://doi.org/10.1093/bioinformatics/btu760">Pertusi et al.; Efficient searching and annotation of metabolic networks using chemical similarity; Bioinformatics; 2015</a><br/><a href="https://doi.org/10.1016/j.jmb.2005.09.079">Croes et al.; Inferring Meaningful Pathways in Weighted Metabolic Networks; Journal of Molecular Biology; 2006</a><br/><a href="https://doi.org/10.1093/bioinformatics/bti116">Rahman et al.; Metabolic pathway analysis web service (Pathway Hunter Tool at CUBIC); Bioinformatics; 2005</a><br/><a href="https://doi.org/10.1093/bioinformatics/btg217">McShan et al.; PathMiner: predicting metabolic pathways by heuristic search; Bioinformatics; 2003</a><br/><a href="https://doi.org/10.1093/bib/bbv115">Frainay et al.; Computational methods to identify metabolic sub-networks based on metabolomic profiles; Briefings in Bioinformatics; 2017</a><br/><a href="https://doi.org/10.1016/j.biosystems.2011.05.004">Faust et al.; Prediction of metabolic pathways from genome-scale metabolic networks; Biosystems; 2011</a><br/><br/><br/><pre><code> -cw (--customWeights) VAL              : an optional file containing weights
+                                          for compound pairs
+ -dw (--degreeWeights)                  : penalize traversal of hubs by using
+                                          degree square weighting (default:
+                                          false)
+ -f (--format) [gml | tab | nodeList |  : Format of the exported graphTabulated
+ json | matrix]                           edge list by default (source id 	
+                                          edge type 	 target id). Other options
+                                          include GML, JsonGraph, and tabulated
+                                          node list (label 	 node id 	 node
+                                          type). (default: tab)
+ -h                                     : prints the help (default: false)
+ -i VAL                                 : input SBML file
+ -k N                                   : Extract k-shortest paths (default: 1)
+ -o VAL                                 : output file: path to the tabulated
+                                          file where the resulting network will
+                                          be exported
+ -s VAL                                 : input sources txt file
+ -sc (--side) VAL                       : an optional file containing list of
+                                          side compounds to ignore
+ -st (--steinertree)                    : Extract Steiner Tree (default: false)
+ -sw (--chemSimWeights)                 : penalize traversal of non-relevant
+                                          edges by using chemical similarity
+                                          weighting (default: false)
+ -t VAL                                 : input targets txt file
+ -u (--undirected)                      : Ignore reaction direction (default:
+                                          false)
+</code></pre></details></td></tr>
+<tr><td>ExtractSubReactionNetwork</td><td>Create a subnetwork from a metabolic network in SBML format, and two files containing lists of reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.<details><summary><small>more</small></summary>Create a subnetwork from a metabolic network in SBML format, and two files containing lists of reactions of interests ids, one per row, plus one file of the same format containing side compounds ids.<br/>The subnetwork corresponds to the part of the network that connects reactions from the first list to reactions from the second list.<br/>Sources and targets list can have elements in common. The connecting part can be defined as the union of shortest or k-shortest paths between sources and targets, or the Steiner tree connecting them. Contrary to compound graph, reaction graph often lacks weighting policy for edge relevance. In order to ensure appropriate network density, a list of side compounds to ignore for linking reactions must be provided. An optional edge weight file, if available, can also be used.<br/><br/><pre><code> -cw (--customWeights) VAL              : an optional file containing weights
+                                          for reactions pairs
+ -f (--format) [gml | tab | nodeList |  : Format of the exported graphTabulated
+ json | matrix]                           edge list by default (source id 	
+                                          edge type 	 target id). Other options
+                                          include GML, JsonGraph, and tabulated
+                                          node list (label 	 node id 	 node
+                                          type). (default: tab)
+ -h                                     : prints the help (default: false)
+ -i VAL                                 : input SBML file
+ -k N                                   : Extract k-shortest paths (default: 1)
+ -o VAL                                 : output file: path to the tabulated
+                                          file where the resulting network will
+                                          be exported
+ -re (--rExclude) VAL                   : an optional file containing list of
+                                          reactions to ignore
+ -s VAL                                 : input sources txt file
+ -sc (--side) VAL                       : a file containing list of side
+                                          compounds to ignore
+ -st (--steinertree)                    : Extract Steiner Tree (default: false)
+ -t VAL                                 : input targets txt file
+ -u (--undirected)                      : Ignore reaction direction (default:
+                                          false)
+</code></pre></details></td></tr>
+<tr><td>LoadPoint</td><td>Compute the Load points of a metabolic network. Load points constitute an indicator of lethality and can help identifying drug targets.<details><summary><small>more</small></summary>Compute the Load points of a metabolic network. Load points constitute an indicator of lethality and can help identifying drug targets.<br/>From Rahman et al. Observing local and global properties of metabolic pathways: ‘load points’ and ‘choke points’ in the metabolic networks. Bioinf. (2006):<br/>For a given metabolic network, the load L on metabolite m can be defined as :<br/>ln [(pm/km)/(∑Mi=1Pi)/(∑Mi=1Ki)]<br/>p is the number of shortest paths passing through a metabolite m;<br/>k is the number of nearest neighbour links for m in the network;<br/>P is the total number of shortest paths;<br/>K is the sum of links in the metabolic network of M metabolites (where M is the number of metabolites in the network).<br/>Use of the logarithm makes the relevant values more distinguishable.<br/><br/>References:<br/><a href="https://doi.org/10.1093/bioinformatics/btl181">Rahman et al.; Observing local and global properties of metabolic pathways: ‘load points’ and ‘choke points’ in the metabolic networks; Bioinformatics; 2006</a><br/><br/><br/><pre><code> -h              : prints the help (default: false)
  -i VAL          : input SBML file
  -k (--npath) N  : Number of alternative paths to consider between a pair of
                    connected metabolites (default: 1)
@@ -709,7 +778,7 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
  -w VAL  : input edge weight file: (recommended) path to file containing edges'
            weights. Will be normalized as transition probabilities
 </code></pre></details></td></tr>
-<tr><td>NetworkSummary</td><td>Create a report summarizing several graph measures characterising the structure of the network.<details><summary><small>more</small></summary>Use a metabolic network in SBML file and an optional list of side compounds, and produce a report summarizing several graph measures characterising the structure of the network.This includes (non-exhaustive list): size and order, connectivity, density, degree distribution, shortest paths length, top centrality nodes...<br/><br/><pre><code> -d (--directed)  : use reaction direction for distances (default: false)
+<tr><td>NetworkSummary</td><td>Create a report summarizing several graph measures characterising the structure of a metabolic network.<details><summary><small>more</small></summary>Create a report summarizing several graph measures characterising the structure of a metabolic network.<br/>Use a metabolic network in SBML file and an optional list of side compounds, and produce a report summarizing several graph measures characterising the structure of the network.This includes (non-exhaustive list): size and order, connectivity, density, degree distribution, shortest paths length, top centrality nodes...<br/><br/><pre><code> -d (--directed)  : use reaction direction for distances (default: false)
  -h               : prints the help (default: false)
  -i VAL           : input SBML file
  -o VAL           : output report file
@@ -718,34 +787,26 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
  -sd (--skipdist) : skip full distance matrix computation (quick summary)
                     (default: false)
 </code></pre></details></td></tr>
-<tr><td>PathwayNet</td><td>Creation of a Pathway Network representation of a SBML file content<details><summary><small>more</small></summary>Genome-scale metabolic networks are often partitioned into metabolic pathways. Pathways are frequently considered independently despite frequent coupling in their activity due to shared metabolites. In order to decipher the interconnections linking overlapping pathways, this app proposes the creation of "Pathway Network", where two pathways are linked if they share compounds.<br/><br/><pre><code> -am (--asmatrix)             : export as matrix (implies simple graph
-                                conversion). Default export as GML file
-                                (default: false)
- -cw (--customWeights) VAL    : an optional file containing weights for pathway
-                                pairs
- -h                           : prints the help (default: false)
- -ncw (--connectorWeights)    : set number of connecting compounds as weight
-                                (default: false)
- -o VAL                       : output Graph file
- -oss (--onlySourcesAndSinks) : consider only metabolites that are source or
-                                sink in the pathway (i.e non-intermediary
-                                compounds) (default: false)
- -ri (--removeIsolatedNodes)  : remove isolated nodes (default: false)
- -s VAL                       : input SBML file
- -sc VAL                      : input Side compound file (recommended)
-</code></pre></details></td></tr>
-<tr><td>PrecursorNetwork</td><td>Perform a network expansion from a set of compound targets to create a precursor network.<details><summary><small>more</small></summary>Perform a network expansion from a set of compound targets to create a precursor network.<br/>The precursor network of a set of compounds (targets) refer to the sub-part of a metabolic network from which a target can be reachedThe network expansion process consist of adding a reaction to the network if any of its products are either a targets or a substrate of a previously added reaction<br/><br/><pre><code> -h                 : prints the help (default: false)
- -i VAL             : input SBML file: path to network used for computing
-                      scope, in sbml format.
- -ir (--ignore) VAL : an optional file containing list of reaction to ignore
-                      (forbid inclusion in scope)
- -o VAL             : output file: path to the .gml file where the results
-                      precursor network will be exported
- -sc (--sides) VAL  : an optional file containing list of ubiquitous compounds
-                      to be considered already available
- -t (--targets) VAL : input target file: tabulated file containing node of
-                      interest ids
- -tab (--asTable)   : Export in tabulated file instead of .GML (default: false)
+<tr><td>PrecursorNetwork</td><td>Perform a network expansion from a set of compound targets to create a precursor network.<details><summary><small>more</small></summary>Perform a network expansion from a set of compound targets to create a precursor network.<br/>The precursor network of a set of compounds (targets) refer to the sub-part of a metabolic network from which a target can be reachedThe network expansion process consist of adding a reaction to the network if any of its products are either a targets or a substrate of a previously added reaction<br/><br/><pre><code> -f (--format) [gml | tab | nodeList |  : Format of the exported graphTabulated
+ json | matrix]                           edge list by default (source id 	
+                                          edge type 	 target id). Other options
+                                          include GML, JsonGraph, and tabulated
+                                          node list (label 	 node id 	 node
+                                          type). (default: tab)
+ -h                                     : prints the help (default: false)
+ -i VAL                                 : input SBML file: path to network used
+                                          for computing scope, in sbml format.
+ -ir (--ignore) VAL                     : an optional file containing list of
+                                          reaction to ignore (forbid inclusion
+                                          in scope)
+ -o VAL                                 : output file: path to the tabulated
+                                          file where the resulting network will
+                                          be exported
+ -sc (--sides) VAL                      : an optional file containing list of
+                                          ubiquitous compounds to be considered
+                                          already available
+ -t (--targets) VAL                     : input target file: tabulated file
+                                          containing node of interest ids
 </code></pre></details></td></tr>
 <tr><td>ReactionDistanceMatrix</td><td>Create a reaction to reaction distance matrix.<details><summary><small>more</small></summary>Create a reaction to reaction distance matrix.<br/>The distance between two reactions is computed as the length of the shortest path connecting the two in the reaction graph, where two reactions are linked if they produce a metabolite consumed by the other or the other way around.<br/>An optional edge weighting can be used, turning the distances into the sum of edge weights in the lightest path, rather than the length of the shortest path.The default weighting use target's degree squared. Alternatively, custom weighting can be provided in a file. In that case, edges without weight are ignored during path search.<br/>If no edge weighting is set, it is recommended to provide a list of side compounds to ignore during network traversal.<br/><br/><pre><code> -dw (--degree)       : penalize traversal of hubs by using degree square
                         weighting (-w must not be set) (default: false)
@@ -760,59 +821,67 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
  -u (--undirected)    : Ignore reaction direction (default: false)
  -w (--weights) VAL   : an optional file containing weights for compound pairs
 </code></pre></details></td></tr>
-<tr><td>ScopeNetwork</td><td>Perform a network expansion from a set of compound seeds to create a scope network<details><summary><small>more</small></summary>Perform a network expansion from a set of compound seeds to create a scope network<br/>The scope of a set of compounds (seed) refer to the maximal metabolic network that can be extended from them,where the extension process consist of adding a reaction to the network if and only if all of its substrates are either a seed or a product of a previously added reaction<br/><br/>References:<br/><a href="https://doi.org/10.1007/s00239-005-0027-1">Handorf et al.; Expanding Metabolic Networks: Scopes of Compounds, Robustness, and Evolution; Journal of Molecular Evolution; 2005</a><br/><br/><br/><pre><code> -h                 : prints the help (default: false)
- -i VAL             : input SBML file: path to network used for computing
-                      scope, in sbml format.
- -ir (--ignore) VAL : an optional file containing list of reaction to ignore
-                      (forbid inclusion in scope
- -o VAL             : output file: path to the .gml file where the results
-                      scope network will be exported
- -s (--seeds) VAL   : input seeds file: tabulated file containing node of
-                      interest ids
- -sc (--sides) VAL  : an optional file containing list of ubiquitous side
-                      compounds to be considered available by default but
-                      ignored during expansion
- -ssc (--showsides) : show side compounds in output network (default: false)
- -t (--trace)       : trace inclusion step index for each node in output
-                      (default: false)
- -tab (--asTable)   : Export in tabulated file instead of .GML (default: false)
-</code></pre></details></td></tr>
-<tr><td>SeedsAndTargets</td><td>Identify exogenously acquired compounds, producible compounds exogenously available and/or dead ends metabolites from metabolic network topology<details><summary><small>more</small></summary>Identify exogenously acquired compounds, producible compounds exogenously available and/or dead ends metabolites from metabolic network topology. Metabolic seeds and targets are useful for identifying medium requirements and metabolic capability, and thus enable analysis of metabolic ties within communities of organisms.<br/>This application can use seed definition and SCC-based detection algorithm by Borenstein et al. or, alternatively, degree-based sink and source detection with compartment adjustment.<br/>The first method (see Borenstein et al. 2008 Large-scale reconstruction and phylogenetic analysis of metabolic environments https://doi.org/10.1073/pnas.0806162105) consider strongly connected components rather than individual nodes, thus, members of cycles can be considered as seed. A sink from an external compartment can however be connected to a non sink internal counterpart, thus highlighting what could end up in the external compartment rather than what must be exported.<br/>The second approach is neighborhood based and identify sources and sinks. Since "real" sinks and sources in intracellular compartment(s) may be involved in transport/exchange reactions reversible by default, thus not allowing extracellular source or sink, an option allows to take the degree (minus extracellular neighbors) of intracellular counterparts.<br/><br/>References:<br/><a href="https://doi.org/10.1073/pnas.0806162105">Borenstein et al.; Large-scale reconstruction and phylogenetic analysis of metabolic environments; Proceedings of the National Academy of Sciences; 2008</a><br/><br/><br/><pre><code> -!s (--notSeed)         : export nodes that are not seed (default: false)
+<tr><td>ScopeNetwork</td><td>Perform a network expansion from a set of compound seeds to create a scope network<details><summary><small>more</small></summary>Perform a network expansion from a set of compound seeds to create a scope network<br/>The scope of a set of compounds (seed) refer to the maximal metabolic network that can be extended from them,where the extension process consist of adding a reaction to the network if and only if all of its substrates are either a seed or a product of a previously added reaction<br/><br/>References:<br/><a href="https://doi.org/10.1007/s00239-005-0027-1">Handorf et al.; Expanding Metabolic Networks: Scopes of Compounds, Robustness, and Evolution; Journal of Molecular Evolution; 2005</a><br/><br/><br/><pre><code> -f (--format) [gml | tab | nodeList |  : Format of the exported graphTabulated
+ json | matrix]                           edge list by default (source id 	
+                                          edge type 	 target id). Other options
+                                          include GML, JsonGraph, and tabulated
+                                          node list (label 	 node id 	 node
+                                          type). (default: tab)
+ -h                                     : prints the help (default: false)
+ -i VAL                                 : input SBML file: path to network used
+                                          for computing scope, in sbml format.
+ -ir (--ignore) VAL                     : an optional file containing list of
+                                          reaction to ignore (forbid inclusion
+                                          in scope
+ -o VAL                                 : output file: path to the tabulated
+                                          file where the resulting network will
+                                          be exported
+ -s (--seeds) VAL                       : input seeds file: tabulated file
+                                          containing node of interest ids
+ -sc (--sides) VAL                      : an optional file containing list of
+                                          ubiquitous side compounds to be
+                                          considered available by default but
+                                          ignored during expansion
+ -ssc (--showsides)                     : show side compounds in output network
+                                          (default: false)
+ -t (--trace)                           : trace inclusion step index for each
+                                          node in output (default: false)
+</code></pre></details></td></tr>
+<tr><td>SeedsAndTargets</td><td>Identify exogenously acquired compounds, exogenously available producible compounds and/or dead ends metabolites from metabolic network topology<details><summary><small>more</small></summary>Identify exogenously acquired compounds, exogenously available producible compounds and/or dead ends metabolites from metabolic network topology<br/>Metabolic seeds and targets are useful for identifying medium requirements and metabolic capability, and thus enable analysis of metabolic ties within communities of organisms.<br/>This application can use seed definition and SCC-based detection algorithm by Borenstein et al. or, alternatively, degree-based sink and source detection with compartment adjustment.<br/>The first method (see Borenstein et al. 2008 Large-scale reconstruction and phylogenetic analysis of metabolic environments https://doi.org/10.1073/pnas.0806162105) consider strongly connected components rather than individual nodes, thus, members of cycles can be considered as seeds. A sink from an external compartment can however be connected to a non sink internal counterpart, thus highlighting what could end up in the external compartment rather than what must be exported.<br/>The second approach is neighborhood based and identify sources and sinks. Since "real" sinks and sources in intracellular compartment(s) may be involved in transport/exchange reactions reversible by default, thus not allowing extracellular source or sink, an option allows to take the degree (minus extracellular neighbors) of intracellular counterparts.<br/><br/>References:<br/><a href="https://doi.org/10.1073/pnas.0806162105">Borenstein et al.; Large-scale reconstruction and phylogenetic analysis of metabolic environments; Proceedings of the National Academy of Sciences; 2008</a><br/><br/><br/><pre><code> -!s (--notSeed)         : export nodes that are not seeds (default: false)
  -!t (--notTarget)       : export nodes that are not targets (default: false)
  -B (--useBorensteinAlg) : use Borenstein Algorithm. Please cite Borenstein et
                            al. 2008 Large-scale reconstruction and phylogenetic
                            analysis of metabolic environments
-                           https://doi.org/10.1073/pnas.0806162105). ignore
+                           https://doi.org/10.1073/pnas.0806162105), ignore
                            internal option (default: false)
- -c (--comp) VAL         : Selected compartment(s), as model identifiers,
+ -c (--comp) VAL         : selected compartment(s), as model identifiers,
                            separated by "+" sign if more than one
  -h                      : prints the help (default: false)
  -i (--inputSBML) VAL    : input SBML file
  -in (--internal)        : if an external compartment is defined, adjust degree
                            by considering internal counterpart (default: false)
  -is (--keepIsolated)    : do not ignore isolated nodes, consider isolated both
-                           seed and target (default: false)
+                           seeds and targets (default: false)
  -o (--output) VAL       : output seeds file
  -s (--seeds)            : export seeds (default: false)
- -sc (--sideFile) VAL    : input Side compound file
+ -sc (--sideFile) VAL    : input side compound file
  -t (--targets)          : export targets (default: false)
 </code></pre></details></td></tr>
-<tr><td>SideCompoundsScan</td><td>Scan a network to identify side-compounds.<details><summary><small>more</small></summary>Scan a network to identify side-compounds.<br/>Side compounds are metabolites of small relevance for topological analysis. Their definition can be quite subjective and varies between sources.<br/>Side compounds tend to be ubiquitous and not specific to a particular biochemical or physiological process.Compounds usually considered as side compounds include water, atp or carbon dioxide. By being involved in many reactions and thus connected to many compounds, they tend to significantly lower the average shortest path distances beyond expected metabolic relatedness.<br/>This tool attempts to propose a list of side compounds according to specific criteria:  <br/>- *Degree*: Compounds with an uncommonly high number of neighbors can betray a lack of process specificity.  <br/>High degree compounds typically include water and most main cofactors (CoA, ATP, NADPH...) but can also include central compounds such as pyruvate or acetyl-CoA  <br/>- *Neighbor Coupling*: Similar to degree, this criteria assume that side compounds are involved in many reactions, but in pairs with other side compounds.<br/>Therefore, the transition from ATP to ADP will appear multiple time in the network, creating redundant 'parallel edges' between these two neighbors.<br/>Being tightly coupled to another compound through a high number of redundant edges, can point out cofactors while keeping converging pathways' products with high degree like pyruvate aside.  <br/>- *Carbon Count*: Metabolic "waste", or degradation end-product such as ammonia or carbon dioxide are usually considered as side compounds.<br/>Most of them are inorganic compound, another ill-defined concept, sometimes defined as compound lacking C-C or C-H bonds. Since chemical structure is rarely available in SBML model beyond chemical formula, we use a less restrictive criterion by flagging compound with one or no carbons. This cover most inorganic compounds, but include few compounds such as methane usually considered as organic.  - *Chemical Formula*: Metabolic network often contains 'artifacts' that serve modelling purpose (to define a composite objective function for example). Such entities can be considered as 'side entities'. Since they are not actual chemical compounds, they can be detected by their lack of valid chemical formula. However, this can also flag main compounds with erroneous or missing annotation.<br/><br/><pre><code> -cc (--noCarbonSkeleton)            : flag as side compound any compounds with
+<tr><td>SideCompoundsScan</td><td>Scan a network to identify side compounds.<details><summary><small>more</small></summary>Scan a network to identify side compounds.<br/>Side compounds are metabolites of small relevance for topological analysis. Their definition can be quite subjective and varies between sources.<br/>Side compounds tend to be ubiquitous and not specific to a particular biochemical or physiological process.Compounds usually considered as side compounds include water, atp or carbon dioxide. By being involved in many reactions and thus connected to many compounds, they tend to significantly lower the average shortest path distances beyond expected metabolic relatedness.<br/>This tool attempts to propose a list of side compounds according to specific criteria:  <br/>- *Degree*: Compounds with an uncommonly high number of neighbors can betray a lack of process specificity.  <br/>High degree compounds typically include water and most main cofactors (CoA, ATP, NADPH...) but can also include central compounds such as pyruvate or acetyl-CoA  <br/>- *Neighbor Coupling*: Similar to degree, this criteria assume that side compounds are involved in many reactions, but in pairs with other side compounds.<br/>Therefore, the transition from ATP to ADP will appear multiple times in the network, creating redundant 'parallel edges' between these two neighbors.<br/>Being tightly coupled to another compound through a high number of redundant edges, can point out cofactors while keeping converging pathways' products with high degree like pyruvate aside.  <br/>- *Carbon Count*: Metabolic "waste", or degradation end-product such as ammonia or carbon dioxide are usually considered as side compounds.<br/>Most of them are inorganic compound, another ill-defined concept, sometimes defined as compound lacking C-C or C-H bonds. Since chemical structure is rarely available in SBML model beyond chemical formula, we use a less restrictive criterion by flagging compound with one or no carbons. This cover most inorganic compounds, but include few compounds such as methane usually considered as organic.  - *Chemical Formula*: Metabolic network often contains 'artifacts' that serve modelling purpose (to define a composite objective function for example). Such entities can be considered as 'side entities'. Since they are not actual chemical compounds, they can be detected by their lack of valid chemical formula. However, this can also flag main compounds with erroneous or missing annotation.<br/><br/><pre><code> -cc (--noCarbonSkeleton)            : flag as side compound any compound with
                                        less than 2 carbons in formula (default:
                                        false)
- -d (--degree) N                     : flag as side compounds any compounds
-                                       with degree above threshold (default:
-                                       400)
+ -d (--degree) N                     : flag as side compounds any compound with
+                                       degree above threshold (default: 400)
  -dp (--degreep) N                   : flag as side compounds the top x% of
                                        compounds according to their degree
                                        (default: NaN)
  -h                                  : prints the help (default: false)
  -i VAL                              : input SBML file
  -id (--onlyIds)                     : do not report values in output, export
-                                       ids list of compounds flagged as
-                                       side-Compounds, allowing piping results
+                                       ids of compounds flagged as side
+                                       compounds, allowing piping results
                                        (default: false)
- -m (--merge) [no | by_name | by_id] : Degree is shared between compounds in
+ -m (--merge) [no | by_name | by_id] : degree is shared between compounds in
                                        different compartments. Use names if
                                        consistent and unambiguous across
                                        compartments, or identifiers if
@@ -824,19 +893,20 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
                                        a number of parallel edges shared with a
                                        neighbor above the given threshold
                                        (default: NaN)
- -o VAL                              : output Side-Compounds file
- -s (--onlySides)                    : output compounds flagged as
-                                       side-Compounds only (default: false)
- -uf (--undefinedFormula)            : flag as side compound any compounds with
+ -o VAL                              : output file containing the side compounds
+ -s (--onlySides)                    : output compounds flagged as side
+                                       compounds only (default: false)
+ -uf (--undefinedFormula)            : flag as side compound any compound with
                                        no valid chemical formula (default:
                                        false)
 </code></pre></details></td></tr>
-<tr><td>TopologicalPathwayAnalysis</td><td>Run a Topological Pathway Analysis to identify key pathways based on topological properties of its constituting compounds.<details><summary><small>more</small></summary>Run a Topological Pathway Analysis (TPA) to identify key pathways based on topological properties of its mapped compounds. From a list of compounds of interest, the app compute their betweenness centrality (which quantifies how often a compound acts as a intermediary along the shortest paths between pairs of other compounds in the network, which, if high, suggest a critical role in the overall flow within the network). Each pathway is scored according to the summed centrality of its metabolites found in the dataset. Alternatively to the betweenness, one can make use of the out-degree (the number of outgoing link, i.e. number of direct metabolic product) as a criterion of importance. TPA is complementary to statistical enrichment analysis to ensures a more meaningful interpretation of the data, by taking into account the influence of identified compounds on the structure of the pathways.<br/><br/><pre><code> -cw (--customWeights) VAL              : an optional file containing weights
+<tr><td>TopologicalPathwayAnalysis</td><td>Run a Topological Pathway Analysis (TPA) to identify key pathways based on topological properties of its constituting compounds.<details><summary><small>more</small></summary>Run a Topological Pathway Analysis (TPA) to identify key pathways based on topological properties of its constituting compounds.<br/>From a list of compounds of interest, the app compute their betweenness centrality (which quantifies how often a compound acts as a intermediary along the shortest paths between pairs of other compounds in the network, which, if high, suggest a critical role in the overall flow within the network). Each pathway is scored according to the summed centrality of its metabolites found in the dataset. Alternatively to the betweenness, one can make use of the out-degree (the number of outgoing link, i.e. number of direct metabolic product) as a criterion of importance. TPA is complementary to statistical enrichment analysis to ensures a more meaningful interpretation of the data, by taking into account the influence of identified compounds on the structure of the pathways.<br/><br/><pre><code> -cw (--customWeights) VAL              : an optional file containing weights
                                           for compound pairs, taken into
                                           account for betweenness computation.
                                           Edges not found in file will be
                                           removed
  -h                                     : prints the help (default: false)
+ -i VAL                                 : input SBML file
  -mc (--mergecomp) [no | by_name |      : merge compartments. Use names if
  by_id]                                   consistent and unambiguous across
                                           compartments, or identifiers if
@@ -852,7 +922,6 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
                                           instead of betweenness (faster
                                           computation) (default: false)
  -ri (--removeIsolatedNodes)            : remove isolated nodes (default: false)
- -s VAL                                 : input SBML file
  -sc VAL                                : input Side compound file (recommended)
  -un (--undirected)                     : the compound graph built from the
                                           metabolic network and used for
@@ -865,12 +934,52 @@ Wrappers launch the met4j singularity container, so the server where your Galaxy
 <table>
 <thead><tr><th colspan="2">Package fr.inrae.toulouse.metexplore.met4j_toolbox.reconstruction</th></tr></thead>
 <tbody>
-<tr><td>SbmlCheckBalance</td><td>Check balance of all the reactions in a SBML.<details><summary><small>more</small></summary>Check balance of all the reactions in a SBML.<br/>A reaction is balanced if all its reactants have a chemical formula with a good syntax and if the quantity of each atom is the same in both sides of the reaction.<br/>For each reaction, indicates if the reaction is balanced, the list of the atoms and the sum of their quantity, and the list of the metabolites that don't have a correct chemical formula.<br/><br/><pre><code> -h        : prints the help (default: false)
- -out VAL  : [checkBalances.tsv] Output tabulated file (1st col: reaction id,
-             2nd col: boolean indicating if the reaction is balanced, 3rd col:
-             atom balances, 4th col: metabolites with bad formula (default:
-             checkBalances.tsv)
- -sbml VAL : Original sbml file
+<tr><td>CreateMetaNetwork</td><td>Create a Meta-Network from two sub-networks in SBML format.<details><summary><small>more</small></summary>Create a Meta-Network from two sub-networks in SBML format.<br/>A meta-network is a single model which contains several sub-networks that remains individualized within the meta-network (as opposed to model fusion), but which can share some of their components with other sub-networks through a shared "medium" compartment.<br/><br/><pre><code> -h                                     : prints the help (default: false)
+ -k (--keepCompartment)                 : keep the original external
+                                          compartments in the meta-network,
+                                          otherwise, they will be fused into
+                                          the new shared external compartment
+                                          (default: false)
+ -mc (--mergingCriterion) [by_metanetx  : field used to identify the same
+ | by_name | by_id]                       metabolites across the two different
+                                          networks. "by_name"/"by_id" can be
+                                          used if names/identifiers are
+                                          consistent and unambiguous across
+                                          source models, "by_metanetx" can be
+                                          used if models contains MetaNetX
+                                          identifiers in annotation field using
+                                          standard miriam format. (default:
+                                          by_name)
+ -n1 (--network1) VAL                   : input SBML file: path to first
+                                          network, in sbml format.
+ -n1ex (--external1) VAL                : external compartment identifier in
+                                          first network.
+ -n1meta (--firstAsMeta)                : treat first network as meta-network,
+                                          allowing more than two sub-models
+                                          with iterative fusions. This will
+                                          overwrite shared compartment and pool
+                                          compounds (which must follow the
+                                          "pool_" prefix convention) and will
+                                          ignore --n1prefix argument (default:
+                                          false)
+ -n1px (--n1prefix) VAL                 : prefix that will be added to first
+                                          network's entities identifiers
+                                          (default: Net1_)
+ -n2 (--network2) VAL                   : input SBML file: path to second
+                                          network, in sbml format.
+ -n2ex (--external2) VAL                : external compartment identifier in
+                                          second network.
+ -n2px (--n2prefix) VAL                 : prefix that will be added to second
+                                          network's entities identifiers
+                                          (default: Net2_)
+ -o VAL                                 : output meta-network SBML file
+</code></pre></details></td></tr>
+<tr><td>SbmlCheckBalance</td><td>Check balance of all the reactions in a SBML.<details><summary><small>more</small></summary>Check balance of all the reactions in a SBML.<br/>A reaction is balanced if all its reactants have a chemical formula with a good syntax and if the quantity of each atom is the same in both sides of the reaction.<br/>For each reaction, indicates if the reaction is balanced, the list of the atoms and the sum of their quantity, and the list of the metabolites that don't have a correct chemical formula.<br/><br/><pre><code> -h       : prints the help (default: false)
+ -i VAL   : Input Sbml file
+ -out VAL : [checkBalances.tsv] Output tabulated file (1st col: reaction id,
+            2nd col: boolean indicating if the reaction is balanced, 3rd col:
+            atom balances, 4th col: metabolites with bad formula (default:
+            checkBalances.tsv)
 </code></pre></details></td></tr>
 </tbody>
 </table>
diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2CarbonSkeletonNet.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2CarbonSkeletonNet.java
index 32c15ec86c1f2f20541cf2bb262cddfe37fee785..3bdd864a6bb32bb8d809bbeed8a227c595d7618c 100644
--- a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2CarbonSkeletonNet.java
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2CarbonSkeletonNet.java
@@ -44,12 +44,10 @@ import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.RP
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.ReactionProbabilityWeight;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.EdgeMerger;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.VertexContraction;
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.utils.ComputeAdjacencyMatrix;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.io.ExportGraph;
-import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.ExportMatrix;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.AbstractMet4jApplication;
+import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.GraphOutPut;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Format;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.ParameterType;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.utils.Doi;
@@ -64,7 +62,7 @@ import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Enu
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumParameterTypes.OutputFile;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.utils.IOUtils.SbmlPackage.*;
 
-public class Sbml2CarbonSkeletonNet extends AbstractMet4jApplication {
+public class Sbml2CarbonSkeletonNet extends AbstractMet4jApplication implements GraphOutPut{
 
     @Format(name = Sbml)
     @ParameterType(name = InputFile)
@@ -76,11 +74,6 @@ public class Sbml2CarbonSkeletonNet extends AbstractMet4jApplication {
     @Option(name = "-g", usage = "input GSAM file", required = true)
     public String inputAAM = null;
 
-    @Format(name = Txt)
-    @ParameterType(name = OutputFile)
-    @Option(name = "-o", usage = "output Graph file (Gml or Matrix format, see -am parameter))", required = true)
-    public String outputPath = null;
-
     @Option(name = "-ks", aliases = {"--keepSingleCarbon"}, usage = "keep edges involving single-carbon compounds, such as CO2 (requires formulas in SBML)")
     public boolean keepSingleCarbon = false;
 
@@ -99,8 +92,14 @@ public class Sbml2CarbonSkeletonNet extends AbstractMet4jApplication {
     @Option(name = "-tp", aliases = {"--transitionproba"}, usage = "set transition probability as weight")
     public boolean computeWeight = false;
 
-    @Option(name = "-am", aliases = {"--asmatrix"}, usage = "export as matrix (implies simple graph conversion). Default export as GML file")
-    public boolean asMatrix = false;
+    @Option(name = "-f", aliases = {"--format"}, usage = "Format of the exported graph" +
+            "Tabulated edge list by default (source id \t edge type \t target id). Other options include GML, JsonGraph, and tabulated node list (label \t node id \t node type).")
+    public GraphOutPut.formatEnum format = GraphOutPut.formatEnum.tab;
+
+    @Format(name = Txt)
+    @ParameterType(name = OutputFile)
+    @Option(name = "-o", usage = "output file: path to the tabulated file where the resulting network will be exported", required = true)
+    public String output;
 
     @Option(name = "-main", aliases = {"--onlyMainTransition"}, usage = "Compute RPAIRS-like tags and keep only main transitions for each reaction")
     public boolean main = false;
@@ -214,15 +213,11 @@ public class Sbml2CarbonSkeletonNet extends AbstractMet4jApplication {
             System.out.println(" Done.");
         }
 
+        System.out.println(graph.vertexSet().size()+ " nodes and "+graph.edgeSet().size()+" edges created.");
+
         //export graph
         System.out.print("Exporting...");
-        if (asMatrix) {
-            ComputeAdjacencyMatrix adjBuilder = new ComputeAdjacencyMatrix(graph);
-            if (!computeWeight) adjBuilder.parallelEdgeWeightsHandling((u, v) -> Math.max(u, v));
-            ExportMatrix.toCSV(this.outputPath, adjBuilder.getadjacencyMatrix());
-        } else {
-            ExportGraph.toGmlWithAttributes(graph, this.outputPath, true);
-        }
+        this.exportGraph(graph, format, output, computeWeight, "Shared_Carbons");
         System.out.println(" Done.");
     }
 
diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2CompoundGraph.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2CompoundGraph.java
index 4dfb09da467417aaf2f595fc3a8c9ffe246cc878..a3fddbaa2f527249de719877ad87beb96bfdcb5d 100644
--- a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2CompoundGraph.java
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2CompoundGraph.java
@@ -43,13 +43,14 @@ import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.*;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.EdgeMerger;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.VertexContraction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.utils.ComputeAdjacencyMatrix;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.io.ExportGraph;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.ExportMatrix;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.AbstractMet4jApplication;
+import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.GraphOutPut;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumParameterTypes;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Format;
@@ -61,11 +62,14 @@ import org.kohsuke.args4j.Option;
 import java.util.HashSet;
 import java.util.Set;
 
+import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats.Tsv;
+import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats.Txt;
+import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumParameterTypes.OutputFile;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.utils.IOUtils.SbmlPackage.FBC;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.utils.IOUtils.SbmlPackage.NOTES;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.utils.IOUtils.getMetabolitesFromFile;
 
-public class Sbml2CompoundGraph extends AbstractMet4jApplication {
+public class Sbml2CompoundGraph extends AbstractMet4jApplication implements GraphOutPut {
 
     @Format(name = EnumFormats.Sbml)
     @ParameterType(name = EnumParameterTypes.InputFile)
@@ -77,11 +81,6 @@ public class Sbml2CompoundGraph extends AbstractMet4jApplication {
     @Option(name = "-sc", usage = "input Side compound file")
     public String inputSide = null;
 
-    @ParameterType(name = EnumParameterTypes.OutputFile)
-    @Format(name = EnumFormats.Txt)
-    @Option(name = "-o", usage = "output Graph file (GML or matrix format, see -am parameter)", required = true)
-    public String outputPath = null;
-
     @Option(name = "-mc", aliases = {"--mergecomp"}, usage = "merge compartments. " +
             "Use names if consistent and unambiguous across compartments, or identifiers if compartment suffix is present (id in form \"xxx_y\" with xxx as base identifier and y as compartment label).")
     public strategy mergingStrat = strategy.no;
@@ -107,8 +106,14 @@ public class Sbml2CompoundGraph extends AbstractMet4jApplication {
     @Option(name = "-tp", aliases = {"--transitionproba"}, usage = "set weight as random walk transition probability, normalized by reaction")
     public boolean computeWeight = false;
 
-    @Option(name = "-am", aliases = {"--asmatrix"}, usage = "export as matrix (implies simple graph conversion). Default export as GML file")
-    public boolean asMatrix = false;
+    @Option(name = "-f", aliases = {"--format"}, usage = "Format of the exported graph" +
+            "Tabulated edge list by default (source id \t edge type \t target id). Other options include GML, JsonGraph, and tabulated node list (label \t node id \t node type).")
+    public GraphOutPut.formatEnum format = GraphOutPut.formatEnum.tab;
+
+    @Format(name = Txt)
+    @ParameterType(name = OutputFile)
+    @Option(name = "-o", usage = "output file: path to the tabulated file where the resulting network will be exported", required = true)
+    public String output;
 
     public static void main(String[] args) {
 
@@ -207,16 +212,17 @@ public class Sbml2CompoundGraph extends AbstractMet4jApplication {
 
         //export graph
         System.out.print("Exporting...");
-        if (asMatrix) {
-            ComputeAdjacencyMatrix adjBuilder = new ComputeAdjacencyMatrix(graph);
-            if (!computeWeight) adjBuilder.parallelEdgeWeightsHandling((u, v) -> Math.max(u, v));
-            ExportMatrix.toCSV(this.outputPath, adjBuilder.getadjacencyMatrix());
-        } else {
-            ExportGraph.toGmlWithAttributes(graph, this.outputPath, true);
-        }
+        this.exportGraph(graph, format, output, computeWeight, "weight");
         System.out.println(" Done.");
     }
 
+    @Override
+    public void exportToMatrix(BioGraph graph, String outputPath){
+        ComputeAdjacencyMatrix<BioMetabolite, ReactionEdge, CompoundGraph> adjBuilder = new ComputeAdjacencyMatrix<>(graph);
+        if(!computeWeight) adjBuilder.parallelEdgeWeightsHandling(Math::max);
+        ExportMatrix.toCSV(outputPath,adjBuilder.getadjacencyMatrix());
+    }
+
     @Override
     public String getLabel() {
         return this.getClass().getSimpleName();
diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2Graph.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2Graph.java
index 04b7fa0cba487302b1072812f942995f9af39316..6c5826304144fc41fd017b6d76ff63870fd1905e 100644
--- a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2Graph.java
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2Graph.java
@@ -1,16 +1,18 @@
 package fr.inrae.toulouse.metexplore.met4j_toolbox.convert;
 
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.ReactionGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.io.ExportGraph;
 import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.JsbmlReader;
 import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.Met4jSbmlReaderException;
-import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.plugin.*;
+import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.plugin.FBCParser;
+import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.plugin.GroupPathwayParser;
+import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.plugin.NotesParser;
+import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.plugin.PackageParser;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.AbstractMet4jApplication;
-import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.*;
+import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.GraphOutPut;
+import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Format;
+import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.ParameterType;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.utils.Doi;
 import org.kohsuke.args4j.Option;
 
@@ -19,22 +21,17 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Set;
 
-import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats.Sbml;
+import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats.*;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumParameterTypes.InputFile;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumParameterTypes.OutputFile;
 
-public class Sbml2Graph extends AbstractMet4jApplication {
+public class Sbml2Graph extends AbstractMet4jApplication implements GraphOutPut {
 
     @Format(name = Sbml)
     @ParameterType(name = InputFile)
     @Option(name = "-i", usage = "input SBML file", required = true)
     public String inputPath = null;
 
-    @Format(name = EnumFormats.Txt)
-    @ParameterType(name = OutputFile)
-    @Option(name = "-o", usage = "output Graph file", required = true)
-    public String outputPath = null;
-
     @Option(name = "-b", aliases = {"--bipartite"}, usage = "create bipartite graph", forbids = {"-c", "-r"})
     public Boolean bipartite = false;
 
@@ -44,13 +41,16 @@ public class Sbml2Graph extends AbstractMet4jApplication {
     @Option(name = "-r", aliases = {"--reaction"}, usage = "create reaction graph", forbids = {"-c", "-b"})
     public Boolean reaction = false;
 
-    @Option(name = "-tab", usage = "export in tabulated file", forbids = {"-gml"})
-    public Boolean tab = false;
+    @Option(name = "-f", aliases = {"--format"}, usage = "Format of the exported graph" +
+            "Tabulated edge list by default (source id \t edge type \t target id). Other options include GML, JsonGraph, and tabulated node list (label \t node id \t node type).")
+    public GraphOutPut.formatEnum format = GraphOutPut.formatEnum.tab;
 
-    @Option(name = "-gml", usage = "export in GML file", forbids = {"-tab"})
-    public Boolean gml = true;
+    @Format(name = Txt)
+    @ParameterType(name = OutputFile)
+    @Option(name = "-o", usage = "output file: path to the tabulated file where the resulting network will be exported", required = true)
+    public String output;
 
-    public static void main(String[] args) {
+    public static void main(String[] args) throws IOException {
 
         Sbml2Graph app = new Sbml2Graph();
 
@@ -61,7 +61,7 @@ public class Sbml2Graph extends AbstractMet4jApplication {
     }
 
 
-    public void run() {
+    public void run() throws IOException {
         JsbmlReader reader = new JsbmlReader(this.inputPath);
         ArrayList<PackageParser> pkgs = new ArrayList<>(Arrays.asList(
                 new NotesParser(false), new FBCParser(), new GroupPathwayParser()));
@@ -77,34 +77,21 @@ public class Sbml2Graph extends AbstractMet4jApplication {
         }
 
         Bionetwork2BioGraph builder = new Bionetwork2BioGraph(network);
-
+        BioGraph graph = null;
         if (bipartite || reaction) {
             compound = false;
         }
-        if (tab) gml = false;
 
         if (compound) {
-            CompoundGraph graph = builder.getCompoundGraph();
-            if (gml) {
-                ExportGraph.toGml(graph, this.outputPath);
-            } else {
-                ExportGraph.toTab(graph, this.outputPath);
-            }
+            graph = builder.getCompoundGraph();
         } else if (bipartite) {
-            BipartiteGraph graph = builder.getBipartiteGraph();
-            if (gml) {
-                ExportGraph.toGml(graph, this.outputPath);
-            } else {
-                ExportGraph.toTab(graph, this.outputPath);
-            }
+            graph = builder.getBipartiteGraph();
         } else {
-            ReactionGraph graph = builder.getReactionGraph();
-            if (gml) {
-                ExportGraph.toGml(graph, this.outputPath);
-            } else {
-                ExportGraph.toTab(graph, this.outputPath);
-            }
+            graph = builder.getReactionGraph();
         }
+
+        this.exportGraph(graph, format, output);
+        return;
     }
 
     @Override
diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2PathwayNet.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2PathwayNet.java
index 4aad3fa4f912070af7891600aaa455b21e45c769..54265589a947bd6ef8ee7c79705a620cf67ac08b 100644
--- a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2PathwayNet.java
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/Sbml2PathwayNet.java
@@ -44,14 +44,13 @@ import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.Cu
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.UnweightedPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.WeightsFromFile;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.EdgeMerger;
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.utils.ComputeAdjacencyMatrix;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.pathway.PathwayGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.pathway.PathwayGraphEdge;
+import fr.inrae.toulouse.metexplore.met4j_graph.io.AttributeExporter;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.io.ExportGraph;
-import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.ExportMatrix;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.AbstractMet4jApplication;
+import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.GraphOutPut;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumParameterTypes;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Format;
@@ -61,14 +60,12 @@ import fr.inrae.toulouse.metexplore.met4j_toolbox.utils.IOUtils;
 import org.kohsuke.args4j.Option;
 
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.utils.IOUtils.SbmlPackage.GROUPS;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.utils.IOUtils.getMetabolitesFromFile;
 
-public class Sbml2PathwayNet extends AbstractMet4jApplication {
+public class Sbml2PathwayNet extends AbstractMet4jApplication implements GraphOutPut{
 
     @Format(name = EnumFormats.Sbml)
     @ParameterType(name = EnumParameterTypes.InputFile)
@@ -99,8 +96,11 @@ public class Sbml2PathwayNet extends AbstractMet4jApplication {
     @Option(name = "-ncw", aliases = {"--connectorWeights"}, usage = "set number of connecting compounds as weight", forbids = {"-cw"})
     public Boolean connectors = false;
 
-    @Option(name = "-am", aliases = {"--asmatrix"}, usage = "export as matrix (implies simple graph conversion). Default export as GML file")
-    public boolean asMatrix = false;
+    @Option(name = "-f", aliases = {"--format"}, usage = "Format of the exported graph" +
+            "Tabulated edge list by default (source id \t edge type \t target id). Other options include GML, JsonGraph, and tabulated node list (label \t node id \t node type).")
+    public GraphOutPut.formatEnum format = GraphOutPut.formatEnum.tab;
+
+    private BioNetwork finalNetwork;
 
     public static void main(String[] args) {
 
@@ -154,19 +154,21 @@ public class Sbml2PathwayNet extends AbstractMet4jApplication {
 
         //export graph
         System.out.print("Exporting...");
-        if (asMatrix) {
-            ComputeAdjacencyMatrix adjBuilder = new ComputeAdjacencyMatrix(graph);
-            ExportMatrix.toCSV(this.outputPath, adjBuilder.getadjacencyMatrix());
-        } else {
-            if (!onlySourcesAndSinks) EdgeMerger.undirectedMergeEdgesWithOverride(graph, null);
-            BioNetwork finalNetwork = network;
-            Map<BioPathway, Integer> size = graph.vertexSet().stream()
-                    .collect(Collectors.toMap(p -> p, p -> finalNetwork.getMetabolitesFromPathway(p).size()));
-            ExportGraph.toGmlWithAttributes(graph, this.outputPath, size, "size", true);
-        }
+        finalNetwork = network;
+        if(format != formatEnum.matrix && !onlySourcesAndSinks) EdgeMerger.undirectedMergeEdgesWithOverride(graph,null);
+        this.exportGraph(graph, format, outputPath);
         System.out.println(" Done.");
     }
 
+    @Override
+    public AttributeExporter getAttributeExporter() {
+        return new AttributeExporter()
+                .exportName()
+                .exportType()
+                .exportReversible()
+                .exportNodeAttribute("size", p -> finalNetwork.getMetabolitesFromPathway((BioPathway) p).size());
+    }
+
     @Override
     public String getLabel() {
         return this.getClass().getSimpleName();
diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/SbmlWizard.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/SbmlWizard.java
index 398ffecf6ffdcb92da0bd31f9df5f9ba4beba9e0..56b9682506cfd7ace6244b937bf0ac3f013c2144 100644
--- a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/SbmlWizard.java
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/convert/SbmlWizard.java
@@ -31,17 +31,27 @@ public class SbmlWizard extends AbstractMet4jApplication {
 
     @ParameterType(name = EnumParameterTypes.InputFile)
     @Format(name = EnumFormats.Txt)
-    @Option(name = "-rc", usage = "file containing identifiers of compounds to remove from the metabolic network")
+    @Option(name = "-rc", aliases = {"--removeC"}, usage = "file containing identifiers of compounds to remove from the metabolic network")
     public String inputSide = null;
 
+    @ParameterType(name = EnumParameterTypes.InputFile)
+    @Format(name = EnumFormats.Txt)
+    @Option(name = "-kc", aliases = {"--retainC"}, usage = "file containing identifiers of compounds to keep from the metabolic network")
+    public String toKeepC = null;
+
     @Option(name = "-ric", aliases = {"--noIsolated"}, usage = "remove isolated compounds (not involved in any reaction)")
     public boolean removeIsolated;
 
     @ParameterType(name = EnumParameterTypes.InputFile)
     @Format(name = EnumFormats.Txt)
-    @Option(name = "-rr", usage = "file containing identifiers of reactions to remove from the metabolic network")
+    @Option(name = "-rr",aliases = {"--removeR"}, usage = "file containing identifiers of reactions to remove from the metabolic network")
     public String inputReactions = null;
 
+    @ParameterType(name = EnumParameterTypes.InputFile)
+    @Format(name = EnumFormats.Txt)
+    @Option(name = "-kr", aliases = {"--retainR"}, usage = "file containing identifiers of reactions to keep from the metabolic network")
+    public String toKeepR = null;
+
     @ParameterType(name = EnumParameterTypes.OutputFile)
     @Format(name = EnumFormats.Sbml)
     @Option(name = "-o", usage = "output SBML file", required = true)
@@ -89,6 +99,31 @@ public class SbmlWizard extends AbstractMet4jApplication {
         System.out.println("\tprotein:\t"+network.getProteinsView().size());
         System.out.println("\tpathway:\t"+network.getPathwaysView().size()+"\n\n");
 
+
+        //retain compounds
+        if (toKeepC != null) {
+            BioCollection<BioMetabolite> toKeep = new BioCollection<>();
+            System.out.println("retaining compounds...");
+            Mapper<BioMetabolite> cmapper = new Mapper<>(network, BioNetwork::getMetabolitesView).skipIfNotFound();
+
+            try {
+                toKeep = cmapper.map(toKeepC);
+            } catch (IOException e) {
+                System.err.println("Error while reading the compounds to keep file");
+                System.err.println(e.getMessage());
+                System.exit(1);
+            }
+            if (cmapper.getNumberOfSkippedEntries() > 0)
+                System.out.println(cmapper.getNumberOfSkippedEntries() + " compounds not found in network.");
+
+            for(BioMetabolite c : network.getMetabolitesView()){
+                if(!toKeep.contains(c)){
+                    network.removeOnCascade(c);
+                }
+            }
+            System.out.println(toKeep.size() + " compounds retained in network.");
+        }
+
         //side compound removal [optional]
         if (inputSide != null) {
             System.out.println("removing side compounds...");
@@ -101,6 +136,30 @@ public class SbmlWizard extends AbstractMet4jApplication {
             System.out.println(sideCpds.size() + " side compounds removed from network.");
         }
 
+        //retain reactions
+        if(toKeepR != null){
+            BioCollection<BioReaction> toKeep = new BioCollection<>();
+            System.out.println("retaining reactions...");
+            Mapper<BioReaction> rmapper = new Mapper<>(network, BioNetwork::getReactionsView).skipIfNotFound();
+
+            try {
+                toKeep = rmapper.map(toKeepR);
+            } catch (IOException e) {
+                System.err.println("Error while reading the reactions to keep file");
+                System.err.println(e.getMessage());
+                System.exit(1);
+            }
+            if (rmapper.getNumberOfSkippedEntries() > 0)
+                System.out.println(rmapper.getNumberOfSkippedEntries() + " reactions not found in network.");
+
+            for(BioReaction r : network.getReactionsView()){
+                if(!toKeep.contains(r)){
+                    network.removeOnCascade(r);
+                }
+            }
+            System.out.println(toKeep.size() + " reactions retained in network.");
+        }
+
         //irrelevant reaction removal [optional]
         if (inputReactions != null) {
             BioCollection<BioReaction> sideRxns = new BioCollection<>();
diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/generic/GraphOutPut.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/generic/GraphOutPut.java
new file mode 100644
index 0000000000000000000000000000000000000000..7d0abceaca067dbbb53cd854aefe926a9209b818
--- /dev/null
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/generic/GraphOutPut.java
@@ -0,0 +1,82 @@
+package fr.inrae.toulouse.metexplore.met4j_toolbox.generic;
+
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.utils.ComputeAdjacencyMatrix;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.io.AttributeExporter;
+import fr.inrae.toulouse.metexplore.met4j_graph.io.ExportGraph;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import static fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.ExportMatrix.toCSV;
+
+/**
+ * Interface for apps that output files in graph formats
+ */
+public interface GraphOutPut {
+
+    /**
+     * Enum for the different formats
+     */
+    enum formatEnum {gml, tab, nodeList, json, matrix}
+
+    /**
+     * Export a graph to a file
+     * @param graph the graph to export
+     * @param format the format to export to
+     * @param outputPath the path to the output file
+     */
+    default void exportGraph(BioGraph graph, formatEnum format, String outputPath){
+        exportGraph(graph, format, outputPath, false, null);
+    }
+
+    /**
+     * Export a graph to a file
+     * @param graph the graph to export
+     * @param format the format to export to
+     * @param outputPath the path to the output file
+     * @param weighted whether to export edge weights
+     * @param edgeWeightName the name of the edge weight attribute
+     */
+    default void exportGraph(BioGraph graph, formatEnum format, String outputPath, Boolean weighted, String edgeWeightName){
+        try{
+            BufferedWriter writer = new BufferedWriter(new FileWriter(outputPath));
+            AttributeExporter att = getAttributeExporter();
+            if(weighted) att.exportEdgeAttribute(edgeWeightName, e-> graph.getEdgeWeight(e));
+            ExportGraph export = new ExportGraph<>(graph,att);
+
+            switch (format) {
+                case tab -> export.toTab(writer);
+                case nodeList -> export.toNodeTab(writer);
+                case gml -> export.toGml(writer);
+                case json -> export.toJSONgraph(writer);
+                case matrix -> this.exportToMatrix(graph, outputPath);
+                default -> throw new IllegalArgumentException("Unexpected value: " + format);
+            }
+        }catch (IOException e){
+            System.err.println("Error while exporting graph");
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * Get the default attribute exporter
+     * @return the attribute exporter
+     */
+    default AttributeExporter getAttributeExporter(){
+        return new AttributeExporter()
+                .exportName().exportType().exportReversible();
+    }
+
+    /**
+     * Export the graph to a matrix
+     * @param graph the graph to export
+     * @param outputPath the path to the output file
+     */
+    default void exportToMatrix(BioGraph graph, String outputPath){
+        ComputeAdjacencyMatrix adjBuilder = new ComputeAdjacencyMatrix<>(graph);
+        toCSV(outputPath,adjBuilder.getadjacencyMatrix());
+    }
+
+}
diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ExtractSubBipNetwork.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ExtractSubBipNetwork.java
index a148995eb82e6c458cfef767f66a0fafd8a942ae..f15f8d9ce5d6e16dd3f68354fe2e74ae58467b56 100644
--- a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ExtractSubBipNetwork.java
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ExtractSubBipNetwork.java
@@ -16,9 +16,12 @@ import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph;
+import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.JsbmlReader;
+import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.Met4jSbmlReaderException;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.ExportGraph;
 import fr.inrae.toulouse.metexplore.met4j_mapping.Mapper;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.AbstractMet4jApplication;
+import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.GraphOutPut;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Format;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.ParameterType;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.utils.Doi;
@@ -35,7 +38,7 @@ import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Enu
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumParameterTypes.OutputFile;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.utils.IOUtils.getMetabolitesFromFile;
 
-public class ExtractSubBipNetwork extends AbstractMet4jApplication {
+public class ExtractSubBipNetwork extends AbstractMet4jApplication implements GraphOutPut{
 
     @Format(name = Sbml)
     @ParameterType(name = InputFile)
@@ -55,14 +58,6 @@ public class ExtractSubBipNetwork extends AbstractMet4jApplication {
     @Option(name = "-u", aliases = {"--undirected"}, usage = "Ignore reaction direction")
     public Boolean undirected = false;
 
-    @Option(name = "-tab", aliases = {"--asTable"}, usage = "Export in tabulated file instead of .GML")
-    public Boolean asTable = false;
-
-    @Format(name = Gml)
-    @ParameterType(name = OutputFile)
-    @Option(name = "-o", usage = "output gml file", required = true)
-    public String outputPath = null;
-
     @Format(name = Txt)
     @ParameterType(name = InputFile)
     @Option(name = "-sc", aliases = {"--side"}, usage = "a file containing list of side compounds to ignore", required = true)
@@ -84,6 +79,15 @@ public class ExtractSubBipNetwork extends AbstractMet4jApplication {
     @Option(name = "-st", aliases = {"--steinertree"}, usage = "Extract Steiner Tree", forbids = {"-k"})
     public boolean st = false;
 
+    @Option(name = "-f", aliases = {"--format"}, usage = "Format of the exported graph" +
+            "Tabulated edge list by default (source id \t edge type \t target id). Other options include GML, JsonGraph, and tabulated node list (label \t node id \t node type).")
+    public GraphOutPut.formatEnum format = GraphOutPut.formatEnum.tab;
+
+    @Format(name = Txt) // Txt because it can be gml or tab
+    @ParameterType(name = OutputFile)
+    @Option(name = "-o", usage = "output file: path to the tabulated file where the resulting network will be exported", required = true)
+    public String output;
+
     public static void main(String[] args) {
         ExtractSubBipNetwork app = new ExtractSubBipNetwork();
         app.parseArguments(args);
@@ -183,11 +187,7 @@ public class ExtractSubBipNetwork extends AbstractMet4jApplication {
         }
 
         //export sub-network
-        if (asTable) {
-            ExportGraph.toTab(subnet, outputPath);
-        } else {
-            ExportGraph.toGml(subnet, outputPath);
-        }
+        this.exportGraph(subnet,format, output);
 
     }
 
diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ExtractSubNetwork.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ExtractSubNetwork.java
index bbdae27c9b860df708d995ee56f674ea2f61d99d..872ac1678e74722e718abe3349dcce36890ac86e 100644
--- a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ExtractSubNetwork.java
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ExtractSubNetwork.java
@@ -17,9 +17,9 @@ import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.io.ExportGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.NodeMapping;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.AbstractMet4jApplication;
+import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.GraphOutPut;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Format;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.ParameterType;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.utils.Doi;
@@ -36,7 +36,7 @@ import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Enu
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumParameterTypes.OutputFile;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.utils.IOUtils.getMetabolitesFromFile;
 
-public class ExtractSubNetwork extends AbstractMet4jApplication {
+public class ExtractSubNetwork extends AbstractMet4jApplication implements GraphOutPut{
 
     @Format(name = Sbml)
     @ParameterType(name = InputFile)
@@ -53,11 +53,6 @@ public class ExtractSubNetwork extends AbstractMet4jApplication {
     @Option(name = "-t", usage = "input targets txt file", required = true)
     public String targetPath = null;
 
-    @Format(name = Gml)
-    @ParameterType(name = OutputFile)
-    @Option(name = "-o", usage = "output gml file", required = true)
-    public String outputPath = null;
-
     @Format(name = Txt)
     @ParameterType(name = InputFile)
     @Option(name = "-sc", aliases = {"--side"}, usage = "an optional file containing list of side compounds to ignore")
@@ -77,15 +72,21 @@ public class ExtractSubNetwork extends AbstractMet4jApplication {
     @Option(name = "-u", aliases = {"--undirected"}, usage = "Ignore reaction direction")
     public Boolean undirected = false;
 
-    @Option(name = "-tab", aliases = {"--asTable"}, usage = "Export in tabulated file instead of .GML")
-    public Boolean asTable = false;
-
     @Option(name = "-k", usage = "Extract k-shortest paths", forbids = {"-st"})
     public int k = 1;
 
     @Option(name = "-st", aliases = {"--steinertree"}, usage = "Extract Steiner Tree", forbids = {"-k"})
     public boolean st = false;
 
+    @Option(name = "-f", aliases = {"--format"}, usage = "Format of the exported graph" +
+            "Tabulated edge list by default (source id \t edge type \t target id). Other options include GML, JsonGraph, and tabulated node list (label \t node id \t node type).")
+    public GraphOutPut.formatEnum format = GraphOutPut.formatEnum.tab;
+
+    @Format(name = Txt)
+    @ParameterType(name = OutputFile)
+    @Option(name = "-o", usage = "output file: path to the tabulated file where the resulting network will be exported", required = true)
+    public String output;
+
     public static void main(String[] args) {
         ExtractSubNetwork app = new ExtractSubNetwork();
         app.parseArguments(args);
@@ -165,11 +166,7 @@ public class ExtractSubNetwork extends AbstractMet4jApplication {
         }
 
         //export sub-network
-        if (asTable) {
-            ExportGraph.toTab(subnet, outputPath);
-        } else {
-            ExportGraph.toGmlWithAttributes(subnet, outputPath);
-        }
+        this.exportGraph(subnet, format, output, ((weightFile != null)||(degree)||(chemicalSim)),"weight");
 
     }
 
diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ExtractSubReactionNetwork.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ExtractSubReactionNetwork.java
index d57bb85dadc0b62d301152aab4a3d47c603f4508..24a8bf616203f3641efb19fa6e4cbd37a9ba283c 100644
--- a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ExtractSubReactionNetwork.java
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ExtractSubReactionNetwork.java
@@ -16,9 +16,15 @@ import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.CompoundEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.ReactionGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph;
+import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.JsbmlReader;
+import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.Met4jSbmlReaderException;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.ExportGraph;
 import fr.inrae.toulouse.metexplore.met4j_mapping.Mapper;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.AbstractMet4jApplication;
+import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.GraphOutPut;
+import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats;
+import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Format;
+import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.ParameterType;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Format;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.ParameterType;
@@ -36,7 +42,7 @@ import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Enu
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumParameterTypes.OutputFile;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.utils.IOUtils.getMetabolitesFromFile;
 
-public class ExtractSubReactionNetwork extends AbstractMet4jApplication {
+public class ExtractSubReactionNetwork extends AbstractMet4jApplication implements GraphOutPut {
 
     @Format(name = Sbml)
     @ParameterType(name = InputFile)
@@ -51,19 +57,11 @@ public class ExtractSubReactionNetwork extends AbstractMet4jApplication {
     @Option(name = "-u", aliases = {"--undirected"}, usage = "Ignore reaction direction")
     public Boolean undirected = false;
 
-    @Option(name = "-tab", aliases = {"--asTable"}, usage = "Export in tabulated file instead of .GML")
-    public Boolean asTable = false;
-
     @Format(name = Txt)
     @ParameterType(name = InputFile)
     @Option(name = "-t", usage = "input targets txt file", required = true)
     public String targetPath = null;
 
-    @Format(name = Txt)
-    @ParameterType(name = OutputFile)
-    @Option(name = "-o", usage = "output gml or tabulated file (see -tab option)", required = true)
-    public String outputPath = null;
-
     @Format(name = Txt)
     @ParameterType(name = InputFile)
     @Option(name = "-sc", aliases = {"--side"}, usage = "a file containing list of side compounds to ignore", required = true)
@@ -85,6 +83,15 @@ public class ExtractSubReactionNetwork extends AbstractMet4jApplication {
     @Option(name = "-st", aliases = {"--steinertree"}, usage = "Extract Steiner Tree", forbids = {"-k"})
     public boolean st = false;
 
+    @Option(name = "-f", aliases = {"--format"}, usage = "Format of the exported graph" +
+            "Tabulated edge list by default (source id \t edge type \t target id). Other options include GML, JsonGraph, and tabulated node list (label \t node id \t node type).")
+    public GraphOutPut.formatEnum format = GraphOutPut.formatEnum.tab;
+
+    @Format(name = Txt)
+    @ParameterType(name = OutputFile)
+    @Option(name = "-o", usage = "output file: path to the tabulated file where the resulting network will be exported", required = true)
+    public String output;
+
     public static void main(String[] args) {
         ExtractSubReactionNetwork app = new ExtractSubReactionNetwork();
         app.parseArguments(args);
@@ -179,11 +186,7 @@ public class ExtractSubReactionNetwork extends AbstractMet4jApplication {
         }
 
         //export sub-network
-        if (asTable) {
-            ExportGraph.toTab(subnet, outputPath);
-        } else {
-            ExportGraph.toGmlWithAttributes(subnet, outputPath);
-        }
+        this.exportGraph(subnet, format, output);
 
     }
 
diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/PrecursorNetwork.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/PrecursorNetwork.java
index fcea05d4c5fd932761ed2d142312b258778a195b..389ced90a5e99cfc57f3ca6fd957b11072f28fa2 100644
--- a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/PrecursorNetwork.java
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/PrecursorNetwork.java
@@ -8,9 +8,9 @@ import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.io.ExportGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.NodeMapping;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.AbstractMet4jApplication;
+import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.GraphOutPut;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Format;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.ParameterType;
@@ -22,11 +22,12 @@ import java.io.IOException;
 import java.util.Set;
 
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats.Sbml;
+import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats.Tsv;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats.Txt;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumParameterTypes.InputFile;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumParameterTypes.OutputFile;
 
-public class PrecursorNetwork extends AbstractMet4jApplication {
+public class PrecursorNetwork extends AbstractMet4jApplication implements GraphOutPut{
 
     //arguments
     @Format(name = Sbml)
@@ -39,11 +40,6 @@ public class PrecursorNetwork extends AbstractMet4jApplication {
     @Option(name = "-t", aliases = {"--targets"}, usage = "input target file: tabulated file containing node of interest ids", required = true)
     public String targetsFilePath;
 
-    @Format(name = Txt) // Because the output is a tabulated file or a GML file
-    @ParameterType(name = OutputFile)
-    @Option(name = "-o", usage = "output file: path to the .gml file where the results precursor network will be exported", required = true)
-    public String output;
-
     //options
     @ParameterType(name = InputFile)
     @Format(name = EnumFormats.Txt)
@@ -54,8 +50,14 @@ public class PrecursorNetwork extends AbstractMet4jApplication {
     @Option(name = "-ir", aliases = {"--ignore"}, usage = "an optional file containing list of reaction to ignore (forbid inclusion in scope)")
     public String reactionToIgnoreFile = null;
 
-    @Option(name = "-tab", aliases = {"--asTable"}, usage = "export in tabulated file instead of .GML")
-    public Boolean asTable = false;
+    @Option(name = "-f", aliases = {"--format"}, usage = "Format of the exported graph" +
+            "Tabulated edge list by default (source id \t edge type \t target id). Other options include GML, JsonGraph, and tabulated node list (label \t node id \t node type).")
+    public GraphOutPut.formatEnum format = GraphOutPut.formatEnum.tab;
+
+    @Format(name = Txt)
+    @ParameterType(name = OutputFile)
+    @Option(name = "-o", usage = "output file: path to the tabulated file where the resulting network will be exported", required = true)
+    public String output;
 
     public static void main(String[] args) {
         PrecursorNetwork app = new PrecursorNetwork();
@@ -109,11 +111,7 @@ public class PrecursorNetwork extends AbstractMet4jApplication {
             fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.PrecursorNetwork precursorComp =
                     new fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.PrecursorNetwork(graph, bootstraps, targets, forbidden);
             BipartiteGraph precursorNet = precursorComp.getPrecursorNetwork();
-            if (asTable) {
-                ExportGraph.toTab(precursorNet, output);
-            } else {
-                ExportGraph.toGml(precursorNet, output);
-            }
+            this.exportGraph(precursorNet, format, output);
         }
     }
 
diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ScopeNetwork.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ScopeNetwork.java
index c00b908b8498e6e39b1a09bc6c6bdc42d9724caa..969f3190b0679fda206c3f7ee66b58c4f9a1b56a 100644
--- a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ScopeNetwork.java
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/ScopeNetwork.java
@@ -9,9 +9,9 @@ import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.ScopeCompoun
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteEdge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.bipartite.BipartiteGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.io.ExportGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.NodeMapping;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.AbstractMet4jApplication;
+import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.GraphOutPut;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Format;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.ParameterType;
@@ -24,11 +24,12 @@ import java.util.HashSet;
 import java.util.Set;
 
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats.Sbml;
+import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats.Tsv;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats.Txt;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumParameterTypes.InputFile;
 import static fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumParameterTypes.OutputFile;
 
-public class ScopeNetwork extends AbstractMet4jApplication {
+public class ScopeNetwork extends AbstractMet4jApplication implements GraphOutPut {
 
     //arguments
     @Format(name = Sbml)
@@ -41,11 +42,6 @@ public class ScopeNetwork extends AbstractMet4jApplication {
     @Option(name = "-s", aliases = {"--seeds"}, usage = "input seeds file: tabulated file containing node of interest ids", required = true)
     public String seedsFilePath;
 
-    @Format(name = Txt) // Because the output is a tabulated file or a GML file
-    @ParameterType(name = OutputFile)
-    @Option(name = "-o", usage = "output file: path to the .gml file or tabulated file (see -asTable parameter) where the results scope network will be exported", required = true)
-    public String output;
-
     //options
     @ParameterType(name = InputFile)
     @Format(name = EnumFormats.Txt)
@@ -63,8 +59,16 @@ public class ScopeNetwork extends AbstractMet4jApplication {
     @Option(name = "-t", aliases = {"--trace"}, usage = "trace inclusion step index for each node in output")
     public boolean trace = false;
 
-    @Option(name = "-tab", aliases = {"--asTable"}, usage = "Export in tabulated file instead of .GML")
-    public Boolean asTable = false;
+    @Option(name = "-f", aliases = {"--format"}, usage = "Format of the exported graph" +
+            "Tabulated edge list by default (source id \t edge type \t target id). Other options include GML, JsonGraph, and tabulated node list (label \t node id \t node type).")
+    public GraphOutPut.formatEnum format = GraphOutPut.formatEnum.tab;
+
+    @Format(name = Txt)
+    @ParameterType(name = OutputFile)
+    @Option(name = "-o", usage = "output file: path to the tabulated file where the resulting network will be exported", required = true)
+    public String output;
+
+
 
     public static void main(String[] args) {
         ScopeNetwork app = new ScopeNetwork();
@@ -119,15 +123,8 @@ public class ScopeNetwork extends AbstractMet4jApplication {
             if (includeSides) scopeComp.includeBootstrapsInScope();
             if (trace) scopeComp.trace();
             BipartiteGraph scope = scopeComp.getScopeNetwork();
-            if (asTable) {
-                ExportGraph.toTab(scope, output);
-            } else {
-                if (trace) {
-                    ExportGraph.toGmlWithAttributes(scope, output, scopeComp.getExpansionSteps(), "step");
-                } else {
-                    ExportGraph.toGml(scope, output);
-                }
-            }
+            //export sub-network
+            this.exportGraph(scope, format, output, trace, "step");
         }
 
     }