diff --git a/.gitmodules b/.gitmodules
index 082cca8232a4539ad1276d212fd7abc76d7adda2..cf8c41bffee40150983e64ce2208936887a7c205 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,6 +1,6 @@
 [submodule "isl"]
 	path = isl
-	url = git://repo.or.cz/isl.git
+	url = git://github.com/inducer/isl-mirror
 [submodule "bpl-subset"]
 	path = bpl-subset
 	url = git://github.com/inducer/bpl-subset
diff --git a/MANIFEST.in b/MANIFEST.in
index 115b7956dd7da8af0e421f6550a1e2efc99639fc..8050086bde2e2cd1e8750fa586cabf76984a1d96 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,5 +1,7 @@
 include isl/*.c
 include isl/*.h
+include isl/imath/*.c
+include isl/imath/*.h
 include isl/include/isl/*.h
 include isl/include/isl/deprecated/*.h
 include isl-supplementary/isl/*.h
diff --git a/isl b/isl
index 52c2b1154c6b757bc819a1e45f5a5e93806598cb..16930c8cff710948fe82c436b65efdba1e11e51c 160000
--- a/isl
+++ b/isl
@@ -1 +1 @@
-Subproject commit 52c2b1154c6b757bc819a1e45f5a5e93806598cb
+Subproject commit 16930c8cff710948fe82c436b65efdba1e11e51c
diff --git a/setup.py b/setup.py
index df076f7f3ec578f3fe83068418c31f1944c14a27..1087bd1f298896cb25da0e7da0c3f643461dcccd 100644
--- a/setup.py
+++ b/setup.py
@@ -11,6 +11,7 @@ def get_config_schema():
 
         Switch("USE_SHIPPED_BOOST", True, "Use included Boost library"),
         Switch("USE_SHIPPED_ISL", True, "Use included copy of isl"),
+        Switch("USE_SHIPPED_IMATH", True, "Use included copy of imath in isl"),
 
         IncludeDir("GMP", []),
         LibraryDir("GMP", []),
@@ -60,6 +61,13 @@ def main():
             elif "piplib" in fn:
                 blacklisted = True
 
+            if "gmp" in fn:
+                if conf["USE_SHIPPED_IMATH"]:
+                    continue
+            if "imath" in fn:
+                if not conf["USE_SHIPPED_IMATH"]:
+                    continue
+
             inf = open(fn, "rt")
             try:
                 contents = inf.read()
@@ -70,15 +78,29 @@ def main():
                 EXTRA_OBJECTS.append(fn)
 
         conf["ISL_INC_DIR"] = ["isl-supplementary", "isl/include",  "isl"]
+
+        if conf["USE_SHIPPED_IMATH"]:
+            EXTRA_OBJECTS.extend([
+                "isl/imath/imath.c",
+                "isl/imath/imrat.c",
+                "isl/imath/gmp_compat.c",
+                ])
+            EXTRA_DEFINES["USE_IMATH_FOR_MP"] = 1
+
+            conf["ISL_INC_DIR"].append("isl/imath")
+        else:
+            EXTRA_DEFINES["USE_GMP_FOR_MP"] = 1
+
     else:
         LIBRARY_DIRS.extend(conf["ISL_LIB_DIR"])
         LIBRARIES.extend(conf["ISL_LIBNAME"])
 
     INCLUDE_DIRS.extend(conf["ISL_INC_DIR"])
 
-    INCLUDE_DIRS.extend(conf["GMP_INC_DIR"])
-    LIBRARY_DIRS.extend(conf["GMP_LIB_DIR"])
-    LIBRARIES.extend(conf["GMP_LIBNAME"])
+    if not (conf["USE_SHIPPED_ISL"] and conf["USE_SHIPPED_IMATH"]):
+        INCLUDE_DIRS.extend(conf["GMP_INC_DIR"])
+        LIBRARY_DIRS.extend(conf["GMP_LIB_DIR"])
+        LIBRARIES.extend(conf["GMP_LIBNAME"])
 
     init_filename = "islpy/version.py"
     exec(compile(open(init_filename, "r").read(), init_filename, "exec"), conf)
@@ -132,12 +154,12 @@ def main():
           ext_modules=[
               Extension(
                   "islpy._isl",
-                  [
+                  EXTRA_OBJECTS + [
                       "src/wrapper/wrap_isl.cpp",
                       "src/wrapper/wrap_isl_part1.cpp",
                       "src/wrapper/wrap_isl_part2.cpp",
                       "src/wrapper/wrap_isl_part3.cpp",
-                      ] + EXTRA_OBJECTS,
+                      ],
                   include_dirs=INCLUDE_DIRS,
                   library_dirs=LIBRARY_DIRS,
                   libraries=LIBRARIES,