diff --git a/include/common_objects.scad b/include/common_objects.scad
index d0d5c670640482c15236d4184bbfef6b1014ada6..c5246739acec6b786188a26f3f0f6409a0a9ce5c 100644
--- a/include/common_objects.scad
+++ b/include/common_objects.scad
@@ -1,2 +1,5 @@
 co_sd_card = [32, 24, 2.1];
 co_usd_card = [15, 11, 1];
+
+// IKEA stuff (mostly inaccurate, approximate measurements)
+ikea_samla_22l_handle_slope = 3;
diff --git a/src/rain_gutter_filter.scad b/src/rain_gutter_filter.scad
index 48ed38f3c1c323751ac1f9277164692711e6b9a6..abd9667cb0d3e2ac79cb7828681cf7dd2b6ebbe3 100644
--- a/src/rain_gutter_filter.scad
+++ b/src/rain_gutter_filter.scad
@@ -1,27 +1,60 @@
 use <../include/short.scad>;
 
-tube_filter_diameter = 65;
-tube_filter_length = 10;
+tube_filter_diameter = 68;
+tube_filter_length = 30;
 tube_filter_ear_count = 6;
 tube_filter_grid_spacing = 4;
-tube_filter_grid_thickness = 4;
+tube_filter_wall = 3;
+tube_filter_lip = 10;
+tube_filter_lip_thickness = 5;
 
 $fn = 100;
 
 module filter_rectangular(
     spacing = 4,
     wall = -1,
-    size = 23
+    size = 23,
+    thickness = 5,
+    level_offset = 0.4
 ) {
     _wall = wall < 0 ? spacing / 4 : wall;
     step = spacing + _wall;
     s = size - _wall;
-    for (x = [-s/2:step:s/2])
+    
+    ext(thickness) for (x = [-s/2:step:s/2])
         translate([x, -s/2]) square([_wall, size]);
-    for (y = [-s/2:step:s/2])
+    ext(thickness - level_offset) for (y = [-s/2:step:s/2])
         translate([-s/2, y]) square([size, _wall]);
 }
 
+module filter_cylinder(
+    spacing = 4,
+    wall = -1,
+    diameter = 30,
+    thickness = 5,
+    length = 10
+) {
+    _wall = wall < 0 ? spacing / 4 : wall;
+    step = spacing + _wall;
+    
+    nr = ceil(diameter * PI / step);
+    nl = ceil((length - _wall) / step);
+    
+    for (i = [0:nr])
+        rZ(i * 360 / nr) tX(diameter/2 - thickness)
+            tY(-_wall/2)
+                cube([thickness, _wall, length]);
+    for (i = [0:nl])
+        tZ(i * (length - _wall) / nl)
+            ext(_wall)
+                ring(od = diameter, th = thickness);
+}
+
+module gutter() {
+    d = 105;
+    tZ(tube_filter_length / 2) tZ(d/2) rX(90) cylinder(d = d, h = tube_filter_diameter * 2, center=true);
+}
+
 module ear() {
     w = tube_filter_diameter / 5;
     tX(tube_filter_diameter / 2) intersection() {
@@ -31,26 +64,53 @@ module ear() {
 }
 
 module tube_filter() {
-    wall = 3;
+    wall = tube_filter_wall;
     diameter = tube_filter_diameter;
-    th = tube_filter_grid_thickness;
+    th = tube_filter_grid_spacing + 1;
+    length = tube_filter_length;
     
     // tube
-    ext(tube_filter_length) difference() {
-        circle(d=diameter); circle(d = diameter - wall * 2);
-    }
+    filter_cylinder(
+        spacing = tube_filter_grid_spacing,
+        diameter = diameter,
+        length = length,
+        thickness = wall
+    );
     
     // filter grid
-    ext(th) intersection() {
+    intersection() {
         filter_rectangular(
-            spacing = tube_filter_grid_spacing, size = diameter);
-        circle(d = diameter);
+            spacing = tube_filter_grid_spacing,
+            size = diameter,
+            thickness = th
+        );
+        ext(th) circle(d = diameter);
     }
     
+    // joiner rings at top & bottom
+    ext(th) ring(od = diameter, th = wall);
+    
     // ears
-    for (i = [0:tube_filter_ear_count]) {
-        rZ(i * 360 / tube_filter_ear_count) ext(th) ear();
-    }
+    // for (i = [0:tube_filter_ear_count]) {
+    //     tZ(length - th)
+    //         rZ(i * 360 / tube_filter_ear_count)
+    //             ext(th) ear();
+    // }
 }
 
-tube_filter();
\ No newline at end of file
+difference() {
+    union() {
+        difference() {
+            union() {
+                intersection() {
+                    sf = (tube_filter_diameter + tube_filter_lip * 2) / tube_filter_diameter;
+                    gutter();
+                    tZ(tube_filter_wall) scale([sf, 1, 1]) cylinder(d = tube_filter_diameter, h = tube_filter_length * 1.1);
+                }
+            tube_filter();
+            }
+            tZ(tube_filter_lip_thickness) scale([0.7, 1, 0.7]) gutter();
+        }
+    }
+    tZ(tube_filter_wall + 5) cylinder(d = tube_filter_diameter - tube_filter_wall * 2, h = tube_filter_length * 2);
+}
diff --git a/src/samla_box_shaft_holder.scad b/src/samla_box_shaft_holder.scad
new file mode 100644
index 0000000000000000000000000000000000000000..b1f89dd32e4a18d20f288ee615b3c87fbfdb8a93
--- /dev/null
+++ b/src/samla_box_shaft_holder.scad
@@ -0,0 +1,22 @@
+include <../include/short.scad>;
+include <../include/common_objects.scad>;
+
+$fn = 32;
+
+shaft = 8;
+wall = 2;
+h = 8;
+base = 25;
+screw_hole = 3;
+screw_head = 5;
+
+diff() {
+    hull() {
+        scale([1,1,1]) cylinder(d = base, h = wall);
+        cylinder(d = shaft + wall * 2, h = h);
+    }
+    rX(ikea_samla_22l_handle_slope) tZ(wall) ext(h) union() {
+        circle(d = shaft);
+        tX(-shaft/2) square([shaft, 100]);
+    }
+}
\ No newline at end of file
diff --git a/src/text_tag.scad b/src/text_tag.scad
new file mode 100644
index 0000000000000000000000000000000000000000..f209a04091fa2dbc5e513ad52b425371fe7e77a2
--- /dev/null
+++ b/src/text_tag.scad
@@ -0,0 +1,17 @@
+s=[35,15,3];
+pad=3;
+r=1;
+text_w = 0.8;
+$fn=40;
+hole=3;
+
+difference() {
+minkowski() {
+    sphere(r);
+    cube(s-[r,r,r]);
+}
+co = hole/2+r/2;
+translate([s[0]/2-r/2+co/2,s[1]/2-r/2,s[2]/2]) linear_extrude(s[2])
+    scale([text_w,1,1]) text("1505", valign="center", halign="center", size=s[1]-pad);
+translate([co,co,-50]) cylinder(d=hole,h=100);
+}
\ No newline at end of file