diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
index 12c46bd..7815708 100644
--- a/python/CMakeLists.txt
+++ b/python/CMakeLists.txt
@@ -41,8 +41,8 @@
 declare_mlir_python_sources(MPACTPythonSources.SampleModels
   ROOT_DIR "${MPACT_PYTHON_ROOT_DIR}"
   ADD_TO_PARENT MPACTPythonSources
-  SOURCES
-    models/resnet.py
+  SOURCES_GLOB
+    models/*.py
 )
 
 #-------------------------------------------------------------------------------
diff --git a/python/mpact/models/gcn.py b/python/mpact/models/gcn.py
new file mode 100644
index 0000000..8a015de
--- /dev/null
+++ b/python/mpact/models/gcn.py
@@ -0,0 +1,19 @@
+import torch
+
+
+class GraphConv(torch.nn.Module):
+    def __init__(self, input_dim, output_dim):
+        super(GraphConv, self).__init__()
+        self.kernel = torch.nn.Parameter(torch.Tensor(input_dim, output_dim))
+        torch.nn.init.ones_(self.kernel)
+        self.bias = torch.nn.Parameter(torch.Tensor(output_dim))
+        torch.nn.init.ones_(self.bias)
+
+    def forward(self, inp, adj_mat):
+        # Input matrix times weight matrix.
+        support = torch.mm(inp, self.kernel)
+        # Sparse adjacency matrix times support matrix.
+        output = torch.spmm(adj_mat, support)
+        # Add bias.
+        output = output + self.bias
+        return output
diff --git a/python/mpact/models/kernels.py b/python/mpact/models/kernels.py
new file mode 100644
index 0000000..f8dbf17
--- /dev/null
+++ b/python/mpact/models/kernels.py
@@ -0,0 +1,31 @@
+import torch
+
+
+class MVNet(torch.nn.Module):
+    def forward(self, x, v):
+        return torch.mv(x, v)
+
+
+class MMNet(torch.nn.Module):
+    def forward(self, x, v):
+        return torch.mm(x, v)
+
+
+class AddNet(torch.nn.Module):
+    def forward(self, x, v):
+        return torch.add(x, v)
+
+
+class MulNet(torch.nn.Module):
+    def forward(self, x, v):
+        return torch.mul(x, v)
+
+
+class SelfNet(torch.nn.Module):
+    def forward(self, x):
+        return x
+
+
+class SDDMMNet(torch.nn.Module):
+    def forward(self, x, y, z):
+        return torch.mul(x, torch.mm(y, z))
diff --git a/python/mpact/models/lif.py b/python/mpact/models/lif.py
new file mode 100644
index 0000000..37bf94f
--- /dev/null
+++ b/python/mpact/models/lif.py
@@ -0,0 +1,58 @@
+import torch
+
+
+def spike(input):
+    return (input >= 0).float()
+
+
+def sqSum(input):
+    return (input * input).sum()
+
+
+class LIF(torch.nn.Module):
+    def __init__(self):
+        super(LIF, self).__init__()
+        self.thresh = 1.0
+        self.decay = 0.5
+        self.act = spike
+
+    def forward(self, X):
+        """A filter that yields a binary-valued sparse tensor."""
+        mem = 0
+        spike_pot = []
+        T = X.size(-1)
+        for t in range(T):
+            mem = mem * self.decay + X[..., t]
+            spike = self.act(mem - self.thresh)
+            spike = spike.to_sparse().to_dense()  # prop hack
+            mem = mem * (1.0 - spike)
+            spike_pot.append(spike)
+        spike_pot = torch.stack(spike_pot, dim=-1)
+        return spike_pot
+
+
+class tdLayer(torch.nn.Module):
+    def __init__(self, layer):
+        super(tdLayer, self).__init__()
+        self.layer = layer
+
+    def forward(self, X):
+        T = X.size(-1)
+        out = []
+        for t in range(T):
+            m = self.layer(X[..., t])
+            out.append(m)
+        out = torch.stack(out, dim=-1)
+        return out
+
+
+class Block(torch.nn.Module):
+    def __init__(self):
+        super(Block, self).__init__()
+        self.spike = LIF()
+        self.layer = tdLayer(sqSum)
+
+    def forward(self, X):
+        out = self.spike(X)
+        out = self.layer(out)
+        return out
diff --git a/test/python/sparse_gcn.py b/test/python/sparse_gcn.py
index d1d00a0..ce89411 100644
--- a/test/python/sparse_gcn.py
+++ b/test/python/sparse_gcn.py
@@ -3,25 +3,7 @@
 import torch
 
 from mpact.mpactbackend import mpact_jit, mpact_jit_compile, mpact_jit_run
-
-
-class GraphConv(torch.nn.Module):
-    def __init__(self, input_dim, output_dim):
-        super(GraphConv, self).__init__()
-        self.kernel = torch.nn.Parameter(torch.Tensor(input_dim, output_dim))
-        torch.nn.init.ones_(self.kernel)
-        self.bias = torch.nn.Parameter(torch.Tensor(output_dim))
-        torch.nn.init.ones_(self.bias)
-
-    def forward(self, inp, adj_mat):
-        # Input matrix times weight matrix.
-        support = torch.mm(inp, self.kernel)
-        # Sparse adjacency matrix times support matrix.
-        output = torch.spmm(adj_mat, support)
-        # Add bias.
-        output = output + self.bias
-        return output
-
+from mpact.models.gcn import GraphConv
 
 net = GraphConv(4, 4)
 
diff --git a/test/python/sparse_lif.py b/test/python/sparse_lif.py
index d717af3..38973c9 100644
--- a/test/python/sparse_lif.py
+++ b/test/python/sparse_lif.py
@@ -3,64 +3,7 @@
 import torch
 
 from mpact.mpactbackend import mpact_jit, mpact_jit_compile, mpact_jit_run
-
-
-def spike(input):
-    return (input >= 0).float()
-
-
-def sqSum(input):
-    return (input * input).sum()
-
-
-class LIF(torch.nn.Module):
-    def __init__(self):
-        super(LIF, self).__init__()
-        self.thresh = 1.0
-        self.decay = 0.5
-        self.act = spike
-
-    def forward(self, X):
-        """A filter that yields a binary-valued sparse tensor."""
-        mem = 0
-        spike_pot = []
-        T = X.size(-1)
-        for t in range(T):
-            mem = mem * self.decay + X[..., t]
-            spike = self.act(mem - self.thresh)
-            spike = spike.to_sparse().to_dense()  # prop hack
-            mem = mem * (1.0 - spike)
-            spike_pot.append(spike)
-        spike_pot = torch.stack(spike_pot, dim=-1)
-        return spike_pot
-
-
-class tdLayer(torch.nn.Module):
-    def __init__(self, layer):
-        super(tdLayer, self).__init__()
-        self.layer = layer
-
-    def forward(self, X):
-        T = X.size(-1)
-        out = []
-        for t in range(T):
-            m = self.layer(X[..., t])
-            out.append(m)
-        out = torch.stack(out, dim=-1)
-        return out
-
-
-class Block(torch.nn.Module):
-    def __init__(self):
-        super(Block, self).__init__()
-        self.spike = LIF()
-        self.layer = tdLayer(sqSum)
-
-    def forward(self, X):
-        out = self.spike(X)
-        out = self.layer(out)
-        return out
-
+from mpact.models.lif import Block
 
 net = Block()
 
diff --git a/test/python/spmv.py b/test/python/spmv.py
index 29467e1..604fab7 100644
--- a/test/python/spmv.py
+++ b/test/python/spmv.py
@@ -3,12 +3,9 @@
 import torch
 
 from mpact.mpactbackend import mpact_jit, mpact_jit_compile, mpact_jit_run
+from mpact.models.kernels import MVNet
 
-class SpMVNet(torch.nn.Module):
-    def forward(self, x, v):
-        return torch.mv(x, v)
-
-net = SpMVNet()
+net = MVNet()
 
 # Get a fixed vector and matrix (which we make 2x2 block "sparse").
 dense_vector = torch.arange(1, 11, dtype=torch.float32)
