roll: @amercader 
please take a look
diff --git a/README.md b/README.md
index 2fc94ba..5173225 100644
--- a/README.md
+++ b/README.md
@@ -119,6 +119,7 @@ Goodtables by default supports the following presets:
 - table
 - tables
 - datapackage
+- datapackages
 
 #### Custom presets
 
diff --git a/examples/datapackages.py b/examples/datapackages.py
new file mode 100644
index 0000000..6545c9b
--- /dev/null
+++ b/examples/datapackages.py
@@ -0,0 +1,9 @@
+from pprint import pprint
+from goodtables import Inspector
+
+inspector = Inspector()
+report = inspector.inspect([
+    'data/datapackages/valid/datapackage.json',
+    {'source': 'data/datapackages/invalid/datapackage.json'},
+], preset='datapackages')
+pprint(report)
diff --git a/examples/tables.py b/examples/tables.py
index fba2af5..26e7ba0 100644
--- a/examples/tables.py
+++ b/examples/tables.py
@@ -3,7 +3,7 @@ from goodtables import Inspector
 
 inspector = Inspector()
 report = inspector.inspect([
+    'data/invalid.csv',
     {'source': 'data/valid.csv', 'schema': {'fields': [{'name': 'id'}, {'name': 'name'}]}},
-    {'source': 'data/invalid.csv'},
 ], preset='tables')
 pprint(report)
diff --git a/features/datapackages.yml b/features/datapackages.yml
new file mode 100644
index 0000000..bea1769
--- /dev/null
+++ b/features/datapackages.yml
@@ -0,0 +1,8 @@
+datapackages:
+  source:
+    - data/datapackages/valid/datapackage.json
+    - source: data/datapackages/invalid/datapackage.json
+  preset: datapackages
+  report:
+    - [3, 3, null, 'blank-row']
+    - [4, 4, null, 'blank-row']
diff --git a/goodtables/inspector.py b/goodtables/inspector.py
index 6d8be7b..70e6028 100644
--- a/goodtables/inspector.py
+++ b/goodtables/inspector.py
@@ -67,7 +67,9 @@ class Inspector(object):
             preset (str): dataset extraction preset
                 supported presets:
                     - table
+                    - tables
                     - datapackage
+                    - datapackages
             options (dict): source options
 
         Returns:
@@ -93,7 +95,7 @@ class Inspector(object):
 
         # Collect reports
         reports = []
-        if not errors:
+        if tables:
             tasks = []
             pool = ThreadPool(processes=len(tables))
             for table in tables:
diff --git a/goodtables/presets/__init__.py b/goodtables/presets/__init__.py
index 91d2f3b..d5c24f4 100644
--- a/goodtables/presets/__init__.py
+++ b/goodtables/presets/__init__.py
@@ -5,5 +5,6 @@ from __future__ import absolute_import
 from __future__ import unicode_literals
 
 from .datapackage import datapackage
+from .datapackages import datapackages
 from .table import table
 from .tables import tables
diff --git a/goodtables/presets/datapackages.py b/goodtables/presets/datapackages.py
new file mode 100644
index 0000000..408a36a
--- /dev/null
+++ b/goodtables/presets/datapackages.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+from __future__ import division
+from __future__ import print_function
+from __future__ import absolute_import
+from __future__ import unicode_literals
+
+import six
+from copy import deepcopy
+from .datapackage import datapackage as datapackage_preset
+from ..register import preset
+
+
+# Module API
+
+@preset('datapackages')
+def datapackages(items):
+    errors = []
+    tables = []
+
+    # Add errors, tables
+    items = deepcopy(items)
+    for item in items:
+        if isinstance(item, six.string_types):
+            item_errors, item_tables = datapackage_preset(item)
+        else:
+            source = item.pop('source')
+            item_errors, item_tables = datapackage_preset(source, **item)
+        errors.extend(item_errors)
+        tables.extend(item_tables)
+
+    return errors, tables
diff --git a/goodtables/presets/tables.py b/goodtables/presets/tables.py
index 581c538..6ef002b 100644
--- a/goodtables/presets/tables.py
+++ b/goodtables/presets/tables.py
@@ -4,6 +4,8 @@ from __future__ import print_function
 from __future__ import absolute_import
 from __future__ import unicode_literals
 
+import six
+from copy import deepcopy
 from .table import table as table_preset
 from ..register import preset
 
@@ -16,9 +18,13 @@ def tables(items):
     tables = []
 
     # Add errors, tables
+    items = deepcopy(items)
     for item in items:
-        source = item.pop('source')
-        item_errors, item_tables = table_preset(source, **item)
+        if isinstance(item, six.string_types):
+            item_errors, item_tables = table_preset(item)
+        else:
+            source = item.pop('source')
+            item_errors, item_tables = table_preset(source, **item)
         errors.extend(item_errors)
         tables.extend(item_tables)
 

Add datapackages preset
# Overview

Required by https://github.com/frictionlessdata/goodtables.io/issues/17
diff --git a/tests/presets/test_datapackages.py b/tests/presets/test_datapackages.py
new file mode 100644
index 0000000..6ca1ce7
--- /dev/null
+++ b/tests/presets/test_datapackages.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+from __future__ import division
+from __future__ import print_function
+from __future__ import absolute_import
+from __future__ import unicode_literals
+
+from goodtables import presets
+
+
+# Test
+
+def test_datapackages():
+    errors, tables = presets.datapackages([
+        'data/datapackages/valid/datapackage.json',
+        {'source': 'data/datapackages/invalid/datapackage.json'},
+    ])
+    assert len(errors) == 0
+    assert len(tables) == 4
diff --git a/tests/presets/test_tables.py b/tests/presets/test_tables.py
new file mode 100644
index 0000000..4aedfcc
--- /dev/null
+++ b/tests/presets/test_tables.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+from __future__ import division
+from __future__ import print_function
+from __future__ import absolute_import
+from __future__ import unicode_literals
+
+from goodtables import presets
+
+
+# Test
+
+def test_tables():
+    errors, tables = presets.tables([
+        'data/valid.csv',
+        {'source': 'data/invalid.csv'},
+    ])
+    assert len(errors) == 0
+    assert len(tables) == 2

pip install --upgrade -e .[develop,ods]
parse_log_pytest
pytest
mock pyyaml pytest
apt-get update apt-get install -y gcc
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
cchardet==1.1.3
certifi==2021.5.30
charset-normalizer==2.0.12
click==6.7
datapackage==0.8.8
distlib==0.3.9
et-xmlfile==1.1.0
ezodf==0.3.2
filelock==3.4.1
future==0.18.3
-e git+https://github.com/frictionlessdata/goodtables-py.git@3ea326ea948a50f0155257e2cf423f44c6fc363b#egg=goodtables
idna==3.10
ijson==2.6.1
importlib-metadata==4.8.3
importlib-resources==5.4.0
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
isodate==0.6.1
jdcal==1.4.1
jsonlines==1.2.0
jsonschema==2.6.0
jsontableschema==0.10.0
linear-tsv==1.1.0
lxml==3.8.0
mccabe==0.7.0
mock==5.2.0
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
openpyxl==2.6.4
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
platformdirs==2.4.0
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pycodestyle==2.10.0
pydocstyle==6.3.0
pyflakes==3.0.1
pylama==7.7.1
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
python-dateutil==2.9.0.post0
PyYAML==6.0.1
requests==2.27.1
rfc3986==0.4.1
six==1.17.0
snowballstemmer==2.2.0
tabulator==0.15.1
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
tox==3.28.0
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
unicodecsv==0.14.1
urllib3==1.26.20
virtualenv==20.17.1
xlrd==1.2.0
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: goodtables-py
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - cchardet==1.1.3
      - charset-normalizer==2.0.12
      - click==6.7
      - datapackage==0.8.8
      - distlib==0.3.9
      - et-xmlfile==1.1.0
      - ezodf==0.3.2
      - filelock==3.4.1
      - future==0.18.3
      - idna==3.10
      - ijson==2.6.1
      - importlib-metadata==4.8.3
      - importlib-resources==5.4.0
      - isodate==0.6.1
      - jdcal==1.4.1
      - jsonlines==1.2.0
      - jsonschema==2.6.0
      - jsontableschema==0.10.0
      - linear-tsv==1.1.0
      - lxml==3.8.0
      - mccabe==0.7.0
      - mock==5.2.0
      - openpyxl==2.6.4
      - platformdirs==2.4.0
      - pycodestyle==2.10.0
      - pydocstyle==6.3.0
      - pyflakes==3.0.1
      - pylama==7.7.1
      - python-dateutil==2.9.0.post0
      - pyyaml==6.0.1
      - requests==2.27.1
      - rfc3986==0.4.1
      - six==1.17.0
      - snowballstemmer==2.2.0
      - tabulator==0.15.1
      - tox==3.28.0
      - unicodecsv==0.14.1
      - urllib3==1.26.20
      - virtualenv==20.17.1
      - xlrd==1.2.0
prefix: /opt/conda/envs/goodtables-py

tests/presets/test_datapackages.py::test_datapackages tests/presets/test_tables.py::test_tables
examples/tables.py examples/datapackages.py goodtables/presets/datapackages.py goodtables/presets/tables.py features/datapackages.yml goodtables/presets/__init__.py README.md goodtables/inspector.py
examples/tables.py examples/datapackages.py goodtables/presets/datapackages.py goodtables/presets/tables.py features/datapackages.yml goodtables/presets/__init__.py README.md goodtables/inspector.py