diff --git a/HISTORY.rst b/HISTORY.rst
index f991788..0af685a 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -13,6 +13,9 @@ History
   ``packtools.domain.SchematronValidator``).
 * The stylechecker utility exits 0 on success, and >0 if an error occurs
   [https://github.com/scieloorg/packtools/issues/118].
+* The values in attribute ``@country`` are checked against ISO3166 alpha-2 
+  list.
+
 
 
 1.5 (2017-04-03)
diff --git a/packtools/catalogs/__init__.py b/packtools/catalogs/__init__.py
index 24d655e..94ecc89 100644
--- a/packtools/catalogs/__init__.py
+++ b/packtools/catalogs/__init__.py
@@ -36,3 +36,6 @@ XML_CATALOG = os.path.join(_CWD, 'scielo-publishing-schema.xml')
 XSLTS = {
     'root-html-1.2.xslt': os.path.join(_CWD, 'htmlgenerator/root-html-1.2.xslt'),
 }
+
+ISO3166_CODES = os.path.join(_CWD, 'iso3166-codes.json')
+
diff --git a/packtools/catalogs/iso3166-codes.json b/packtools/catalogs/iso3166-codes.json
new file mode 100644
index 0000000..b9aa006
--- /dev/null
+++ b/packtools/catalogs/iso3166-codes.json
@@ -0,0 +1,1 @@
+["FM", "CD", "YU", "BR", "NH", "SH", "MD", "EC", "PK", "LU", "TD", "IT", "WS", "CI", "GI", "AS", "NI", "AW", "AI", "BM", "BF", "BU", "WK", "UA", "ZA", "YD", "NA", "GF", "CX", "BO", "MX", "AU", "MR", "DK", "SA", "CG", "BN", "IQ", "VG", "SS", "CY", "AE", "OM", "MF", "TP", "RH", "AM", "TN", "AT", "NF", "BE", "GG", "IM", "MZ", "SX", "PM", "ER", "GL", "PY", "PL", "RS", "SL", "KY", "JE", "MV", "FK", "SE", "GB", "VE", "NQ", "LY", "PG", "UZ", "NZ", "MO", "LA", "GN", "ML", "MH", "TF", "MC", "KI", "TK", "GR", "HV", "AX", "PT", "JO", "HU", "BI", "MQ", "YT", "PH", "LC", "SM", "SN", "CU", "AZ", "CF", "LI", "MU", "DO", "MM", "ZM", "DM", "UY", "LT", "SC", "NO", "GU", "SB", "TZ", "LV", "NU", "BL", "LS", "FQ", "JP", "MT", "PE", "IR", "QA", "KE", "VU", "HT", "KR", "ME", "RO", "EH", "ZR", "GA", "PN", "CC", "PS", "BD", "TC", "AG", "AD", "GQ", "RW", "HR", "ZW", "AQ", "BB", "DJ", "VA", "BH", "HM", "GM", "SR", "BS", "VN", "BW", "CW", "NR", "AL", "PU", "WF", "SD", "GE", "AN", "EE", "MK", "CK", "PZ", "ST", "KN", "SG", "SZ", "UM", "KH", "GY", "VD", "MI", "NP", "KW", "ES", "NG", "TJ", "KM", "PC", "SI", "SK", "TG", "FI", "PW", "IE", "TL", "TO", "JM", "TH", "IN", "TW", "TT", "CR", "UG", "VI", "KG", "BG", "IL", "DD", "ID", "KZ", "NC", "MW", "TR", "GD", "IS", "LB", "PA", "US", "JT", "GP", "CL", "KP", "MA", "LK", "BQ", "BV", "GH", "DE", "NL", "BJ", "FJ", "CH", "SO", "EG", "CM", "FO", "DY", "YE", "FR", "BT", "MS", "IO", "BY", "GW", "AF", "CS", "HN", "RU", "VC", "HK", "BZ", "PR", "SJ", "MY", "SY", "SV", "BA", "GT", "TV", "RE", "DZ", "MG", "AO", "CO", "PF", "LR", "CA", "AR", "CZ", "NE", "ET", "TM", "CT", "MP", "NT", "GS", "CV", "CN", "MN"]
\ No newline at end of file
diff --git a/packtools/checks.py b/packtools/checks.py
index 19ce822..2d2cf4d 100644
--- a/packtools/checks.py
+++ b/packtools/checks.py
@@ -2,15 +2,21 @@
 from __future__ import unicode_literals
 import logging
 import itertools
+import json
 
 import plumber
 
 from .style_errors import StyleError
+from . import catalogs
 
 
 LOGGER = logging.getLogger(__name__)
 
 
+with open(catalogs.ISO3166_CODES) as f:
+    ISO3166_CODES_SET = set(json.load(f))
+
+
 # --------------------------------
 # Basic functionality
 # --------------------------------
@@ -36,7 +42,7 @@ def teardown(message):
 def StyleCheckingPipeline():
     """Factory for style checking pipelines.
     """
-    return plumber.Pipeline(setup, funding_group, doctype, teardown)
+    return plumber.Pipeline(setup, funding_group, doctype, country_code, teardown)
 
 
 # --------------------------------
@@ -135,3 +141,21 @@ def doctype(message):
 
     return message
 
+
+@plumber.filter
+def country_code(message):
+    """Check country codes against iso3166 alpha-2 list.
+    """
+    et, err_list = message
+
+    elements = et.findall('//*[@country]')
+    for elem in elements:
+        value = elem.attrib['country']
+        if value not in ISO3166_CODES_SET:
+            err = StyleError()
+            err.line = elem.sourceline
+            err.message = "Element '%s', attribute country: Invalid country code \"%s\"." % (elem.tag, value)
+            err_list.append(err)
+
+    return message
+

Acusar erro quando atributo de @country estiver em minúsculo
Style não acusa erro quando atributo de @country="br".
diff --git a/tests/test_checks.py b/tests/test_checks.py
index def4e34..5c59f5e 100644
--- a/tests/test_checks.py
+++ b/tests/test_checks.py
@@ -419,3 +419,89 @@ class DoctypePipeTests(unittest.TestCase):
 
         self.assertEqual(len(err_list), 0)
 
+
+class CountryCodesTests(unittest.TestCase):
+
+    def test_valid_code(self):
+        sample = io.BytesIO(b"""
+        <article>
+          <front>
+            <article-meta>
+              <aff id="aff1">
+                <label>I</label>
+                <institution content-type="orgdiv2">Departamento de Fonoaudiologia</institution>
+                <institution content-type="orgdiv1">Faculdade de Medicina</institution>
+                <institution content-type="orgname">Universidade Federal do Rio de Janeiro</institution>
+                <addr-line>
+                  <named-content content-type="city">Rio de Janeiro</named-content>
+                  <named-content content-type="state">RJ</named-content>
+                </addr-line>
+                <country country="BR">Brasil</country>
+                <institution content-type="original">Departamento de Fonoaudiologia. Faculdade de Medicina. Universidade Federal do Rio de Janeiro. Rio de Janeiro, RJ, Brasil</institution>
+              </aff>
+            </article-meta>
+          </front>
+        </article>
+        """)
+
+        et = etree.parse(sample)
+        _, err_list = checks.country_code((et, []))
+
+        self.assertEqual(len(err_list), 0)
+
+    def test_valid_code_in_lowercase(self):
+        sample = io.BytesIO(b"""
+        <article>
+          <front>
+            <article-meta>
+              <aff id="aff1">
+                <label>I</label>
+                <institution content-type="orgdiv2">Departamento de Fonoaudiologia</institution>
+                <institution content-type="orgdiv1">Faculdade de Medicina</institution>
+                <institution content-type="orgname">Universidade Federal do Rio de Janeiro</institution>
+                <addr-line>
+                  <named-content content-type="city">Rio de Janeiro</named-content>
+                  <named-content content-type="state">RJ</named-content>
+                </addr-line>
+                <country country="br">Brasil</country>
+                <institution content-type="original">Departamento de Fonoaudiologia. Faculdade de Medicina. Universidade Federal do Rio de Janeiro. Rio de Janeiro, RJ, Brasil</institution>
+              </aff>
+            </article-meta>
+          </front>
+        </article>
+        """)
+
+        et = etree.parse(sample)
+        _, err_list = checks.country_code((et, []))
+
+        self.assertEqual(len(err_list), 1)
+        self.assertTrue("country" in err_list[0].message)
+
+    def test_invalid_code(self):
+        sample = io.BytesIO(b"""
+        <article>
+          <front>
+            <article-meta>
+              <aff id="aff1">
+                <label>I</label>
+                <institution content-type="orgdiv2">Departamento de Fonoaudiologia</institution>
+                <institution content-type="orgdiv1">Faculdade de Medicina</institution>
+                <institution content-type="orgname">Universidade Federal do Rio de Janeiro</institution>
+                <addr-line>
+                  <named-content content-type="city">Rio de Janeiro</named-content>
+                  <named-content content-type="state">RJ</named-content>
+                </addr-line>
+                <country country="INVALID">Brasil</country>
+                <institution content-type="original">Departamento de Fonoaudiologia. Faculdade de Medicina. Universidade Federal do Rio de Janeiro. Rio de Janeiro, RJ, Brasil</institution>
+              </aff>
+            </article-meta>
+          </front>
+        </article>
+        """)
+
+        et = etree.parse(sample)
+        _, err_list = checks.country_code((et, []))
+
+        self.assertEqual(len(err_list), 1)
+        self.assertTrue("country" in err_list[0].message)
+

pip install -e .
parse_log_pytest
pytest
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
certifi==2021.5.30
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
lxml==5.3.1
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
-e git+https://github.com/scieloorg/packtools.git@2144acd27d2e306994515bde1321ffbeee0c4bbf#egg=packtools
picles.plumber==0.11
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: packtools
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=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:
      - lxml==5.3.1
      - picles-plumber==0.11
prefix: /opt/conda/envs/packtools

tests/test_checks.py::CountryCodesTests::test_invalid_code tests/test_checks.py::CountryCodesTests::test_valid_code tests/test_checks.py::CountryCodesTests::test_valid_code_in_lowercase
tests/test_checks.py::SetupTests::test_message_is_splitted tests/test_checks.py::TeardownTests::test_returns_errorlist tests/test_checks.py::FundingGroupPipeTests::test_fn_p_and_awardid_with_no_content tests/test_checks.py::FundingGroupPipeTests::test_fn_p_with_no_content tests/test_checks.py::FundingGroupPipeTests::test_fn_p_with_no_content_with_funding_group tests/test_checks.py::FundingGroupPipeTests::test_proposition_1_case_1 tests/test_checks.py::FundingGroupPipeTests::test_proposition_1_case_2 tests/test_checks.py::FundingGroupPipeTests::test_proposition_1_case_3 tests/test_checks.py::FundingGroupPipeTests::test_proposition_1_case_4 tests/test_checks.py::FundingGroupPipeTests::test_proposition_3_case_1 tests/test_checks.py::FundingGroupPipeTests::test_proposition_3_case_2 tests/test_checks.py::FundingGroupPipeTests::test_proposition_3_case_3 tests/test_checks.py::FundingGroupPipeTests::test_valid_with_contractno_after_formatting_markup tests/test_checks.py::FundingGroupPipeTests::test_valid_with_contractno_after_formatting_markup_as_first_element tests/test_checks.py::DoctypePipeTests::test_doctype tests/test_checks.py::DoctypePipeTests::test_missing_doctype
HISTORY.rst packtools/catalogs/iso3166-codes.json packtools/checks.py packtools/catalogs/__init__.py
HISTORY.rst packtools/catalogs/iso3166-codes.json packtools/checks.py packtools/catalogs/__init__.py