diff --git a/graph_tools/misc.py b/graph_tools/misc.py
index 44c7daa8e238b07e0a97133149483f0300bd253b..f6f39a5b0196dd2af089d2ca2103b915b2d6fdfc 100644
--- a/graph_tools/misc.py
+++ b/graph_tools/misc.py
@@ -52,6 +52,40 @@ def _init_():
     return b
 
 
+  def guess_decomposition(G):
+    from sage.all import flatten
+
+    cycles = []
+    H = G.copy()
+    while not H.is_forest():
+      _, c = H.girth(certificate=True)
+
+      stack = H.vertex_boundary(c)
+      H.delete_vertices(c)
+
+      while stack:
+        v = stack.pop()
+        if v not in H or H.degree(v) > 1: continue
+        c = [ c, v ]
+        stack.extend(H.vertex_boundary([ v ]))
+        H.delete_vertex(v)
+      
+      cycles.append(c)
+
+    score = lambda x: len(G.edge_boundary(flatten([cycles[x[0]], cycles[x[1]]])))
+
+    while len(cycles) > 2:
+      i1, i2 = min([ (i, j) for i in range(len(cycles)) for j in range(i) ], key=score)
+      c1 = cycles[i1]
+      c2 = cycles[i2]
+      del cycles[i1]
+      del cycles[i2]
+      cycles.append([ c1, c2 ])
+
+    assert(sorted(flatten(cycles)) == sorted(G.vertices()))
+    return cycles
+
+
   def graph_to_gadget(G, decomposition = None, allow_non_graph = False):
     """Transform graph into a Gadget.
 
@@ -76,9 +110,7 @@ def _init_():
     edges = [ (verts[u], verts[v]) for u, v, _ in G.edges() ]
 
     if decomposition is None:
-      decomposition = G.vertices()[0]
-      for v in G.vertices()[1:]:
-        decomposition = [ v, decomposition ]
+      decomposition = guess_decomposition(G)
 
     vert_map = { v: [0, 1, 2] for v in range(len(verts)) }