diff --git a/extra/db/mysql/lib/lib.factor b/extra/db/mysql/lib/lib.factor
index 7d5c2d55dc..59d1b6ff3d 100644
--- a/extra/db/mysql/lib/lib.factor
+++ b/extra/db/mysql/lib/lib.factor
@@ -14,81 +14,65 @@ TUPLE: mysql-result-set ;
 
 : new-mysql ( -- conn )
     f mysql_init ;
-    
-: mysql-error-string ( mysql-connection -- str )
-    mysql-db-handle mysql_error ;
 
 : mysql-error ( mysql -- )
-    mysql-error-string throw ;
+    [ mysql_error throw ] when* ;
 
 : mysql-connect ( mysql-connection -- )
-    init-mysql swap
-    [ set-mysql-connection-mysqlconn ] 2keep
-    [ mysql-connection-host ] keep
-    [ mysql-connection-user ] keep
-    [ mysql-connection-password ] keep
-    [ mysql-connection-db ] keep
-    [ mysql-connection-port f 0 mysql_real_connect ] keep
-    [ set-mysql-connection-handle ] keep 
-    dup mysql-connection-handle 
-    [ connect-error-msg throw ] unless ;
+    new-mysql over set-mysql-db-handle
+    dup {
+        mysql-db-handle
+        mysql-db-host
+        mysql-db-user
+        mysql-db-password
+        mysql-db-db
+        mysql-db-port
+    } get-slots f 0 mysql_real_connect mysql-error ;
 
 ! =========================================================
 ! Low level mysql utility definitions
 ! =========================================================
 
 : (mysql-query) ( mysql-connection query -- ret )
-    >r mysql-connection-mysqlconn r> mysql_query ;
+    >r mysql-db-handle r> mysql_query ;
 
-: (mysql-result) ( mysql-connection -- ret )
-    [ mysql-connection-mysqlconn mysql_use_result ] keep 
-    [ set-mysql-connection-resulthandle ] keep ;
-    
-: (mysql-affected-rows) ( mysql-connection -- n )
-    mysql-connection-mysqlconn mysql_affected_rows ;
+! : (mysql-result) ( mysql-connection -- ret )
+    ! [ mysql-db-handle mysql_use_result ] keep 
+    ! [ set-mysql-connection-resulthandle ] keep ;
 
-: (mysql-free-result) ( mysql-connection -- )
-    mysql-connection-resulthandle drop ;
+! : (mysql-affected-rows) ( mysql-connection -- n )
+    ! mysql-connection-mysqlconn mysql_affected_rows ;
 
-: (mysql-row) ( mysql-connection -- row )
-    mysql-connection-resulthandle mysql_fetch_row ;
+! : (mysql-free-result) ( mysql-connection -- )
+    ! mysql-connection-resulthandle drop ;
 
-: (mysql-num-cols) ( mysql-connection -- n )
-    mysql-connection-resulthandle mysql_num_fields ;
+! : (mysql-row) ( mysql-connection -- row )
+    ! mysql-connection-resulthandle mysql_fetch_row ;
+
+! : (mysql-num-cols) ( mysql-connection -- n )
+    ! mysql-connection-resulthandle mysql_num_fields ;
    
-: mysql-char*-nth ( index object -- str )
-    #! Utility based on 'char*-nth' to perform an additional sanity check on the value
-    #! extracted from the array of strings.
-    void*-nth [ alien>char-string ] [ "" ] if* ;
-        
-: mysql-row>seq ( object n -- seq )
-    [ swap mysql-char*-nth ] map-with ;
-    
-: (mysql-result>seq) ( seq -- seq )
-    my-conn get (mysql-row) dup [       
-        my-conn get (mysql-num-cols) mysql-row>seq
-        over push
-        (mysql-result>seq)
-    ] [ drop ] if 
-    ! Perform needed cleanup on fetched results
-    my-conn get (mysql-free-result) ;
-            
-! =========================================================
-!  Public Word Definitions
-! =========================================================
+! : mysql-char*-nth ( index object -- str )
+    ! #! Utility based on 'char*-nth' to perform an additional sanity check on the value
+    ! #! extracted from the array of strings.
+    ! void*-nth [ alien>char-string ] [ "" ] if* ;
 
+! : mysql-row>seq ( object n -- seq )
+    ! [ swap mysql-char*-nth ] map-with ;
 
-: mysql-query ( query -- ret )
-    >r my-conn get r> (mysql-query) drop
-    my-conn get (mysql-result) ;
+! : (mysql-result>seq) ( seq -- seq )
+    ! my-conn get (mysql-row) dup [       
+        ! my-conn get (mysql-num-cols) mysql-row>seq
+        ! over push
+        ! (mysql-result>seq)
+    ! ] [ drop ] if 
+    ! ! Perform needed cleanup on fetched results
+    ! my-conn get (mysql-free-result) ;
 
-: mysql-command ( query -- n )
-    mysql-query drop
-    my-conn get (mysql-affected-rows) ;
+! : mysql-query ( query -- ret )
+    ! >r my-conn get r> (mysql-query) drop
+    ! my-conn get (mysql-result) ;
 
-: with-mysql ( host user password db port quot -- )
-    [ 
-        >r <mysql-connection> my-conn set 
-            my-conn get mysql-connect drop r> 
-        [ my-conn get mysql-close ] cleanup
-    ] with-scope ; inline
+! : mysql-command ( query -- n )
+    ! mysql-query drop
+    ! my-conn get (mysql-affected-rows) ;
diff --git a/extra/db/mysql/mysql.factor b/extra/db/mysql/mysql.factor
index 8043bc2782..941c25e1fa 100644
--- a/extra/db/mysql/mysql.factor
+++ b/extra/db/mysql/mysql.factor
@@ -1,10 +1,12 @@
 ! Copyright (C) 2008 Doug Coleman.
 ! See http://factorcode.org/license.txt for license.
 USING: alien continuations io kernel prettyprint sequences
-db ;
+db db.mysql.ffi ;
 IN: db.mysql
 
 TUPLE: mysql-db handle host user password db port ;
+TUPLE: mysql-statement ;
+TUPLE: mysql-result-set ;
 
 M: mysql-db db-open ( mysql-db -- )
     ;
@@ -13,3 +15,44 @@ M: mysql-db dispose ( mysql-db -- )
     mysql-db-handle mysql_close ;
 
 
+M: mysql-db <simple-statement> ( str -- statement )
+    ;
+
+M: mysql-db <prepared-statement> ( str -- statement )
+    ;
+
+M: mysql-statement prepare-statement ( statement -- )
+    ;
+
+M: mysql-statement bind-statement* ( statement -- )
+    ;
+
+M: mysql-statement rebind-statement ( statement -- )
+    ;
+
+M: mysql-statement execute-statement ( statement -- )
+    ;
+
+M: mysql-statement query-results ( query -- result-set )
+    ;
+
+M: mysql-result-set #rows ( result-set -- n )
+    ;
+
+M: mysql-result-set #columns ( result-set -- n )
+    ;
+
+M: mysql-result-set row-column ( result-set n -- obj )
+    ;
+
+M: mysql-result-set advance-row ( result-set -- ? )
+    ;
+
+M: mysql-db begin-transaction ( -- )
+    ;
+
+M: mysql-db commit-transaction ( -- )
+    ;
+
+M: mysql-db rollback-transaction ( -- )
+    ;