diff --git a/opf.go b/opf.go
index a2a46f3d00250fa628486cc3e9f1bfe9593d45dc..8b6457de27a6c49b241c9e2fa8aa9683b1394191 100644
--- a/opf.go
+++ b/opf.go
@@ -2,6 +2,7 @@ package liber
 
 import (
 	"encoding/xml"
+	"errors"
 	"io"
 	"os"
 	"path/filepath"
@@ -75,29 +76,27 @@ func opfOpen(path string) (*Metadata, error) {
 	return opfParse(file)
 }
 
-func opfMetadataPath(epubPath string) string {
-	return filepath.Join(filepath.Dir(epubPath), "metadata.opf")
-}
-
-func opfCoverPath(epubPath string) string {
-	return filepath.Join(filepath.Dir(epubPath), "cover.jpg")
+func replaceExt(path, ext string) string {
+	return strings.TrimSuffix(path, filepath.Ext(path)) + ext
 }
 
 type opfProvider struct{}
 
 func (p *opfProvider) Lookup(storage *FileStorage, path, filetype string) (*Metadata, error) {
-	if !storage.Exists(opfMetadataPath(path)) {
-		return nil, nil
+	paths := []string{
+		filepath.Join(filepath.Dir(path), "metadata.opf"),
+		replaceExt(path, ".opf"),
 	}
-	m, err := opfOpen(opfMetadataPath(storage.Abs(path)))
-	if err != nil {
-		return nil, err
+	for _, opfpath := range paths {
+		if m, err := opfOpen(storage.Abs(opfpath)); err == nil {
+			return m, err
+		}
 	}
-	return m, err
+	return nil, errors.New("no OPF metadata found")
 }
 
 func (p *opfProvider) GetBookCover(storage *FileStorage, path string) (string, error) {
-	coverPath := opfCoverPath(path)
+	coverPath := filepath.Join(filepath.Dir(path), "cover.jpg")
 	if storage.Exists(coverPath) {
 		return coverPath, nil
 	}