Index: main/plugin-blog/src/org/ametys/plugins/blog/repository/BlogRootPageFactory.java
===================================================================
--- main/plugin-blog/src/org/ametys/plugins/blog/repository/BlogRootPageFactory.java	(revision 31097)
+++ main/plugin-blog/src/org/ametys/plugins/blog/repository/BlogRootPageFactory.java	(working copy)
@@ -38,6 +38,7 @@
 import org.ametys.web.repository.page.Page;
 import org.ametys.web.repository.page.PagesContainer;
 import org.ametys.web.site.SiteConfigurationExtensionPoint;
+import org.ametys.web.skin.SkinsManager;
 import org.ametys.web.tags.TagProviderExtensionPoint;
 
 /**
@@ -70,6 +71,9 @@
     /** The i18n catalogue. */
     protected String _i18nCatalogue;
     
+    /** The skins manager */
+    protected SkinsManager _skinsManager;
+    
     @Override
     public void service(ServiceManager manager) throws ServiceException
     {
@@ -78,6 +82,7 @@
         _tagProviderEP = (TagProviderExtensionPoint) manager.lookup(TagProviderExtensionPoint.ROLE);
         _i18nUtils = (I18nUtils) manager.lookup(I18nUtils.ROLE);
         _siteConf = (SiteConfigurationExtensionPoint) manager.lookup(SiteConfigurationExtensionPoint.ROLE);
+        _skinsManager = (SkinsManager) manager.lookup(SkinsManager.ROLE);
     }
     
     @Override
@@ -107,9 +112,9 @@
         
         String lang = parentContainer.getSitemapName();
         
-        Page yearsPage = new VirtualYearsPage(_resolver, _cacheManager, _i18nUtils, _i18nCatalogue, _siteConf, translate(lang, "PLUGINS_BLOG_PAGE_YEARS"), parentContainer);
-        Page tagsPage = new VirtualTagsPage(_resolver, _cacheManager, _i18nUtils, _tagProviderEP, _siteConf, translate(lang, "PLUGINS_BLOG_PAGE_TAGS"), parentContainer);
-        Page postsPage = new VirtualPostsPage(_resolver, _cacheManager, translate(lang, "PLUGINS_BLOG_PAGE_POSTS"), parentContainer);
+        Page yearsPage = new VirtualYearsPage(_resolver, _cacheManager, _skinsManager, _i18nUtils, _i18nCatalogue, _siteConf, translate(lang, "PLUGINS_BLOG_PAGE_YEARS"), parentContainer);
+        Page tagsPage = new VirtualTagsPage(_resolver, _cacheManager, _skinsManager, _i18nUtils, _tagProviderEP, _siteConf, translate(lang, "PLUGINS_BLOG_PAGE_TAGS"), parentContainer);
+        Page postsPage = new VirtualPostsPage(_resolver, _cacheManager, _skinsManager, translate(lang, "PLUGINS_BLOG_PAGE_POSTS"), parentContainer);
         
         children.add(yearsPage);
         children.add(tagsPage);
@@ -141,15 +146,15 @@
         Page child = null;
         if (VirtualYearsPage.NAME.equals(childName))
         {
-            child = new VirtualYearsPage(_resolver, _cacheManager, _i18nUtils, _i18nCatalogue, _siteConf, translate(lang, "PLUGINS_BLOG_PAGE_YEARS"), parentContainer);
+            child = new VirtualYearsPage(_resolver, _cacheManager, _skinsManager, _i18nUtils, _i18nCatalogue, _siteConf, translate(lang, "PLUGINS_BLOG_PAGE_YEARS"), parentContainer);
         }
         else if (VirtualTagsPage.NAME.equals(childName))
         {
-            child = new VirtualTagsPage(_resolver, _cacheManager, _i18nUtils, _tagProviderEP, _siteConf, translate(lang, "PLUGINS_BLOG_PAGE_TAGS"), parentContainer);
+            child = new VirtualTagsPage(_resolver, _cacheManager, _skinsManager, _i18nUtils, _tagProviderEP, _siteConf, translate(lang, "PLUGINS_BLOG_PAGE_TAGS"), parentContainer);
         }
         else if (VirtualPostsPage.NAME.equals(childName))
         {
-            child = new VirtualPostsPage(_resolver, _cacheManager, translate(lang, "PLUGINS_BLOG_PAGE_POSTS"), parentContainer);
+            child = new VirtualPostsPage(_resolver, _cacheManager, _skinsManager, translate(lang, "PLUGINS_BLOG_PAGE_POSTS"), parentContainer);
         }
         else
         {
@@ -173,15 +178,15 @@
         Page child = null;
         if (VirtualYearsPage.NAME.equals(childName))
         {
-            child = new VirtualYearsPage(_resolver, _cacheManager, _i18nUtils, _i18nCatalogue, _siteConf, translate(lang, "PLUGINS_BLOG_PAGE_YEARS"), parent);
+            child = new VirtualYearsPage(_resolver, _cacheManager, _skinsManager, _i18nUtils, _i18nCatalogue, _siteConf, translate(lang, "PLUGINS_BLOG_PAGE_YEARS"), parent);
         }
         else if (VirtualTagsPage.NAME.equals(childName))
         {
-            child = new VirtualTagsPage(_resolver, _cacheManager, _i18nUtils, _tagProviderEP, _siteConf, translate(lang, "PLUGINS_BLOG_PAGE_TAGS"), parent);
+            child = new VirtualTagsPage(_resolver, _cacheManager, _skinsManager, _i18nUtils, _tagProviderEP, _siteConf, translate(lang, "PLUGINS_BLOG_PAGE_TAGS"), parent);
         }
         else if (VirtualPostsPage.NAME.equals(childName))
         {
-            child = new VirtualPostsPage(_resolver, _cacheManager, translate(lang, "PLUGINS_BLOG_PAGE_POSTS"), parent);
+            child = new VirtualPostsPage(_resolver, _cacheManager, _skinsManager,  translate(lang, "PLUGINS_BLOG_PAGE_POSTS"), parent);
         }
         
         return child;
Index: main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualMonthPage.java
===================================================================
--- main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualMonthPage.java	(revision 31097)
+++ main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualMonthPage.java	(working copy)
@@ -38,17 +38,21 @@
 import org.ametys.web.repository.site.Site;
 import org.ametys.web.repository.sitemap.Sitemap;
 import org.ametys.web.site.SiteConfigurationExtensionPoint;
+import org.ametys.web.skin.Skin;
+import org.ametys.web.skin.SkinsManager;
 
 /**
  * Virtual page representing a month page.
  */
 public class VirtualMonthPage extends AbstractBlogPage
 {
+    private static final String __BLOG_MONTH_TEMPLATE = "blog-month";
     
     private AmetysObjectResolver _resolver;
     private BlogCacheManager _cacheManager;
     private PagesContainer _root;
     private SiteConfigurationExtensionPoint _siteConf;
+    private SkinsManager _skinsManager;
     private int _year;
     private int _month;
     private String _title;
@@ -57,16 +61,18 @@
      * Constructor.
      * @param resolver the {@link AmetysObjectResolver}.
      * @param cacheManager the {@link AmetysObjectResolver}.
+     * @param skinsManager the {@link SkinsManager}
      * @param siteConf 
      * @param year 
      * @param month 
      * @param title the page's title.
      * @param root the blog root page.
      */
-    public VirtualMonthPage(AmetysObjectResolver resolver, BlogCacheManager cacheManager, SiteConfigurationExtensionPoint siteConf, int year, int month, String title, PagesContainer root)
+    public VirtualMonthPage(AmetysObjectResolver resolver, BlogCacheManager cacheManager, SkinsManager skinsManager, SiteConfigurationExtensionPoint siteConf, int year, int month, String title, PagesContainer root)
     {
         _resolver = resolver;
         _cacheManager = cacheManager;
+        _skinsManager = skinsManager;
         _siteConf = siteConf;
         _root = root;
         _year = year;
@@ -159,7 +165,7 @@
         {
             Content postContent = _resolver.resolveById(post.getId());
             
-            VirtualPostPage page = new VirtualPostPage(_resolver, _root, postContent, VirtualYearsPage.NAME + "/" + _year + "/" + String.format("%02d", _month));
+            VirtualPostPage page = new VirtualPostPage(_resolver, _skinsManager, _root, postContent, VirtualYearsPage.NAME + "/" + _year + "/" + String.format("%02d", _month));
             
             childrenPages.add(page);
         }
@@ -229,7 +235,7 @@
         
         Content postContent = _resolver.resolveById(post.getId());
         
-        VirtualPostPage page = new VirtualPostPage(_resolver, _root, postContent, VirtualYearsPage.NAME + "/" + _year + "/" + String.format("%02d", _month));
+        VirtualPostPage page = new VirtualPostPage(_resolver, _skinsManager, _root, postContent, VirtualYearsPage.NAME + "/" + _year + "/" + String.format("%02d", _month));
         
         if (slashPos == -1)
         {
@@ -304,4 +310,11 @@
     {
         return Collections.emptySet();
     }
+    
+    @Override
+    public String getTemplate() throws AmetysRepositoryException
+    {
+        Skin skin = _skinsManager.getSkin(getSite().getSkinId());
+        return skin.getTemplate(__BLOG_MONTH_TEMPLATE) != null ? __BLOG_MONTH_TEMPLATE : super.getTemplate(); 
+    }
 }
Index: main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualMonthPageFactory.java
===================================================================
--- main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualMonthPageFactory.java	(revision 31097)
+++ main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualMonthPageFactory.java	(working copy)
@@ -31,6 +31,7 @@
 import org.ametys.web.repository.page.Page;
 import org.ametys.web.repository.page.PagesContainer;
 import org.ametys.web.site.SiteConfigurationExtensionPoint;
+import org.ametys.web.skin.SkinsManager;
 
 /**
  * {@link AmetysObjectFactory} handling {@link VirtualMonthPage}.
@@ -49,6 +50,7 @@
     private AmetysObjectResolver _resolver;
     private BlogCacheManager _cacheManager;
     private SiteConfigurationExtensionPoint _siteConf;
+    private SkinsManager _skinsManager;
     
     @Override
     public void service(ServiceManager manager) throws ServiceException
@@ -57,6 +59,7 @@
         _cacheManager = (BlogCacheManager) manager.lookup(BlogCacheManager.ROLE);
         _i18nUtils = (I18nUtils) manager.lookup(I18nUtils.ROLE);
         _siteConf = (SiteConfigurationExtensionPoint) manager.lookup(SiteConfigurationExtensionPoint.ROLE);
+        _skinsManager = (SkinsManager) manager.lookup(SkinsManager.ROLE);
     }
     
     @Override
@@ -103,7 +106,7 @@
         
         String title = translate(root.getSitemapName(), "PLUGINS_BLOG_PAGE_MONTH_" + monthStr);
         
-        return new VirtualMonthPage(_resolver, _cacheManager, _siteConf, year, month, title, root);
+        return new VirtualMonthPage(_resolver, _cacheManager, _skinsManager, _siteConf, year, month, title, root);
     }
 
     @Override
Index: main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualPostPage.java
===================================================================
--- main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualPostPage.java	(revision 31097)
+++ main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualPostPage.java	(working copy)
@@ -32,26 +32,33 @@
 import org.ametys.web.repository.page.Zone;
 import org.ametys.web.repository.site.Site;
 import org.ametys.web.repository.sitemap.Sitemap;
+import org.ametys.web.skin.Skin;
+import org.ametys.web.skin.SkinsManager;
 
 /**
  * Page representing a post.
  */
 public class VirtualPostPage extends AbstractBlogPage
 {
+    private static final String __BLOG_POST_TEMPLATE = "blog-post";
+    
     private PagesContainer _root;
     private Content _post;
     private String _path;
+    private SkinsManager _skinsManager;
     
     /**
      * Constructor.
+     * @param skinsManager the skins manager
      * @param resolver the {@link AmetysObjectResolver}.
      * @param root the blog root page.
      * @param post the post.
      * @param path path from the virtual root
      */
-    public VirtualPostPage(AmetysObjectResolver resolver, PagesContainer root, Content post, String path)
+    public VirtualPostPage(AmetysObjectResolver resolver, SkinsManager skinsManager, PagesContainer root, Content post, String path)
     {
         _root = root;
+        _skinsManager = skinsManager;
         _post = post;
         _path = path;
     }
@@ -233,4 +240,11 @@
     {
         return Collections.emptySet();
     }
+    
+    @Override
+    public String getTemplate() throws AmetysRepositoryException
+    {
+        Skin skin = _skinsManager.getSkin(getSite().getSkinId());
+        return skin.getTemplate(__BLOG_POST_TEMPLATE) != null ? __BLOG_POST_TEMPLATE : super.getTemplate(); 
+    }
 }
Index: main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualPostPageFactory.java
===================================================================
--- main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualPostPageFactory.java	(revision 31097)
+++ main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualPostPageFactory.java	(working copy)
@@ -25,6 +25,7 @@
 import org.ametys.plugins.repository.AmetysObjectResolver;
 import org.ametys.plugins.repository.AmetysRepositoryException;
 import org.ametys.web.repository.page.PagesContainer;
+import org.ametys.web.skin.SkinsManager;
 
 /**
  * {@link AmetysObjectFactory} handling {@link VirtualPostPage}.
@@ -33,11 +34,13 @@
 {
     
     private AmetysObjectResolver _resolver;
+    private SkinsManager _skinsManager;
     
     @Override
     public void service(ServiceManager manager) throws ServiceException
     {
         _resolver = (AmetysObjectResolver) manager.lookup(AmetysObjectResolver.ROLE);
+        _skinsManager = (SkinsManager) manager.lookup(SkinsManager.ROLE);
     }
     
     @Override
@@ -59,7 +62,7 @@
         PagesContainer root = _resolver.resolveById(rootId);
         Content postContent = _resolver.resolveById(postId);
         
-        return new VirtualPostPage(_resolver, root, postContent, path);
+        return new VirtualPostPage(_resolver, _skinsManager, root, postContent, path);
     }
     
     @Override
Index: main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualPostsPage.java
===================================================================
--- main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualPostsPage.java	(revision 31097)
+++ main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualPostsPage.java	(working copy)
@@ -38,6 +38,7 @@
 import org.ametys.web.repository.page.Zone;
 import org.ametys.web.repository.site.Site;
 import org.ametys.web.repository.sitemap.Sitemap;
+import org.ametys.web.skin.SkinsManager;
 
 /**
  * Virtual page representing the Post list page.
@@ -50,6 +51,7 @@
     
     private AmetysObjectResolver _resolver;
     private BlogCacheManager _cacheManager;
+    private SkinsManager _skinsManager;
     private PagesContainer _root;
     private String _title;
     
@@ -57,13 +59,15 @@
      * Constructor.
      * @param resolver the {@link AmetysObjectResolver}.
      * @param cacheManager the {@link AmetysObjectResolver}.
+     * @param skinsManager the skins manager
      * @param root the blog root page.
      * @param title the page's title.
      */
-    public VirtualPostsPage(AmetysObjectResolver resolver, BlogCacheManager cacheManager, String title, PagesContainer root)
+    public VirtualPostsPage(AmetysObjectResolver resolver, BlogCacheManager cacheManager, SkinsManager skinsManager, String title, PagesContainer root)
     {
         _resolver = resolver;
         _cacheManager = cacheManager;
+        _skinsManager = skinsManager;
         _root = root;
         _title = title;
     }
@@ -158,7 +162,7 @@
         {
             Content postContent = _resolver.resolveById(post.getId());
             
-            VirtualPostPage page = new VirtualPostPage(_resolver, _root, postContent, NAME);
+            VirtualPostPage page = new VirtualPostPage(_resolver, _skinsManager, _root, postContent, NAME);
             
             children.add(page);
         }
@@ -236,7 +240,7 @@
         
 //        Content postContent = _resolver.resolveById(postId);
         
-        VirtualPostPage page = new VirtualPostPage(_resolver, _root, postContent, NAME);
+        VirtualPostPage page = new VirtualPostPage(_resolver, _skinsManager, _root, postContent, NAME);
         
         if (slashPos == -1)
         {
Index: main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualTagPage.java
===================================================================
--- main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualTagPage.java	(revision 31097)
+++ main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualTagPage.java	(working copy)
@@ -38,13 +38,17 @@
 import org.ametys.web.repository.site.Site;
 import org.ametys.web.repository.sitemap.Sitemap;
 import org.ametys.web.site.SiteConfigurationExtensionPoint;
+import org.ametys.web.skin.Skin;
+import org.ametys.web.skin.SkinsManager;
 
 /**
  * Virtual page representing a year page.
  */
 public class VirtualTagPage extends AbstractBlogPage
 {
+    private static final String __BLOG_TAG_TEMPLATE = "blog-tag";
     
+    private SkinsManager _skinsManager;
     private AmetysObjectResolver _resolver;
     private BlogCacheManager _cacheManager;
     private SiteConfigurationExtensionPoint _siteConf;
@@ -56,15 +60,17 @@
      * Constructor.
      * @param resolver the {@link AmetysObjectResolver}.
      * @param cacheManager the {@link AmetysObjectResolver}.
+     * @param skinsManager the  {@link SkinsManager}
      * @param siteConf 
      * @param tagName 
      * @param title the page's title.
      * @param root the blog root page.
      */
-    public VirtualTagPage(AmetysObjectResolver resolver, BlogCacheManager cacheManager, SiteConfigurationExtensionPoint siteConf, String tagName, String title, PagesContainer root)
+    public VirtualTagPage(AmetysObjectResolver resolver, BlogCacheManager cacheManager, SkinsManager skinsManager, SiteConfigurationExtensionPoint siteConf, String tagName, String title, PagesContainer root)
     {
         _resolver = resolver;
         _cacheManager = cacheManager;
+        _skinsManager = skinsManager;
         _siteConf = siteConf;
         _root = root;
         _tagName = tagName;
@@ -148,7 +154,7 @@
         {
             Content postContent = _resolver.resolveById(post.getId());
             
-            VirtualPostPage page = new VirtualPostPage(_resolver, _root, postContent, VirtualTagsPage.NAME + "/" + _tagName);
+            VirtualPostPage page = new VirtualPostPage(_resolver, _skinsManager, _root, postContent, VirtualTagsPage.NAME + "/" + _tagName);
             
             childrenPages.add(page);
         }
@@ -224,7 +230,7 @@
                 
         Content postContent = _resolver.resolveById(post.getId());
         
-        VirtualPostPage page = new VirtualPostPage(_resolver, _root, postContent, VirtualTagsPage.NAME + "/" + _tagName);
+        VirtualPostPage page = new VirtualPostPage(_resolver, _skinsManager, _root, postContent, VirtualTagsPage.NAME + "/" + _tagName);
         
         if (slashPos == -1)
         {
@@ -299,4 +305,17 @@
     {
         return Collections.emptySet();
     }
+    
+    @Override
+    public String getTemplate() throws AmetysRepositoryException
+    {
+        Skin skin = _skinsManager.getSkin(getSite().getSkinId());
+        if (skin.getTemplate(__BLOG_TAG_TEMPLATE) != null)
+        {
+            return __BLOG_TAG_TEMPLATE;
+        }
+        
+        // Default template
+        return super.getTemplate(); 
+    }
 }
Index: main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualTagPageFactory.java
===================================================================
--- main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualTagPageFactory.java	(revision 31097)
+++ main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualTagPageFactory.java	(working copy)
@@ -31,6 +31,7 @@
 import org.ametys.web.repository.page.Page;
 import org.ametys.web.repository.page.PagesContainer;
 import org.ametys.web.site.SiteConfigurationExtensionPoint;
+import org.ametys.web.skin.SkinsManager;
 import org.ametys.web.tags.Tag;
 import org.ametys.web.tags.TagProviderExtensionPoint;
 
@@ -52,6 +53,7 @@
     private BlogCacheManager _cacheManager;
     private TagProviderExtensionPoint _tagProviderEP;
     private SiteConfigurationExtensionPoint _siteConf;
+    private SkinsManager _skinsManager;
     
     @Override
     public void service(ServiceManager manager) throws ServiceException
@@ -61,6 +63,7 @@
         _tagProviderEP = (TagProviderExtensionPoint) manager.lookup(TagProviderExtensionPoint.ROLE);
         _i18nUtils = (I18nUtils) manager.lookup(I18nUtils.ROLE);
         _siteConf = (SiteConfigurationExtensionPoint) manager.lookup(SiteConfigurationExtensionPoint.ROLE);
+        _skinsManager = (SkinsManager) manager.lookup(SkinsManager.ROLE);
     }
     
     @Override
@@ -99,7 +102,7 @@
         
         String title = _i18nUtils.translate(tag.getTitle(), root.getSitemapName());
         
-        return new VirtualTagPage(_resolver, _cacheManager, _siteConf, tagName, title, root);
+        return new VirtualTagPage(_resolver, _cacheManager, _skinsManager, _siteConf, tagName, title, root);
     }
 
     @Override
Index: main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualTagsPage.java
===================================================================
--- main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualTagsPage.java	(revision 31097)
+++ main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualTagsPage.java	(working copy)
@@ -37,6 +37,7 @@
 import org.ametys.web.repository.site.Site;
 import org.ametys.web.repository.sitemap.Sitemap;
 import org.ametys.web.site.SiteConfigurationExtensionPoint;
+import org.ametys.web.skin.SkinsManager;
 import org.ametys.web.tags.Tag;
 import org.ametys.web.tags.TagProviderExtensionPoint;
 
@@ -55,22 +56,25 @@
     private TagProviderExtensionPoint _tagProviderEP;
     private SiteConfigurationExtensionPoint _siteConf;
     private PagesContainer _root;
+    private SkinsManager _skinsManager;
     private String _title;
     
     /**
      * Constructor.
      * @param resolver the {@link AmetysObjectResolver}.
      * @param cacheManager the {@link AmetysObjectResolver}.
+     * @param skinsManager the {@link SkinsManager}.
      * @param i18nCache 
      * @param tagProviderEP 
      * @param siteConf 
      * @param root the blog root page.
      * @param title the page's title.
      */
-    public VirtualTagsPage(AmetysObjectResolver resolver, BlogCacheManager cacheManager, I18nUtils i18nCache, TagProviderExtensionPoint tagProviderEP, SiteConfigurationExtensionPoint siteConf, String title, PagesContainer root)
+    public VirtualTagsPage(AmetysObjectResolver resolver, BlogCacheManager cacheManager, SkinsManager skinsManager, I18nUtils i18nCache, TagProviderExtensionPoint tagProviderEP, SiteConfigurationExtensionPoint siteConf, String title, PagesContainer root)
     {
         _resolver = resolver;
         _cacheManager = cacheManager;
+        _skinsManager = skinsManager;
         _i18nUtils = i18nCache;
         _tagProviderEP = tagProviderEP;
         _siteConf = siteConf;
@@ -177,7 +181,7 @@
             {
                 String title = _i18nUtils.translate(tag.getTitle(), getSitemapName());
                 
-                VirtualTagPage page = new VirtualTagPage(_resolver, _cacheManager, _siteConf, tagName, title, _root);
+                VirtualTagPage page = new VirtualTagPage(_resolver, _cacheManager, _skinsManager, _siteConf, tagName, title, _root);
                 
                 children.add(page);
             }
@@ -249,7 +253,7 @@
         
         String title = _i18nUtils.translate(tag.getTitle(), getSitemapName());
         
-        VirtualTagPage page = new VirtualTagPage(_resolver, _cacheManager, _siteConf, childName, title, _root);
+        VirtualTagPage page = new VirtualTagPage(_resolver, _cacheManager, _skinsManager, _siteConf, childName, title, _root);
         
         if (slashPos == -1)
         {
Index: main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualYearPage.java
===================================================================
--- main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualYearPage.java	(revision 31097)
+++ main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualYearPage.java	(working copy)
@@ -39,12 +39,15 @@
 import org.ametys.web.repository.site.Site;
 import org.ametys.web.repository.sitemap.Sitemap;
 import org.ametys.web.site.SiteConfigurationExtensionPoint;
+import org.ametys.web.skin.Skin;
+import org.ametys.web.skin.SkinsManager;
 
 /**
  * Virtual page representing a year page.
  */
 public class VirtualYearPage extends AbstractBlogPage
 {
+    private static final String __BLOG_YEAR_TEMPLATE = "blog-year";
     
     private AmetysObjectResolver _resolver;
     private BlogCacheManager _cacheManager;
@@ -54,11 +57,13 @@
     private PagesContainer _root;
     private int _year;
     private String _title;
+    private SkinsManager _skinsManager;
     
     /**
      * Constructor.
      * @param resolver the {@link AmetysObjectResolver}.
      * @param cacheManager the {@link BlogCacheManager}.
+     * @param skinsManager the {@link SkinsManager}
      * @param i18nCache 
      * @param i18nCatalogue the i18n catalogue.
      * @param siteConf 
@@ -66,10 +71,11 @@
      * @param title the page's title.
      * @param root the blog root page.
      */
-    public VirtualYearPage(AmetysObjectResolver resolver, BlogCacheManager cacheManager, I18nUtils i18nCache, String i18nCatalogue, SiteConfigurationExtensionPoint siteConf, int year, String title, PagesContainer root)
+    public VirtualYearPage(AmetysObjectResolver resolver, BlogCacheManager cacheManager, SkinsManager skinsManager, I18nUtils i18nCache,  String i18nCatalogue, SiteConfigurationExtensionPoint siteConf, int year, String title, PagesContainer root)
     {
         _resolver = resolver;
         _cacheManager = cacheManager;
+        _skinsManager = skinsManager;
         _i18nUtils = i18nCache;
         _i18nCatalogue = i18nCatalogue;
         _siteConf = siteConf;
@@ -158,7 +164,7 @@
             
             String title = _i18nUtils.translate(monthText, getSitemapName());
             
-            VirtualMonthPage page = new VirtualMonthPage(_resolver, _cacheManager, _siteConf, _year, month, title, _root);
+            VirtualMonthPage page = new VirtualMonthPage(_resolver, _cacheManager, _skinsManager, _siteConf, _year, month, title, _root);
             
             children.add(page);
         }
@@ -230,7 +236,7 @@
         
         String title = _i18nUtils.translate(monthText, getSitemapName());
         
-        VirtualMonthPage page = new VirtualMonthPage(_resolver, _cacheManager, _siteConf, _year, month, title, _root);
+        VirtualMonthPage page = new VirtualMonthPage(_resolver, _cacheManager, _skinsManager, _siteConf, _year, month, title, _root);
         
         if (slashPos == -1)
         {
@@ -316,4 +322,11 @@
     {
         return Collections.emptySet();
     }
+    
+    @Override
+    public String getTemplate() throws AmetysRepositoryException
+    {
+        Skin skin = _skinsManager.getSkin(getSite().getSkinId());
+        return skin.getTemplate(__BLOG_YEAR_TEMPLATE) != null ? __BLOG_YEAR_TEMPLATE : super.getTemplate(); 
+    }
 }
Index: main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualYearPageFactory.java
===================================================================
--- main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualYearPageFactory.java	(revision 31097)
+++ main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualYearPageFactory.java	(working copy)
@@ -31,6 +31,7 @@
 import org.ametys.web.repository.page.Page;
 import org.ametys.web.repository.page.PagesContainer;
 import org.ametys.web.site.SiteConfigurationExtensionPoint;
+import org.ametys.web.skin.SkinsManager;
 
 /**
  * {@link AmetysObjectFactory} handling {@link VirtualYearPage}.
@@ -49,6 +50,7 @@
     private AmetysObjectResolver _resolver;
     private BlogCacheManager _cacheManager;
     private SiteConfigurationExtensionPoint _siteConf;
+    private SkinsManager _skinsManager;
     
     @Override
     public void service(ServiceManager manager) throws ServiceException
@@ -57,6 +59,7 @@
         _cacheManager = (BlogCacheManager) manager.lookup(BlogCacheManager.ROLE);
         _i18nUtils = (I18nUtils) manager.lookup(I18nUtils.ROLE);
         _siteConf = (SiteConfigurationExtensionPoint) manager.lookup(SiteConfigurationExtensionPoint.ROLE);
+        _skinsManager = (SkinsManager) manager.lookup(SkinsManager.ROLE);
     }
     
     @Override
@@ -97,7 +100,7 @@
             throw new UnknownAmetysObjectException("There's no virtual child page named " + yearStr + " for parent " + rootId); 
         }
         
-        return new VirtualYearPage(_resolver, _cacheManager, _i18nUtils, _i18nCatalogue, _siteConf, year, yearStr, root);
+        return new VirtualYearPage(_resolver, _cacheManager, _skinsManager, _i18nUtils, _i18nCatalogue, _siteConf, year, yearStr, root);
     }
 
     @Override
Index: main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualYearsPage.java
===================================================================
--- main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualYearsPage.java	(revision 31097)
+++ main/plugin-blog/src/org/ametys/plugins/blog/repository/VirtualYearsPage.java	(working copy)
@@ -39,6 +39,7 @@
 import org.ametys.web.repository.site.Site;
 import org.ametys.web.repository.sitemap.Sitemap;
 import org.ametys.web.site.SiteConfigurationExtensionPoint;
+import org.ametys.web.skin.SkinsManager;
 
 /**
  * Virtual page representing the Post list by year page.
@@ -56,21 +57,24 @@
     private SiteConfigurationExtensionPoint _siteConf;
     private PagesContainer _root;
     private String _title;
+    private SkinsManager _skinsManager;
     
     /**
      * Constructor.
      * @param resolver the {@link AmetysObjectResolver}.
      * @param cacheManager the {@link BlogCacheManager}.
+     * @param skinsManager the {@link SkinsManager}.
      * @param i18nCache 
      * @param i18nCatalogue the i18n catalogue.
      * @param siteConf 
      * @param root the blog root page.
      * @param title the page's title.
      */
-    public VirtualYearsPage(AmetysObjectResolver resolver, BlogCacheManager cacheManager, I18nUtils i18nCache, String i18nCatalogue, SiteConfigurationExtensionPoint siteConf, String title, PagesContainer root)
+    public VirtualYearsPage(AmetysObjectResolver resolver, BlogCacheManager cacheManager, SkinsManager skinsManager,  I18nUtils i18nCache, String i18nCatalogue, SiteConfigurationExtensionPoint siteConf, String title, PagesContainer root)
     {
         _resolver = resolver;
         _cacheManager = cacheManager;
+        _skinsManager = skinsManager;
         _i18nUtils = i18nCache;
         _i18nCatalogue = i18nCatalogue;
         _siteConf = siteConf;
@@ -166,7 +170,7 @@
         
         for (Integer year : years)
         {
-            VirtualYearPage page = new VirtualYearPage(_resolver, _cacheManager, _i18nUtils, _i18nCatalogue, _siteConf, year, Integer.toString(year), _root);
+            VirtualYearPage page = new VirtualYearPage(_resolver, _cacheManager, _skinsManager, _i18nUtils, _i18nCatalogue, _siteConf, year, Integer.toString(year), _root);
             
             children.add(page);
         }
@@ -234,7 +238,7 @@
             throw new AmetysRepositoryException(childName + " is not a valid year.", e);
         }
         
-        VirtualYearPage page = new VirtualYearPage(_resolver, _cacheManager, _i18nUtils, _i18nCatalogue, _siteConf, year, childName, _root);
+        VirtualYearPage page = new VirtualYearPage(_resolver, _cacheManager, _skinsManager, _i18nUtils, _i18nCatalogue, _siteConf, year, childName, _root);
         
         if (slashPos == -1)
         {
