diff --git a/src/fr/inrialpes/exmo/align/service/CacheImpl.java b/src/fr/inrialpes/exmo/align/service/CacheImpl.java
index ce3af168018095afab6d17af47325f5209986acd..e0893c2240d68af79b30dddd5a9141d800be2ad4 100644
--- a/src/fr/inrialpes/exmo/align/service/CacheImpl.java
+++ b/src/fr/inrialpes/exmo/align/service/CacheImpl.java
@@ -63,7 +63,7 @@ public class CacheImpl {
     String host = null;
     String port = null;
     int rights = 1; // writing rights in the database (default is 1)
-	
+
     final int VERSION = 310; // Version of the API to be stored in the database
     /* 300: initial database format
        301: added alignment id as primary key
@@ -71,6 +71,7 @@ public class CacheImpl {
        310: changed extension table with added URIs and method -> val 
      */
 
+    DBService service = null;
     Connection conn = null;
 	
     final int CONNECTION_ERROR = 1;
@@ -84,9 +85,10 @@ public class CacheImpl {
     static public final String OURI2 = "ouri2";
 	
     //**********************************************************************
-    public CacheImpl( DBService service ) {
+    public CacheImpl( DBService serv ) {
+	service = service;
 	try {
-	    this.conn = service.getConnection();
+	    conn = serv.getConnection();
 	} catch(Exception e) {
 	    // Rather raise an exception
 	    System.err.println(e.toString());
@@ -102,7 +104,7 @@ public class CacheImpl {
     public void init( Parameters p ) throws SQLException, AlignmentException {
 	port = (String)p.getParameter("http"); // bad idea
 	host = (String)p.getParameter("host");
-	Statement st = (Statement) conn.createStatement();
+	Statement st = createStatement();
 	// test if a database is here, otherwise create it
 	ResultSet rs = (ResultSet)st.executeQuery("SHOW TABLES LIKE 'server'");
 	if ( !rs.next() ) {
@@ -112,14 +114,28 @@ public class CacheImpl {
 	}
 	// register by the database
 	st.executeUpdate("INSERT INTO server (host, port, edit, version) VALUES ('"+host+"','"+port+"','"+rights+"',"+VERSION+")");
+	st.close();
 	// load alignment descriptions
 	loadAlignments( true );
     }
 
     public void close() throws SQLException  {
-	Statement st = (Statement) conn.createStatement();
+	Statement st = (Statement)conn.createStatement();
 	// unregister by the database
 	st.executeUpdate("DELETE FROM server WHERE host='"+host+"' AND port='"+port+"'");
+	st.close();
+	conn.close();
+    }
+
+    public Statement createStatement() throws SQLException {
+	Statement st = null;
+	try {
+	     st = (Statement) conn.createStatement();
+	} catch ( SQLException ex ) {
+	    conn = service.getConnection();
+	    st = (Statement) conn.createStatement();
+	}
+	return st;
     }
 
     // **********************************************************************
@@ -134,7 +150,7 @@ public class CacheImpl {
 	String id = null;
 	Alignment alignment = null;
 	Vector<String> idInfo = new Vector<String>();
-	Statement st = (Statement) conn.createStatement();
+	Statement st = createStatement();
 	
 	if (force) {
 	    // Retrieve the alignment ids
@@ -151,6 +167,7 @@ public class CacheImpl {
 		recordAlignment( id, alignment, true );
 	    }							
 	}
+	st.close();
     }
 
     protected Enumeration<Alignment> listAlignments() {
@@ -180,7 +197,7 @@ public class CacheImpl {
 	URIAlignment result = new URIAlignment();
 		
 	try {
-	    Statement st = (Statement) conn.createStatement();
+	    Statement st = createStatement();
 	    // Get basic ontology metadata
 	    query = "SELECT * FROM alignment WHERE id = '" + id  +"'";
 	    rs = (ResultSet) st.executeQuery(query);
@@ -204,6 +221,7 @@ public class CacheImpl {
 		value = rs.getString("val");
 		result.setExtension( rs.getString("uri"), tag, value);
 	    }
+	    st.close();
 	} catch (Exception e) { // URI exception that should not occur
 	    System.err.println("Unlikely URI exception!");
 	    e.printStackTrace();
@@ -230,7 +248,7 @@ public class CacheImpl {
 	URI ent1 = null, ent2 = null;
 	Cell cell = null;
 
-	Statement st = (Statement) conn.createStatement();
+	Statement st = createStatement();
 
 	alignment.setOntology1( new URI( alignment.getExtension( SVCNS, OURI1 ) ) );
 	alignment.setOntology2( new URI( alignment.getExtension( SVCNS, OURI2 ) ) );
@@ -264,7 +282,7 @@ public class CacheImpl {
 	}
 	// reset
 	resetCacheStamp(alignment);
-
+	st.close();
 	return alignment;
     }
     
@@ -450,7 +468,7 @@ public class CacheImpl {
     public void unStoreAlignment( String id ) throws Exception {
 	Alignment alignment = getAlignment( id );
 	if ( alignment != null ) {
-	    Statement st = (Statement) conn.createStatement();
+	    Statement st = createStatement();
 	    String query = "DELETE FROM extension WHERE id=''";
 	    st.executeUpdate(query);
 	    query = "DELETE FROM alignment WHERE id=''";
@@ -458,13 +476,14 @@ public class CacheImpl {
 	    query = "DELETE FROM cell WHERE id=''";
 	    st.executeUpdate(query);
 	    alignment.setExtension( SVCNS, STORED, "");
+	    st.close();
 	}
     }
 
     public void storeAlignment( String id ) throws Exception {
 	String query = null;
 	Alignment alignment = getAlignment( id );
-	Statement st = (Statement) conn.createStatement();
+	Statement st = createStatement();
 
 	// We store stored date
 	alignment.setExtension( SVCNS, STORED, new Date().toString());
@@ -551,6 +570,7 @@ public class CacheImpl {
 	    alignment.setExtension( SVCNS, STORED, "");
 	    e.printStackTrace(); 
 	};
+	st.close();
 	// We reset cached date
 	resetCacheStamp(alignment);
     }
@@ -618,17 +638,18 @@ public class CacheImpl {
     */
 
     public void initDatabase() throws SQLException {
-	Statement st = (Statement) conn.createStatement();
+	Statement st = createStatement();
 	// Create tables
 	st.executeUpdate("CREATE TABLE alignment (id VARCHAR(100), owlontology1 VARCHAR(250), owlontology2 VARCHAR(250), type VARCHAR(5), level VARCHAR(1), file1 VARCHAR(250), file2 VARCHAR(250), uri1 VARCHAR(250), uri2 VARCHAR(250), primary key (id))");
 	st.executeUpdate("CREATE TABLE cell(id VARCHAR(100), cell_id VARCHAR(250), uri1 VARCHAR(250), uri2 VARCHAR(250), semantics VARCHAR(30), measure VARCHAR(20), relation VARCHAR(5))");
 	st.executeUpdate("CREATE TABLE extension(id VARCHAR(100), uri VARCHAR(200), tag VARCHAR(50), val VARCHAR(500))");
 	st.executeUpdate("CREATE TABLE server (host VARCHAR(50), port VARCHAR(5), edit BOOLEAN, version VARCHAR(5))");
 	st.executeUpdate("INSERT INTO server (host, port, edit, version) VALUES ('dbms', 'port', 0, '"+VERSION+"')");
+	st.close();
     }
 
     public void resetDatabase( boolean force ) throws SQLException, AlignmentException {
-	Statement st = (Statement) conn.createStatement();
+	Statement st = createStatement();
 	// Check that no one else is connected...
 	if ( force != true ){
 	    ResultSet rs = (ResultSet) st.executeQuery("SELECT COUNT(*) AS rowcount FROM server WHERE edit=1");
@@ -648,10 +669,11 @@ public class CacheImpl {
 	initDatabase();
 	// Register this server, etc. characteristics (incl. version name)
 	st.executeUpdate("INSERT INTO server (host, port, edit, version) VALUES ('"+host+"','"+port+"','"+rights+"',"+VERSION+")");
+	st.close();
     }
 
     public void updateDatabase( ) throws SQLException, AlignmentException {
-	Statement st = (Statement) conn.createStatement();
+	Statement st = createStatement();
 	// get the version number
 	ResultSet rs = (ResultSet) st.executeQuery("SELECT version FROM server WHERE port='port'");
 	rs.next();
@@ -663,7 +685,7 @@ public class CacheImpl {
 		st.executeUpdate("ALTER TABLE extension ADD uri VARCHAR(200);");
 		// Modify extensions
 		ResultSet rse = (ResultSet) st.executeQuery("SELECT * FROM extension");
-		Statement st2 = (Statement) conn.createStatement();
+		Statement st2 = createStatement();
 		while ( rse.next() ){
 		    String tag = rse.getString("tag");
 		    //System.err.println(" Treating tag "+tag+" of "+rse.getString("id"));
@@ -694,6 +716,7 @@ public class CacheImpl {
 		throw new AlignmentException("Database must be upgraded ("+version+" -> "+VERSION+")");
 	    }
 	}
+	st.close();
     }
 
 }
diff --git a/src/fr/inrialpes/exmo/align/service/DBServiceImpl.java b/src/fr/inrialpes/exmo/align/service/DBServiceImpl.java
index edbb77070a3b6e98e9d3eee7fc9594ca4adb960e..5895d92ae406a6ee5fb3b8ff5f9452d1c956b0cb 100644
--- a/src/fr/inrialpes/exmo/align/service/DBServiceImpl.java
+++ b/src/fr/inrialpes/exmo/align/service/DBServiceImpl.java
@@ -38,7 +38,6 @@ public class DBServiceImpl implements DBService{
     static String user = "adminAServ";
     static String database = "AServDB";
     String driverPrefix = "jdbc:mysql";
-    Statement st = null;
     CacheImpl cache = null;
 	
     public DBServiceImpl() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
@@ -71,7 +70,6 @@ public class DBServiceImpl implements DBService{
 
     public void connect(String IPAddress, String port, String user, String password, String database ) throws SQLException {
 	conn = DriverManager.getConnection(driverPrefix+"://"+IPAddress+":"+port+"/"+database, user, password);
-	st = (Statement) conn.createStatement();
 	}
 
     public Connection getConnection() {
@@ -81,7 +79,6 @@ public class DBServiceImpl implements DBService{
     public void close() {
 	try {
 	    conn.close();
-	    st.close();
 	} catch (Exception ex) {
 	    ex.printStackTrace();
 	}