diff --git a/composer.json b/composer.json
index 8e4fa7a33af3aefbf17d01c29713100d119b6bb6..05c3a2bf86c74d1e464bd96a5b0ff4e166a1ab01 100644
--- a/composer.json
+++ b/composer.json
@@ -17,5 +17,8 @@
         "psr-0": {
             "HAB\\Pica": "src/"
         }
+    },
+    "require-dev": {
+        "phpunit/phpunit": "^8"
     }
 }
diff --git a/phpunit.xml b/phpunit.xml
index 50449de41c32091bf61232c8c53ca069a4ab714c..af648d8c4ed0e441c3d761af223709483001e571 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -1,15 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
-<phpunit bootstrap="tests/unit-tests/bootstrap.php" strict="true">
+<phpunit bootstrap="tests/unit-tests/bootstrap.php">
   <testsuites>
     <testsuite name="Unit Tests">
       <directory suffix="Test.php">tests</directory>
     </testsuite>
   </testsuites>
   <filter>
-    <blacklist>
-      <directory suffix=".php">vendor</directory>
-      <directory suffix=".php">tests</directory>
-    </blacklist>
     <whitelist addUncoveredFilesFromWhitelist="true">
       <directory suffix=".php">bin</directory>
       <directory suffix=".php">src</directory>
diff --git a/tests/unit-tests/src/HAB/Pica/Record/AuthorityRecordTest.php b/tests/unit-tests/src/HAB/Pica/Record/AuthorityRecordTest.php
index 4d1f732885913130069086a4871f2761007f59c3..57f52a06abf5ee1ead7b61fe9c12ffaa89fae67c 100644
--- a/tests/unit-tests/src/HAB/Pica/Record/AuthorityRecordTest.php
+++ b/tests/unit-tests/src/HAB/Pica/Record/AuthorityRecordTest.php
@@ -20,33 +20,33 @@
  *
  * @package   PicaRecord
  * @author    David Maus <maus@hab.de>
- * @copyright Copyright (c) 2012, 2013 by Herzog August Bibliothek Wolfenbüttel
+ * @copyright Copyright (c) 2012-2019 by Herzog August Bibliothek Wolfenbüttel
  * @license   http://www.gnu.org/licenses/gpl.html GNU General Public License v3
  */
 
 namespace HAB\Pica\Record;
 
-use PHPUnit_FrameWork_TestCase;
+use PHPUnit\Framework\TestCase;
 
-class AuthorityRecordTest extends PHPUnit_FrameWork_TestCase 
+class AuthorityRecordTest extends TestCase
 {
 
     ///
 
-    public function testIsEmpty () 
+    public function testIsEmpty ()
     {
         $r = new AuthorityRecord();
         $this->assertTrue($r->isEmpty());
     }
 
-    public function testAppend () 
+    public function testAppend ()
     {
         $r = new AuthorityRecord();
         $r->append(new Field('000@', 0, array(new Subfield('0', 'valid'))));
         $this->assertFalse($r->isEmpty());
     }
 
-    public function testGetPPN () 
+    public function testGetPPN ()
     {
         $r = new AuthorityRecord();
         $this->assertNull($r->getPPN());
@@ -54,7 +54,7 @@ class AuthorityRecordTest extends PHPUnit_FrameWork_TestCase
         $this->assertEquals('valid', $r->getPPN());
     }
 
-    public function testDelete () 
+    public function testDelete ()
     {
         $r = new AuthorityRecord();
         $r->append(new Field('003@', 0, array(new Subfield('0', 'valid'))));
@@ -65,7 +65,7 @@ class AuthorityRecordTest extends PHPUnit_FrameWork_TestCase
 
     ///
 
-    public function testSetPPN () 
+    public function testSetPPN ()
     {
         $r = new AuthorityRecord();
         $this->assertNull($r->getPPN());
@@ -76,7 +76,7 @@ class AuthorityRecordTest extends PHPUnit_FrameWork_TestCase
         $this->assertEquals(1, count($r->getFields('003@/00')));
     }
 
-    public function testClone () 
+    public function testClone ()
     {
         $r = new AuthorityRecord();
         $f = new Field('003@', 0);
@@ -87,38 +87,38 @@ class AuthorityRecordTest extends PHPUnit_FrameWork_TestCase
         $this->assertNotSame($f, reset($fields));
     }
 
-    public function testIsInvalidEmptyField () 
+    public function testIsInvalidEmptyField ()
     {
         $r = new AuthorityRecord(array(new Field('003@', 0)));
         $this->assertFalse($r->isValid());
     }
 
-    public function testIsInvalidMissingPPN () 
+    public function testIsInvalidMissingPPN ()
     {
         $r = new AuthorityRecord(array(new Field('002@', 0, array(new Subfield('0', 'T')))));
         $this->assertFalse($r->isValid());
     }
 
-    public function testIsInvalidMissingType () 
+    public function testIsInvalidMissingType ()
     {
         $r = new AuthorityRecord(array(new Field('003@', 0, array(new Subfield('0', 'something')))));
         $this->assertFalse($r->isValid());
     }
 
-    public function testIsInvalidWrongType () 
+    public function testIsInvalidWrongType ()
     {
         $r = new AuthorityRecord(array(new Field('002@', 0, array(new Subfield('0', 'A')))));
         $this->assertFalse($r->isValid());
     }
 
-    public function testIsValid () 
+    public function testIsValid ()
     {
         $r = new AuthorityRecord(array(new Field('002@', 0, array(new Subfield('0', 'T'))),
                                        new Field('003@', 0, array(new Subfield('0', 'valid')))));
         $this->assertTrue($r->isValid());
     }
 
-    public function testSort () 
+    public function testSort ()
     {
         $r = new AuthorityRecord(array(new Field('003@', 99, array(new Subfield('0', 'valid'))),
                                        new Field('003@', 0, array(new Subfield('0', 'valid')))));
@@ -130,24 +130,20 @@ class AuthorityRecordTest extends PHPUnit_FrameWork_TestCase
 
     ///
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
-    public function testAppendThrowsExceptionOnDuplicateField () 
+    public function testAppendThrowsExceptionOnDuplicateField ()
     {
+        $this->expectException('InvalidArgumentException');
         $r = new AuthorityRecord();
         $f = new Field('003@', 0);
         $r->append($f);
         $r->append($f);
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
-    public function testAppendThrowsExceptionOnInvalidLevel () 
+    public function testAppendThrowsExceptionOnInvalidLevel ()
     {
+        $this->expectException('InvalidArgumentException');
         $r = new AuthorityRecord();
         $r->append(new Field('101@', 0));
     }
 
-}
\ No newline at end of file
+}
diff --git a/tests/unit-tests/src/HAB/Pica/Record/CopyRecordTest.php b/tests/unit-tests/src/HAB/Pica/Record/CopyRecordTest.php
index 7f2ad1e5180f59752cc278a0d58e32c4e21b48eb..d4f1407d3f8a64573e12c432d6f7dc14a1fb75ec 100644
--- a/tests/unit-tests/src/HAB/Pica/Record/CopyRecordTest.php
+++ b/tests/unit-tests/src/HAB/Pica/Record/CopyRecordTest.php
@@ -20,15 +20,15 @@
  *
  * @package   PicaRecord
  * @author    David Maus <maus@hab.de>
- * @copyright Copyright (c) 2012, 2013 by Herzog August Bibliothek Wolfenbüttel
+ * @copyright Copyright (c) 2012-2019 by Herzog August Bibliothek Wolfenbüttel
  * @license   http://www.gnu.org/licenses/gpl.html GNU General Public License v3
  */
 
 namespace HAB\Pica\Record;
 
-use PHPUnit_FrameWork_TestCase;
+use PHPUnit\Framework\TestCase;
 
-class CopyRecordTest extends PHPUnit_FrameWork_TestCase {
+class CopyRecordTest extends TestCase {
 
     public function testGetEPN ()
     {
@@ -60,20 +60,16 @@ class CopyRecordTest extends PHPUnit_FrameWork_TestCase {
 
     ///
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testAppendThrowsExceptionOnInvalidFieldLevel ()
     {
+        $this->expectException('InvalidArgumentException');
         $r = new CopyRecord();
         $r->append(new Field('003@', 0));
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testAppendThrowsExceptionOnNumberMismatch ()
     {
+        $this->expectException('InvalidArgumentException');
         $r = new CopyRecord();
         $r->append(new Field('201@', 0));
         $r->append(new Field('202@', 1));
diff --git a/tests/unit-tests/src/HAB/Pica/Record/FieldTest.php b/tests/unit-tests/src/HAB/Pica/Record/FieldTest.php
index 6fc57c773a19777ff84d6c92ef2d8a582ba89fd2..773530febc2e8bc2d136cb7369caf08dd2cc9b93 100644
--- a/tests/unit-tests/src/HAB/Pica/Record/FieldTest.php
+++ b/tests/unit-tests/src/HAB/Pica/Record/FieldTest.php
@@ -20,15 +20,15 @@
  *
  * @package   PicaRecord
  * @author    David Maus <maus@hab.de>
- * @copyright Copyright (c) 2012, 2013 by Herzog August Bibliothek Wolfenbüttel
+ * @copyright Copyright (c) 2012-2019 by Herzog August Bibliothek Wolfenbüttel
  * @license   http://www.gnu.org/licenses/gpl.html GNU General Public License v3
  */
 
 namespace HAB\Pica\Record;
 
-use PHPUnit_FrameWork_TestCase;
+use PHPUnit\Framework\TestCase;
 
-class FieldTest extends PHPUnit_FrameWork_TestCase
+class FieldTest extends TestCase
 {
 
     public function testValidFieldOccurrenceCastNull () {
@@ -191,64 +191,50 @@ class FieldTest extends PHPUnit_FrameWork_TestCase
 
     ///
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testFactoryThrowsExceptionOnMissingTagIndex ()
     {
+        $this->expectException('InvalidArgumentException');
         Field::factory(array('occurrence' => 10, 'subfields' => array()));
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testFactoryThrowsExceptionOnMissingOccurrenceIndex ()
     {
+        $this->expectException('InvalidArgumentException');
         Field::factory(array('tag' => '003@', 'subfields' => array()));
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testFactoryThrowsExceptionOnMissingSubfieldIndex ()
     {
+        $this->expectException('InvalidArgumentException');
         Field::factory(array('tag' => '003@', 'occurrence' => 10));
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testContructorThrowsExceptionOnInvalidTag ()
     {
+        $this->expectException('InvalidArgumentException');
         new Field('invalid', 0);
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testConstructorThrowsExceptionOnInvalidOccurrence ()
     {
+        $this->expectException('InvalidArgumentException');
         new Field('003@', 1000);
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testAddSubfieldThrowsExceptionOnDuplicateSubfield ()
     {
+        $this->expectException('InvalidArgumentException');
         $f = new Field('003@', 0);
         $s = new Subfield('a', 'valid');
         $f->addSubfield($s);
         $f->addSubfield($s);
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testRemoveSubfieldThrowsExceptionOnNonExistentField ()
     {
+        $this->expectException('InvalidArgumentException');
         $f = new Field('003@', 0);
         $s = new Subfield('a', 'valid');
         $f->removeSubfield($s);
     }
-}
\ No newline at end of file
+}
diff --git a/tests/unit-tests/src/HAB/Pica/Record/LocalRecordTest.php b/tests/unit-tests/src/HAB/Pica/Record/LocalRecordTest.php
index c26199a3e661b8693fdd0a106f6a374aa4ba9fb2..d2882b0b389475dc87ea2ff5f788294e9e8a4722 100644
--- a/tests/unit-tests/src/HAB/Pica/Record/LocalRecordTest.php
+++ b/tests/unit-tests/src/HAB/Pica/Record/LocalRecordTest.php
@@ -20,15 +20,15 @@
  *
  * @package   PicaRecord
  * @author    David Maus <maus@hab.de>
- * @copyright Copyright (c) 2012, 2013 by Herzog August Bibliothek Wolfenbüttel
+ * @copyright Copyright (c) 2012-2019 by Herzog August Bibliothek Wolfenbüttel
  * @license   http://www.gnu.org/licenses/gpl.html GNU General Public License v3
  */
 
 namespace HAB\Pica\Record;
 
-use PHPUnit_FrameWork_TestCase;
+use PHPUnit\Framework\TestCase;
 
-class LocalRecordTest extends PHPUnit_FrameWork_TestCase
+class LocalRecordTest extends TestCase
 {
 
     public function testClone ()
@@ -132,52 +132,42 @@ class LocalRecordTest extends PHPUnit_FrameWork_TestCase
 
     ///
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testAddCopyRecordThrowsExceptionOnItemNumberCollision ()
     {
+        $this->expectException('InvalidArgumentException');
         $r = new LocalRecord();
         $r->addCopyRecord(new CopyRecord(array(new Field('200@', 11))));
         $r->addCopyRecord(new CopyRecord(array(new Field('200@', 11))));
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testAddCopyRecordThrowsExceptionOnDuplicateCopyRecord ()
     {
+        $this->expectException('InvalidArgumentException');
         $r = new LocalRecord();
         $c = new CopyRecord();
         $r->addCopyRecord($c);
         $r->addCopyRecord($c);
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testRemoveCopyRecordThrowsExceptionOnCopyRecordNotContainedInRecord ()
     {
+        $this->expectException('InvalidArgumentException');
         $r = new LocalRecord();
         $c = new CopyRecord();
         $r->removeCopyRecord($c);
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testAppendThrowsExceptionOnInvalidLevel ()
     {
+        $this->expectException('InvalidArgumentException');
         $r = new LocalRecord();
         $r->append(new Field('003@', 0));
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testGetMaximumOccurrenceOfThrowsExceptionOnInvalidFieldTag ()
     {
+        $this->expectException('InvalidArgumentException');
         $r = new LocalRecord();
         $r->getMaximumOccurrenceOf('@@@@');
     }
-}
\ No newline at end of file
+}
diff --git a/tests/unit-tests/src/HAB/Pica/Record/RecordTest.php b/tests/unit-tests/src/HAB/Pica/Record/RecordTest.php
index f6f2b338f2bcd09d0da8f000c6673b304161cd08..954733c2538ffb40caeb2e0b25e01ce15658c803 100644
--- a/tests/unit-tests/src/HAB/Pica/Record/RecordTest.php
+++ b/tests/unit-tests/src/HAB/Pica/Record/RecordTest.php
@@ -20,15 +20,15 @@
  *
  * @package   PicaRecord
  * @author    David Maus <maus@hab.de>
- * @copyright Copyright (c) 2012, 2013 by Herzog August Bibliothek Wolfenbüttel
+ * @copyright Copyright (c) 2012-2019 by Herzog August Bibliothek Wolfenbüttel
  * @license   http://www.gnu.org/licenses/gpl.html GNU General Public License v3
  */
 
 namespace HAB\Pica\Record;
 
-use PHPUnit_FrameWork_TestCase;
+use PHPUnit\Framework\TestCase;
 
-class RecordTest extends PHPUnit_FrameWork_TestCase
+class RecordTest extends TestCase
 {
 
     public function testFactoryCreatesAuthorityRecord ()
@@ -71,30 +71,25 @@ class RecordTest extends PHPUnit_FrameWork_TestCase
 
     ///
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
+
     public function testFactoryThrowsExceptionOnMissingFieldsIndex ()
     {
+        $this->expectException('InvalidArgumentException');
         Record::factory(array());
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testFactoryThrowsExceptionOnMissingTypeField ()
     {
+        $this->expectException('InvalidArgumentException');
         $record = Record::factory(array('fields' => array()));
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testFactoryThrowsExceptionOnMissingTypeSubfield ()
     {
+        $this->expectException('InvalidArgumentException');
         $record = Record::factory(array('fields' => array(
                                             array('tag' => '002@',
                                                   'occurrence' => 0,
                                                   'subfields' => array()))));
     }
-}
\ No newline at end of file
+}
diff --git a/tests/unit-tests/src/HAB/Pica/Record/SubfieldTest.php b/tests/unit-tests/src/HAB/Pica/Record/SubfieldTest.php
index d398b391639a07bd4288f38190025d79569474a1..d7ba59b36f2ac5f79b24127d6ff1d96d5849201e 100644
--- a/tests/unit-tests/src/HAB/Pica/Record/SubfieldTest.php
+++ b/tests/unit-tests/src/HAB/Pica/Record/SubfieldTest.php
@@ -20,15 +20,15 @@
  *
  * @package   PicaRecord
  * @author    David Maus <maus@hab.de>
- * @copyright Copyright (c) 2012, 2013 by Herzog August Bibliothek Wolfenbüttel
+ * @copyright Copyright (c) 2012-2019 by Herzog August Bibliothek Wolfenbüttel
  * @license   http://www.gnu.org/licenses/gpl.html GNU General Public License v3
  */
 
 namespace HAB\Pica\Record;
 
-use PHPUnit_FrameWork_TestCase;
+use PHPUnit\Framework\TestCase;
 
-class SubfieldTest extends PHPUnit_FrameWork_TestCase
+class SubfieldTest extends TestCase
 {
 
     public function testValidSubfieldCodeZero ()
@@ -70,28 +70,22 @@ class SubfieldTest extends PHPUnit_FrameWork_TestCase
 
     ///
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testConstructorThrowsExceptionOnInvalidCode ()
     {
+        $this->expectException('InvalidArgumentException');
         new Subfield(null, 'valid');
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testFactoryThrowsExceptionOnMissingCodeIndex ()
     {
+        $this->expectException('InvalidArgumentException');
         Subfield::factory(array('value' => 'valid'));
     }
 
-    /**
-     * @expectedException InvalidArgumentException
-     */
     public function testFactoryThrowsExceptionOnMissingValueIndex ()
     {
+        $this->expectException('InvalidArgumentException');
         Subfield::factory(array('code' => 'a'));
     }
 
-}
\ No newline at end of file
+}
diff --git a/tests/unit-tests/src/HAB/Pica/Record/TitleRecordTest.php b/tests/unit-tests/src/HAB/Pica/Record/TitleRecordTest.php
index 8a06fcbbcda737f6564dc0c8aa1415560063604b..5cb798a581eef5354bd0451eff0db0bf91d816d0 100644
--- a/tests/unit-tests/src/HAB/Pica/Record/TitleRecordTest.php
+++ b/tests/unit-tests/src/HAB/Pica/Record/TitleRecordTest.php
@@ -20,15 +20,15 @@
  *
  * @package   PicaRecord
  * @author    David Maus <maus@hab.de>
- * @copyright Copyright (c) 2012, 2013 by Herzog August Bibliothek Wolfenbüttel
+ * @copyright Copyright (c) 2012-2019 by Herzog August Bibliothek Wolfenbüttel
  * @license   http://www.gnu.org/licenses/gpl.html GNU General Public License v3
  */
 
 namespace HAB\Pica\Record;
 
-use PHPUnit_FrameWork_TestCase;
+use PHPUnit\Framework\TestCase;
 
-class TitleRecordTest extends PHPUnit_FrameWork_TestCase
+class TitleRecordTest extends TestCase
 {
 
     public function testAppend ()