diff --git a/module/VuFind/tests/fixtures/marc/marctraits.xml b/module/VuFind/tests/fixtures/marc/marctraits.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fda580cf3acd719380ac347e599007a7321cac05
--- /dev/null
+++ b/module/VuFind/tests/fixtures/marc/marctraits.xml
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns='http://www.loc.gov/MARC21/slim'>
+
+    <record
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"
+        xmlns="http://www.loc.gov/MARC21/slim">
+        <leader>00000cam a22000004i 4500</leader>
+        <controlfield tag="001">123</controlfield>
+        <controlfield tag="008">021122s2020    en            000 0 eng d</controlfield>
+        <datafield tag="020" ind1=" " ind2=" ">
+            <subfield code="a">978-3-16-148410-0</subfield>
+            <subfield code="z">978-3-16-148410-1</subfield>
+        </datafield>
+        <datafield tag="010" ind1=" " ind2=" ">
+            <subfield code="a">LC123</subfield>
+        </datafield>
+        <datafield tag="015" ind1=" " ind2=" ">
+            <subfield code="a">NBN12</subfield>
+            <subfield code="7">NB</subfield>
+        </datafield>
+        <datafield tag="022" ind1=" " ind2=" ">
+            <subfield code="a">0000-1111</subfield>
+        </datafield>
+        <datafield tag="024" ind1="1" ind2=" ">
+            <subfield code="a">upc</subfield>
+        </datafield>
+        <datafield tag="024" ind1="2" ind2=" ">
+            <subfield code="a">ismn</subfield>
+        </datafield>
+        <datafield tag="024" ind1="3" ind2=" ">
+            <subfield code="a">ian</subfield>
+        </datafield>
+        <datafield tag="035" ind1=" " ind2=" ">
+            <subfield code="a">(FOO)123</subfield>
+        </datafield>
+        <datafield tag="035" ind1=" " ind2=" ">
+            <subfield code="a">(Baz)456</subfield>
+        </datafield>
+        <datafield tag="041" ind1="0" ind2=" ">
+            <subfield code="a">ger</subfield>
+        </datafield>
+        <datafield tag="041" ind1="1" ind2="7">
+            <subfield code="a">spa</subfield>
+        </datafield>
+        <datafield tag="050" ind1=" " ind2="0">
+            <subfield code="b">c3</subfield>
+        </datafield>
+        <datafield tag="082" ind1="0" ind2=" ">
+            <subfield code="a">d1</subfield>
+        </datafield>
+        <datafield tag="090" ind1=" " ind2=" ">
+            <subfield code="a">c1</subfield>
+        </datafield>
+        <datafield tag="090" ind1=" " ind2=" ">
+            <subfield code="a">c2</subfield>
+        </datafield>
+        <datafield tag="100" ind1="1" ind2=" ">
+            <subfield code="a">Author, Test</subfield>
+            <subfield code="d">(1800-)</subfield>
+        </datafield>
+        <datafield tag="110" ind1="2" ind2=" ">
+            <subfield code="a">Testcorp</subfield>
+        </datafield>
+        <datafield tag="245" ind1="0" ind2="4">
+            <subfield code="a">The Foo:</subfield>
+            <subfield code="b">Bar! /</subfield>
+            <subfield code="c">Test Author.</subfield>
+            <subfield code="n">2.</subfield>
+            <subfield code="p">Return</subfield>
+            <subfield code="h">Format 1</subfield>
+            <subfield code="h">Format 2</subfield>
+        </datafield>
+        <datafield tag="250" ind1=" " ind2=" ">
+            <subfield code="a">2nd ed.</subfield>
+        </datafield>
+        <datafield tag="260" ind1=" " ind2=" ">
+            <subfield code="a">Place :</subfield>
+            <subfield code="b">Publisher,</subfield>
+            <subfield code="c">2020</subfield>
+        </datafield>
+        <datafield tag="264" ind1=" " ind2="0">
+            <subfield code="a">Place :</subfield>
+            <subfield code="b">Producer,</subfield>
+            <subfield code="c">2019</subfield>
+        </datafield>
+        <datafield tag="264" ind1=" " ind2="1">
+            <subfield code="a">Location :</subfield>
+            <subfield code="b">The Publishers,</subfield>
+            <subfield code="c">2020</subfield>
+        </datafield>
+        <datafield tag="300" ind1=" " ind2=" ">
+            <subfield code="a">1 book :</subfield>
+            <subfield code="b">colored,</subfield>
+            <subfield code="c">28 cm</subfield>
+            <subfield code="e">1 cd</subfield>
+        </datafield>
+        <datafield tag="306" ind1=" " ind2=" ">
+            <subfield code="a">002010</subfield>
+            <subfield code="a">013055</subfield>
+        </datafield>
+        <datafield tag="310" ind1=" " ind2=" ">
+            <subfield code="a">Frequency varies,</subfield>
+            <subfield code="b">2020-</subfield>
+        </datafield>
+        <datafield tag="362" ind1=" " ind2=" ">
+            <subfield code="a">2020-</subfield>
+        </datafield>
+        <datafield tag="440" ind1=" " ind2="0">
+            <subfield code="a">Development Series</subfield>    
+            <subfield code="x">1111-2222</subfield>
+        </datafield>
+        <datafield tag="490" ind1="0" ind2=" ">
+            <subfield code="a">System Collection</subfield>    
+            <subfield code="x">2222-3333</subfield>
+        </datafield>
+        <datafield tag="500" ind1=" " ind2=" ">
+            <subfield code="a">General notes here.</subfield>
+        </datafield>
+        <datafield tag="500" ind1=" " ind2=" ">
+            <subfield code="a">Translation.</subfield>
+        </datafield>
+        <datafield tag="504" ind1=" " ind2=" ">
+            <subfield code="a">Bibliography: p. 122</subfield>
+        </datafield>
+        <datafield tag="506" ind1=" " ind2=" ">
+            <subfield code="a">Classified.</subfield>
+        </datafield>
+        <datafield tag="508" ind1=" " ind2=" ">
+            <subfield code="a">Producer: VuFind</subfield>
+        </datafield>
+        <datafield tag="520" ind1=" " ind2=" ">
+            <subfield code="a">Summary.</subfield>
+            <subfield code="b">Expanded.</subfield>
+        </datafield>
+        <datafield tag="521" ind1=" " ind2=" ">
+            <subfield code="a">Developers</subfield>
+        </datafield>
+        <datafield tag="538" ind1=" " ind2=" ">
+            <subfield code="a">Data in UTF-8</subfield>
+        </datafield>
+        <datafield tag="555" ind1="0" ind2=" ">
+            <subfield code="a">Finding aid available</subfield>
+        </datafield>
+        <datafield tag="580" ind1=" " ind2=" ">
+            <subfield code="a">Merged with several branches</subfield>
+        </datafield>
+        <datafield tag="586" ind1=" " ind2=" ">
+            <subfield code="a">VuFind Golden Award, 2020</subfield>
+        </datafield>
+        <datafield tag="650" ind1=" " ind2="4">
+            <subfield code="a">Foo</subfield>
+            <subfield code="g">test</subfield>
+            <subfield code="7">null</subfield>
+        </datafield>
+        <datafield tag="650" ind1=" " ind2="4">
+            <subfield code="a">Bar</subfield>
+            <subfield code="g">test again</subfield>
+            <subfield code="7">null</subfield>
+        </datafield>
+        <datafield tag="710" ind1="2" ind2=" ">
+            <subfield code="a">Foobar Inc.</subfield>
+        </datafield>
+        <datafield tag="730" ind1="0" ind2=" ">
+            <subfield code="x">3333-4444</subfield>
+        </datafield>
+        <datafield tag="752" ind1=" " ind2=" ">
+            <subfield code="a">Zoolandia</subfield>
+            <subfield code="b">City.</subfield>
+        </datafield>
+        <datafield tag="752" ind1=" " ind2=" ">
+            <subfield code="a">Funland</subfield>
+            <subfield code="b">Funtown.</subfield>
+        </datafield>
+        <datafield tag="773" ind1="0" ind2=" ">
+            <subfield code="z">1-84356-028-3</subfield>
+        </datafield>
+        <datafield tag="773" ind1="0" ind2=" ">
+            <subfield code="x">4444-5555</subfield>
+        </datafield>
+        <datafield tag="776" ind1="0" ind2=" ">
+            <subfield code="x">5555-6666</subfield>
+        </datafield>
+        <datafield tag="780" ind1="0" ind2="0">
+            <subfield code="a">Old Journal</subfield>    
+            <subfield code="x">6666-7777</subfield>
+        </datafield>
+        <datafield tag="785" ind1="0" ind2="0">
+            <subfield code="a">New Journal</subfield>    
+            <subfield code="x">7777-8888</subfield>
+        </datafield>
+        <datafield tag="830" ind1=" " ind2="0">
+            <subfield code="a">Development</subfield>    
+            <subfield code="v">no. 2</subfield>
+            <subfield code="x">7777-8888</subfield>
+        </datafield>
+        <datafield tag="856" ind1="4" ind2="2">
+            <subfield code="u">https://vufind.org/vufind/</subfield>    
+            <subfield code="y">VuFind Home Page</subfield>
+        </datafield>
+    </record>
+</collection>
diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/RecordDriver/MarcBasicTraitTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/RecordDriver/MarcBasicTraitTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..305168654c42649d025f087b4a8fed894cb83420
--- /dev/null
+++ b/module/VuFind/tests/unit-tests/src/VuFindTest/RecordDriver/MarcBasicTraitTest.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Record Driver Marc Traits Test Class
+ *
+ * PHP version 7
+ *
+ * Copyright (C) The National Library of Finland 2020.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * @category VuFind
+ * @package  Tests
+ * @author   Ere Maijala <ere.maijala@helsinki.fi>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://vufind.org/wiki/development:testing:unit_tests Wiki
+ */
+namespace VuFindTest\RecordDriver;
+
+/**
+ * Record Driver Marc Traits Test Class
+ *
+ * @category VuFind
+ * @package  Tests
+ * @author   Ere Maijala <ere.maijala@helsinki.fi>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://vufind.org/wiki/development:testing:unit_tests Wiki
+ */
+class MarcBasicTraitTest extends \VuFindTest\Unit\TestCase
+{
+    use \VuFindTest\Unit\FixtureTrait;
+
+    /**
+     * Test methods in MarcBasicTrait.
+     *
+     * @return void
+     */
+    public function testMarcBasicTrait()
+    {
+        $xml = $this->getFixture('marc/marctraits.xml');
+        $record = (new \File_MARCXML($xml, \File_MARCXML::SOURCE_STRING))->next();
+        $obj = $this->getMockBuilder(\VuFind\RecordDriver\WorldCat::class)
+            ->onlyMethods(['getMarcRecord'])->getMock();
+        $obj->expects($this->any())
+            ->method('getMarcRecord')
+            ->will($this->returnValue($record));
+
+        $this->assertEquals(
+            ['9783161484100', '9783161484101', '1843560283'],
+            $obj->getISBNs()
+        );
+        $this->assertEquals(
+            [
+                '0000-1111', '1111-2222', '2222-3333', '3333-4444', '4444-5555',
+                '5555-6666', '6666-7777', '7777-8888'
+            ],
+            $obj->getISSNs()
+        );
+        $this->assertEquals(['Format 1 Format 2'], $obj->getFormats());
+        $this->assertEquals('123', $obj->getUniqueID());
+        $this->assertEquals(['c1', 'c3', 'd1'], $obj->getCallNumbers());
+        $this->assertEquals(['Author, Test (1800-)'], $obj->getPrimaryAuthors());
+        $this->assertEquals(['eng', 'ger'], $obj->getLanguages());
+        $this->assertEquals('The Foo: Bar! /', $obj->getTitle());
+        $this->assertEquals('The Foo:', $obj->getShortTitle());
+        $this->assertEquals('Bar! /', $obj->getSubtitle());
+        $this
+            ->assertEquals(['Publisher,', 'The Publishers,'], $obj->getPublishers());
+        $this->assertEquals(['2020', '2020'], $obj->getPublicationDates());
+        $this->assertEquals(['2020-'], $obj->getDateSpan());
+        $this
+            ->assertEquals(['Testcorp', 'Foobar Inc.'], $obj->getCorporateAuthors());
+        $this->assertEquals([], $obj->getSecondaryAuthors());
+        $this->assertEquals(['New Journal'], $obj->getNewerTitles());
+        $this->assertEquals(['Old Journal'], $obj->getPreviousTitles());
+        $this->assertEquals('2nd ed.', $obj->getEdition());
+        $this->assertEquals(
+            ['1 book : colored, 28 cm 1 cd'], $obj->getPhysicalDescriptions()
+        );
+    }
+}
diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/RecordDriver/SolrMarcTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/RecordDriver/SolrMarcTest.php
index a484c6af0d960476898e75edf22968f42305d993..ff803e99c40002ff1906ca6ec36af31b0057639b 100644
--- a/module/VuFind/tests/unit-tests/src/VuFindTest/RecordDriver/SolrMarcTest.php
+++ b/module/VuFind/tests/unit-tests/src/VuFindTest/RecordDriver/SolrMarcTest.php
@@ -212,4 +212,108 @@ class SolrMarcTest extends \VuFindTest\Unit\TestCase
             $record->getFormattedMarcDetails('245', $input)
         );
     }
+
+    /**
+     * Test methods in MarcAdvancedTrait.
+     *
+     * Note that some methods are covered by the other tests.
+     *
+     * @return void
+     */
+    public function testMarcAdvancedTrait()
+    {
+        $xml = $this->getFixture('marc/marctraits.xml');
+        $record = (new \File_MARCXML($xml, \File_MARCXML::SOURCE_STRING))->next();
+        $obj = $this->getMockBuilder(\VuFind\RecordDriver\SolrMarc::class)
+            ->onlyMethods(['getMarcRecord'])->getMock();
+        $obj->expects($this->any())
+            ->method('getMarcRecord')
+            ->will($this->returnValue($record));
+
+        $this->assertEquals(['Classified.'], $obj->getAccessRestrictions());
+        $this->assertEquals(['VuFind Golden Award, 2020'], $obj->getAwards());
+        $this->assertEquals(['Bibliography: p. 122'], $obj->getBibliographyNotes());
+        $this->assertRegExp(
+            '/<collection.*?>.*<record>.*<\/record>.*<\/collection>/s',
+            $obj->getFilteredXML()
+        );
+        $this->assertEquals(['Finding aid available'], $obj->getFindingAids());
+        $this->assertEquals(
+            ['General notes here.', 'Translation.'], $obj->getGeneralNotes()
+        );
+        $this->assertEquals(
+            ['2020', '2020'], $obj->getHumanReadablePublicationDates()
+        );
+        $this->assertEquals(
+            ['Place :', 'Location :'], $obj->getPlacesOfPublication()
+        );
+        $this->assertEquals(['00:20:10', '01:30:55'], $obj->getPlayingTimes());
+        $this->assertEquals(['Producer: VuFind'], $obj->getProductionCredits());
+        $this->assertEquals(
+            ['Frequency varies, 2020-'], $obj->getPublicationFrequency()
+        );
+        $this->assertEquals(
+            ['Merged with several branches'], $obj->getRelationshipNotes()
+        );
+        $this->assertEquals(
+            [
+                ['name' => 'Development Series'],
+                ['name' => 'Development', 'number' => 'no. 2']
+            ],
+            $obj->getSeries()
+        );
+        $this->assertEquals(['Summary.'], $obj->getSummary());
+        $this->assertEquals(['Data in UTF-8'], $obj->getSystemDetails());
+        $this->assertEquals(['Developers'], $obj->getTargetAudienceNotes());
+        $this->assertEquals('2. Return', $obj->getTitleSection());
+        $this->assertEquals('Test Author.', $obj->getTitleStatement());
+        $this->assertEquals(
+            ['Zoolandia -- City.', 'Funland -- Funtown.'],
+            $obj->getHierarchicalPlaceNames()
+        );
+        $this->assertEquals(
+            [
+                [
+                    'url' => 'https://vufind.org/vufind/',
+                    'desc' => 'VuFind Home Page'
+                ]
+            ],
+            $obj->getURLs()
+        );
+        $this->assertEquals(['(FOO)123', '(Baz)456'], $obj->getConsortialIDs());
+        $this->assertEquals('ismn', $obj->getCleanISMN());
+        $this->assertEquals(
+            ['nbn' => 'NBN12', 'source' => 'NB'], $obj->getCleanNBN()
+        );
+        $marc21Xml = $obj->getXML('marc21');
+        $this->assertStringStartsWith(
+            '<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
+            . ' xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="'
+            . 'http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml'
+            . '/schema/MARC21slim.xsd" type="Bibliographic">',
+            $marc21Xml
+        );
+        $this->assertStringContainsString('<leader>', $marc21Xml);
+        $this->assertEquals(
+            1, substr_count($marc21Xml, '<leader>00000cam a22000004i 4500</leader>')
+        );
+        $this->assertEquals(2, substr_count($marc21Xml, '<controlfield '));
+        $this->assertEquals(52, substr_count($marc21Xml, '<datafield '));
+        $this->assertEquals(86, substr_count($marc21Xml, '<subfield '));
+        $rdfXml = $obj->getRDFXML();
+        $this->assertStringContainsString(
+            '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"'
+            . ' xmlns="http://www.loc.gov/mods/v3">',
+            $rdfXml
+        );
+        $this->assertStringContainsString('<nonSort>The </nonSort>', $rdfXml);
+        $this->assertStringContainsString(
+            '<namePart>Author, Test</namePart>',
+            $rdfXml
+        );
+        $this->assertStringContainsString(
+            '<identifier type="isbn">978-3-16-148410-0</identifier>',
+            $rdfXml
+        );
+    }
 }