diff --git a/attachments.scad b/attachments.scad
index 0b4d8a7..641a5f9 100644
--- a/attachments.scad
+++ b/attachments.scad
@@ -1038,6 +1038,13 @@ module attach(from, to, overlap, norot=false)
// ---
// d = Diameter of corner mask.
// convexity = Max number of times a line could intersect the perimeter of the mask shape. Default: 10
+// Side Effects:
+// Sets `$tags = "mask"` for all children.
+// Example:
+// diff("mask")
+// cube([50,60,70],center=true)
+// face_profile(TOP,except=TOP+LEFT)
+// mask2d_roundover(r=10, inset=2);
module face_profile(faces=[], r, d, convexity=10) {
faces = is_vector(faces)? [faces] : faces;
assert(all([for (face=faces) is_vector(face) && sum([for (x=face) x!=0? 1 : 0])==1]), "Vector in faces doesn't point at a face.");
diff --git a/primitives.scad b/primitives.scad
index ad7ac4f..de96579 100644
--- a/primitives.scad
+++ b/primitives.scad
@@ -11,14 +11,19 @@
// Function&Module: square()
-// Usage:
-// square(size, [center])
+// Topics: Shapes (2D), Path Generators (2D)
+// Usage: As a Built-in Module
+// square(size,
);
+// Usage: As a Function
+// path = square(size, );
+// See Also: rect()
// Description:
// When called as the builtin module, creates a 2D square or rectangle of the given size.
// When called as a function, returns a 2D path/list of points for a square/rectangle of the given size.
// Arguments:
// size = The size of the square to create. If given as a scalar, both X and Y will be the same size.
// center = If given and true, overrides `anchor` to be `CENTER`. If given and false, overrides `anchor` to be `FRONT+LEFT`.
+// ---
// anchor = (Function only) Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
// spin = (Function only) Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
// Example(2D):
@@ -43,14 +48,19 @@ function square(size=1, center, anchor, spin=0) =
// Function&Module: circle()
-// Usage:
-// circle(r|d)
+// Topics: Shapes (2D), Path Generators (2D)
+// Usage: As a Built-in Module
+// circle(r|d=, ...);
+// Usage: As a Function
+// path = circle(r|d=, ...);
+// See Also: oval()
// Description:
// When called as the builtin module, creates a 2D polygon that approximates a circle of the given size.
// When called as a function, returns a 2D list of points (path) for a polygon that approximates a circle of the given size.
// Arguments:
// r = The radius of the circle to create.
// d = The diameter of the circle to create.
+// ---
// anchor = (Function only) Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
// spin = (Function only) Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
// Example(2D): By Radius
@@ -72,10 +82,14 @@ function circle(r, d, anchor=CENTER, spin=0) =
// Function&Module: cube()
+// Topics: Shapes (3D), Attachable, VNF Generators
// Usage: As Module
-// cube(size, [center]);
+// cube(size, , ...);
+// Usage: With Attachments
+// cube(size, , ...) { attachments }
// Usage: As Function
-// vnf = cube(size, [center]);
+// vnf = cube(size, , ...);
+// See Also: cuboid(), prismoid()
// Description:
// Creates a 3D cubic object with support for anchoring and attachments.
// This can be used as a drop-in replacement for the built-in `cube()` module.
@@ -83,6 +97,7 @@ function circle(r, d, anchor=CENTER, spin=0) =
// Arguments:
// size = The size of the cube.
// center = If given, overrides `anchor`. A true value sets `anchor=CENTER`, false sets `anchor=ALLNEG`.
+// ---
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
// orient = Vector to rotate top towards, after spin. See [orient](attachments.scad#orient). Default: `UP`
@@ -138,12 +153,16 @@ function cube(size=1, center, anchor, spin=0, orient=UP) =
// Function&Module: cylinder()
+// Topics: Shapes (3D), Attachable, VNF Generators
// Usage: As Module
-// cylinder(h, r|d, [center]);
-// cylinder(h, r1/d1, r2/d2, [center]);
+// cylinder(h, r=/d=, , ...);
+// cylinder(h, r1/d1=, r2/d2=, , ...);
+// Usage: With Attachments
+// cylinder(h, r=/d=, ) {attachments}
// Usage: As Function
-// vnf = cylinder(h, r|d, [center]);
-// vnf = cylinder(h, r1/d1, r2/d2, [center]);
+// vnf = cylinder(h, r=/d=, , ...);
+// vnf = cylinder(h, r1/d1=, r2/d2=, , ...);
+// See Also: cyl()
// Description:
// Creates a 3D cylinder or conic object with support for anchoring and attachments.
// This can be used as a drop-in replacement for the built-in `cylinder()` module.
@@ -153,6 +172,7 @@ function cube(size=1, center, anchor, spin=0, orient=UP) =
// r1 = The bottom radius of the cylinder. (Before orientation.)
// r2 = The top radius of the cylinder. (Before orientation.)
// center = If given, overrides `anchor`. A true value sets `anchor=CENTER`, false sets `anchor=BOTTOM`.
+// ---
// d1 = The bottom diameter of the cylinder. (Before orientation.)
// d2 = The top diameter of the cylinder. (Before orientation.)
// r = The radius of the cylinder.
@@ -230,16 +250,21 @@ function cylinder(h, r1, r2, center, l, r, d, d1, d2, anchor, spin=0, orient=UP)
// Function&Module: sphere()
+// Topics: Shapes (3D), Attachable, VNF Generators
// Usage: As Module
-// sphere(r|d, [circum], [style])
+// sphere(r|d=, ,