diff --git a/data/data.lisp b/data/data.lisp
index 4f10bce7c36d4925c41c4528e5b07384f97edcb3..0f8316936c48aafbff5d89ae6d03204d48a47a83 100644
--- a/data/data.lisp
+++ b/data/data.lisp
@@ -1,7 +1,7 @@
 ;; "Data" is bulk arrayed data, like vectors, matrices, permutations,
 ;; combinations, or histograms.
 ;; Liam Healy 2008-04-06 21:23:41EDT
-;; Time-stamp: <2008-11-15 19:46:51EST data.lisp>
+;; Time-stamp: <2008-11-23 08:55:31EST data.lisp>
 ;; $Id$
 
 (in-package :gsl)
@@ -211,8 +211,7 @@
 		    (progn
 		      (setf (c-pointer ,symbol) ,cptr)
 		      ,@body)
-		  ,@(when sync-exit `((copy-c-to-cl ,symbol))))
-	     (free-gsl-struct ,symbol)))))))
+		  ,@(when sync-exit `((copy-c-to-cl ,symbol))))))))))
 
 ;;;;****************************************************************************
 ;;;; Syncronize C and CL
@@ -315,25 +314,18 @@
 	  (cffi:foreign-slot-value blockptr 'gsl-block-c 'data)
 	  (c-pointer object)
 	  (cffi:foreign-slot-value blockptr 'gsl-block-c 'size)
-	  (total-size object)
-	  (mpointer object)
-	  (alloc-from-block object))))
+	  (total-size object))
+    (let ((array-struct (alloc-from-block object)))
+      (tg:finalize
+       object
+       (lambda ()
+	 (unless (eq blockptr array-struct)
+	   (cffi:foreign-free blockptr))
+	 (cffi:foreign-free array-struct)))
+      (setf (mpointer object) array-struct))))
 
 (defmethod mpointer :before ((object gsl-data))
   "Make a GSL struct if there isn't one already."
   (unless (slot-value object 'mpointer)
     (alloc-gsl-struct object)
     nil))
-
-(defun free-gsl-struct (object)
-  "Free the C structure(s) and memory for data."
-  ;; This should happen immediately at the end of the
-  ;; with-pointer-to-array and substitutes for the GSL "_free"
-  ;; functions.
-  (when (block-pointer object)
-    (unless (eq (block-pointer object) (mpointer object))
-      (cffi:foreign-free (block-pointer object))) ; free the block struct
-    (setf (block-pointer object) nil))
-  (when (mpointer object)
-    (cffi:foreign-free (mpointer object)) ; free the larger struct
-    (setf (mpointer object) nil)))
diff --git a/gsll.asd b/gsll.asd
index 4f849cae2e8df4284766c1ec2572821f2c2a92f2..0a45db07a8ee74b2cea7d3a6a966e95bd405f281 100644
--- a/gsll.asd
+++ b/gsll.asd
@@ -1,6 +1,6 @@
 ;; Definition of GSLL system 
 ;; Liam Healy
-;; Time-stamp: <2008-11-16 12:14:14EST gsll.asd>
+;; Time-stamp: <2008-11-22 17:13:51EST gsll.asd>
 ;; $Id$
 
 (asdf:defsystem "gsll"
@@ -9,7 +9,7 @@
   :version "0"
   :author "Liam M. Healy"
   :licence "LLGPL v3, FDL"
-  :depends-on (cffi cl-utilities)
+  :depends-on (cffi trivial-garbage cl-utilities)
   :components
   ((:module init
 	    :components
@@ -33,7 +33,7 @@
 	    :depends-on (init)
 	    :components
 	    ((:file "foreign-friendly")
-	     (:file "data")
+	     (:file "data" :depends-on (foreign-friendly))
 	     (:file "vector" :depends-on (data))
 	     (:file "matrix" :depends-on (data vector))
 	     (:file "maref" :depends-on (data vector matrix))