diff --git a/area.go b/area.go
new file mode 100644
index 0000000..d43645b
--- /dev/null
+++ b/area.go
@@ -0,0 +1,14 @@
+// 16 december 2015
+
+package ui
+
+// #include "ui.h"
+import "C"
+
+// no need to lock this; only the GUI thread can access it
+var areas = make(map[*C.uiArea]*Area)
+
+// TODO.
+type Area struct {
+	Control
+}
diff --git a/areahandler.go b/areahandler.go
index 0daa5b5..5cd7987 100644
--- a/areahandler.go
+++ b/areahandler.go
@@ -2,6 +2,7 @@
 
 package ui
 
+// #include <stdlib.h>
 // #include "ui.h"
 // extern void doAreaHandlerDraw(uiAreaHandler *, uiArea *, uiAreaDrawParams *);
 // static inline uiAreaHandler *allocAreaHandler(void)
@@ -55,7 +56,7 @@ type AreaDrawParams struct {
 	VScrollPos	int
 }
 
-// export doAreaHandlerDraw
+//export doAreaHandlerDraw
 func doAreaHandlerDraw(uah *C.uiAreaHandler, ua *C.uiArea, udp *C.uiAreaDrawParams) {
 	ah := areahandlers[uah]
 	a := areas[ua]
diff --git a/draw.go b/draw.go
index 4d09bd5..27ed8ba 100644
--- a/draw.go
+++ b/draw.go
@@ -32,14 +32,35 @@ import "C"
 // 	dp.Context.Clip(p)
 // 	// ...
 // 	p.Free() // when done with the path
+// 
+// A Path also defines its fill mode. (This should ideally be a fill
+// parameter, but some implementations prevent it.)
+// TODO talk about fill modes
 type Path struct {
 	p	*C.uiDrawPath
 }
 
-// NewPath creates a new Path.
-func NewPath() *Path {
+// TODO
+type FillMode uint
+const (
+	Winding FillMode = iota
+	Alternate
+)
+
+// NewPath creates a new Path with the given fill mode.
+func NewPath(fillMode FillMode) *Path {
+	var fm C.uiDrawFillMode
+
+	switch fillMode {
+	case Winding:
+		fm = C.uiDrawFillModeWinding
+	case Alternate:
+		fm = C.uiDrawFillModeAlternate
+	default:
+		panic("invalid fill mode passed to ui.NewPath()")
+	}
 	return &Path{
-		p:	C.uiDrawNewPath(),
+		p:	C.uiDrawNewPath(fm),
 	}
 }