'''
     return np.array(m._beziers[iu].point_at_t(t))
 
-  def point_offset(m, iu, t, offset):
-    '''
-    offset by offset perpendicular to the surface
-     at the top (iu=t=0), in the y direction
-    '''
+  def normal(m, iu, t):
+    '''at the top (iu=t=0), is +ve in the +ve y direction'''
     p = m.point(iu, t)
     if t == 0:
       dirn = m.edge.dirn(m._thetas[iu], extra_zeta=-tau/4)
     elif iu == m.nu:
-      return m.point_offset(0, t, offset)
+      return m.normal(0, t)
     else:
       vec_t = m.point(iu,   t + 0.01) - p
       vec_u = m.point(iu+1, t)        - p
       dirn =  np.cross(vec_u, vec_t)
-    return p + offset * dirn / np.linalg.norm(dirn)
+      dirn = unit_v(dirn)
+    return dirn
+
+  def point_offset(m, iu, t, offset):
+    '''
+    offset by offset perpendicular to the surface
+     at the top (iu=t=0), +ve offset is in the +ve y direction
+    '''
+    p = m.point(iu, t)
+    return p + offset * m.normal(iu, t)
 
 class Moebius():
   def __init__(m, nv, nw):