diff --git a/loopy/target/c/codegen/expression.py b/loopy/target/c/codegen/expression.py
index 1dc3aafcfb63789255a7f5fd79b178e657b3c74d..0c25d5380ff24d2444967c47a2950ea8bf5dffa0 100644
--- a/loopy/target/c/codegen/expression.py
+++ b/loopy/target/c/codegen/expression.py
@@ -376,14 +376,14 @@ class LoopyCCodeMapper(RecursiveMapper):
                 cast_type = "cfloat_t"
             else:
                 if dtype == np.complex128:
-                    cast_type = "cdouble_t"
+                    cast_type = "cdouble"
                 elif dtype == np.complex64:
-                    cast_type = "cfloat_t"
+                    cast_type = "cfloat"
                 else:
                     raise RuntimeError("unsupported complex type in expression "
                             "generation: %s" % type(expr))
 
-            return "(%s) (%s, %s)" % (cast_type, repr(expr.real), repr(expr.imag))
+            return "%s_new(%s, %s)" % (cast_type, repr(expr.real), repr(expr.imag))
         else:
             if type_context == "f":
                 return repr(float(expr))+"f"
@@ -490,11 +490,20 @@ class LoopyCCodeMapper(RecursiveMapper):
                     if 'c' == self.infer_type(child).kind]
 
             real_sum = self.join_rec(" + ", reals, PREC_SUM, type_context)
-            complex_sum = self.join_rec(
-                    " + ", complexes, PREC_SUM, type_context, tgt_dtype)
+
+            if len(complexes) == 1:
+                myprec = PREC_SUM
+            else:
+                myprec = PREC_NONE
+
+            complex_sum = self.rec(complexes[0], myprec, type_context, tgt_dtype)
+            for child in complexes[1:]:
+                complex_sum = "%s_add(%s, %s)" % (
+                        tgt_name, complex_sum,
+                        self.rec(child, PREC_NONE, type_context, tgt_dtype))
 
             if real_sum:
-                result = "%s_fromreal(%s) + %s" % (tgt_name, real_sum, complex_sum)
+                result = "%s_radd(%s, %s)" % (tgt_name, real_sum, complex_sum)
             else:
                 result = complex_sum
 
@@ -545,8 +554,7 @@ class LoopyCCodeMapper(RecursiveMapper):
                         self.rec(child, PREC_NONE, type_context, tgt_dtype))
 
             if real_prd:
-                # elementwise semantics are correct
-                result = "%s*%s" % (real_prd, complex_prd)
+                result = "%s_rmul(%s, %s)" % (tgt_name, real_prd, complex_prd)
             else:
                 result = complex_prd
 
@@ -591,9 +599,10 @@ class LoopyCCodeMapper(RecursiveMapper):
         if not (n_complex or d_complex):
             return base_impl(expr, enclosing_prec, type_context)
         elif n_complex and not d_complex:
-            # elementwise semantics are correct
-            return base_impl(expr, enclosing_prec, type_context,
-                    num_tgt_dtype=tgt_dtype)
+            return "%s_divider(%s, %s)" % (
+                    self.complex_type_name(tgt_dtype),
+                    self.rec(expr.numerator, PREC_NONE, type_context, tgt_dtype),
+                    self.rec(expr.denominator, PREC_NONE, type_context))
         elif not n_complex and d_complex:
             return "%s_rdivide(%s, %s)" % (
                     self.complex_type_name(tgt_dtype),
diff --git a/loopy/version.py b/loopy/version.py
index e7d877aa136ef4ad15774388ba9c9cb37b828ed1..60f16185df94611d32c45691aed70987cc6a8119 100644
--- a/loopy/version.py
+++ b/loopy/version.py
@@ -25,4 +25,4 @@ VERSION = (2014, 1)
 VERSION_STATUS = ""
 VERSION_TEXT = ".".join(str(x) for x in VERSION) + VERSION_STATUS
 
-DATA_MODEL_VERSION = "v6"
+DATA_MODEL_VERSION = "v7"