diff --git a/weboob/capabilities/shop.py b/weboob/capabilities/shop.py
new file mode 100644
index 00000000..f82dbc35
--- /dev/null
+++ b/weboob/capabilities/shop.py
@@ -0,0 +1,145 @@
+# -*- coding: utf-8 -*-
+
+# Copyright(C) 2014 Oleg Plakhotniuk
+#
+# This file is part of weboob.
+#
+# weboob is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# weboob is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with weboob. If not, see .
+
+
+from .base import BaseObject, StringField, DecimalField, UserError
+from .date import DateField
+from .collection import CapCollection
+
+
+__all__ = ['OrderNotFound', 'Order', 'Payment', 'Item', 'CapShop']
+
+
+class OrderNotFound(UserError):
+ """
+ Raised when an order is not found.
+ """
+
+ def __init__(self, msg='Order not found'):
+ UserError.__init__(self, msg)
+
+
+class Order(BaseObject):
+ """
+ Purchase order.
+ """
+ date = DateField('Date when the order was placed')
+ shipping = DecimalField('Shipping price')
+ discount = DecimalField('Discounts')
+ tax = DecimalField('Tax')
+
+ def __repr__(self):
+ return u"" % (self.id, self.date)
+
+
+class Payment(BaseObject):
+ """
+ Payment for an order.
+ """
+ date = DateField('The date when payment was applied')
+ method = StringField('Payment method; e.g. "VISA 1234"')
+ amount = DecimalField('Payment amount')
+
+ def __repr__(self):
+ return u"" % \
+ (self.date, self.method, self.amount)
+
+
+class Item(BaseObject):
+ """
+ Purchased item within an order.
+ """
+ label = StringField('Item label')
+ url = StringField('URL with item description')
+ price = DecimalField('Item price')
+
+ def __repr__(self):
+ return u"- " % (self.label, self.price)
+
+
+class CapShop(CapCollection):
+ """
+ Capability of online shops to see orders history.
+ """
+
+ def iter_resources(self, objs, split_path):
+ """
+ Iter resources.
+
+ Default implementation of this method is to return on top-level
+ all orders (by calling :func:`iter_accounts`).
+
+ :param objs: type of objects to get
+ :type objs: tuple[:class:`BaseObject`]
+ :param split_path: path to discover
+ :type split_path: :class:`list`
+ :rtype: iter[:class:`BaseObject`]
+ """
+ if Order in objs:
+ self._restrict_level(split_path)
+ return self.iter_orders()
+
+ def get_currency(self):
+ """
+ Get the currency this shop uses.
+
+ :rtype: :class:`str`
+ """
+ raise NotImplementedError()
+
+ def iter_orders(self):
+ """
+ Iter history of orders.
+
+ :rtype: iter[:class:`Order`]
+ """
+ raise NotImplementedError()
+
+ def get_order(self, id):
+ """
+ Get an order from its ID.
+
+ :param id: ID of the order
+ :type id: :class:`str`
+ :rtype: :class:`Order`
+ :raises: :class:`OrderNotFound`
+ """
+ raise NotImplementedError()
+
+ def iter_payments(self, order):
+ """
+ Iter payments of a specific order.
+
+ :param order: order to get payments
+ :type order: :class:`Order`
+ :rtype: iter[:class:`Payment`]
+ :raises: :class:`OrderNotFound`
+ """
+ raise NotImplementedError()
+
+ def iter_items(self, order):
+ """
+ Iter items of a specific order.
+
+ :param order: order to get items
+ :type order: :class:`Order`
+ :rtype: iter[:class:`Item`]
+ :raises: :class:`OrderNotFound`
+ """
+ raise NotImplementedError()