diff --git a/ChangeLog b/ChangeLog
index d28194e..f288755 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
-0.001 - 03 May 2013
+0.002	2013-09-25
+    - add some documentation
+    - Do not share 'o' for Oracle ('o') and ODBC (now 'd')
+    - Do not force DBI_PURE_PERL
 
-    * Initial release
+0.001	2013-08-06
+    - Initial release
diff --git a/DBI-TEST.SKIP b/DBI-TEST.SKIP
index 9998e8b..6719a0f 100644
--- a/DBI-TEST.SKIP
+++ b/DBI-TEST.SKIP
@@ -1 +1,2 @@
+t/attributes/.*\.t
 t/basic/.*\.t
diff --git a/MANIFEST b/MANIFEST
index e9127c0..b2b8032 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -4,6 +4,7 @@ DESIGN.md
 lib/DBI/Mock.pm
 lib/DBI/Test.pm
 lib/DBI/Test/Case.pm
+lib/DBI/Test/Case/attributes/Error.pm
 lib/DBI/Test/Case/attributes/PrintError.pm
 lib/DBI/Test/Case/attributes/Warn.pm
 lib/DBI/Test/Case/basic/bind_columns.pm
@@ -22,6 +23,8 @@ lib/DBI/Test/DSN/Provider/File.pm
 lib/DBI/Test/List.pm
 Makefile.PL
 MANIFEST
+misc/DESIGN.md
+misc/GOAL.md
 README.md
 META.yml                                 Module YAML meta-data (added by MakeMaker)
 META.json                                Module JSON meta-data (added by MakeMaker)
diff --git a/META.json b/META.json
index 0b52fb9..6003298 100644
--- a/META.json
+++ b/META.json
@@ -4,13 +4,13 @@
       "The DBI team <dbi-dev@perl.org>"
    ],
    "dynamic_config" : 1,
-   "generated_by" : "ExtUtils::MakeMaker version 6.72, CPAN::Meta::Converter version 2.131560",
+   "generated_by" : "ExtUtils::MakeMaker version 7.62, CPAN::Meta::Converter version 2.150010",
    "license" : [
       "perl_5"
    ],
    "meta-spec" : {
       "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
-      "version" : "2"
+      "version" : 2
    },
    "name" : "DBI-Test",
    "no_index" : {
@@ -45,5 +45,6 @@
          "url" : "https://github.com/perl5-dbi/DBI-Test"
       }
    },
-   "version" : "0.001"
+   "version" : "0.002",
+   "x_serialization_backend" : "JSON::PP version 4.06"
 }
diff --git a/META.yml b/META.yml
index 37edb38..06e1110 100644
--- a/META.yml
+++ b/META.yml
@@ -3,23 +3,24 @@ abstract: 'Test suite for DBI API'
 author:
   - 'The DBI team <dbi-dev@perl.org>'
 build_requires:
-  Test::Simple: 0.90
+  Test::Simple: '0.90'
 configure_requires:
-  ExtUtils::MakeMaker: 0
+  ExtUtils::MakeMaker: '0'
 dynamic_config: 1
-generated_by: 'ExtUtils::MakeMaker version 6.72, CPAN::Meta::Converter version 2.131560'
+generated_by: 'ExtUtils::MakeMaker version 7.62, CPAN::Meta::Converter version 2.150010'
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
-  version: 1.4
+  version: '1.4'
 name: DBI-Test
 no_index:
   directory:
     - t
     - inc
 requires:
-  perl: 5.008001
+  perl: '5.008001'
 resources:
   license: http://dev.perl.org/licenses/
   repository: https://github.com/perl5-dbi/DBI-Test
-version: 0.001
+version: '0.002'
+x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff --git a/debian/changelog b/debian/changelog
index 1964c5b..c615f5f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,4 @@
-libdbi-test-perl (0.001-2) UNRELEASED; urgency=medium
+libdbi-test-perl (0.001+git20140316.1.297a33a-1) UNRELEASED; urgency=medium
 
   [ Salvatore Bonaccorso ]
   * debian/control: Use HTTPS transport protocol for Vcs-Git URI
@@ -12,7 +12,10 @@ libdbi-test-perl (0.001-2) UNRELEASED; urgency=medium
   [ gregor herrmann ]
   * debian/watch: use uscan version 4.
 
- -- Salvatore Bonaccorso <carnil@debian.org>  Sat, 30 Jan 2016 20:03:54 +0100
+  [ Debian Janitor ]
+  * New upstream snapshot.
+
+ -- Salvatore Bonaccorso <carnil@debian.org>  Thu, 17 Mar 2022 21:24:38 -0000
 
 libdbi-test-perl (0.001-1.1) unstable; urgency=medium
 
diff --git a/lib/DBI/Mock.pm b/lib/DBI/Mock.pm
index 510ce36..86b7268 100644
--- a/lib/DBI/Mock.pm
+++ b/lib/DBI/Mock.pm
@@ -5,6 +5,8 @@ use warnings;
 
 use Carp qw(carp confess);
 
+our $VERSION = "0.002";
+
 sub _set_isa
 {
     my ( $classes, $topclass ) = @_;
@@ -483,7 +485,7 @@ sub _miss_dbi
     defined $_have_dbi and return !$_have_dbi;
     $_have_dbi = 0;
     eval qq{
-	\$ENV{DBI_PUREPERL} = 2; # we only want to know if it's there ...
+	#\$ENV{DBI_PUREPERL} = 2; # we only want to know if it's there ...
 	require DBI;
 	\$_have_dbi = 1;
     };
@@ -523,7 +525,6 @@ This module is a team-effort. The current team members are
   H.Merijn Brand   (Tux)
   Jens Rehsack     (Sno)
   Peter Rabbitson  (ribasushi)
-  Joakim TE<0x00f8>rmoen   (trmjoa)
 
 =head1 COPYRIGHT AND LICENSE
 
diff --git a/lib/DBI/Test.pm b/lib/DBI/Test.pm
index 52ae060..24f88f0 100644
--- a/lib/DBI/Test.pm
+++ b/lib/DBI/Test.pm
@@ -10,7 +10,7 @@ use Test::More import => [ '!pass' ];
 
 use parent qw(Test::Builder::Module Exporter);
 
-our $VERSION = "0.001";
+our $VERSION = "0.002";
 
 # XXX improve / beautify ... map {} + categories ...
 our @EXPORT = qw(connect_ok connect_not_ok prepare_ok execute_ok execute_not_ok do_ok do_not_ok);
@@ -105,6 +105,9 @@ In Makefile.PL:
     use DBI::Test::Conf ();
     my @generated_tests = DBI::Test::Conf->setup();
     WriteMakefile (
+        configure_requires => {
+	    'DBI::Test' => '0.002',
+	},
         test => {
 	    TESTS           => join (' ' => 'xt/*.t', @generated_tests),
         },
@@ -219,30 +222,11 @@ The value got from $dbh-E<gt>do / $sth-E<gt>execute is returned.
 do_not_ok invokes $dbh->do and proves the result via I<is(undef)>.
 The value got from $dbh-E<gt>do / $sth-E<gt>execute is returned.
 
-=head1 GOAL
-
-=head2 TODO
-
-=head2 Source
-
-Recent changes can be (re)viewed in the public GIT repository at
-GitHub L<https://github.com/perl5-dbi/DBI-Test>
-Feel free to clone your own copy:
-
- $ git clone https://github.com/perl5-dbi/DBI-Test.git DBI-Test
-
-=head2 Contact
-
-We are discussing issues on the DBI development mailing list 1) and on IRC 2)
-
- 1) The DBI team <dbi-dev@perl.org>
- 2) irc.perl.org/6667 #dbi
-
 =head1 SUPPORT
 
 You can find documentation for this module with the perldoc command.
 
-    perldoc SQL::Statement
+    perldoc DBI::Test
 
 You can also look for information at:
 
@@ -266,6 +250,13 @@ L<http://search.cpan.org/dist/DBI-Test/>
 
 =back
 
+=head2 Contact
+
+We are discussing issues on the DBI development mailing list 1) and on IRC 2)
+
+ 1) The DBI team <dbi-dev@perl.org>
+ 2) irc.perl.org/6667 #dbi
+
 =head2 Reporting bugs
 
 If you think you've found a bug then please read
@@ -283,14 +274,6 @@ DBI::Test comes with some basic tests to test itself and L<DBI::Mock>.
 The same tests are used for basic DBI self-tests as well as testing the
 SQL::Statement mock driver.
 
-=head1 EXAMPLES
-
-??? Synopsis ???
-
-=head1 DIAGNOSTICS
-
-???
-
 =head1 SEE ALSO
 
  DBI        - Database independent interface for Perl
@@ -304,7 +287,6 @@ This module is a team-effort. The current team members are
   H.Merijn Brand   (Tux)
   Jens Rehsack     (Sno)
   Peter Rabbitson  (ribasushi)
-  Joakim TE<0x00f8>rmoen   (trmjoa)
 
 =head1 COPYRIGHT AND LICENSE
 
diff --git a/lib/DBI/Test/Case.pm b/lib/DBI/Test/Case.pm
index 159a8a0..a0e5471 100644
--- a/lib/DBI/Test/Case.pm
+++ b/lib/DBI/Test/Case.pm
@@ -5,6 +5,8 @@ use warnings;
 
 use DBI::Mock ();
 
+our $VERSION = "0.002";
+
 sub requires_extended { 0 }
 
 sub is_test_for_mocked
@@ -61,4 +63,133 @@ sub supported_variant
     return 1;
 }
 
+=head1 NAME
+
+DBI::Test::Case - base class for every test case written to be run in DBI::Test
+
+=head1 SYNOPSIS
+
+    package DBI::Test::Case::namespace::test::case;
+
+    use strict;
+    use warnings;
+
+    use parent qw(DBI::Test::Case);
+
+    use Test::More;
+    use DBI::Test;
+
+    sub filter_drivers
+    {
+	my ( $self, $options, @test_dbds ) = @_;
+
+	# do own filterring and return a decision when made
+	...
+
+	# if still in doubt:
+	return $self->SUPER::filter_drivers($options, @test_dbds);
+    }
+
+    sub supported_variant
+    {
+	my ( $self, $test_case, $cfg_pfx, $test_confs, $dsn_pfx, $dsn_cred, $options ) = @_;
+
+	# is that combination of options and driver settings suitable for this test case?
+	...
+
+	# if still in doubt (allows handling of requires_extended, ...):
+	return $self->SUPER::supported_variant($test_case, $cfg_pfx, $test_confs, $dsn_pfx, $dsn_cred, $options);
+    }
+
+    sub run_tests
+    {
+	my ( $self, $dsn_creds ) = @_;
+	my @connect_args = @{$dsn_creds}; 
+
+	SKIP: {
+	    my $dbh = connect_ok(@connect_args, "connect to db") or skip("connect failed", 1);
+	    my $sth = prepare_ok($dbh, query, "prepare sample query") or skip("prepare failed", 1);
+	    execute_ok($sth, @params, "execute sample query");
+	};
+    }
+
+=head1 DESCRIPTION
+
+This is the base class for all test cases which will be populated via
+DBI::Test. Intension of this class is providing base defaults for the
+decisions when a test case is populated for what configuration.
+
+=head1 METHODS
+
+=over 4
+
+=item I<requires_extended>
+
+This method is called during the test population and tells the
+L<DBI::Test::DSN::Provider> whether extended tests for different
+driver attribute variants shall be generated.
+
+For example, think of generic C<type_info> tests on L<DBD::CSV> - it
+doesn't make a difference whether it runs with L<DBI::SQL::Nano> or
+L<SQL::Statement>, neither if L<Text::CSV_XS> or L<Text::CSV> is
+used for parsing.
+
+But it makes differences when proving C<ChopBlanks> behavior, because
+the underlying engine influences return values.
+
+=item I<is_test_for_mocked>
+
+    test::case->is_test_for_mocked($test_confs);
+
+This method returns a true value when the given test_confs are for
+a configuration relying on L<DBI::Mock>.
+
+=item I<is_test_for_dbi>
+
+    test::case->is_test_for_dbi($test_confs);
+
+This method returns a true value when the given test_confs are for
+a configuration relying on L<DBI>.
+
+=item I<filter_drivers>
+
+This method is called by L<DBI::Test::Conf/populate_tests> to remove
+DBI drivers which aren't supposed to be tested in this incarnation.
+
+    test::case->filter_drivers( $options, @test_drivers )
+
+The options are those C<%params> L<DBI::Test::Conf/setup> got when
+invoked from C<Makefile.PL>.
+
+=item I<supported_variant>
+
+This method is finally called before a test is really populated to
+a directory. When this method returns a false value, L<DBI::Test::Conf>
+jumps to the next in line.
+
+=item I<run_tests>
+
+This method is called from the populated test (I<*.t> file) with the
+DSN and credentials as one and only argument.
+
+=back
+
+=head1 AUTHOR
+
+This module is a team-effort. The current team members are
+
+  H.Merijn Brand   (Tux)
+  Jens Rehsack     (Sno)
+  Peter Rabbitson  (ribasushi)
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C)2013 - The DBI development team
+
+You may distribute this module under the terms of either the GNU
+General Public License or the Artistic License, as specified in
+the Perl README file.
+
+=cut
+
 1;
diff --git a/lib/DBI/Test/Case/attributes/Error.pm b/lib/DBI/Test/Case/attributes/Error.pm
new file mode 100644
index 0000000..aff44c9
--- /dev/null
+++ b/lib/DBI/Test/Case/attributes/Error.pm
@@ -0,0 +1,88 @@
+package DBI::Test::Case::attributes::Error;
+
+use strict;
+use warnings;
+use parent qw(DBI::Test::Case);
+
+use Data::Dumper;
+
+use Test::More;
+use DBI::Test;
+
+our $VERSION = "0.002";
+
+sub supported_variant
+{
+    my ( $self, $test_case, $cfg_pfx, $test_confs, $dsn_pfx, $dsn_cred, $options ) = @_;
+    if ( $self->is_test_for_mocked($test_confs) )
+    {
+        # XXX this means, SQL::Statement's DSN-Provider for NullP should extend
+        #     the delivered DSN creds with the attribute below.
+              defined $dsn_cred->[3]
+          and defined $dsn_cred->[3]->{RootClass}
+          and $dsn_cred->[3]->{RootClass} eq "SQL::Statement::Test"
+          and return 1;
+        return;
+    }
+
+    $dsn_cred->[0] =~ m/NullP/ and return;
+
+    # there is only DBI and DBI::Mock ...
+    return if ( scalar grep { $_->{abbrev} eq "g" } @$test_confs );    # skip Gofer proxying
+
+    return 1;
+}
+
+sub run_test
+{
+    my @DB_CREDS = @{ $_[1] };
+
+    $DB_CREDS[3]->{PrintError} = 0;
+    $DB_CREDS[3]->{RaiseError} = 0;
+
+    my $dbh = connect_ok(
+                          @DB_CREDS,
+                          "Connect to "
+                            . Data::Dumper->new( [ \@DB_CREDS ] )->Indent(0)->Sortkeys(1)
+                            ->Quotekeys(0)->Terse(1)->Dump()
+                        );
+
+    eval { $dbh->prepare("Junk"); };
+    ok( !$@, 'Parse "Junk" RaiseError=0 (default)' ) or diag($@);
+
+  SKIP:
+    {
+        # skip this test for DBI::SQL::Nano and ExampleP
+	$DB_CREDS[0] =~ m/(?:ExampleP)/ and skip( "ExampleP doesn't do functions", 1 );
+        $dbh->FETCH("sql_handler")
+          and $dbh->FETCH("sql_handler") eq "DBI::SQL::Nano"
+          and skip( "Nano doesn't do functions", 1 );
+	  diag($dbh->{sql_handler});
+        eval { $dbh->do("SELECT UPPER('a')"); };
+        ok( !$@,           'Execute function succeeded' ) or diag($@);
+        ok( !$dbh->errstr, 'Execute function no errstr' ) or diag( $dbh->errstr );
+    }
+
+    eval { $dbh->do("SELECT * FROM nonexistant"); };
+    ok( !$@, 'Execute RaiseError=0' ) or diag($@);
+
+    $DB_CREDS[3]->{RaiseError} = 1;
+    $dbh = connect_ok(
+                       @DB_CREDS,
+                       "Connect to "
+                         . Data::Dumper->new( [ \@DB_CREDS ] )->Indent(0)->Sortkeys(1)
+                         ->Quotekeys(0)->Terse(1)->Dump()
+                     );
+    eval { $dbh->prepare("Junk"); };
+    ok( $@, 'Parse "Junk" RaiseError=1' );
+    {
+        eval { $dbh->do("SELECT * FROM nonexistant"); };
+        ok( $@,             'Execute RaiseError=1' );
+        ok( $dbh->errstr(), 'Execute "SELECT * FROM nonexistant" has errstr' )
+          or diag( $dbh->errstr() );
+    }
+
+    done_testing();
+}
+
+1;
diff --git a/lib/DBI/Test/Case/attributes/PrintError.pm b/lib/DBI/Test/Case/attributes/PrintError.pm
deleted file mode 100644
index 68c773d..0000000
--- a/lib/DBI/Test/Case/attributes/PrintError.pm
+++ /dev/null
@@ -1,71 +0,0 @@
-use strict;
-use warnings;
-use Test::More;
-
-our @DB_CREDS = ('dbi:SQLite::memory:', undef, undef, {});
-my %SQLS = (
-  'SELECT' => 'SELECT a, b FROM x',
-  'SELECT_ZERO_ROWS' => 'SELECT a, b FROM x WHERE 1 == 2',
-  'INSERT' => undef
-);
-
-my $a;
-my %methods = (
-  dbh => {
-    prepare => [$SQLS{SELECT}],
-    prepare_cached => [$SQLS{SELECT}],
-    disconnect => []
-  },
-  sth => {
-    bind_columns => [\$a],
-    execute => []
-  }
-);
-
-{ #Testing PrintError on dbh methods failure
-  my $dbh = DBI->connect( @DB_CREDS[0..2], {} );
-  isa_ok($dbh, 'DBI::db');
-  
-  my @warnings = ();
-  
-  #Make sure we fetch the local
-  local $SIG{__WARN__} = sub {
-    push(@warnings, shift());
-  };  
-
-  TODO : {
-    local $TODO = "Need to make dbh methods fail";
-    while( my ($dbh_method, $dbh_args) = each %{ $methods{dbh} } ){
-      ok(!$dbh->$dbh_method( @{$dbh_args} ), '$dbh->' . $dbh_method . '() fails');
-    }
-  }
-  cmp_ok(scalar(@warnings), '==', scalar(keys %{ $methods{dbh} }), 'Recorded ' . scalar( keys %{ $methods{dbh} }) . ' warnings');
-}
-
-{ #Testing PrintError on sth methods failure
-  my $dbh = DBI->connect( @DB_CREDS[0..2], {} );
-  isa_ok($dbh, 'DBI::db');
-  
-  #TO BE REMOVED
-  $dbh->do("CREATE TABLE x(a INTEGER PRIMARY KEY, b INTEGER)") or die $DBI::errstr;
-  
-  my $sth = $dbh->prepare($SQLS{SELECT});
-  isa_ok($sth, 'DBI::st');
-  my @warnings = ();
-  
-  #Make sure we fetch the local
-  local $SIG{__WARN__} = sub {
-    push(@warnings, shift());
-  };  
-
-  TODO : {
-    local $TODO = "Need to make sth methods fail";
-    while( my ($sth_method, $sth_args) = each %{ $methods{sth} } ){
-      ok($sth->$sth_method( @{ $sth_args } ), '$sth->' . $sth_method . '() fails');
-    }
-  }
-  cmp_ok(scalar(@warnings), '==', scalar( keys %{ $methods{sth} }), 'Recorded ' . scalar( keys %{ $methods{sth} }) . ' warnings');
-  
-}
-
-done_testing();
\ No newline at end of file
diff --git a/lib/DBI/Test/Case/attributes/Warn.pm b/lib/DBI/Test/Case/attributes/Warn.pm
index 093eb69..714d196 100644
--- a/lib/DBI/Test/Case/attributes/Warn.pm
+++ b/lib/DBI/Test/Case/attributes/Warn.pm
@@ -1,19 +1,25 @@
+package DBI::Test::Case::attributes::Warn;
+
 use strict;
 use warnings;
+use parent qw(DBI::Test::Case);
+
 use Test::More;
+use DBI::Test;
 
-our @DB_CREDS = ('dbi:SQLite::memory:', undef, undef, { AutoCommit => 0});
-my %SQLS = (
-  'SELECT' => 'SELECT 1+1',
-  'INSERT' => undef
-);
+our $VERSION = "0.002";
 
-{ #Check that warn is enabled by default
+#Check that warn is enabled by default
+sub run_test
+{
+    my @DB_CREDS = @{$_[1]};
+
+    my $dbh = connect_ok (@DB_CREDS, "basic connect");
   
-  my $dbh = DBI->connect( @DB_CREDS[0..2], {} );
-  isa_ok($dbh, 'DBI::db');
-  ok($dbh->{Warn}, '$dbh->{Warn} is true');
-  ok($dbh->FETCH('Warn'), '$dbh->FETCH(Warn) is true');
+    ok($dbh->{Warn}, '$dbh->{Warn} is true');
+    ok($dbh->FETCH('Warn'), '$dbh->FETCH(Warn) is true');
+
+    done_testing();
 }
 
-done_testing();
\ No newline at end of file
+1;
diff --git a/lib/DBI/Test/Case/basic/bind_columns.pm b/lib/DBI/Test/Case/basic/bind_columns.pm
deleted file mode 100644
index 1ca265b..0000000
--- a/lib/DBI/Test/Case/basic/bind_columns.pm
+++ /dev/null
@@ -1,155 +0,0 @@
-use strict;
-use warnings;
-use Test::More;
-
-our @DB_CREDS = ('dbi:SQLite::memory:', undef, undef, {});
-my %SQLS = (
-  'SELECT' => 'SELECT a, b FROM x',
-  'INSERT' => 'INSERT 1'
-);
-
-
-my $dbh = DBI->connect( @DB_CREDS );
-isa_ok($dbh, 'DBI::db');
-#TO BE REMOVED
-$dbh->do("CREATE TABLE x(a INTEGER PRIMARY KEY, b INTEGER)") or die $DBI::errstr;
-
-{  
-  TODO : {
-    local $TODO = "Must be able to mock fetch to change variables to a certain value";
-    my ($a, $b);
-    my $sth = $dbh->prepare($SQLS{SELECT});
-    $sth->execute;
-    
-    # Bind Perl variables to columns:
-    ok($sth->bind_columns(\$a, \$b), 'bind_columns');
-  
-    #Need to mock the fetch method
-    
-    #Q : Where is the fetch method documented. Return values?
-    $sth->fetch();
-    
-    cmp_ok($a, 'eq', 'a', '$a eq a');
-    cmp_ok($b, 'eq', 'b', '$b eq b')
-  }
-}
-
-{ #Same test as above, just with a different perl reference syntax. See perlref
-  # and DBI fetch example
-  
-  TODO : {
-    local $TODO = "Must be able to mock fetch to change variables to a certain value";
-    my ($a, $b);
-    my $sth = $dbh->prepare($SQLS{SELECT});
-    isa_ok($sth, 'DBI::st');
-    ok($sth->execute(), 'execute');
-    
-    # Bind Perl variables to columns:
-    ok($sth->bind_columns(\($a, $b)), 'bind_columns');
-  
-    #Need to mock the fetch method
-    
-    #Q : Where is the fetch method documented. Return values?
-    $sth->fetch();
-    
-    cmp_ok($a, 'eq', 'a', '$a eq a');
-    cmp_ok($b, 'eq', 'b', '$b eq b')
-  }
-}
-
-{ # For compatibility with old scripts, the first parameter will be ignored if it is undef or a hash reference.
-
-  TODO : {
-    local $TODO = "Must be able to mock fetch to change variables to a certain value";
-    my $a = {};
-    my $b;
-    
-    my $sth = $dbh->prepare($SQLS{SELECT});
-    isa_ok($sth, 'DBI::st');
-    ok($sth->execute(), 'execute');
-    
-    # Bind Perl variables to columns:
-    ok($sth->bind_columns(\($a, $b)), 'bind_columns');
-  
-    #Need to mock the fetch method
-    
-    #Q : Where is the fetch method documented. Return values?
-    $sth->fetch();
-    
-    is_deeply($a, {}, '$a is {}');
-    cmp_ok($b, 'eq', 'b', '$b eq b')
-  }  
-}
-
-{ # For compatibility with old scripts, the first parameter will be ignored if it is undef or a hash reference.
-
-  TODO : {
-    local $TODO = "Must be able to mock fetch to change variables to a certain value";
-    my $a = undef;
-    my $b;
-    
-    my $sth = $dbh->prepare($SQLS{SELECT});
-    isa_ok($sth, 'DBI::st');
-    ok($sth->execute(), 'execute');
-    
-    # Bind Perl variables to columns:
-    ok($sth->bind_columns(\($a, $b)), 'bind_columns');
-  
-    #Need to mock the fetch method
-    
-    #Q : Where is the fetch method documented. Return values?
-    $sth->fetch();
-    
-    ok(!$a, '$a is undef');
-    cmp_ok($b, 'eq', 'b', '$b eq b')
-  }  
-}
-
-{ #Negative case. bind_columns fails
-  my $dbh = DBI->connect( @DB_CREDS[0..2], {} ); #The PrintError is default to true
-  isa_ok($dbh, 'DBI::db');
-  
-  #TO BE REMOVED
-  $dbh->do("CREATE TABLE x(a INTEGER PRIMARY KEY, b INTEGER)") or die $DBI::errstr;
-
-  TODO : {
-    local $TODO = "Must be able to mock bind_columns to fail";
-    my ($a, $b);
-    my $sth = $dbh->prepare($SQLS{SELECT});
-    isa_ok($sth, 'DBI::st');
-    ok($sth->execute(), 'execute');
-    
-    my $warnings = 0;
-  
-    #Make sure we fetch the local
-    local $SIG{__WARN__} = sub {
-      $warnings++; #TODO : Must be the correct warning
-    };  
-    
-    # Bind Perl variables to columns:
-    ok(!$sth->bind_columns(\$a, \$b), 'bind_columns');
-    cmp_ok($warnings, '>', 0, "warning displayed");
-  }  
-}
-
-{ #Negative case. bind_columns fails with RaiseError
-  my $dbh = DBI->connect( @DB_CREDS[0..2], { RaiseError => 1 } );
-  isa_ok($dbh, 'DBI::db');
-  
-  #TO BE REMOVED
-  $dbh->do("CREATE TABLE x(a INTEGER PRIMARY KEY, b INTEGER)") or die $DBI::errstr;
-
-  TODO : {
-    local $TODO = "Must be able to mock bind_columns to fail";
-    my ($a, $b);
-    my $sth = $dbh->prepare($SQLS{SELECT});
-    isa_ok($sth, 'DBI::st');
-    
-    ok($sth->execute(), 'execute');
-    
-    # Bind Perl variables to columns:
-    eval{ $sth->bind_columns(\$a, \$b); };
-    ok($@, 'bind_columns died');
-  }  
-}
-done_testing();
\ No newline at end of file
diff --git a/lib/DBI/Test/Case/basic/connect.pm b/lib/DBI/Test/Case/basic/connect.pm
index b9592df..d0f1236 100644
--- a/lib/DBI/Test/Case/basic/connect.pm
+++ b/lib/DBI/Test/Case/basic/connect.pm
@@ -8,93 +8,94 @@ use parent qw(DBI::Test::Case);
 use Test::More;
 use DBI::Test;
 
+our $VERSION = "0.002";
+
+# Look for optional tests if you find ways to make the tests pass/fail
+# e.g. currently it rather hard to make disconnect or connect fail in
+# ways we would want to test.
+our $optional_tests = 0;
+
 sub run_test
 {
     my @DB_CREDS = @{$_[1]};
 
-    {
-        my $dbh = connect_ok( @DB_CREDS, "basic connect" );
-
-        #Active should be true when you are connected
-        #disconnect set Active to false
-        ok( $dbh->{Active}, "dbh is active" );
-    }
-
-    {    #Testing that the connect attributes are correctly set
-      SKIP:
-        {
-            skip "No attributes provided", 1
-              if ( !defined $DB_CREDS[3] || ref( $DB_CREDS[3] ) ne 'HASH' );
-
-            my $dbh = connect_ok( @DB_CREDS, "basic connect" );
-
-            #Check the $dbh->{Attribute} and $dbh->FETCH('Attribute') interface
-            foreach my $attr ( keys %{ $DB_CREDS[3] } )
-            {
-                is( $dbh->{$attr},
-                        $DB_CREDS[3]->{$attr},
-                        $attr . ' == ' . $DB_CREDS[3]->{$attr} );
-                is( $dbh->FETCH($attr),
-                        $DB_CREDS[3]->{$attr},
-                        $attr . ' == ' . $DB_CREDS[3]->{$attr} );
-            }
-        }
-    }
-
-    {    #Check some default values
-
-        my $dbh = connect_ok( @DB_CREDS[ 0 .. 2 ], {}, "connect without attr" );
-
-        for (qw(AutoCommit PrintError))
-        {
-            cmp_ok( $dbh->{$_},      '==', 1, $_ . ' == 1' );
-            cmp_ok( $dbh->FETCH($_), '==', 1, $_ . ' == 1' );
-        }
-
-      TODO:
-        {
-            #Seems like $^W doesnt honor the use warnings pragma.. Is PrintWarn affected by the pragma, or only the -w cmd flag?
-            local $TODO = "PrintWarn should default to true if warnings is enabled. How to check?";
-            diag '$^W= ' . $^W . "\n";
-            cmp_ok( $dbh->{PrintWarn}, '==',
-                    ( ($^W) ? 1 : 0 ),
-                    'PrintWarn == ' . ( ($^W) ? 1 : 0 ) );
-        }
-    }
-
-    {    #Negative test
-
-        #Use a fake dsn that does not exists
-        #TODO : Using a invalid dsn does not work. Drivers like SQLite etc will just create a file with that name
-        #It isnt so simple we will have to use a DBD that is available. Or do we do them all?
-      TODO:
-        {
-            local $TODO =
-              "How to make the connect fail. Just using a wrong dsn doesnt seem to cut it";
-
-            #TODO, make this more portable
-            my $dsn = $DB_CREDS[0];
-            $dsn =~ s/(dbi:[A-Za-z_\-0-9]+::).+/$1/; $dsn .= "invalid_db";
-
-            #PrintError is on by default, so we should check that we can intercept a warning
-            my $warnings = 0;
-
-            #TODO : improve this
-            local $SIG{__WARN__} = sub {
-                $warnings++;
-            };
-
-            connect_not_ok( $dsn, @DB_CREDS[ 1 .. 2 ], {}, "Connection failure" );
-
-            cmp_ok( $warnings, '>', 0, "warning displayed" );
-
-            ok( $DBI::err,    '$DBI::err defined' );
-            ok( $DBI::errstr, '$DBI::errstr defined' );
-        }
+    {	my $dbh = connect_ok (@DB_CREDS, "basic connect");
+
+	# Active should be true when you are connected
+	# disconnect set Active to false
+	ok ($dbh->{Active}, "dbh is active");
+	}
+
+    SKIP: {
+	# Testing that the connect attributes are correctly set
+	skip "No attributes provided", 1
+	    if (!defined $DB_CREDS[3] || ref ($DB_CREDS[3]) ne "HASH");
+
+	my $dbh = connect_ok (@DB_CREDS, "basic connect");
+
+	#Check the $dbh->{Attribute} and $dbh->FETCH('Attribute') interface
+	foreach my $attr (keys %{$DB_CREDS[3]}) {
+	    is ($dbh->{$attr},
+		$DB_CREDS[3]->{$attr},
+		$attr . " == " . $DB_CREDS[3]->{$attr});
+	    is ($dbh->FETCH ($attr),
+		$DB_CREDS[3]->{$attr},
+		$attr . " == " . $DB_CREDS[3]->{$attr});
+	    }
+	}
+
+    {   #Check some default values
+
+	my $dbh = connect_ok (@DB_CREDS[0 .. 2], {}, "connect without attr");
+
+	for (qw(AutoCommit PrintError)) {
+	    cmp_ok ($dbh->{$_}, "==", 1, $_ . " == 1");
+	    cmp_ok ($dbh->FETCH ($_), "==", 1, $_ . " == 1");
+	    }
+
+	if ($optional_tests) {
+	    TODO: {
+		#Seems like $^W doesnt honor the use warnings pragma.. Is PrintWarn affected by the pragma, or only the -w cmd flag?
+		local $TODO =
+		    "PrintWarn should default to true if warnings is enabled. How to check?";
+		diag '$^W= ' . $^W . "\n";
+		cmp_ok ($dbh->{PrintWarn}, "==", $^W ? 1 : 0,
+		    "PrintWarn == " . ($^W ? 1 : 0));
+		}
+	    }
+
+	if ($optional_tests) {
+	    TODO: {
+		# Negative test
+
+		# Use a fake dsn that does not exists
+		# TODO : Using a invalid dsn does not work. Drivers like SQLite etc will just create a file with that name
+		# It isnt so simple we will have to use a DBD that is available. Or do we do them all?
+		local $TODO =
+		    "How to make the connect fail. Just using a wrong dsn doesnt seem to cut it";
+
+		# TODO, make this more portable
+		my $dsn = $DB_CREDS[0];
+		$dsn =~ s/(dbi:[A-Za-z_\-0-9]+::).+/$1/;
+		$dsn .= "invalid_db";
+
+		# PrintError is on by default, so we should check that we can intercept a warning
+		my $warnings = 0;
+
+		# TODO : improve this
+		local $SIG{__WARN__} = sub { $warnings++; };
+
+		connect_not_ok ($dsn, @DB_CREDS[1 .. 2], {}, "Connection failure");
+
+		cmp_ok ($warnings, ">", 0, "warning displayed");
+
+		ok ($DBI::err,    '$DBI::err defined');
+		ok ($DBI::errstr, '$DBI::errstr defined');
+		}
+	    }
+	}
+
+    done_testing ();
     }
 
-    done_testing();
-
-}
-
 1;
diff --git a/lib/DBI/Test/Case/basic/disconnect.pm b/lib/DBI/Test/Case/basic/disconnect.pm
index 7d951ff..bad23ac 100644
--- a/lib/DBI/Test/Case/basic/disconnect.pm
+++ b/lib/DBI/Test/Case/basic/disconnect.pm
@@ -8,108 +8,117 @@ use parent qw(DBI::Test::Case);
 use Test::More;
 use DBI::Test;
 
-sub run_test
-{
-    my @DB_CREDS = @{ $_[1] };
-    my %SQLS = (
-                 'SELECT' => 'SELECT 1+1',
-                 'INSERT' => undef
-               );
-
-    {    #Basic test
-        my $dbh = connect_ok(@DB_CREDS, "basic connect");
-
-        ok( $dbh->disconnect(), "Disconnect" );
-
-        #Disconnect should clear the active flag of a database handle
-        ok( !$dbh->{Active}, 'dbh is inactive' );
-    }
-
-    SKIP:
-    {    #Test that disconnect prints a warning if it disconncets on an active statementhandler
-            #Q: Does it print an warning even though PrintWarn is false?
-        my $dbh = connect_ok(@DB_CREDS, "basic connect");
-	skip("Invalid SQL for some engines", 1);
-
-        #Create  statementhandler
-        my $sth = prepare_ok( $dbh, $SQLS{SELECT}, undef, "prepare $SQLS{SELECT}");    #TODO : some SELECT should go inside here, or?
-        execute_ok($sth, "execute $SQLS{SELECT}" );
-
-        my $warnings = 0;
-
-        #Make sure we fetch the local
-        local $SIG{__WARN__} = sub {
-            $warnings++ if ( shift() =~ m/^DBI::db/ );
-        };
-
-        #The statementhandler should have more rows to fetch
-        ok( $dbh->disconnect(), "Disconnect" );
-        # cmp_ok( $warnings, '>', 0, "Catched a warning" );
-    }
+our $VERSION = "0.002";
 
-    {    #Negative test
-            #TODO how should we force it to fail. Mock DBD\DBI?
+# Look for optional tests if you find ways to make the tests pass/fail
+# e.g. currently it rather hard to make disconnect or connect fail in
+# ways we would want to test.
+our $optional_tests = 0;
 
-      TODO:
-        {
-            local $TODO = "Must make an API to make the disconnecct fail";
-	    my $dbh = connect_ok(@DB_CREDS, "basic connect");
-
-            #Put code to make disconnect fail in here
-            ok( !$dbh->disconnect(), "Disconnect failure" );
-            #Check that $DBI::err && $DBI::errstr is set
-            #It should be set after a failed call
-            ok( $DBI::err,    '$DBI::err is set' );
-            ok( $DBI::errstr, '$DBI::errstr is set' );
-
-            #Disconnect failed. The Active flag should still be true
-            ok( $dbh->{Active}, 'dbh is still active' );
-        }
-
-    }
-
-    {    #Check that disconnect does print an error when PrintError is true
-            #TODO how should we force it to fail. Mock DBD\DBI?
-
-      TODO:
-        {
-            local $TODO = "Must make an API to make the disconnecct fail";
-	    my $dbh = connect_ok(@DB_CREDS[ 0 .. 2 ], { PrintError => 1 }, "connect with PrintError");
-
-            my @warnings = ();
-            #Make sure we fetch the local
-            local $SIG{__WARN__} = sub {
-                my ( $called_from, $warning ) = @_;    # to find out Carping methods
-                my $warn_kind = $called_from eq 'Carp' ? 'carped' : 'warn';
-                my @warning_stack = split /\n/, $warning;    # some stuff of uplevel is included
-                push( @warnings, $warning_stack[0] );
-            };
-
-            #TODO : force disconncet to fail
-
-            #Put code to make disconnect fail in here
-            ok( !$dbh->disconnect(), "Disconnect failure" );
-            cmp_ok( scalar(@warnings), '>', 1, "Warning recorded" );
-        }
-    }
-
-    {    #Check that disconnect does dies on fail when RaiseError is set
-            #TODO how should we force it to fail. Mock DBD\DBI?
-
-      TODO:
-        {
-            local $TODO = "Must make an API to make the disconnecct fail";
-            my $dbh = DBI->connect( @DB_CREDS[ 0 .. 2 ], { RaiseError => 1 } );
-            isa_ok( $dbh, 'DBI::db' );
-
-            #TODO : force disconncet to fail
-
-            #Put code to make disconnect fail in here
-            eval { $dbh->disconnect(); };
-            ok( $@, "Disconnect raised error" );
-        }
+sub run_test
+{
+    my @DB_CREDS = @{$_[1]};
+    my %SQLS     = (
+	SELECT => "SELECT 1+1",
+	INSERT => undef
+	);
+
+    {   # Basic test
+	my $dbh = connect_ok (@DB_CREDS, "basic connect");
+
+	ok ($dbh->disconnect (), "Disconnect");
+
+	# Disconnect should clear the active flag of a database handle
+	ok (!$dbh->{Active}, "dbh is inactive");
+	}
+
+    SKIP: {
+	# Test that disconnect prints a warning if it disconncets on an active statementhandler
+	# Q: Does it print an warning even though PrintWarn is false?
+	my $dbh = connect_ok (@DB_CREDS, "basic connect");
+	skip ("Invalid SQL for some engines", 1);
+
+	# Create  statementhandler
+	# TODO : some SELECT should go inside here, or?
+	my $sth = prepare_ok ($dbh, $SQLS{SELECT}, undef, "prepare $SQLS{SELECT}");
+	execute_ok ($sth, "execute $SQLS{SELECT}");
+
+	my $warnings = 0;
+
+	# Make sure we fetch the local
+	local $SIG{__WARN__} = sub {
+	    $warnings++ if (shift () =~ m/^DBI::db/);
+	    };
+
+	# The statementhandler should have more rows to fetch
+	ok ($dbh->disconnect (), "Disconnect");
+	# cmp_ok( $warnings, ">", 0, "Catched a warning" );
+	}
+
+    if ($optional_tests) {
+        # Negative test
+	# TODO how should we force it to fail. Mock DBD\DBI?
+
+	TODO: {
+	    local $TODO = "Must make an API to make the disconnecct fail";
+	    my $dbh = connect_ok (@DB_CREDS, "basic connect");
+
+	    # Put code to make disconnect fail in here
+	    ok (!$dbh->disconnect (), "Disconnect failure");
+	    # Check that $DBI::err && $DBI::errstr is set
+	    # It should be set after a failed call
+	    ok ($DBI::err,    '$DBI::err is set');
+	    ok ($DBI::errstr, '$DBI::errstr is set');
+
+	    # Disconnect failed. The Active flag should still be true
+	    ok ($dbh->{Active}, "dbh is still active");
+	    }
+	}
+
+    if ($optional_tests) {
+	# Check that disconnect does print an error when PrintError is true
+	# TODO how should we force it to fail. Mock DBD\DBI?
+
+	TODO: {
+	    local $TODO = "Must make an API to make the disconnecct fail";
+	    my $dbh = connect_ok (@DB_CREDS[0 .. 2], { PrintError => 1 },
+		"connect with PrintError");
+
+	    my @warnings = ();
+	    # Make sure we fetch the local
+	    local $SIG{__WARN__} = sub {
+		my ($called_from, $warning) = @_;  # to find out Carping methods
+		my $warn_kind = $called_from eq "Carp" ? "carped" : "warn";
+		# some stuff of uplevel is included
+		my @warning_stack = split /\n/, $warning;
+		push @warnings, $warning_stack[0];
+		};
+
+	    # TODO : force disconncet to fail
+
+	    # Put code to make disconnect fail in here
+	    ok (!$dbh->disconnect (), "Disconnect failure");
+	    cmp_ok (scalar @warnings, ">", 1, "Warning recorded");
+	    }
+	}
+
+    if ($optional_tests) {
+        # Check that disconnect does dies on fail when RaiseError is set
+	# TODO how should we force it to fail. Mock DBD\DBI?
+
+	TODO: {
+	    local $TODO = "Must make an API to make the disconnecct fail";
+	    my $dbh = DBI->connect (@DB_CREDS[0 .. 2], {RaiseError => 1});
+	    isa_ok ($dbh, "DBI::db");
+
+	    # TODO : force disconncet to fail
+
+	    # Put code to make disconnect fail in here
+	    eval { $dbh->disconnect (); };
+	    ok ($@, "Disconnect raised error");
+	    }
+	}
+    done_testing ();
     }
-    done_testing();
-}
 
 1;
diff --git a/lib/DBI/Test/Case/basic/do.pm b/lib/DBI/Test/Case/basic/do.pm
deleted file mode 100644
index ecd9262..0000000
--- a/lib/DBI/Test/Case/basic/do.pm
+++ /dev/null
@@ -1,58 +0,0 @@
-use strict;
-use warnings;
-use Test::More;
-
-our @DB_CREDS = ('dbi:SQLite::memory:', undef, undef, {});
-my %SQLS = (
-  'SELECT' => 'SELECT a, b FROM x',
-  'SELECT_ZERO_ROWS' => 'SELECT a, b FROM x WHERE 1 = 2',
-  'INSERT' => 'INSERT INTO x VALUES(1, 1)',
-  'UPDATE' => 'UPDATE x SET a = 2',
-  'UPDATE_ZERO_ROWS' => 'UPDATE x SET a = 3 WHERE 1 = 2',
-  'DELETE' => 'DELETE FROM x WHERE b = 3',
-  'DELETE_ZERO_ROWS' => 'DELETE FROM x WHERE 1 = 2'
-);
-
-my $dbh = DBI->connect( @DB_CREDS );
-isa_ok($dbh, 'DBI::db');
-#TO BE REMOVED
-$dbh->do("CREATE TABLE x(a INTEGER, b INTERGER)") or die $DBI::errstr;  
-
-{ #A very basic case. Checks that do returns a true value
-  # Q: Do we need to test SELECT case?
-  
-  for( qw( SELECT SELECT_ZERO_ROWS INSERT UPDATE UPDATE_ZERO_ROWS) ){
-    my $retval = $dbh->do($SQLS{$_});
-    ok( $retval, 'dbh->do should return a true value');    
-  }
-}
-
-
-{ #Test that the driver returns 0E0 or -1 for 0 rows
- for( qw(UPDATE_ZERO_ROWS DELETE_ZERO_ROWS) ){
-  my $retval = $dbh->do($SQLS{$_});
-  ok( (defined $retval && ( $retval eq '0E0' || $retval == -1)) ? 1 : undef, '0E0 or -1 returned for zero rows query');  
- }
-}
-{ #Test that the driver return > 0 for a SELECT that gives rows
-  TODO : {
-    local $TODO = "Make sure the query return rows";
-    
-    for( qw(DELETE UPDATE INSERT) ){
-      my $retval = $dbh->do($SQLS{$_});
-      ok( (defined $retval && ( $retval > 0 || $retval == -1)) ? 1 : undef, 'return value for query with rows in result is > 0 or -1');
-    }
-  }
-}
-{ #Negative test. Check that do actually returns undef on failure
-  TODO : {
-    local $TODO = 'Make dbh->do fail';
-    
-    for( qw(INSERT UPDATE UPDATE_ZERO_ROWS DELETE DELETE_ZERO_ROWS SELECT SELECT_ZERO_ROWS) ){
-      ok(!$dbh->do($SQLS{$_}), 'dbh->do() returns undef');
-      ok($DBI::err, '$DBI::err is set on dbh->do failure');
-      ok($DBI::errstr, '$DBI::errstr is set on dbh->do failure');
-    }
-  }
-}
-done_testing();
\ No newline at end of file
diff --git a/lib/DBI/Test/Case/basic/execute.pm b/lib/DBI/Test/Case/basic/execute.pm
deleted file mode 100644
index 83a6119..0000000
--- a/lib/DBI/Test/Case/basic/execute.pm
+++ /dev/null
@@ -1,63 +0,0 @@
-use strict;
-use warnings;
-use Test::More;
-
-our @DB_CREDS = ('dbi:SQLite::memory:', undef, undef, {});
-my %SQLS = (
-  'SELECT' => 'SELECT 1+1',
-  'INSERT' => 'INSERT INTO x VALUES(1)'
-);
-
-my $dbh = DBI->connect( @DB_CREDS );
-isa_ok($dbh, 'DBI::db');
-#TO BE REMOVED
-$dbh->do("CREATE TABLE x(a INTEGER PRIMARY KEY)") or die $DBI::errstr;
-
-#Q : How does prepare deside the query type?
-{ #Basic test SELECT
-
-  my $sth = $dbh->prepare($SQLS{SELECT});
-  
-  ok($sth->execute(), "Execute sth");
-  
-  #According to the DBI doc NUM_OF_FIELDS should be larger then 0 after a SELECT statement
-  cmp_ok($sth->{NUM_OF_FIELDS}, '>', 0, 'NUM_OF_FIELDS > 0');
-  
-  #Make sure the Execute attribute is true after execution
-  ok($sth->{Executed}, 'sth executed is true after execution');
-}
-{ #Basic test INSERT
-
-  my $sth = $dbh->prepare($SQLS{INSERT});
-  
-  my $retval = $sth->execute();
-  #$retval should be either a digit or 0E0 after a execute of a non-SELECT statement
-  ok( (( defined $retval && ($retval eq '0E0' || $retval > 0)) ? 1 : undef ), 'returnvalue of execute is sane');
-  
-  #Make sure the Execute attribute is true after execution
-  ok($sth->{Executed}, 'sth execute is true after execution');
-}
-
-{ #Execute fails
-  TODO : {
-    local $TODO = "Must have an API to make execute fail";
-    my $dbh = DBI->connect( @DB_CREDS[0..2], {} );
-    isa_ok($dbh, 'DBI::db');
-  
-    #Do something so that prepare fails
-  
-    my $sth = $dbh->prepare($SQLS{SELECT});
-    ok(!$sth->execute(), "execute fails");
-    
-    #Check that the sth is not marked as Executed if the execution fails
-    ok(!$sth->{Executed}, "not marked as executed");
-    
-    #Check that $DBI::err && $DBI::errstr is set
-    #It should be set after a failed call
-    ok($DBI::err, '$DBI::err is set');
-    ok($DBI::errstr, '$DBI::errstr is set');    
-  }  
-  
-}
-
-done_testing();
\ No newline at end of file
diff --git a/lib/DBI/Test/Case/basic/prepare.pm b/lib/DBI/Test/Case/basic/prepare.pm
deleted file mode 100644
index bbdddd9..0000000
--- a/lib/DBI/Test/Case/basic/prepare.pm
+++ /dev/null
@@ -1,93 +0,0 @@
-package DBI::Test::Case::basic::prepare;
-
-use strict;
-use warnings;
-
-use parent qw(DBI::Test::Case);
-
-use Test::More;
-
-sub run_test
-{
-    my @DB_CREDS = @{ $_[1] };
-    my %SQLS = (
-                 'SELECT' => 'SELECT 1+1',
-                 'INSERT' => undef
-               );
-
-    {    #Basic test
-        my $dbh = DBI->connect(@DB_CREDS);
-        isa_ok( $dbh, 'DBI::db' );
-
-        my $sth;
-        eval { $sth = $dbh->prepare( $SQLS{SELECT} ); };
-        ok( !$@, "Prepared query" );
-      SKIP:
-        {
-            skip "Could not prepare query", 1 if !$sth;
-            isa_ok( $sth, 'DBI::st' );
-        }
-    }
-
-    {    #Prepare should fail
-
-      TODO:
-        {
-            local $TODO = "Must have an API to make prepare fail";
-            my $dbh = DBI->connect( @DB_CREDS[ 0 .. 2 ], {} );
-            isa_ok( $dbh, 'DBI::db' );
-
-            #Do something so that prepare fails
-
-            my $sth = $dbh->prepare( $SQLS{SELECT} );
-            ok( !$sth, "Prepared failed" );
-            #Check that $DBI::err && $DBI::errstr is set
-            #It should be set after a failed call
-            ok( $DBI::err,    '$DBI::err is set' );
-            ok( $DBI::errstr, '$DBI::errstr is set' );
-        }
-    }
-
-    {    #Prepare should print a warning if PrintError is set
-
-      TODO:
-        {
-            local $TODO = "Must have an API to make prepare fail";
-            my $dbh = DBI->connect( @DB_CREDS[ 0 .. 2 ], { PrintError => 1 } );
-            isa_ok( $dbh, 'DBI::db' );
-
-            my $warnings = 0;
-
-            #Make sure we fetch the local
-            local $SIG{__WARN__} = sub {
-                $warnings++;    #TODO : Must be the correct warning
-            };
-
-            #Do something so that prepare fails
-
-            my $sth = $dbh->prepare( $SQLS{SELECT} );
-            ok( !$sth, "prepare failed" );
-            cmp_ok( $warnings, '>', 0, "Recorded a warning" );
-        }
-    }
-    {                           #Prepare should die if RaiseError is set
-
-      TODO:
-        {
-            local $TODO = "Must have an API to make prepare fail";
-            my $dbh = DBI->connect( @DB_CREDS[ 0 .. 2 ], { RaiseError => 1 } );
-            isa_ok( $dbh, 'DBI::db' );
-
-            #Do something so that prepare fails
-
-            my $sth;
-            eval { $sth = $dbh->prepare( $SQLS{SELECT} ); };
-            ok( $@,    "prepare died" );
-            ok( !$sth, 'sth is undef' );
-        }
-    }
-
-    done_testing();
-}
-
-1;
diff --git a/lib/DBI/Test/Case/basic/type_info.pm b/lib/DBI/Test/Case/basic/type_info.pm
deleted file mode 100644
index c1e76d1..0000000
--- a/lib/DBI/Test/Case/basic/type_info.pm
+++ /dev/null
@@ -1,147 +0,0 @@
-use strict;
-use warnings;
-use Test::More;
-
-our @DB_CREDS = ('dbi:SQLite::memory:', undef, undef, {});
-
-# NOTES: This test is a draft. Need to figure out several things.
-# TODO : We should implement stricter tests for the datastructure keys
-
-my @required_keys = qw(
-TYPE_NAME DATA_TYPE COLUMN_SIZE
-LITERAL_PREFIX LITERAL_SUFFIX
-CREATE_PARAMS NULLABLE CASE_SENSITIVE
-SEARCHABLE UNSIGNED_ATTRIBUTE FIXED_PREC_SCALE
-AUTO_UNIQUE_VALUE LOCAL_TYPE_NAME MINIMUM_SCALE
-MAXIMUM_SCALE SQL_DATA_TYPE SQL_DATETIME_SUB
-NUM_PREC_RADIX INTERVAL_PRECISION );
-
-my $dbh = DBI->connect( @DB_CREDS );
-isa_ok($dbh, 'DBI::db');
-
-{ #Checks that type_info returns a list of hashrefs containing the correct keys
-  # if the method is called without arguments
-  my @data_without_args = $dbh->type_info(); #No argument should be passed
-  test_type_info( @data_without_args ); 
-}
-
-{ #Check that type_info() returns the same with no arguments as with argument SQL_ALL_TYPES
-  
-  #TODO import DBI constants
-  my @data_with_args = $dbh->type_info( DBI::SQL_ALL_TYPES );
-  
-  test_type_info(@data_with_args);
-  
-  #To be sure, match the two datastructures
-  my @data_without_args = $dbh->type_info();
-  is_deeply(\@data_without_args, \@data_with_args, "Calling type_info without and with argument is equal");
-}
-
-{ #If type_info is called with an arrayref as an argument, it should return
-  # the information from the first type in the array that has any matches  
-  TODO : {
-    local $TODO = 'Need to check that $sql_timestamp_type is correct';
-    my $sql_timestamp_type = $dbh->type_info( [ 99999, DBI::SQL_TIMESTAMP ] ); #99999 is a chosen number that hopefully is not defined by a DBI constant
-  }
-}
-
-
-sub test_type_info{
-  my @type_info_data = @_;
-  
-  #Check that each element in the array is a hashref with the correct keys
-  for( my $i = 0; $i < scalar(@type_info_data); $i++){
-    my $element = $type_info_data[$i];
-    
-    cmp_ok(ref($element), 'eq', 'HASH', 'Element #' . $i . ' is a hashref');
-    
-    #Testing that we have the required hashkeys
-    ok(exists $element->{$_}, 'Element #' . $i . ' has key ' . $_) for(@required_keys);
-    
-    #Check the TYPE_NAME
-    # TODO : Implement some sort of more specific check. Can we produce a list of valid TYPE_NAMES?
-    
-    #Check that DATA_TYPE has a valid integer value or undef
-    #TODO : This should be checked against DBI constant or something?
-    ok( !defined $element->{DATA_TYPE} || $element->{DATA_TYPE} =~ m/^\d+$/, 'DATA_TYPE is an integer');
-    
-    #Check that COLUMN_SIZE is an integer or undef
-    ok( !defined $element->{COLUMN_SIZE} || $element->{COLUMN_SIZE} =~ m/^\d+$/, 'COLUMN_SIZE is an integer');
-        
-    # TODO: Create a stricter test for this key
-    
-    #Check that NULLABLE is 0, empty string, 1 or 2
-    # Valid values are:
-    # undef - not set by the DBD
-    # 0 or an empty string = no
-    # 1 = yes
-    # 2 = unknown
-    ok(
-      !defined $element->{NULLABLE} ||
-      $element->{NULLABLE} eq '' ||
-      $element->{NULLABLE} =~ m/^(1|2)$/,
-      'NULLABLE is undef, empty string, 0, 1 or 2'
-    );
-    
-    #Check that SEARCHABLE is undef, 0, 1, 2 or 3
-    # Valid values:
-    # undef - Not set by the DBD
-    # 0 - Cannot be used in a WHERE clause
-    # 1 - Only with a LIKE predicate
-    # 2 - All comparison operators except LIKE
-    # 3 - Can be used in a WHERE clause with any comparison operator
-    
-    ok(
-      !defined $element->{SEARCHABLE} ||
-      $element->{SEARCHABLE} =~ m/^(0|1|2|3)$/,
-      'SEARCHABLE is undef, 0, 1, 2 or 3'
-    );
-    
-    
-    #If FIXED_PREC_SCALE is set MINIMUM_SCALE and MAXIMUM_SCALE should be equal
-    SKIP : {
-      skip 'FIXED_PREC_SCALE is undef', 1 if !$element->{FIXED_PREC_SCALE};
-      cmp_ok( $element->{MINIMUM_SCALE}, '==', $element->{MAXIMUM_SCALE}, 'MINIMUM_SCALE == MAXIMUM_SCALE');
-    }
-    
-    #Check that MINIMUM_SCALE is undef or an integer
-    ok( !defined $element->{MINIMUM_SCALE} || $element->{MINIMUM_SCALE} =~ m/^\d+$/, 'MINIMUM_SCALE is undef or integer');
-
-    #Check that MAXIMUM_SCALE is undef or an integer
-    ok( !defined $element->{MAXIMUM_SCALE} || $element->{MAXIMUM_SCALE} =~ m/^\d+$/, 'MAXIMUM_SCALE is undef or integer');
-    
-    #Check that SQL_DATA_TYPE is an integer
-    # TODO : Do a better test
-    ok(
-      !defined $element->{SQL_DATA_TYPE} ||
-      $element->{SQL_DATA_TYPE} =~ m/^\d+$/,
-      "SQL_DATA_TYPE is undef or integer"
-    );
-    
-    #Check that SQL_DATETIME_SUB is an integer
-    # TODO : Do a better test
-    ok(
-      !defined $element->{SQL_DATETIME_SUB} ||
-      $element->{SQL_DATETIME_SUB} =~ m/^\d+$/,
-      "SQL_DATETIME_SUB is undef or integer"
-    );
-    
-    #Check that NUM_PREC_RADIX is an integer
-    # TODO : Do a better test
-    ok(
-      !defined $element->{NUM_PREC_RADIX} ||
-      $element->{NUM_PREC_RADIX} =~ m/^\d+$/,
-      "NUM_PREC_RADIX is undef or integer"
-    );
-    
-    #Check that INTERVAL_PRECISION is an integer
-    # TODO : Do a better test
-    ok(
-      !defined $element->{INTERVAL_PRECISION} ||
-      $element->{INTERVAL_PRECISION} =~ m/^\d+$/,
-      "INTERVAL_PRECISION is undef or integer"
-    );    
-  }
-}
-
-done_testing();
\ No newline at end of file
diff --git a/lib/DBI/Test/Conf.pm b/lib/DBI/Test/Conf.pm
index 75e6e70..5db5b10 100644
--- a/lib/DBI/Test/Conf.pm
+++ b/lib/DBI/Test/Conf.pm
@@ -17,6 +17,8 @@ use DBI::Test::DSN::Provider ();
 
 use Module::Pluggable::Object ();
 
+our $VERSION = "0.002";
+
 my $cfg_plugins;
 
 sub cfg_plugins
@@ -110,6 +112,19 @@ sub alldrivers
     @drivers;
 }
 
+my %abbrev = (
+    CSV		=> "c",
+    ExampleP	=> "e",
+    File	=> "f",
+    mysql	=> "m",
+    NullP	=> "n",
+    ODBC	=> "d",
+    Oracle	=> "o",
+    Pg		=> "p",
+    SQLite	=> "s",
+    Unify	=> "u",
+);
+
 sub default_dsn_conf
 {
     my ( $self, $driver ) = @_;
@@ -117,7 +132,7 @@ sub default_dsn_conf
     $driver => {
                  category   => "driver",
                  cat_abbrev => "d",
-                 abbrev     => lc( substr( $driver, 0, 1 ) ),
+                 abbrev     => $abbrev{$driver} || lc( substr( $driver, 0, 1 ) ),
                  driver     => "dbi:$driver:",
                  name       => "DSN for $driver",
                };
@@ -248,8 +263,16 @@ END {
 }
 EOC
 
+    my @dsn = @$dsn_cred;
+#    if (! defined $dsn[1] and defined $ENV{DBI_USER}) { # Use $DBI_USER / $DBI_PASS if user undef
+#	$dsn[1] = $ENV{DBI_USER};
+#	$dsn[2] = $ENV{DBI_PASS} if defined $ENV{DBI_PASS};
+#    }
+#    if (! defined $dsn[1] and $dsn[0] eq "dbi:Oracle:" && defined $ENV{ORACLE_USERID}) {
+#	($dsn[1], $dsn[2]) = split m{/} => $ENV{ORACLE_USERID};
+#    }
     my $dsn =
-      Data::Dumper->new( [$dsn_cred] )->Indent(0)->Sortkeys(1)->Quotekeys(0)->Terse(1)->Dump();
+      Data::Dumper->new( [\@dsn] )->Indent(0)->Sortkeys(1)->Quotekeys(0)->Terse(1)->Dump();
     # XXX how to deal with namespaces here and how do they affect generated test names?
     my $test_case_ns = "DBI::Test::Case::$test_case";
     my $test_case_code = sprintf( <<EOC, $init_stub, $cleanup_stub, $dsn );
@@ -485,7 +508,6 @@ This module is a team-effort. The current team members are
   H.Merijn Brand   (Tux)
   Jens Rehsack     (Sno)
   Peter Rabbitson  (ribasushi)
-  Joakim TE<0x00f8>rmoen   (trmjoa)
 
 =head1 COPYRIGHT AND LICENSE
 
diff --git a/lib/DBI/Test/DSN/Provider.pm b/lib/DBI/Test/DSN/Provider.pm
index 99856ab..3d4a022 100644
--- a/lib/DBI/Test/DSN/Provider.pm
+++ b/lib/DBI/Test/DSN/Provider.pm
@@ -5,6 +5,8 @@ use warnings;
 
 use Module::Pluggable::Object ();
 
+our $VERSION = "0.002";
+
 my $dsn_plugins;
 
 sub dsn_plugins
diff --git a/lib/DBI/Test/DSN/Provider/Base.pm b/lib/DBI/Test/DSN/Provider/Base.pm
index 093c95d..f27ff48 100644
--- a/lib/DBI/Test/DSN/Provider/Base.pm
+++ b/lib/DBI/Test/DSN/Provider/Base.pm
@@ -3,6 +3,8 @@ package DBI::Test::DSN::Provider::Base;
 use strict;
 use warnings;
 
+our $VERSION = "0.002";
+
 sub relevance
 {
     my ($self, $test_case_ns, $default_creds) = @_;
diff --git a/lib/DBI/Test/DSN/Provider/Config.pm b/lib/DBI/Test/DSN/Provider/Config.pm
index 0091b22..59c126b 100644
--- a/lib/DBI/Test/DSN/Provider/Config.pm
+++ b/lib/DBI/Test/DSN/Provider/Config.pm
@@ -8,6 +8,8 @@ use parent qw(DBI::Test::DSN::Provider::Base);
 require Cwd;
 require File::Spec;
 
+our $VERSION = "0.002";
+
 my $json;
 my $have_config_any;
 my $have_file_configdir;
diff --git a/lib/DBI/Test/DSN/Provider/Dir.pm b/lib/DBI/Test/DSN/Provider/Dir.pm
index bf0cbc0..37dc3d4 100644
--- a/lib/DBI/Test/DSN/Provider/Dir.pm
+++ b/lib/DBI/Test/DSN/Provider/Dir.pm
@@ -11,6 +11,8 @@ use File::Spec;
 
 use Carp qw(carp croak);
 
+our $VERSION = "0.002";
+
 my $test_dir;
 END { defined( $test_dir ) and rmtree $test_dir }
 
diff --git a/lib/DBI/Test/DSN/Provider/File.pm b/lib/DBI/Test/DSN/Provider/File.pm
index 741638d..f3b3da6 100644
--- a/lib/DBI/Test/DSN/Provider/File.pm
+++ b/lib/DBI/Test/DSN/Provider/File.pm
@@ -5,6 +5,8 @@ use warnings;
 
 use parent qw(DBI::Test::DSN::Provider::Base);
 
+our $VERSION = "0.002";
+
 1;
 
 =head1 NAME
diff --git a/lib/DBI/Test/List.pm b/lib/DBI/Test/List.pm
index e21e7cb..3d3f8c7 100644
--- a/lib/DBI/Test/List.pm
+++ b/lib/DBI/Test/List.pm
@@ -3,17 +3,54 @@ package DBI::Test::List;
 use strict;
 use warnings;
 
+our $VERSION = "0.002";
+
 sub test_cases
 {
-    return qw(basic::connect basic::disconnect);
+    return qw(basic::connect basic::disconnect attributes::Error attributes::Warn);
 }
 
 =head1 NAME
 
 DBI::Test::List - provides tests cases list for DBI::Test.
 
+=head1 SYNOPSIS
+
+    package DBI::Test::namespace::List;
+
+    use strict;
+    use warnings;
+
+    use parent qw(DBI::Test::List);
+
+    my @casegrp1 = qw(simple::case1 simple::case2);
+    my @casegrp2 = qw(complex::case1 complex::case2 complex::case3);
+    my @test_cases = (@casegrp1, @casegrp2);
+
+    sub test_cases
+    {
+	return map { "namespace::" . $_ } @test_cases;
+    }
+
 =head1 DESCRIPTION
 
+This class is the expected base class of every test case list class provided
+by any L<DBI::Test> using derived work. The only thing currently has to be
+done is overloading the I<test_cases> method and return the class names
+of the test cases which should be executed.
+
+=head1 METHODS
+
+=over 4
+
+=item I<test_cases>
+
+Method which is invoked to retrieve a list of enabled test cases. This
+allows authors to make decision at configure time of a distribution which
+test cases shall be populated into tests.
+
+=back
+
 =head1 AUTHOR
 
 This module is a team-effort. The current team members are
@@ -21,7 +58,6 @@ This module is a team-effort. The current team members are
   H.Merijn Brand   (Tux)
   Jens Rehsack     (Sno)
   Peter Rabbitson  (ribasushi)
-  Joakim TE<0x00f8>rmoen   (trmjoa)
 
 =head1 COPYRIGHT AND LICENSE
 
diff --git a/misc/DESIGN.md b/misc/DESIGN.md
new file mode 100644
index 0000000..676f0c9
--- /dev/null
+++ b/misc/DESIGN.md
@@ -0,0 +1,84 @@
+# DESIGN
+
+# Here is code POV
+
+The code is currently split into 2 large potions - whereby one thing is shared.
+
+Potion 1: configure stage support
+---------------------------------
+
+In this stage, the tests for the incarnations are generated. To do this,
+DBI::Test::Conf runs through some steps
+
+  a) find all config plugins and load their configuration setting
+
+	my $finder = Module::Pluggable::Object->new(
+						     search_path => ["DBI::Test"],
+						     require     => 1,
+						     only        => qr/::Conf$/,
+						     inner       => 0
+						   );
+	my @plugs = grep { $_->isa("DBI::Test::Conf") } $finder->plugins();
+
+  b) find all list plugins and load there test cases list
+
+	my $finder = Module::Pluggable::Object->new(
+						     search_path => ["DBI::Test"],
+						     require     => 1,
+						     only        => qr/::List$/,
+						     inner       => 0
+						   );
+	my @plugs = grep { $_->isa("DBI::Test::List") } $finder->plugins();
+
+  c) ask DBI about the available_drivers()
+
+  d) create a n over k matrix for required test configurations
+
+  foreach test case
+
+      i) request test case to kick out unsupported DBD's (filter_drivers)
+         ==> DBI::Test::Case provides a filter based on CONTAINED_DBDS
+
+     ii) generate matrix of any supported driver and it's variants (in case
+         of requires_extended) using DSN::Provider.
+
+    iii) request test case to identify unsupported driver variants
+         (PURE_PERL and XS?)
+
+     iv) generate test file from template and populate it as
+         $basedir/namespace/${conf_prefix}_${driver_prefix}_test_case.t
+
+	 Template looks (more or less) like:
+
+	 #!perl
+
+	 %s # begin stub, eg. $ENV{DBI_AUTOPROXY} = 'dbi:Gofer:transport=null;policy=pedantic';
+
+	 %s # end stub, eg. delete $ENV{DBI_AUTOPROXY};
+
+	 use DBI::Mock;
+	 use DBI::Test::DSN::Provider;
+
+	 use DBI::Test::Case::${namespace}::${test_case}; # full qualified test case namespace
+
+	 my $test_case_conf = DBI::Test::DSN::Provider->get_dsn_creds($test_case_ns, [$dsn_creds]);
+	 $test_case_ns->run_test($test_case_conf);
+
+Potion 2: test stage support
+----------------------------
+
+  a) boostrap test case
+
+     Tests populated via template processing (basic built-in engine, no TT2 or
+     similar) rely on the DSN::Provider (bad design at the moment, only created
+     in a fashion to have no show stopper for basic tests) - it creates the used
+     base directory for DBD::DBM tests etc. (DSN::Provider is shared, it is also
+     called in d-ii above).
+
+  b) run tests
+
+     Once we have a DSN - we give it to run_tests(). In run_tests, test functions
+     from DBI::Test can be used, like connect_ok, prepare_ok etc.
+     Those tests not only prove the return value (true|false), the also prove the
+     right instantiation ($dbh->blessed && $dbh->isa("DBI::db")).
+
diff --git a/misc/GOAL.md b/misc/GOAL.md
new file mode 100644
index 0000000..7eef536
--- /dev/null
+++ b/misc/GOAL.md
@@ -0,0 +1,42 @@
+# GOAL(s)
+
+# Here is the things we are trying to do
+
+Jens Rehsack (Sno)
+------------------
+
+1) reduce effort n managing and maintaining tests between SQL::Statement
+   and database emulation drivers in DBI (DBI::DBD::SqlEngine based stuff).
+
+2) want the tests from DBD::CSV (ChopBlanks, ...) shared with SQL::Statement
+   and DBD::DBM (reduce Merijns effort)
+
+3) want all 3rd party DBI::DBD::SqlEngine based DBDs tested against
+   SQL::Statement and DBI::SQL::Nano (improve quality of Nano and improve
+   usability out there)
+
+
+H.Merijn Brand (Tux)
+--------------------
+
+1) Test DBI API from both side - from DBI (inside and while delivering DBI)
+   and on DBD side whether the DBD supports the API correctly or not
+   (think about ReadOnly, TypeInfo, ...)
+
+2) Increase test coverage over the usage of DBD::CSV (run entire test suite
+   against Text::CSV and Text::CSV_XS)
+
+Peter Rabbitson (ribasushi)
+---------------------------
+
+1) Write one test when a driver fails stuff in DBIx::Class and (hopefully)
+   get it tested in any DBI::Test using DBD.
+   ==> improve DBIx::Class user experience by error free DBDs
+   ==> reduce support effort because of bugs in DBDs
+
+2) Shared DSN config setup to allow DBDs with difference access methods 
+   run all (suitable) tests against all access methods, eg. say one has
+   an MS-SQL server for testing:
+    [09:24am] riba: DBD::Sybase compiled against ( freetds | the sybase native client |  mje's... thingy forgot the company name )
+    [09:25am] riba: DBD::ODBC via ( Freetds | mje's driver | microsoft's recently released linux driver )
+    [09:25am] riba: DBD::Freetds (doesn't really compile these days )