diff --git a/src/centpkg/__init__.py b/src/centpkg/__init__.py
index 0d1f025..7332b45 100644
--- a/src/centpkg/__init__.py
+++ b/src/centpkg/__init__.py
@@ -105,8 +105,69 @@ class Commands(pyrpkg.Commands):
     def push(self, *args, **kwargs):
         raise NotImplementedError("This command is not yet implemented in centpkg")
 
-    def sources(self, *args, **kwargs):
-        raise NotImplementedError("This command is not yet implemented in centpkg")
+    def sources(self, outdir=None):
+        """Download source files"""
+
+        # We are not using sources() in super because the metadata file is
+        # hard-coded into the first open() call. Otherwise this is copied from
+        # upstream pyrpkg
+
+        try:
+            archives = open(os.path.join(self.path,
+                                         '.{0}.metadata'.format(self.module_name)),
+                            'r').readlines()
+        except IOError, e:
+            raise pyrpkg.rpkgError('%s is not a valid repo: %s' % (self.path, e))
+        # Default to putting the files where the module is
+        if not outdir:
+            outdir = self.path
+        for archive in archives:
+            try:
+                # This strip / split is kind a ugly, but checksums shouldn't have
+                # two spaces in them.  sources file might need more structure in the
+                # future
+                csum, file = archive.strip().split(' ', 1)
+            except ValueError:
+                raise pyrpkg.rpkgError('Malformed sources file.')
+            # See if we already have a valid copy downloaded
+            outfile = os.path.join(outdir, file)
+            if os.path.exists(outfile):
+                if self._verify_file(outfile, csum, self.lookasidehash):
+                    continue
+            self.log.info("Downloading %s" % (file))
+            url = '%s/%s/%s/%s' % (self.lookaside, self.module_name,
+                                      self.branch_merge,
+                                      csum,
+                                      )
+            # There is some code here for using pycurl, but for now,
+            # just use subprocess
+            #output = open(file, 'wb')
+            #curl = pycurl.Curl()
+            #curl.setopt(pycurl.URL, url)
+            #curl.setopt(pycurl.FOLLOWLOCATION, 1)
+            #curl.setopt(pycurl.MAXREDIRS, 5)
+            #curl.setopt(pycurl.CONNECTTIMEOUT, 30)
+            #curl.setopt(pycurl.TIMEOUT, 300)
+            #curl.setopt(pycurl.WRITEDATA, output)
+            #try:
+            #    curl.perform()
+            #except:
+            #    print "Problems downloading %s" % url
+            #    curl.close()
+            #    output.close()
+            #    return 1
+            #curl.close()
+            #output.close()
+            # These options came from Makefile.common.
+            # Probably need to support wget as well
+            command = ['curl', '-H', 'Pragma:', '-o', outfile, '-R', '-S', '--fail']
+            if self.quiet:
+                command.append('-s')
+            command.append(url)
+            self._run_command(command)
+            if not self._verify_file(outfile, csum, self.lookasidehash):
+                raise pyrpkg.rpkgError('%s failed checksum' % file)
+        return
 
     def switch_branch(self, *args, **kwargs):
         raise NotImplementedError("This command is not yet implemented in centpkg")