Index: main/plugin-gadgets/src/org/ametys/plugins/gadgets/Init.java
===================================================================
--- main/plugin-gadgets/src/org/ametys/plugins/gadgets/Init.java	(revision 9146)
+++ main/plugin-gadgets/src/org/ametys/plugins/gadgets/Init.java	(working copy)
@@ -16,13 +16,23 @@
 
 package org.ametys.plugins.gadgets;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.avalon.framework.CascadingRuntimeException;
+import org.apache.avalon.framework.component.WrapperComponentManager;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.avalon.framework.service.Serviceable;
+import org.apache.cocoon.Constants;
+import org.apache.cocoon.components.CocoonComponentManager;
+import org.apache.cocoon.environment.background.BackgroundEnvironment;
 import org.apache.commons.lang.StringUtils;
 import org.apache.excalibur.source.SourceResolver;
 import org.apache.shindig.common.PropertiesModule;
@@ -33,6 +43,7 @@
 import org.apache.shindig.gadgets.process.Processor;
 import org.slf4j.bridge.SLF4JBridgeHandler;
 
+import org.ametys.plugins.gadgets.generators.GadgetsLibraryManager;
 import org.ametys.runtime.config.Config;
 
 import com.google.inject.AbstractModule;
@@ -43,15 +54,28 @@
 /**
  * Init class for initializing shindig components
  */
-public class Init extends AbstractLogEnabled implements org.ametys.runtime.plugin.Init, Serviceable
+public class Init extends AbstractLogEnabled implements org.ametys.runtime.plugin.Init, Serviceable, Contextualizable
 {
     private static Injector __injector;
     private SourceResolver _resolver;
+    private GadgetsLibraryManager _gadgetLibrary;
+    
+    /** The cocoon environment context. */
+    private org.apache.cocoon.environment.Context _environmentContext;
+    private ServiceManager _manager;
     
     @Override
     public void service(ServiceManager manager) throws ServiceException
     {
         _resolver = (SourceResolver) manager.lookup(SourceResolver.ROLE);
+        _gadgetLibrary = (GadgetsLibraryManager) manager.lookup(GadgetsLibraryManager.ROLE);
+        _manager = manager;
+    }
+    
+    @Override
+    public void contextualize(Context context) throws ContextException
+    {
+        _environmentContext = (org.apache.cocoon.environment.Context) context.get(Constants.CONTEXT_ENVIRONMENT_CONTEXT);
     }
 
     @Override
@@ -73,6 +97,26 @@
                                           new OAuthModule());
         
         ((AmetysGadgetSpecFactory) __injector.getInstance(GadgetSpecFactory.class)).setResolver(_resolver);
+        
+        
+        Map<String, Object> environmentInformation = null;
+        
+        try
+        {
+            environmentInformation = _createAndEnterEngineEnvironment();
+            
+            // Load the gadget library in cache
+            _gadgetLibrary.loadLibrary();
+            
+        }
+        finally
+        {
+            // Leave the environment.
+            if (environmentInformation != null)
+            {
+                _leaveEngineEnvironment(environmentInformation);
+            }
+        }
     }
 
     /**
@@ -132,6 +176,67 @@
             return Integer.toString(_port);
         }
     }
+    
+    /**
+     * Create and enter a cocoon environment specific to the engine.
+     * @return a Map with the environment information.
+     */
+    protected Map<String, Object> _createAndEnterEngineEnvironment()
+    {
+        BackgroundEnvironment environment;
+        org.apache.cocoon.Processor processor;
+        
+        // Création de l'environnement cocoon particulier
+        try
+        {
+            environment = new BackgroundEnvironment(getLogger(), _environmentContext);
+            processor = (org.apache.cocoon.Processor) _manager.lookup(org.apache.cocoon.Processor.ROLE);
+        }
+        catch (Exception e)
+        {
+            throw new CascadingRuntimeException("Error during environment's setup.", e);
+        }
+        
+        Object processingKey = CocoonComponentManager.startProcessing(environment);
+        int environmentDepth = CocoonComponentManager.markEnvironment();
+        
+        CocoonComponentManager.enterEnvironment(environment, new WrapperComponentManager(_manager), processor);
+        
+        Map<String, Object> result = new HashMap<String, Object>();
+        
+        result.put("environment", environment);
+        result.put("processor", processor);
+        result.put("processingKey", processingKey);
+        result.put("environmentDepth", new Integer(environmentDepth));
+        
+        return result;
+    }
+    
+    /**
+     * Leave the cocoon environment.
+     * @param environmentInformation the environment information.
+     */
+    protected void _leaveEngineEnvironment(Map<String, Object> environmentInformation)
+    {
+        BackgroundEnvironment environment = (BackgroundEnvironment) environmentInformation.get("environment");
+        Processor processor = (Processor) environmentInformation.get("processor");
+        Object processingKey = environmentInformation.get("processingKey");
+        int environmentDepth = ((Integer) environmentInformation.get("environmentDepth")).intValue();
+        
+        CocoonComponentManager.leaveEnvironment();
+        CocoonComponentManager.endProcessing(environment, processingKey);
+        
+        try
+        {
+            CocoonComponentManager.checkEnvironment(environmentDepth, getLogger());
+        }
+        catch (Exception e)
+        {
+            throw new CascadingRuntimeException("Error checking the environment", e);
+        }
+        
+        _manager.release(processor);
+    }
 
     class AmetysModule extends AbstractModule
     {