diff --git a/loopy/kernel/__init__.py b/loopy/kernel/__init__.py
index 175bf1d489f1e5c24bda6f3a0e03e6d715d5242f..750b6a58b41a2242a9217dca1cae2fdd6e89c074 100644
--- a/loopy/kernel/__init__.py
+++ b/loopy/kernel/__init__.py
@@ -25,15 +25,12 @@ THE SOFTWARE.
 """
 
 
-
-
-
 import numpy as np
 from pytools import Record, memoize_method
 import islpy as isl
 from islpy import dim_type
 
-from loopy.kernel.creation import UniqueNameGenerator, generate_unique_possibilities
+from pytools import UniqueNameGenerator, generate_unique_possibilities
 
 from loopy.kernel.data import (
         default_function_mangler,
@@ -46,11 +43,10 @@ from loopy.kernel.data import (
         )
 
 
-
-
 class CannotBranchDomainTree(RuntimeError):
     pass
 
+
 # {{{ loop kernel object
 
 class LoopKernel(Record):
@@ -74,8 +70,8 @@ class LoopKernel(Record):
 
     The following arguments are not user-facing:
 
-    :ivar substitutions: a mapping from substitution names to :class:`SubstitutionRule`
-        objects
+    :ivar substitutions: a mapping from substitution names to
+        :class:`SubstitutionRule` objects
     :ivar iname_slab_increments: a dictionary mapping inames to (lower_incr,
         upper_incr) tuples that will be separated out in the execution to generate
         'bulk' slabs with fewer conditionals.
@@ -116,8 +112,8 @@ class LoopKernel(Record):
             # a way to forward sub-kernel grid size requests.
             get_grid_sizes=None):
         """
-        :arg domain: a :class:`islpy.BasicSet`, or a string parseable to a basic set by the isl.
-            Example: "{[i,j]: 0<=i < 10 and 0<= j < 9}"
+        :arg domain: a :class:`islpy.BasicSet`, or a string parseable to
+            a basic set by the isl.  Example: "{[i,j]: 0<=i < 10 and 0<= j < 9}"
         """
 
         if cache_manager is None:
@@ -162,7 +158,8 @@ class LoopKernel(Record):
                     dom0_space.get_ctx(), dom0_space.dim(dim_type.param))
             for i in xrange(dom0_space.dim(dim_type.param)):
                 assumptions_space = assumptions_space.set_dim_name(
-                        dim_type.param, i, dom0_space.get_dim_name(dim_type.param, i))
+                        dim_type.param, i,
+                        dom0_space.get_dim_name(dim_type.param, i))
             assumptions = isl.BasicSet.universe(assumptions_space)
 
         elif isinstance(assumptions, str):
@@ -251,7 +248,8 @@ class LoopKernel(Record):
     def get_var_name_generator(self):
         return UniqueNameGenerator(self.all_variable_names())
 
-    def make_unique_instruction_id(self, insns=None, based_on="insn", extra_used_ids=set()):
+    def make_unique_instruction_id(self, insns=None, based_on="insn",
+            extra_used_ids=set()):
         if insns is None:
             insns = self.instructions
 
@@ -410,7 +408,7 @@ class LoopKernel(Record):
             domains (those which get most say on the actual dim_type of an iname)
             must be later in the order.
         """
-        assert isinstance(domains, tuple) # for caching
+        assert isinstance(domains, tuple)  # for caching
 
         if not domains:
             return isl.BasicSet.universe(isl.Space.set_alloc(
@@ -555,7 +553,8 @@ class LoopKernel(Record):
     @memoize_method
     def reader_map(self):
         """
-        :return: a dict that maps variable names to ids of insns that read that variable.
+        :return: a dict that maps variable names to ids of insns that read that
+          variable.
         """
         result = {}
 
@@ -570,7 +569,8 @@ class LoopKernel(Record):
     @memoize_method
     def writer_map(self):
         """
-        :return: a dict that maps variable names to ids of insns that write to that variable.
+        :return: a dict that maps variable names to ids of insns that write
+            to that variable.
         """
         result = {}
 
@@ -699,8 +699,8 @@ class LoopKernel(Record):
             elif isinstance(tag, LocalIndexTag):
                 tgt_dict = local_sizes
             elif isinstance(tag, AutoLocalIndexTagBase) and not ignore_auto:
-                raise RuntimeError("cannot find grid sizes if automatic local index tags are "
-                        "present")
+                raise RuntimeError("cannot find grid sizes if automatic "
+                        "local index tags are present")
             else:
                 tgt_dict = None
 
@@ -737,8 +737,7 @@ class LoopKernel(Record):
                     cur_axis = None
 
                 if len(size_list) in forced_sizes:
-                    size_list.append(
-                           forced_sizes.pop(len(size_list)))
+                    size_list.append(forced_sizes.pop(len(size_list)))
                     continue
 
                 assert cur_axis is not None
diff --git a/loopy/kernel/creation.py b/loopy/kernel/creation.py
index b9cba164ab7be062540134bf5dd46c78969efa83..859639fd83ec001e8cecef254c04161de7897bdd 100644
--- a/loopy/kernel/creation.py
+++ b/loopy/kernel/creation.py
@@ -36,39 +36,6 @@ import re
 
 # {{{ tool: unique name generation
 
-def generate_unique_possibilities(prefix):
-    yield prefix
-
-    try_num = 0
-    while True:
-        yield "%s_%d" % (prefix, try_num)
-        try_num += 1
-
-
-class UniqueNameGenerator:
-    def __init__(self, existing_names):
-        self.existing_names = existing_names.copy()
-
-    def is_name_conflicting(self, name):
-        return name in self.existing_names
-
-    def add_name(self, name):
-        if self.is_name_conflicting(name):
-            raise ValueError("name '%s' conflicts with existing names")
-        self.existing_names.add(name)
-
-    def add_names(self, names):
-        for name in names:
-            self.add_name(name)
-
-    def __call__(self, based_on="var"):
-        for var_name in generate_unique_possibilities(based_on):
-            if not self.is_name_conflicting(var_name):
-                break
-
-        self.existing_names.add(var_name)
-        return var_name
-
 _IDENTIFIER_RE = re.compile(r"\b([a-zA-Z_][a-zA-Z0-9_]*)\b")