diff --git a/CHANGES.rst b/CHANGES.rst
index 835e061..af2d6ca 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,7 +4,8 @@ Change History
 2.11.4 (unreleased)
 ===================
 
-- Nothing changed yet.
+- Fix `issue 451 <https://github.com/buildout/buildout/issues/451>`:
+  distributions with a two-digit version can be installed.
 
 
 2.11.3 (2018-04-13)
diff --git a/src/zc/buildout/easy_install.py b/src/zc/buildout/easy_install.py
index ba7da0a..7568363 100644
--- a/src/zc/buildout/easy_install.py
+++ b/src/zc/buildout/easy_install.py
@@ -1655,13 +1655,16 @@ def _get_matching_dist_in_location(dist, location):
     Check if `locations` contain only the one intended dist.
     Return the dist with metadata in the new location.
     """
-    # Getting the dist from the environment causes the
-    # distribution meta data to be read.  Cloning isn't
-    # good enough.
+    # Getting the dist from the environment causes the distribution
+    # meta data to be read. Cloning isn't good enough. We must compare
+    # dist.parsed_version, not dist.version, because one or the other
+    # may be normalized (e.g., 3.3 becomes 3.3.0 when downloaded from
+    # PyPI.)
+
     env = pkg_resources.Environment([location])
     dists = [ d for project_name in env for d in env[project_name] ]
-    dist_infos = [ (d.project_name.lower(), d.version) for d in dists ]
-    if dist_infos == [(dist.project_name.lower(), dist.version)]:
+    dist_infos = [ (d.project_name.lower(), d.parsed_version) for d in dists ]
+    if dist_infos == [(dist.project_name.lower(), dist.parsed_version)]:
         return dists.pop()
 
 def _move_to_eggs_dir_and_compile(dist, dest):

assert newdist is not None  # newloc above is missing our dist?!
I am getting the error below while installing nltk. The egg is actually retrieved so the second time the recipe is run, it completes successfully.  

FWIW doing  easy_install-2.7 -U nltk works fine.

Carlos

I am running the latest setuptools

Getting distribution for 'nltk==3.3.0'.
warning: no files found matching 'README.txt'
warning: no files found matching 'Makefile' under directory '*.txt'
warning: no previously-included files matching '*~' found anywhere in distribution
While:
  Installing eggs.
  Getting distribution for 'nltk==3.3.0'.

An internal error occurred due to a bug in either zc.buildout or in a
recipe being used:
Traceback (most recent call last):
  File "/home/ntiuser/buildout/eggs/zc.buildout-2.11.3-py2.7.egg/zc/buildout/buildout.py", line 2127, in main
    getattr(buildout, command)(args)
  File "/home/ntiuser/buildout/eggs/zc.buildout-2.11.3-py2.7.egg/zc/buildout/buildout.py", line 797, in install
    installed_files = self[part]._call(recipe.install)
  File "/home/ntiuser/buildout/eggs/zc.buildout-2.11.3-py2.7.egg/zc/buildout/buildout.py", line 1557, in _call
    return f()
  File "/home/ntiuser/buildout/eggs/zc.recipe.egg-2.0.5-py2.7.egg/zc/recipe/egg/egg.py", line 221, in install
    reqs, ws = self.working_set()
  File "/home/ntiuser/buildout/eggs/zc.recipe.egg-2.0.5-py2.7.egg/zc/recipe/egg/egg.py", line 84, in working_set
    allow_hosts=self.allow_hosts,
  File "/home/ntiuser/buildout/eggs/zc.recipe.egg-2.0.5-py2.7.egg/zc/recipe/egg/egg.py", line 162, in _working_set
    allow_hosts=allow_hosts)
  File "/home/ntiuser/buildout/eggs/zc.buildout-2.11.3-py2.7.egg/zc/buildout/easy_install.py", line 924, in install
    return installer.install(specs, working_set)
  File "/home/ntiuser/buildout/eggs/zc.buildout-2.11.3-py2.7.egg/zc/buildout/easy_install.py", line 726, in install
    for dist in self._get_dist(req, ws):
  File "/home/ntiuser/buildout/eggs/zc.buildout-2.11.3-py2.7.egg/zc/buildout/easy_install.py", line 570, in _get_dist
    dists = [_move_to_eggs_dir_and_compile(dist, self._dest)]
  File "/home/ntiuser/buildout/eggs/zc.buildout-2.11.3-py2.7.egg/zc/buildout/easy_install.py", line 1735, in _move_to_eggs_dir_and_compile
    assert newdist is not None  # newloc above is missing our dist?!
diff --git a/src/zc/buildout/tests.py b/src/zc/buildout/tests.py
index 004f39c..dc6bcb1 100644
--- a/src/zc/buildout/tests.py
+++ b/src/zc/buildout/tests.py
@@ -12,6 +12,9 @@
 # FOR A PARTICULAR PURPOSE.
 #
 ##############################################################################
+from __future__ import print_function
+import unittest
+
 from zc.buildout.buildout import print_
 from zope.testing import renormalizing, setupstack
 
@@ -35,6 +38,116 @@ if os_path_sep == '\\':
     os_path_sep *= 2
 
 
+class TestEasyInstall(unittest.TestCase):
+
+    # The contents of a zipped egg, created by setuptools:
+    # from setuptools import setup
+    # setup(
+    #    name='TheProject',
+    #    version='3.3',
+    # )
+    #
+    # (we can't run setuptools at runtime, it may not be installed)
+    EGG_DATA = (
+        b'PK\x03\x04\x14\x00\x00\x00\x08\x00q8\xa8Lg0\xb7ix\x00\x00\x00\xb6\x00'
+        b'\x00\x00\x11\x00\x00\x00EGG-INFO/PKG-INFO\xf3M-ILI,I\xd4\rK-*'
+        b'\xce\xcc\xcf\xb3R0\xd43\xe0\xf2K\xccM\xb5R\x08\xc9H\r(\xca\xcfJM'
+        b'.\xe1\x82\xcb\x1a\xeb\x19s\x05\x97\xe6\xe6&\x16UZ)\x84\xfay\xfb\xf9\x87\xfb'
+        b'qy\xe4\xe7\xa6\xea\x16$\xa6\xa7"\x84\x1cKK2\xf2\x8b\xd0\xf9\xba\xa9\xb9\x89'
+        b'\x999\x08Q\x9f\xcc\xe4\xd4\xbcb$m.\xa9\xc5\xc9E\x99\x05%`\xbb`\x82\x019\x89%'
+        b'i\xf9E\xb9\x08\x11\x00PK\x03\x04\x14\x00\x00\x00\x08\x00q8\xa8L61\xa1'
+        b'XL\x00\x00\x00\x87\x00\x00\x00\x14\x00\x00\x00EGG-INFO/SOURCES.txt\x0b\xc9H'
+        b'\r(\xca\xcfJM.\xd1KMO\xd7\xcd\xccK\xcb\xd7\x0f\xf0v\xd7\xf5\xf4s'
+        b'\xf3\xe7\n\xc1"\x19\xec\x1f\x1a\xe4\xec\x1a\xacWRQ\x82U>%\xb5 5/%5/\xb92>\'3'
+        b'/\xbb\x18\xa7\xc2\x92\xfc\x82\xf8\x9c\xd4\xb2\xd4\x1c\x90\n\x00PK\x03'
+        b'\x04\x14\x00\x00\x00\x08\x00q8\xa8L\x93\x06\xd72\x03\x00\x00\x00\x01'
+        b'\x00\x00\x00\x1d\x00\x00\x00EGG-INFO/dependency_links.txt\xe3\x02\x00P'
+        b'K\x03\x04\x14\x00\x00\x00\x08\x00q8\xa8L\x93\x06\xd72\x03\x00\x00'
+        b'\x00\x01\x00\x00\x00\x16\x00\x00\x00EGG-INFO/top_level.txt\xe3\x02\x00PK'
+        b'\x03\x04\x14\x00\x00\x00\x08\x00q8\xa8L\x93\x06\xd72\x03\x00\x00\x00'
+        b'\x01\x00\x00\x00\x11\x00\x00\x00EGG-INFO/zip-safe\xe3\x02\x00PK\x01\x02'
+        b'\x14\x03\x14\x00\x00\x00\x08\x00q8\xa8Lg0\xb7ix\x00\x00\x00\xb6\x00\x00\x00'
+        b'\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00EG'
+        b'G-INFO/PKG-INFOPK\x01\x02\x14\x03\x14\x00\x00\x00\x08\x00q8\xa8L61\xa1XL'
+        b'\x00\x00\x00\x87\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00'
+        b'\x00\x00\x00\xa4\x81\xa7\x00\x00\x00EGG-INFO/SOURCES.txtPK\x01'
+        b'\x02\x14\x03\x14\x00\x00\x00\x08\x00q8\xa8L\x93\x06\xd72\x03\x00\x00'
+        b'\x00\x01\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+        b'\x00\xa4\x81%\x01\x00\x00EGG-INFO/dependency_links.txtPK\x01\x02'
+        b'\x14\x03\x14\x00\x00\x00\x08\x00q8\xa8L\x93\x06\xd72\x03\x00\x00\x00'
+        b'\x01\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+        b'\xa4\x81c\x01\x00\x00EGG-INFO/top_level.txtPK\x01\x02\x14\x03\x14\x00'
+        b'\x00\x00\x08\x00q8\xa8L\x93\x06\xd72\x03\x00\x00\x00\x01\x00\x00\x00'
+        b'\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9a\x01\x00\x00EG'
+        b'G-INFO/zip-safePK\x05\x06\x00\x00\x00\x00\x05\x00\x05\x00O\x01\x00\x00\xcc'
+        b'\x01\x00\x00\x00\x00'
+    )
+
+    def setUp(self):
+        self.cwd = os.getcwd()
+        self.temp_dir = tempfile.mkdtemp('.buildouttest')
+        self.project_dir = os.path.join(self.temp_dir, 'TheProject')
+        self.project_dist_dir = os.path.join(self.temp_dir, 'dist')
+        os.mkdir(self.project_dist_dir)
+        self.egg_path = os.path.join(self.project_dist_dir, 'TheProject.egg')
+        os.mkdir(self.project_dir)
+        self.setup_path = os.path.join(self.project_dir, 'setup.py')
+        os.chdir(self.temp_dir)
+
+    def tearDown(self):
+        os.chdir(self.cwd)
+        shutil.rmtree(self.temp_dir)
+
+    def _make_egg(self):
+        with open(self.egg_path, 'wb') as f:
+            f.write(self.EGG_DATA)
+
+
+    def _get_distro_and_egg_path(self):
+        # Returns a distribution with a version of '3.3.0',
+        # but an egg with a version of '3.3'
+        self._make_egg()
+        from distutils.dist import Distribution
+        dist = Distribution()
+        dist.project_name = 'TheProject'
+        dist.version = '3.3.0'
+        dist.parsed_version = pkg_resources.parse_version(dist.version)
+
+        return dist, self.egg_path
+
+    def test_get_matching_dist_in_location_uses_parsed_version(self):
+        # https://github.com/buildout/buildout/pull/452
+        # An egg built with the version '3.3' should match a distribution
+        # looking for '3.3.0'
+        dist, location = self._get_distro_and_egg_path()
+
+        result = zc.buildout.easy_install._get_matching_dist_in_location(
+            dist,
+            self.project_dist_dir
+        )
+        self.assertIsNotNone(result)
+        self.assertEqual(result.version, '3.3')
+
+    def test_move_to_eggs_dir_and_compile(self):
+        # https://github.com/buildout/buildout/pull/452
+        # An egg built with the version '3.3' should match a distribution
+        # looking for '3.3.0'
+
+        dist, location = self._get_distro_and_egg_path()
+        dist.location = location
+
+        dest = os.path.join(self.temp_dir, 'NewLoc')
+
+        result = zc.buildout.easy_install._move_to_eggs_dir_and_compile(
+            dist,
+            dest
+        )
+
+        self.assertIsNotNone(result)
+        self.assertEqual(result.version, '3.3')
+        self.assertIn(dest, result.location)
+
+
 def develop_w_non_setuptools_setup_scripts():
     """
 We should be able to deal with setup scripts that aren't setuptools based.
@@ -3788,4 +3901,9 @@ def test_suite():
                ]),
             ))
 
+    test_suite.append(unittest.defaultTestLoader.loadTestsFromName(__name__))
+
     return unittest.TestSuite(test_suite)
+
+if __name__ == '__main__':
+    unittest.main()

pip install -e .[test]
parse_log_pytest
pytest
coverage zc.buildout 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
bobo==2.3.0
certifi==2021.5.30
coverage==6.2
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
manuel==1.13.0
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
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
six==1.17.0
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
WebOb==1.8.9
-e git+https://github.com/buildout/buildout.git@9161c43da9aa3c4d8394230b85e4a34762b933e1#egg=zc.buildout
zc.recipe.deployment==1.3.0
zc.recipe.egg==2.0.6
zc.zdaemonrecipe==1.0.0
ZConfig==3.6.1
zdaemon==4.4
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work
zope.testing==5.0.1

name: buildout
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:
      - bobo==2.3.0
      - coverage==6.2
      - manuel==1.13.0
      - six==1.17.0
      - webob==1.8.9
      - zc-recipe-deployment==1.3.0
      - zc-recipe-egg==2.0.6
      - zc-zdaemonrecipe==1.0.0
      - zconfig==3.6.1
      - zdaemon==4.4
      - zope-testing==5.0.1
prefix: /opt/conda/envs/buildout

src/zc/buildout/tests.py::TestEasyInstall::test_get_matching_dist_in_location_uses_parsed_version src/zc/buildout/tests.py::TestEasyInstall::test_move_to_eggs_dir_and_compile
src/zc/buildout/tests.py::test_comparing_saved_options_with_funny_characters src/zc/buildout/tests.py::test_help src/zc/buildout/tests.py::test_version src/zc/buildout/tests.py::test_bootstrap_with_extension src/zc/buildout/tests.py::test_exit_codes src/zc/buildout/tests.py::test_constrained_requirement src/zc/buildout/tests.py::test_distutils_scripts_using_import_are_properly_parsed src/zc/buildout/tests.py::test_distutils_scripts_using_from_are_properly_parsed src/zc/buildout/tests.py::test_buildout_section_shorthand_for_command_line_assignments src/zc/buildout/tests.py::test_abi_tag_eggs src/zc/buildout/tests.py::test_buildout_doesnt_keep_adding_itself_to_versions src/zc/buildout/tests.py::test_suite
src/zc/buildout/easy_install.py CHANGES.rst
src/zc/buildout/easy_install.py CHANGES.rst