diff --git a/src/centrifugal_pump.scad b/src/centrifugal_pump.scad
new file mode 100644
index 0000000000000000000000000000000000000000..764e812e881559e62a21a2ebb3c0f8110f7702b7
--- /dev/null
+++ b/src/centrifugal_pump.scad
@@ -0,0 +1,164 @@
+use <../include/short.scad>
+
+$fn = 100;
+
+ID = 25; // internal diameter
+CW = .8; // case wall thickness
+H = 5; // height of case
+OD = 5; // output diameter
+ODB = 3; // output pipe diameter
+I_N = 6; // number of impeller blades
+I_T = .8; // impeller tolerance
+I_B = .8; // impeller base plate thickness
+SH = 2; // motor shaft diameter
+SL = 8; // motor shaft length
+S_P = 4.5; // plastic hex shaft diameter
+S_L = 35; // plastic hex shaft length
+S_T = 1; // plastic hex shaft tube tolerance
+M_H = 29; // mount height
+M_A = 18; // height after motor is thicker
+M_B = 2; // how much thicker
+M_W = .8; // mount wall thickness
+
+module motor_mount_shape() {
+    module a() {
+        rotate([0,0,90]) intersection() {
+            square([100, 15.5], center=true);
+            circle(d=20);
+        }
+    }
+    module b() {
+        circle(d = 34);
+    }
+    b();
+}
+
+module case_inside_shape(r, od, th) {
+    ra = od / 4;
+    rt = r + th;
+    circle(r = rt);
+    intersection() {
+        tX(ra) circle(r = rt + ra);
+        tXY(-rt-1, -rt-ra) square([2*(rt + ra + 1), rt + ra + 1]);
+    }
+}
+
+module case_output_shape(r, od, th) {
+    ra = od / 4;
+    rt = r + th;
+    tXY(r - od/2 - th,-1) square([od + th*2, rt*.6 + 1]);
+}
+
+module case_inside(r = ID/2, od=5, h=10, th=0) {
+    ra = od / 4;
+    rt = r + th;
+    module flat() { case_inside_shape(r=r, od=od, th=th); }
+    module ct() { tXZ(r, H-ODB/2) rotate([-90,0,0]) children(); }
+    tZ(-th) linear_extrude(h + 2*th) flat();
+    hull() {
+        tZ(-th) linear_extrude(h + 2*th)
+            case_output_shape(r=r, od=od, th=th);
+        ct() cylinder(h=rt*1.3, d=ODB + 2*th);
+    }
+    ct() cylinder(h=r*2 - th, d=ODB + 2*th);
+}
+
+module motor_mount_inside() {
+    bh = 1.8;
+    bhp = 2;
+    module shape() { motor_mount_shape(); }
+    module base() {
+            translate([0,0,bh + bhp]) linear_extrude(M_H) shape();
+            translate([0,0,bh + bhp + M_A]) linear_extrude(M_H-M_A) offset(M_B) shape();
+            translate([0,0,bhp]) cylinder(h=bh + 1, d = 6.1);
+            cylinder(h=2*bhp+1, center=true, d=SH);
+    }
+
+    base();
+}
+
+module impeller() {
+    a = 0;
+    base_rot = a - 53;
+    dir = -1; // -1: back, 1: front
+    module blade() {
+        t = .8;
+        // translate([0,-t/2,0]) cube([ID/2-I_T, t, H]);
+        intersection() {
+            d = ID*.8;
+            rX(a) tXY(d/2/sqrt(2), dir * d/2/sqrt(2)) diff() {
+                cylinder(d=d, h=3*H, center=true);
+                tZ(-1) cylinder(d=d-t*2, h=3*H+3, center=true);
+            }
+            tY(-4) cube([ID/2-I_T, 8, H]);
+            rZ(base_rot) cylinder(d=ID-2*I_T, h=H, $fn=I_N);
+        }
+    }
+    difference() {
+        union() {
+            rZ(base_rot) cylinder(h=I_B, d=ID-I_T*2, $fn=I_N);
+            for (i=[0:I_N]) {
+                rotate([0,0,i*360/I_N]) blade();
+            }
+            cylinder(h=H, d=3);
+        }
+        //tZ(-1) cylinder(h=H+2, d=S_P + S_T, $fn=6);
+    }
+}
+
+module plastic_shaft() {
+    diff() {
+        cylinder(d=S_P, h=S_L-1, $fn=6);
+        tZ(-1) cylinder(d=SH, h=SL+1);
+    }
+
+}
+
+module case() {
+    translate([0,0,CW]) difference() {
+        case_inside(r=ID/2, od=OD, h=H, th=CW);
+        case_inside(r=ID/2, od=OD, h=H);
+        cylinder(r=ID/2, h=100);
+        cylinder(d=S_P + 2*S_T, center=true, h=10);
+    }
+}
+
+module main() {
+    rX(180) case();
+    difference() {
+        h = S_L;
+        d = S_P + 2*S_T;
+        w = .4 * 4 * 2;
+        union() {
+            tZ(-CW) cylinder(h=h+CW, d=d + w);
+            hull() {
+                tZ(h) linear_extrude(1) offset(.8)
+                    motor_mount_shape();
+                tZ(h-S_L*.3) cylinder(d=d,h=1);
+            }
+            hull() {
+                tZ(-CW) cylinder(h=CW, d=2.5*d);
+                tZ(S_L * .2) cylinder(h=1, d=d);
+            }
+            tZ(h) tube(10, .4) motor_mount_shape();
+        }
+        tZ(-CW-1) cylinder(h=h+CW+10, d=d);
+        tZ(h) cylinder(h=3, d = 6.1, center=true);
+        tXYZ(-10, -d*.4/2, -2) cube([20, d*.4, h]);
+        for(i = [0:6])
+        rotate([0,0,i*60]) tX(26/2) {
+            cylinder(d = 2.5, h = 100, center=true);
+            tZ(S_L-4) cylinder(d = 5, h=4, center=true);
+        }
+    }
+}
+
+module print() {
+    tZ(H + 2*CW) main();
+    tY(ID + 2) tZ(H) union() {
+        rX(180) impeller();
+        tZ(S_L-I_B-1) rX(180) plastic_shaft();
+    }
+}
+
+print();
diff --git a/src/gearbox.scad b/src/gearbox.scad
new file mode 100644
index 0000000000000000000000000000000000000000..014faf6550c6fcd17db61f4c1d36205d4f86193c
--- /dev/null
+++ b/src/gearbox.scad
@@ -0,0 +1,30 @@
+use <../include/gear.scad>;
+
+dist = 52.5;
+n1 = 8;
+n2 = 40;
+echo("Ratio: ", n2 / n1);
+mm_per_tooth = (dist / (n1 + n2)) * 2 * PI;
+
+module g(n) {
+    gear(
+        mm_per_tooth = mm_per_tooth,
+        number_of_teeth = n,
+        thickness = 6,
+        hole_diameter = 2,
+        clearance = .2,
+        backlash = .1
+    );
+}
+
+difference() {
+    union() {
+        rotate([0,0,360/n2/2]) g(n2);
+        translate([0,0,-6/2]) cylinder(d=5, h=8, $fn=100);
+    }
+    translate([-1.3/2, -5/2, -6/2-1]) cube([1.3, 5, 5]);
+}
+translate([0, pitch_radius(mm_per_tooth, n1) + pitch_radius(mm_per_tooth, n2) + 2 ,0]) g(n1);
+
+
+//# cube([5, dist, 5]);
\ No newline at end of file