diff --git a/loopy/kernel/data.py b/loopy/kernel/data.py
index cf891c0862dcc3b96470da0349fed39b3222eec2..9d0848788a09b7a6b914a1ce5569faf3102f18b2 100644
--- a/loopy/kernel/data.py
+++ b/loopy/kernel/data.py
@@ -424,7 +424,7 @@ class InstructionBase(Record):
         An (otherwise meaningless) identifier that is unique within
         a :class:`loopy.kernel.LoopKernel`.
 
-    .. attribute:: insn_deps
+    .. attribute:: depends_on
 
         a :class:`frozenset` of :attr:`id` values of :class:`Instruction` instances
          that *must* be executed before this one. Note that
@@ -434,9 +434,9 @@ class InstructionBase(Record):
 
         May be *None* to invoke the default.
 
-    .. attribute:: insn_deps_is_final
+    .. attribute:: depends_on_is_final
 
-        A :class:`bool` determining whether :attr:`insn_deps` constitutes
+        A :class:`bool` determining whether :attr:`depends_on` constitutes
         the *entire* list of iname dependencies.
 
         Defaults to *False*.
@@ -492,22 +492,33 @@ class InstructionBase(Record):
     .. attribute:: tags
 
         A tuple of string identifiers that can be used to identify groups
-        of statements.
+        of instructions.
     """
 
-    fields = set("id insn_deps insn_deps_is_final "
+    fields = set("id depends_on depends_on_is_final "
             "groups conflicts_with_groups "
             "predicates "
             "forced_iname_deps_is_final forced_iname_deps "
             "priority boostable boostable_into".split())
 
-    def __init__(self, id, insn_deps, insn_deps_is_final,
+    def __init__(self, id, depends_on, depends_on_is_final,
             groups, conflicts_with_groups,
             forced_iname_deps_is_final, forced_iname_deps, priority,
-            boostable, boostable_into, predicates, tags):
+            boostable, boostable_into, predicates, tags,
+            insn_deps=None, insn_deps_is_final=None):
 
-        if insn_deps is None:
-            insn_deps = frozenset()
+        if depends_on is not None and insn_deps is not None:
+            raise ValueError("may not specify both insn_deps and depends_on")
+        elif insn_deps is not None:
+            from warnings import warn
+            warn("insn_deps is deprecated, use depends_on",
+                    DeprecationWarning, stacklevel=2)
+
+            depends_on = insn_deps
+            depends_on_is_final = insn_deps_is_final
+
+        if depends_on is None:
+            depends_on = frozenset()
 
         if groups is None:
             groups = frozenset()
@@ -518,12 +529,12 @@ class InstructionBase(Record):
         if forced_iname_deps_is_final is None:
             forced_iname_deps_is_final = False
 
-        if insn_deps_is_final is None:
-            insn_deps_is_final = False
+        if depends_on_is_final is None:
+            depends_on_is_final = False
 
-        if insn_deps_is_final and not isinstance(insn_deps, frozenset):
-            raise LoopyError("Setting insn_deps_is_final to True requires "
-                    "actually specifying insn_deps")
+        if depends_on_is_final and not isinstance(depends_on, frozenset):
+            raise LoopyError("Setting depends_on_is_final to True requires "
+                    "actually specifying depends_on")
 
         if tags is None:
             tags = ()
@@ -533,21 +544,21 @@ class InstructionBase(Record):
         #
         # from loopy.tools import is_interned
         # assert is_interned(id)
-        # assert all(is_interned(dep) for dep in insn_deps)
+        # assert all(is_interned(dep) for dep in depends_on)
         # assert all(is_interned(grp) for grp in groups)
         # assert all(is_interned(grp) for grp in conflicts_with_groups)
         # assert all(is_interned(iname) for iname in forced_iname_deps)
         # assert all(is_interned(pred) for pred in predicates)
 
         assert isinstance(forced_iname_deps, frozenset)
-        assert isinstance(insn_deps, frozenset) or insn_deps is None
+        assert isinstance(depends_on, frozenset) or depends_on is None
         assert isinstance(groups, frozenset)
         assert isinstance(conflicts_with_groups, frozenset)
 
         Record.__init__(self,
                 id=id,
-                insn_deps=insn_deps,
-                insn_deps_is_final=insn_deps_is_final,
+                depends_on=depends_on,
+                depends_on_is_final=depends_on_is_final,
                 groups=groups, conflicts_with_groups=conflicts_with_groups,
                 forced_iname_deps_is_final=forced_iname_deps_is_final,
                 forced_iname_deps=forced_iname_deps,
@@ -557,6 +568,14 @@ class InstructionBase(Record):
                 predicates=predicates,
                 tags=tags)
 
+    @property
+    def insn_deps(self):
+        return self.depends_on
+
+    @property
+    def insn_deps_is_final(self):
+        return self.depends_on_is_final
+
     # {{{ abstract interface
 
     def read_dependency_names(self):
@@ -617,8 +636,8 @@ class InstructionBase(Record):
         else:
             raise RuntimeError("unexpected value for Instruction.boostable")
 
-        if self.insn_deps:
-            result.append("deps="+":".join(self.insn_deps))
+        if self.depends_on:
+            result.append("deps="+":".join(self.depends_on))
         if self.groups:
             result.append("groups=%s" % ":".join(self.groups))
         if self.conflicts_with_groups:
@@ -658,13 +677,30 @@ class InstructionBase(Record):
 
     # }}}
 
+    def copy(self, **kwargs):
+        if "insn_deps" in kwargs:
+            from warnings import warn
+            warn("insn_deps is deprecated, use depends_on",
+                    DeprecationWarning, stacklevel=2)
+
+            kwargs["depends_on"] = kwargs.pop("insn_deps")
+
+        if "insn_deps_is_final" in kwargs:
+            from warnings import warn
+            warn("insn_deps_is_final is deprecated, use depends_on",
+                    DeprecationWarning, stacklevel=2)
+
+            kwargs["depends_on_is_final"] = kwargs.pop("insn_deps_is_final")
+
+        return super(InstructionBase, self).copy(**kwargs)
+
     def __setstate__(self, val):
         super(InstructionBase, self).__setstate__(val)
 
         from loopy.tools import intern_frozenset_of_ids
 
         self.id = intern(self.id)
-        self.insn_deps = intern_frozenset_of_ids(self.insn_deps)
+        self.depends_on = intern_frozenset_of_ids(self.depends_on)
         self.groups = intern_frozenset_of_ids(self.groups)
         self.conflicts_with_groups = (
                 intern_frozenset_of_ids(self.conflicts_with_groups))
@@ -712,19 +748,20 @@ class Assignment(InstructionBase):
     def __init__(self,
             assignee, expression,
             id=None,
-            insn_deps=None,
-            insn_deps_is_final=None,
+            depends_on=None,
+            depends_on_is_final=None,
             groups=None,
             conflicts_with_groups=None,
             forced_iname_deps_is_final=None,
             forced_iname_deps=frozenset(),
             boostable=None, boostable_into=None, tags=None,
-            temp_var_type=None, priority=0, predicates=frozenset()):
+            temp_var_type=None, priority=0, predicates=frozenset(),
+            insn_deps=None, insn_deps_is_final=None):
 
         InstructionBase.__init__(self,
                 id=id,
-                insn_deps=insn_deps,
-                insn_deps_is_final=insn_deps_is_final,
+                depends_on=depends_on,
+                depends_on_is_final=depends_on_is_final,
                 groups=groups,
                 conflicts_with_groups=conflicts_with_groups,
                 forced_iname_deps_is_final=forced_iname_deps_is_final,
@@ -733,7 +770,9 @@ class Assignment(InstructionBase):
                 boostable_into=boostable_into,
                 priority=priority,
                 predicates=predicates,
-                tags=tags)
+                tags=tags,
+                insn_deps=insn_deps,
+                insn_deps_is_final=insn_deps_is_final)
 
         from loopy.symbolic import parse
         if isinstance(assignee, str):
@@ -876,11 +915,12 @@ class CInstruction(InstructionBase):
     def __init__(self,
             iname_exprs, code,
             read_variables=frozenset(), assignees=frozenset(),
-            id=None, insn_deps=None, insn_deps_is_final=None,
+            id=None, depends_on=None, depends_on_is_final=None,
             groups=None, conflicts_with_groups=None,
             forced_iname_deps_is_final=None, forced_iname_deps=frozenset(),
             priority=0, boostable=None, boostable_into=None,
-            predicates=frozenset(), tags=None):
+            predicates=frozenset(), tags=None,
+            insn_deps=None, insn_deps_is_final=None):
         """
         :arg iname_exprs: Like :attr:`iname_exprs`, but instead of tuples,
             simple strings pepresenting inames are also allowed. A single
@@ -893,14 +933,16 @@ class CInstruction(InstructionBase):
 
         InstructionBase.__init__(self,
                 id=id,
-                insn_deps=insn_deps,
-                insn_deps_is_final=insn_deps_is_final,
+                depends_on=depends_on,
+                depends_on_is_final=depends_on_is_final,
                 groups=groups, conflicts_with_groups=conflicts_with_groups,
                 forced_iname_deps_is_final=forced_iname_deps_is_final,
                 forced_iname_deps=forced_iname_deps,
                 boostable=boostable,
                 boostable_into=boostable_into,
-                priority=priority, predicates=predicates, tags=tags)
+                priority=priority, predicates=predicates, tags=tags,
+                insn_deps=insn_deps,
+                insn_deps_is_final=insn_deps_is_final)
 
         # {{{ normalize iname_exprs
 
diff --git a/loopy/transform/fusion.py b/loopy/transform/fusion.py
index c36f1b4f92479352d9e8e6b0c9246a69c130cff0..6058b78d08b8ecab148252acbc86c5b3e0e4325c 100644
--- a/loopy/transform/fusion.py
+++ b/loopy/transform/fusion.py
@@ -208,29 +208,10 @@ def _fuse_two_kernels(knla, knlb):
 
     knlb = _apply_renames_in_exprs(knlb, b_var_renames)
 
-    # {{{ fuse instructions
-
-    new_instructions = knla.instructions[:]
-    from pytools import UniqueNameGenerator
-    insn_id_gen = UniqueNameGenerator(
-            set([insna.id for insna in new_instructions]))
-
-    knl_b_instructions = []
-    old_b_id_to_new_b_id = {}
-    for insnb in knlb.instructions:
-        old_id = insnb.id
-        new_id = insn_id_gen(old_id)
-        old_b_id_to_new_b_id[old_id] = new_id
-
-        knl_b_instructions.append(
-                insnb.copy(id=new_id))
-
-    for insnb in knl_b_instructions:
-        new_instructions.append(
-                insnb.copy(
-                    insn_deps=frozenset(
-                        old_b_id_to_new_b_id[dep_id]
-                        for dep_id in insnb.insn_deps)))
+    from pymbolic.imperative.transform import \
+            fuse_instruction_streams_with_unique_ids
+    new_instructions = fuse_instruction_streams_with_unique_ids(
+            knla.instructions, knlb.instructions)
 
     # }}}
 
diff --git a/loopy/version.py b/loopy/version.py
index 94fb160dbaf03cf8b78cfd99c6c86e41645cd5e4..9e37d816a57a93bdba67af7912a705c28f787266 100644
--- a/loopy/version.py
+++ b/loopy/version.py
@@ -32,4 +32,4 @@ except ImportError:
 else:
     _islpy_version = islpy.version.VERSION_TEXT
 
-DATA_MODEL_VERSION = "v14-islpy%s" % _islpy_version
+DATA_MODEL_VERSION = "v15-islpy%s" % _islpy_version