Index: quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/browser/configure.zcml
===================================================================
--- quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/browser/configure.zcml	(revision 1575)
+++ quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/browser/configure.zcml	(revision 2704)
@@ -14,3 +14,6 @@
       />
 
+  <browser:resource
+      name="batch.js"
+      file="resources/batch.js" />
 </configure>
Index: quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/browser/resources/batch.js
===================================================================
--- quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/browser/resources/batch.js	(revision 2704)
+++ quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/browser/resources/batch.js	(revision 2704)
@@ -0,0 +1,94 @@
+jq(document).ready(function(e) {
+    var prev_link = jq('.prevlink');
+    var next_link = jq('.nextlink');
+    var nav_links = jq('.navlink');
+    var batch_size = 4;
+    batch_size = nav_links.size > batch_size ? batch_size : nav_links.size();
+
+    var hideNavigation = function (){
+      jq.each(nav_links, function(index, link){
+        jq(link).hide();
+      });
+    };
+
+    var showPageByIndex = function(index){
+      jq('dd[class*=page]').hide();
+      jq('dd.page-'+(index)).show();
+    };
+          
+    var bind_prev_handler = function(link, index){
+      if (index == 0) {
+        jq(link).hide();
+      }
+      jq(link).unbind();
+      jq(link).click(function(e) {
+        if (!(index % batch_size)) {
+          hideNavigation();
+          for (i=1;i<=batch_size;i++){
+            jq(nav_links[index-i]).show();
+          }
+        }
+        nav_link_handler(index-1);
+     });
+    };
+    var bind_next_handler = function(link, index){
+      if (index == nav_links.size()-1) {
+        jq(link).hide();
+      }
+      jq(link).unbind();
+      jq(link).click(function(e) {
+        if (!((index+1) % batch_size)) {
+          hideNavigation();
+          for (i=1;i<=batch_size;i++){
+            if (i+index<nav_links.size()){
+              jq(nav_links[i+index]).show();
+            }
+          }
+        }
+        nav_link_handler(index+1);
+      });
+    };
+    var nav_link_handler = function(index){
+      if (index > 0) {
+        prev_link.show();
+        bind_prev_handler(prev_link, index);
+      }
+      else {
+        prev_link.hide();
+      }
+      if (index < nav_links.size()-1) {
+        next_link.show();
+        bind_next_handler(next_link, index);
+      }
+      else {
+        next_link.hide();
+      }
+      showPageByIndex(index);
+      for (i=0;i<nav_links.size();i++){
+        if (i == index) {
+          jq(nav_links[i]).addClass('selected');
+        }
+        else{
+          jq(nav_links[i]).removeClass('selected');
+      }
+      }
+    }
+    var initialize_navigation = function(){
+      hideNavigation();
+      for (i=0; i<batch_size;i++){
+          jq(nav_links[i]).show();
+      }
+      showPageByIndex(0);
+      bind_prev_handler(prev_link, 0);
+      bind_next_handler(next_link, 0);
+      jq.each(nav_links, function(index, link) {
+        jq(link).unbind();
+        jq(link).click(function(e) {
+          nav_link_handler(index);
+        });
+    });
+    };
+
+   initialize_navigation();
+
+});
Index: quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/browser/templates/items_listing.pt
===================================================================
--- quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/browser/templates/items_listing.pt	(revision 2704)
+++ quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/browser/templates/items_listing.pt	(revision 2704)
@@ -0,0 +1,39 @@
+<tal:items define="plone_view context/@@plone;
+                   toLocalizedTime nocall:plone_view/toLocalizedTime;
+                   getIcon nocall:plone_view/getIcon;
+                   page_number options/page_number|nothing"
+           repeat="item options/portlet_items">
+  <dd class="portletItem"
+      tal:define="oddrow repeat/item/odd;
+                  item_icon python:plone_view.getIcon(item);
+                  show_title python:view.showProperty('Title');
+                  show_description python:view.showProperty('Description');
+                  item_class python:oddrow and 'portletItem even' or 'portletItem odd'"
+      tal:attributes="class python:page_number and item_class+' page-'+page_number or item_class">
+      <a href="#"
+         class="tile"
+         tal:attributes="href item/getURL;
+                         title python: show_description and item.Description or ''">
+          <img tal:replace="structure item_icon/html_tag" />
+          <span class="tileTitle"
+                tal:condition="show_title"
+                tal:content="item/pretty_title_or_id">
+           Title
+          </span>
+          <span class="tileDescription"
+                tal:condition="show_description">
+            <tal:descr content="item/Description" />
+            <span class="tileReadMore"
+                  tal:condition="view/data/show_item_more"
+                  tal:attributes="href item/getURL" i18n:translate="more_url">
+                  &hellip;more
+            </span>            
+          </span>
+          <span class="portletItemDetails"
+                tal:condition="view/data/show_dates"
+                tal:content="python:toLocalizedTime(item.Date)">
+              Date
+          </span>
+      </a>
+  </dd>
+</tal:items>
Index: quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/browser/templates/navigation.pt
===================================================================
--- quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/browser/templates/navigation.pt	(revision 2704)
+++ quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/browser/templates/navigation.pt	(revision 2704)
@@ -0,0 +1,10 @@
+<tal:navigation>
+  <a class='prevlink'>&#60;</a>
+  <tal:block repeat="batch options/batches">
+    <a class="navlink">
+      <span tal:content="repeat/batch/number"/>
+      <span tal:condition="not:repeat/batch/end">|</span>
+    </a>
+  </tal:block>
+  <a class='nextlink'>&#62;</a>
+</tal:navigation>
Index: quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/collection.pt
===================================================================
--- quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/collection.pt	(revision 1575)
+++ quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/collection.pt	(revision 2704)
@@ -2,8 +2,5 @@
     i18n:domain="plone"
     tal:define="collection_url view/collection_url;
-                styling view/data/styling;
-                plone_view context/@@plone;
-                toLocalizedTime nocall:plone_view/toLocalizedTime;
-                getIcon nocall:plone_view/getIcon;"
+                styling view/data/styling"
     tal:attributes="class string:${attrs/class} ${styling}">
 
@@ -15,41 +12,10 @@
         </a>
         <span class="portletTopRight"></span>
+        <span class="portletNavSection"
+              tal:condition="view/data/allow_batching"
+              tal:content="structure view/batch_navigation">
+        </span>
     </dt>
-    
-    <tal:events tal:repeat="obj view/results">
-    <dd class="portletItem"
-        tal:define="oddrow repeat/obj/odd;
-                    item_icon python:getIcon(obj);
-                    show_title python:view.showProperty('Title');
-                    show_description python:view.showProperty('Description')"
-        tal:attributes="class python:oddrow and 'portletItem even' or 'portletItem odd'">
-        <a href="#"
-           class="tile"
-           tal:attributes="href obj/getURL;
-                           title python: show_description and obj.Description or ''">
-            <img tal:replace="structure item_icon/html_tag" />
-            <span class="tileTitle"
-                  tal:condition="show_title"
-                  tal:content="obj/pretty_title_or_id">
-             Title
-            </span>
-            <span class="tileDescription"
-                  tal:condition="show_description">
-              <tal:descr content="obj/Description" />
-              <span class="tileReadMore"
-                    tal:condition="view/data/show_item_more"
-                    tal:attributes="href obj/getURL" i18n:translate="more_url">
-                    &hellip;more
-              </span>            
-            </span>
-            <span class="portletItemDetails"
-                  tal:condition="view/data/show_dates"
-                  tal:content="python:toLocalizedTime(obj.Date)">
-                Date
-            </span>
-        </a>
-    </dd>
-    </tal:events>
-    
+    <tal:items replace="structure view/render_items"/>
     <dd class="portletFooter" tal:condition="view/data/show_more">
         <span class="portletBottomLeft"></span>
Index: quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/collection.py
===================================================================
--- quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/collection.py	(revision 1575)
+++ quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/collection.py	(revision 2704)
@@ -16,10 +16,24 @@
 from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
 from plone.app.vocabularies.catalog import SearchableTextSourceBinder
+from zope.schema import ValidationError
 from plone.app.form.widgets.uberselectionwidget import UberSelectionWidget
 
 from Products.ATContentTypes.interface import IATTopic
+from Products.CMFPlone.PloneBatch import Batch
 from plone.portlet.collection.collection import ICollectionPortlet
 
 from quintagroup.portlet.collection import MessageFactory as _
+
+MIN_BATCH_SIZE , MAX_BATCHSIZE = 1, 30
+
+class NotValidBatchSizeValue(ValidationError):
+    """This is not valid batch size value.
+    
+    """
+
+def validate_batch_size(value):
+    if MIN_BATCH_SIZE <= value <= MAX_BATCHSIZE:
+        return True
+    raise NotValidBatchSizeValue(value)
 
 class IQCollectionPortlet(ICollectionPortlet):
@@ -52,4 +66,16 @@
                                  default=True)
 
+    allow_batching = schema.Bool(title=_(u"Allow batching."),
+                                 description=_(u"If enabled, items will be splited into pages."),
+                                 required=False,
+                                 default=False)
+
+    batch_size = schema.Int(title=_(u"Batch size"),
+                            description=_("Amount of items per page"
+                                          "(if not set 3 items will be displayed as default)."),
+                            required=False,
+                            default=3, 
+                            constraint=validate_batch_size)
+
 class Assignment(base.Assignment):
     """
@@ -68,5 +94,6 @@
     def __init__(self, header=u"", target_collection=None, limit=None,
                  random=False, show_more=True, show_dates=False,
-                 item_attributes=[], styling=u"", show_item_more=False, link_title=True):
+                 item_attributes=[], styling=u"", show_item_more=False,
+                 link_title=True, allow_batching=False, batch_size=3):
 
         super(Assignment, self).__init__(header=header,
@@ -79,4 +106,6 @@
         self.show_item_more = show_item_more
         self.link_title = link_title
+        self.allow_batching = allow_batching
+        self.batch_size = batch_size
        
     @property
@@ -86,6 +115,5 @@
         """
         return self.header
-
-
+    
 class Renderer(base.Renderer):
     """Portlet renderer.
@@ -97,8 +125,24 @@
 
     render = ViewPageTemplateFile('collection.pt')
+    navigation = ViewPageTemplateFile('browser/templates/navigation.pt')
+    items_listing = ViewPageTemplateFile('browser/templates/items_listing.pt')
 
     def showProperty(self, name):
         return name in self.data.item_attributes
 
+    def batches(self):
+        items = super(Renderer, self).results()
+        delta = self.data.batch_size
+        return [items[idx:idx + delta] for idx in range(0, len(items), delta)]
+    
+    def batch_navigation(self):
+        return self.navigation(batches=self.batches())
+
+    def render_items(self):
+        if self.data.allow_batching:
+            return ''.join([self.items_listing(portlet_items=batch,
+                                               page_number=str(index))
+                            for index, batch in enumerate(self.batches())])
+        return self.items_listing(portlet_items=self.results())
         
 class AddForm(base.AddForm):
Index: quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/profiles/default/jsregistry.xml
===================================================================
--- quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/profiles/default/jsregistry.xml	(revision 2704)
+++ quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/profiles/default/jsregistry.xml	(revision 2704)
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<object name="portal_javascripts">
+
+ <javascript cacheable="True" compression="safe" cookable="True" enabled="True"
+    expression="" id="++resource++batch.js" inline="False"/>    
+
+</object>
