Index: main/waeup.ikoba/trunk/src/waeup/ikoba/payments/browser.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/payments/browser.py	(revision 12761)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/payments/browser.py	(revision 12762)
@@ -20,7 +20,49 @@
 import grok
 from waeup.ikoba.browser.breadcrumbs import Breadcrumb
+from waeup.ikoba.interfaces import IIkobaObject
 from waeup.ikoba.interfaces import MessageFactory as _
-from waeup.ikoba.payments.interfaces import IPayment
-from waeup.ikoba.payments.payment import find_payable_from_payable_id
+from waeup.ikoba.browser.viewlets import PrimaryNavTab
+from waeup.ikoba.browser.layout import (
+    IkobaPage, IkobaEditFormPage, IkobaDisplayFormPage,
+    NullValidator, jsaction, action, UtilityView)
+from waeup.ikoba.utils.helpers import get_current_principal
+
+from waeup.ikoba.payments.interfaces import (
+    IPaymentsContainer, IPayment, payment_states
+    )
+from waeup.ikoba.payments.payment import (
+    find_payable_from_payable_id,
+    get_payment_providers
+    )
+from waeup.ikoba.payments.catalog import search
+
+
+grok.context(IIkobaObject)  # Make IIkobaObject the default context
+grok.templatedir('templates')
+
+
+class PaymentsTab(PrimaryNavTab):
+    """Payments tab in primary navigation.
+    """
+
+    grok.context(IIkobaObject)
+    grok.order(3)
+    grok.require('waeup.Public')
+    grok.name('paymentstab')
+
+    pnav = 5
+    tab_title = _(u'Payments')
+
+    @property
+    def link_target(self):
+        return self.view.application_url('payments')
+
+
+class PaymentsBreadcrumb(Breadcrumb):
+    """A breadcrumb for the payments container.
+    """
+    grok.context(IPaymentsContainer)
+    title = _('Payments')
+
 
 class PaymentBreadcrumb(Breadcrumb):
@@ -46,2 +88,41 @@
             return (grok.getSite(), 'index')
         return (payable, 'index')
+
+
+class PaymentsContainerPage(IkobaPage):
+    """The standard view for payment containers.
+    """
+    grok.context(IPaymentsContainer)
+    grok.name('index')
+    grok.require('waeup.managePortal')
+    grok.template('containerpage')
+    label = _('Find payments')
+    search_button = _('Find payment(s)')
+    pnav = 5
+
+    @property
+    def gateway_services(self):
+        return get_payment_providers()
+
+    @property
+    def payment_states(self):
+        return payment_states
+
+    def update(self, *args, **kw):
+        form = self.request.form
+        self.hitlist = []
+        if 'searchterm' in form and form['searchterm']:
+            self.searchterm = form['searchterm']
+            self.searchtype = form['searchtype']
+        elif 'old_searchterm' in form:
+            self.searchterm = form['old_searchterm']
+            self.searchtype = form['old_searchtype']
+        else:
+            if 'search' in form:
+                self.flash(_('Empty search string'), type="warning")
+            return
+        self.hitlist = search(query=self.searchterm,
+            searchtype=self.searchtype)
+        if not self.hitlist:
+            self.flash(_('No payment found.'), type="warning")
+        return
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/payments/catalog.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/payments/catalog.py	(revision 12761)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/payments/catalog.py	(revision 12762)
@@ -19,6 +19,35 @@
 """
 import grok
+from hurry.query import Eq, Text
+from hurry.query.query import Query
+from zope.catalog.interfaces import ICatalog
+from zope.component import queryUtility
 from waeup.ikoba.interfaces import ICompany
-from waeup.ikoba.payments.interfaces import IPayment
+from waeup.ikoba.payments.interfaces import (
+    IPayment, IPayable
+    )
+from waeup.ikoba.payments.payment import (
+    find_payable_from_payable_id
+    )
+
+
+def search(query=None, searchtype=None):
+    hitlist = []
+    # Temporary solution to display all payments added
+    if query == '*':
+        cat = queryUtility(ICatalog, name='payments_catalog')
+        results = cat.searchResults(payment_id=(None, None))
+    else:
+        results = Query().searchResults(
+            Eq(('payments_catalog', searchtype), query))
+    hitlist = []
+    for payment in results:
+        payable_object = find_payable_from_payable_id(payment.payable_id)
+        if payable_object is not None:
+            payable = IPayable(payable_object)
+        else:
+            payable = None
+        hitlist.append((payment, payable, payable_object))
+    return hitlist
 
 
@@ -32,4 +61,5 @@
     payment_id = grok.index.Field(attribute='payment_id')
     payer_id = grok.index.Field(attribute='payer_id')
+    payable_id = grok.index.Field(attribute='payable_id')
     state = grok.index.Field(attribute='state')
     amount = grok.index.Field(attribute='amount')
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/payments/templates/containerpage.pt
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/payments/templates/containerpage.pt	(revision 12762)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/payments/templates/containerpage.pt	(revision 12762)
@@ -0,0 +1,58 @@
+<form method="POST" i18n:domain="waeup.ikoba" class="form-inline">
+<br />
+  <div class="form-group">
+    <input class="btn btn-primary" type="submit" name="search"
+      tal:attributes="value view/search_button" />
+  </div>
+  <div class="form-group">
+    <select name="searchtype" class="form-control">
+      <option i18n:translate="" value="payment_id">with payment id</option>
+      <option i18n:translate="" value="payer_id">with payer id</option>
+      <option i18n:translate="" value="payable_id">with contract id</option>
+    </select>
+  </div>
+  <div class="form-group">
+    <input type="text" class="form-control" name="searchterm" />
+  </div>
+</form>
+<br />
+<div tal:condition="view/hitlist">
+  <h3 i18n:translate="">Search Results</h3>
+  <input type="hidden" name="old_searchterm"
+       tal:attributes="value view/searchterm" />
+  <input type="hidden" name="old_searchtype"
+       tal:attributes="value view/searchtype" />
+  <table class="ikoba-data-table dataTable">
+    <thead>
+    <tr>
+      <th i18n:translate="">Payment Id</th>
+      <th i18n:translate="">Creation Date</th>
+      <th i18n:translate="">Payment Date</th>
+      <th i18n:translate="">Service</th>
+      <th i18n:translate="">Amount</th>
+      <th i18n:translate="">Currency</th>
+      <th i18n:translate="">State</th>
+      <th i18n:translate="">Contract</th>
+    </tr>
+    </thead>
+    <tbody>
+      <tr tal:repeat="value view/hitlist">
+        <td><span tal:content="python: value[0].payment_id[:9]"></span>...</td>
+        <td tal:content="python: layout.formatDatetime(value[0].creation_date)">CREATION DATE</td>
+        <td tal:content="python: layout.formatDatetime(value[0].payment_date)">PAYMENT DATE</td>
+        <td tal:content="python: view.gateway_services[value[0].gateway_service].title">SERVICE</td>
+        <td tal:content="python: value[0].amount">AMOUNT</td>
+        <td tal:content="python: value[0].currency">CURRENCY</td>
+        <td tal:content="python: view.payment_states.getTerm(value[0].state).title">STATE</td>
+        <td>
+          <span tal:condition="python: value[1] is not None">
+            <a tal:attributes="href python: view.url(value[2])">
+              <span tal:content="python: value[1].title">PAYABLETITLE</span>
+            </a>
+          </span>
+        </td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
