diff --git a/pymbolic/mapper/__init__.py b/pymbolic/mapper/__init__.py
index 97039938e616e654799fc9f5c8bef0d001af989c..a88e861987cffcdc9b638da5a79bbfaa90ff1718 100644
--- a/pymbolic/mapper/__init__.py
+++ b/pymbolic/mapper/__init__.py
@@ -263,7 +263,7 @@ class IdentityMapperBase(object):
         if is_zero(result):
             return 0
 
-        return expr.__class__(
+        return type(expr)(
                 result,
                 expr.prefix,
                 **expr.get_extra_properties())
diff --git a/pymbolic/mapper/stringifier.py b/pymbolic/mapper/stringifier.py
index 801bbd49387d4b3ccc9a8e7e0d7b5ac21952f026..554ec80f1a054b6121e1cbb275e81ea4c1dcc190 100644
--- a/pymbolic/mapper/stringifier.py
+++ b/pymbolic/mapper/stringifier.py
@@ -186,7 +186,14 @@ class StringifyMapper(pymbolic.mapper.RecursiveMapper):
                 return "array(\n%s)" % "".join(lines)
 
     def map_common_subexpression(self, expr, enclosing_prec):
-        return self.format("CSE(%s)", self.rec(expr.child, PREC_NONE))
+        from pymbolic.primitives import CommonSubexpression
+        if type(expr) is CommonSubexpression:
+            type_name = "CSE"
+        else:
+            type_name = type(expr).__name__
+
+        return self.format("%s(%s)",
+                type_name, self.rec(expr.child, PREC_NONE))
 
     def map_if_positive(self, expr, enclosing_prec):
         return "If(%s > 0, %s, %s)" % (