diff --git a/book_tools/format/fb2.py b/book_tools/format/fb2.py
index c6351974caaa140921eaa7d98b4e9ee812fa2b6c..045da3ecf393a9650d0de61acd84e82f65ca9c9a 100644
--- a/book_tools/format/fb2.py
+++ b/book_tools/format/fb2.py
@@ -113,9 +113,9 @@ class FB2Base(BookFile):
 
         def add_author_from_node(node):
             first_name = subnode_text(node, 'first-name')
-            middle_name = subnode_text(node, 'middle-name')
+            #middle_name = subnode_text(node, 'middle-name')
             last_name = subnode_text(node, 'last-name')
-            self.__add_author__(' '.join([first_name, middle_name, last_name]), last_name)
+            self.__add_author__(' '.join([first_name, last_name]), last_name)
 
         res = tree.xpath('/fb:FictionBook/fb:description/fb:title-info/fb:author', namespaces=self.__namespaces)
         if len(res) == 0:
diff --git a/book_tools/format/fb2sax.py b/book_tools/format/fb2sax.py
index bea20f8956ea2312b458e1d21e49129ed1495a2b..1065ea5db2424940a295d1166a277e15450bff62 100644
--- a/book_tools/format/fb2sax.py
+++ b/book_tools/format/fb2sax.py
@@ -169,7 +169,7 @@ class fb2parser:
           self.lang.tagopen(name)
           self.book_title.tagopen(name)
           self.annotation.tagopen(name)
-          self.docdate.tagopen(name)
+          self.docdate.tagopen(name,attrs)
           self.series.tagopen(name,attrs)
           if self.rc!=0:
              if self.cover_name.tagopen(name,attrs):
@@ -245,7 +245,6 @@ class fb2parser:
         except StopIteration:
             pass
         except Exception as err:
-            print(err)
             self.parse_errormsg=err
             self.parse_error=1
 
@@ -262,7 +261,7 @@ class FB2sax(BookFile):
         self.file.seek(0, 0)
         self.fb2parser.parse(self.file)
         if self.fb2parser.parse_error != 0:
-            raise FB2StructureException('FB2sax parse error')
+            raise FB2StructureException('FB2sax parse error (%s)'%self.fb2parser.parse_errormsg)
         self.__detect_title()
         self.__detect_authors()
         self.__detect_tags()
@@ -293,8 +292,8 @@ class FB2sax(BookFile):
         return None
 
     def __detect_docdate(self):
-        res = ''
-        if len(self.fb2parser.docdate.getvalue()) > 0:
+        res = self.fb2parser.docdate.getattr('value') or ''
+        if len(res)==0 and len(self.fb2parser.docdate.getvalue()) > 0:
             res = self.fb2parser.docdate.getvalue()[0].strip();
         if len(res) > 0:
             self.__set_docdate__(res)
diff --git a/opds_catalog/sopdscan.py b/opds_catalog/sopdscan.py
index f546eab529df64f16c8021f486f8e7be679b5be5..ffcc24846b635f42bcda5250d1f13f9a44371d89 100644
--- a/opds_catalog/sopdscan.py
+++ b/opds_catalog/sopdscan.py
@@ -229,7 +229,7 @@ class opdsScanner:
                     for a in book_data.authors:
                         author_name = a.get('name','Unknown author').strip(strip_symbols)
                         # Если в имени автора нет запятой, то фамилию переносим из конца в начало
-                        if author_name.find(',')>=0:
+                        if author_name.find(',')<0:
                             author_names = author_name.split()
                             author_name = ' '.join([author_names[-1],' '.join(author_names[:-1])])
                         author=opdsdb.addauthor(author_name)
diff --git a/opds_catalog/tests/data/mirer.epub b/opds_catalog/tests/data/mirer.epub
new file mode 100644
index 0000000000000000000000000000000000000000..62b38511a6801a64575349f9ea42f1d05d21186a
Binary files /dev/null and b/opds_catalog/tests/data/mirer.epub differ
diff --git a/opds_catalog/tests/data/robin_cook.mobi b/opds_catalog/tests/data/robin_cook.mobi
new file mode 100644
index 0000000000000000000000000000000000000000..b083474b2d368365535297af5d5c0fd81286e6ae
Binary files /dev/null and b/opds_catalog/tests/data/robin_cook.mobi differ
diff --git a/opds_catalog/tests/test_scan.py b/opds_catalog/tests/test_scan.py
index f6ab19e1155891cb5679fe000d951ad2b88a00bc..8483f8e3b21c956f12bb8b3c9ff1772ba5c1d519 100644
--- a/opds_catalog/tests/test_scan.py
+++ b/opds_catalog/tests/test_scan.py
@@ -13,13 +13,15 @@ class scanTestCase(TestCase):
     test_module_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
     test_ROOTLIB = os.path.join(test_module_path, 'tests/data')
     test_fb2 = "262001.fb2"
+    test_epub = "mirer.epub"
+    test_mobi = "robin_cook.mobi"
     test_zip = "books.zip"
 
     def setUp(self):
         config.SOPDS_ROOT_LIB = self.test_ROOTLIB
 
-    def test_processfile(self):
-        """ Тестирование процедуры processfile (извлекает метаданные из книги и помещает в БД) """
+    def test_processfile_fb2(self):
+        """ Тестирование процедуры processfile (извлекает метаданные из книги FB2 и помещает в БД) """
         opdsdb.clear_all()
         scanner = opdsScanner()
         scanner.processfile(self.test_fb2, self.test_ROOTLIB, os.path.join(self.test_ROOTLIB,self.test_fb2), None,0,495373)
@@ -49,6 +51,64 @@ class scanTestCase(TestCase):
         self.assertEqual(book.genres.get(genre="antique").section, opdsdb.unknown_genre)
         self.assertEqual(book.genres.get(genre="antique").subsection, "antique")
 
+    def test_processfile_epub(self):
+        """ Тестирование процедуры processfile (извлекает метаданные из книги EPUB и помещает в БД) """
+        opdsdb.clear_all()
+        scanner = opdsScanner()
+        scanner.processfile(self.test_epub, self.test_ROOTLIB, os.path.join(self.test_ROOTLIB,self.test_epub), None,0,491279)
+        book = Book.objects.get(filename=self.test_epub)
+        self.assertIsNotNone(book)
+        self.assertEqual(scanner.books_added,1)
+        self.assertEqual(book.filename, self.test_epub)
+        self.assertEqual(book.path, ".")
+        self.assertEqual(book.format, "epub")
+        self.assertEqual(book.cat_type, 0)
+        #self.assertGreaterEqual(book.registerdate, )
+        self.assertEqual(book.docdate, "2015")
+        self.assertEqual(book.lang, "ru")
+        self.assertEqual(book.title, "У меня девять жизней (шф (продолжатели))")
+        self.assertEqual(book.search_title, "У меня девять жизней (шф (продолжатели))".upper())
+        self.assertEqual(book.annotation, "Собрание произведений. Том 2")
+        self.assertEqual(book.avail, 2)
+        self.assertEqual(book.catalog.path, ".")
+        self.assertEqual(book.catalog.cat_name, ".")
+        self.assertEqual(book.catalog.cat_type, 0)
+        self.assertEqual(book.filesize, 491279)
+
+        self.assertEqual(book.authors.count(), 1)
+        self.assertEqual(book.authors.get(full_name="Мирер Александр").search_full_name, "МИРЕР АЛЕКСАНДР")
+
+        self.assertEqual(book.genres.count(), 1)
+        self.assertEqual(book.genres.get(genre="sf").section, opdsdb.unknown_genre)
+        self.assertEqual(book.genres.get(genre="sf").subsection, "sf")
+
+    def test_processfile_mobi(self):
+        """ Тестирование процедуры processfile (извлекает метаданные из книги EPUB и помещает в БД) """
+        opdsdb.clear_all()
+        scanner = opdsScanner()
+        scanner.processfile(self.test_mobi, self.test_ROOTLIB, os.path.join(self.test_ROOTLIB,self.test_mobi), None,0,542811)
+        book = Book.objects.get(filename=self.test_mobi)
+        self.assertIsNotNone(book)
+        self.assertEqual(scanner.books_added,1)
+        self.assertEqual(book.filename, self.test_mobi)
+        self.assertEqual(book.path, ".")
+        self.assertEqual(book.format, "mobi")
+        self.assertEqual(book.cat_type, 0)
+        #self.assertGreaterEqual(book.registerdate, )
+        self.assertEqual(book.docdate, "2011-11-20")
+        self.assertEqual(book.lang, "")
+        self.assertEqual(book.title, "Vector")
+        self.assertEqual(book.search_title, "Vector".upper())
+        self.assertEqual(book.annotation, "")
+        self.assertEqual(book.avail, 2)
+        self.assertEqual(book.catalog.path, ".")
+        self.assertEqual(book.catalog.cat_name, ".")
+        self.assertEqual(book.catalog.cat_type, 0)
+        self.assertEqual(book.filesize, 542811)
+
+        self.assertEqual(book.authors.count(), 1)
+        self.assertEqual(book.authors.get(full_name="Cook Robin").search_full_name, "COOK ROBIN")
+
     def test_processzip(self):
         """ Тестирование процедуры processzip (извлекает метаданные из книг, помещенных в архив и помещает их БД) """
         opdsdb.clear_all()
@@ -86,17 +146,17 @@ class scanTestCase(TestCase):
         self.assertEqual(book.path, self.test_zip)
         self.assertEqual(book.cat_type, 1)
         self.assertEqual(book.title, "Драконьи Услуги")
-        self.assertEqual(book.authors.get(full_name="Куприянов Денис Валерьевич").search_full_name, "КУПРИЯНОВ ДЕНИС ВАЛЕРЬЕВИЧ")
+        self.assertEqual(book.authors.get(full_name="Куприянов Денис").search_full_name, "КУПРИЯНОВ ДЕНИС")
 
     def test_scanall(self):
         """ Тестирование процедуры scanall (извлекает метаданные из книг и помещает в БД) """
         opdsdb.clear_all()
         scanner = opdsScanner()
         scanner.scan_all()
-        self.assertEquals(scanner.books_added, 4)
+        self.assertEquals(scanner.books_added, 6)
         self.assertEquals(scanner.bad_books, 1)
-        self.assertEquals(Book.objects.all().count(), 4)
-        self.assertEquals(Author.objects.all().count(), 4)
-        self.assertEquals(Genre.objects.all().count(), 4)
+        self.assertEquals(Book.objects.all().count(), 6)
+        self.assertEquals(Author.objects.all().count(), 6)
+        self.assertEquals(Genre.objects.all().count(), 5)
         self.assertEquals(Series.objects.all().count(), 0)
         self.assertEquals(Catalog.objects.all().count(), 2)