diff --git a/src/main/java/net/nicoulaj/maven/plugins/checksum/artifacts/ArtifactAttacher.java b/src/main/java/net/nicoulaj/maven/plugins/checksum/artifacts/ArtifactAttacher.java
index 1da2b10..e838514 100644
--- a/src/main/java/net/nicoulaj/maven/plugins/checksum/artifacts/ArtifactAttacher.java
+++ b/src/main/java/net/nicoulaj/maven/plugins/checksum/artifacts/ArtifactAttacher.java
@@ -1,44 +1,53 @@
-/*
- * checksum-maven-plugin - http://checksum-maven-plugin.nicoulaj.net
- * Copyright © 2010-2018 checksum-maven-plugin contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.nicoulaj.maven.plugins.checksum.artifacts;
-
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectHelper;
-
-import java.io.File;
-
-public class ArtifactAttacher implements ArtifactListener {
-    private final MavenProject project;
-    private final MavenProjectHelper projectHelper;
-
-    public ArtifactAttacher(MavenProject project, MavenProjectHelper projectHelper) {
-        this.project = project;
-        this.projectHelper = projectHelper;
-    }
-
-    @Override
-    public void artifactCreated(File artifact, String checksumType, String artifactType, String artifactClassifier) {
-        if (checksumType.startsWith(".")) {
-            // Project helper expects a type without leading dot (e.g. turn ".md5" into "md5").
-            checksumType = checksumType.substring(1);
-        }
-
-        String attachmentType = artifactType == null ? checksumType : artifactType + "." + checksumType;
-
-        projectHelper.attachArtifact(project, attachmentType, artifactClassifier, artifact);
-    }
-}
+/*
+ * checksum-maven-plugin - http://checksum-maven-plugin.nicoulaj.net
+ * Copyright © 2010-2018 checksum-maven-plugin contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.nicoulaj.maven.plugins.checksum.artifacts;
+
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.MavenProjectHelper;
+
+import java.io.File;
+
+public class ArtifactAttacher implements ArtifactListener {
+    private final MavenProject project;
+    private final MavenProjectHelper projectHelper;
+
+    public ArtifactAttacher(MavenProject project, MavenProjectHelper projectHelper) {
+        this.project = project;
+        this.projectHelper = projectHelper;
+    }
+
+    @Override
+    public void artifactCreated(File artifact, String checksumType, String artifactType, String artifactClassifier) {
+        if (checksumType.startsWith(".")) {
+            // Project helper expects a type without leading dot (e.g. turn ".md5" into "md5").
+            checksumType = checksumType.substring(1);
+        }
+
+        String fileName = artifact.getName();
+        int period1 = fileName.lastIndexOf('.');  // finds xxx.yyy.sha512   period in front of sha512
+        int period2 = fileName.lastIndexOf('.', period1 - 1);
+        String attachmentType = fileName.substring(period2 + 1);   // yyy.sha512
+//        String attachmentType = fileType + "." + checksumType;
+//        System.out.println("debug artifactType: " + ((artifactType == null) ? "null" : artifactType));
+//        System.out.println("debug artifactClassifier: " + artifactClassifier);
+//        System.out.println("debug checksumType: " + ((checksumType == null) ? "null" : checksumType));
+//        System.out.println("debug derived attachmentType: " + attachmentType);
+//        System.out.println("debug artifact: " + artifact.getAbsolutePath());
+
+        projectHelper.attachArtifact(project, attachmentType, artifactClassifier, artifact);
+    }
+}
diff --git a/src/main/java/net/nicoulaj/maven/plugins/checksum/mojo/ArtifactsMojo.java b/src/main/java/net/nicoulaj/maven/plugins/checksum/mojo/ArtifactsMojo.java
index e70347e..d654ae1 100644
--- a/src/main/java/net/nicoulaj/maven/plugins/checksum/mojo/ArtifactsMojo.java
+++ b/src/main/java/net/nicoulaj/maven/plugins/checksum/mojo/ArtifactsMojo.java
@@ -1,266 +1,285 @@
-/*
- * checksum-maven-plugin - http://checksum-maven-plugin.nicoulaj.net
- * Copyright © 2010-2018 checksum-maven-plugin contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.nicoulaj.maven.plugins.checksum.mojo;
+/*
+ * checksum-maven-plugin - http://checksum-maven-plugin.nicoulaj.net
+ * Copyright © 2010-2018 checksum-maven-plugin contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.nicoulaj.maven.plugins.checksum.mojo;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.codehaus.plexus.util.FileUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Compute project artifacts checksum digests and store them in individual files and/or a summary file.
+ *
+ * @author <a href="mailto:julien.nicoulaud@gmail.com">Julien Nicoulaud</a>
+ * @since 1.0
+ */
+@Mojo(
+    name = ArtifactsMojo.NAME,
+    defaultPhase = LifecyclePhase.VERIFY,
+    requiresProject = true,
+    inheritByDefault = false,
+    threadSafe = true )
+public class ArtifactsMojo
+    extends AbstractChecksumMojo
+{
+
+    /**
+     * The mojo name.
+     */
+    public static final String NAME = "artifacts";
+
+    /**
+     * Indicates whether the build will store checksums in separate files (one file per algorithm per artifact).
+     *
+     * @since 1.0
+     */
+    @Parameter( defaultValue = "true" )
+    protected boolean individualFiles;
+
+    /**
+     * The directory where output files will be stored. Leave unset to have each file next to the source file.
+     *
+     * @since 1.0
+     */
+    @Parameter
+    protected String individualFilesOutputDirectory;
+
+    /**
+     * Indicates whether the build will store checksums to a single CSV summary file.
+     *
+     * @since 1.0
+     */
+    @Parameter( defaultValue = "false" )
+    protected boolean csvSummary;
+
+    /**
+     * The name of the summary file created if the option is activated.
+     *
+     * @see #csvSummary
+     * @since 1.0
+     */
+    @Parameter( defaultValue = "artifacts-checksums.csv" )
+    protected String csvSummaryFile;
+
+    /**
+     * Indicates whether the build will store checksums to a single XML summary file.
+     *
+     * @since 1.0
+     */
+    @Parameter( defaultValue = "false" )
+    protected boolean xmlSummary;
+
+    /**
+     * The name of the summary file created if the option is activated.
+     *
+     * @see #xmlSummary
+     * @since 1.0
+     */
+    @Parameter( defaultValue = "artifacts-checksums.xml" )
+    protected String xmlSummaryFile;
+
+    /**
+     * Indicates whether the build will store checksums to a single shasum summary file.
+     *
+     * @since 1.3
+     */
+    @Parameter( defaultValue = "false" )
+    protected boolean shasumSummary;
+
+    /**
+     * The name of the summary file created if the option is activated.
+     *
+     * @see #shasumSummary
+     * @since 1.3
+     */
+    @Parameter( defaultValue = "artifacts-checksums.sha" )
+    protected String shasumSummaryFile;
+
+    /**
+     * Append the artifact filename in the generated checksum file.
+     * This parameter require the parameter individualFiles be equal to true.
+     *
+     * @see #individualFiles
+     * @since 1.4
+     */
+    @Parameter (defaultValue = "false")
+    protected boolean appendFilename;
+
+    /**
+     * Constructor.
+     */
+    public ArtifactsMojo() {
+        super(false, true, true);
+    }
+
+    /**
+     * Build the list of files from which digests should be generated.
+     *
+     * <p>The list is composed of the project main and attached artifacts.</p>
+     *
+     * @return the list of files that should be processed.
+     * @see #hasValidFile(org.apache.maven.artifact.Artifact)
+     */
+    @Override
+    protected List<ChecksumFile> getFilesToProcess()
+    {
+        List<ChecksumFile> files = new LinkedList<ChecksumFile>();
+
+        // add pom (copy to target)
+        File pomToSign = new File( project.getBuild().getDirectory(), project.getBuild().getFinalName() + ".pom" );
 
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Compute project artifacts checksum digests and store them in individual files and/or a summary file.
- *
- * @author <a href="mailto:julien.nicoulaud@gmail.com">Julien Nicoulaud</a>
- * @since 1.0
- */
-@Mojo(
-    name = ArtifactsMojo.NAME,
-    defaultPhase = LifecyclePhase.VERIFY,
-    requiresProject = true,
-    inheritByDefault = false,
-    threadSafe = true )
-public class ArtifactsMojo
-    extends AbstractChecksumMojo
-{
-
-    /**
-     * The mojo name.
-     */
-    public static final String NAME = "artifacts";
-
-    /**
-     * Indicates whether the build will store checksums in separate files (one file per algorithm per artifact).
-     *
-     * @since 1.0
-     */
-    @Parameter( defaultValue = "true" )
-    protected boolean individualFiles;
-
-    /**
-     * The directory where output files will be stored. Leave unset to have each file next to the source file.
-     *
-     * @since 1.0
-     */
-    @Parameter
-    protected String individualFilesOutputDirectory;
-
-    /**
-     * Indicates whether the build will store checksums to a single CSV summary file.
-     *
-     * @since 1.0
-     */
-    @Parameter( defaultValue = "false" )
-    protected boolean csvSummary;
-
-    /**
-     * The name of the summary file created if the option is activated.
-     *
-     * @see #csvSummary
-     * @since 1.0
-     */
-    @Parameter( defaultValue = "artifacts-checksums.csv" )
-    protected String csvSummaryFile;
-
-    /**
-     * Indicates whether the build will store checksums to a single XML summary file.
-     *
-     * @since 1.0
-     */
-    @Parameter( defaultValue = "false" )
-    protected boolean xmlSummary;
-
-    /**
-     * The name of the summary file created if the option is activated.
-     *
-     * @see #xmlSummary
-     * @since 1.0
-     */
-    @Parameter( defaultValue = "artifacts-checksums.xml" )
-    protected String xmlSummaryFile;
-
-    /**
-     * Indicates whether the build will store checksums to a single shasum summary file.
-     *
-     * @since 1.3
-     */
-    @Parameter( defaultValue = "false" )
-    protected boolean shasumSummary;
-
-    /**
-     * The name of the summary file created if the option is activated.
-     *
-     * @see #shasumSummary
-     * @since 1.3
-     */
-    @Parameter( defaultValue = "artifacts-checksums.sha" )
-    protected String shasumSummaryFile;
-
-    /**
-     * Append the artifact filename in the generated checksum file.
-     * This parameter require the parameter individualFiles be equal to true.
-     *
-     * @see #individualFiles
-     * @since 1.4
-     */
-    @Parameter (defaultValue = "false")
-    protected boolean appendFilename;
-
-    /**
-     * Constructor.
-     */
-    public ArtifactsMojo() {
-        super(false, true, true);
-    }
-
-    /**
-     * Build the list of files from which digests should be generated.
-     *
-     * <p>The list is composed of the project main and attached artifacts.</p>
-     *
-     * @return the list of files that should be processed.
-     * @see #hasValidFile(org.apache.maven.artifact.Artifact)
-     */
-    @Override
-    protected List<ChecksumFile> getFilesToProcess()
-    {
-        List<ChecksumFile> files = new LinkedList<ChecksumFile>();
-
-        // Add project main artifact.
-        if ( hasValidFile( project.getArtifact() ) )
+        try
         {
-            files.add( new ChecksumFile( "", project.getArtifact().getFile(), project.getArtifact().getType(),null ) );
+            FileUtils.copyFile( project.getFile(), pomToSign );
         }
-
-        // Add projects attached.
-        if ( project.getAttachedArtifacts() != null )
+        catch ( IOException e )
         {
-            for ( Artifact artifact : (List<Artifact>) project.getAttachedArtifacts() )
-            {
-                if ( hasValidFile( artifact ) )
-                {
-                    files.add( new ChecksumFile( "", artifact.getFile(), artifact.getType(), artifact.getClassifier() ) );
-                }
-            }
+            throw new RuntimeException( new MojoExecutionException( "Error copying POM for signing.", e ) );
         }
-        return files;
-    }
+        
+        files.add( new ChecksumFile( "", pomToSign, "pom", null ) ); 
 
-    /**
-     * Decide whether the artifact file should be processed.
-     *
-     * <p>Excludes the project POM file and any file outside the build directory, because this could lead to writing
-     * files on the user local repository for example.</p>
-     *
-     * @param artifact the artifact to check.
-     * @return true if the artifact should be included in the files to process.
-     */
-    protected boolean hasValidFile( Artifact artifact )
-    {
-        // Make sure the file exists.
-        boolean hasValidFile = artifact != null && artifact.getFile() != null && artifact.getFile().exists();
-
-        // Exclude project POM file.
-        hasValidFile = hasValidFile && !artifact.getFile().getPath().equals( project.getFile().getPath() );
-
-        // Exclude files outside of build directory.
-        hasValidFile = hasValidFile && artifact.getFile().getPath().startsWith( project.getBuild().getDirectory() );
-
-        return hasValidFile;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected boolean isIndividualFiles()
-    {
-        return individualFiles;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected String getIndividualFilesOutputDirectory()
-    {
-        return individualFilesOutputDirectory;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected boolean isAppendFilename(){
-        return this.appendFilename;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected boolean isCsvSummary()
-    {
-        return csvSummary;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected String getCsvSummaryFile()
-    {
-        return csvSummaryFile;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected boolean isXmlSummary()
-    {
-        return xmlSummary;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected String getXmlSummaryFile()
-    {
-        return xmlSummaryFile;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected boolean isShasumSummary()
-    {
-        return shasumSummary;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected String getShasumSummaryFile()
-    {
-        return shasumSummaryFile;
-    }
-}
+        // Add project main artifact.
+        if ( hasValidFile( project.getArtifact() ) )
+        {
+            files.add( new ChecksumFile( "", project.getArtifact().getFile(), project.getArtifact().getType(), 
+                project.getArtifact().getClassifier() ) );
+        }
+
+        // Add projects attached.
+        if ( project.getAttachedArtifacts() != null )
+        {
+            for ( Artifact artifact : (List<Artifact>) project.getAttachedArtifacts() )
+            {
+                if ( hasValidFile( artifact ) )
+                {
+                    files.add( new ChecksumFile( "", artifact.getFile(), artifact.getType(), artifact.getClassifier() ) );
+                }
+            }
+        }
+        return files;
+    }
+
+    /**
+     * Decide whether the artifact file should be processed.
+     *
+     * <p>Excludes the project POM file and any file outside the build directory, because this could lead to writing
+     * files on the user local repository for example.</p>
+     *
+     * @param artifact the artifact to check.
+     * @return true if the artifact should be included in the files to process.
+     */
+    protected boolean hasValidFile( Artifact artifact )
+    {
+        // Make sure the file exists.
+        boolean hasValidFile = artifact != null && artifact.getFile() != null && artifact.getFile().exists();
+
+        // Exclude project POM file.
+        hasValidFile = hasValidFile && !artifact.getFile().getPath().equals( project.getFile().getPath() );
+
+        // Exclude files outside of build directory.
+        hasValidFile = hasValidFile && artifact.getFile().getPath().startsWith( project.getBuild().getDirectory() );
+
+        return hasValidFile;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected boolean isIndividualFiles()
+    {
+        return individualFiles;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected String getIndividualFilesOutputDirectory()
+    {
+        return individualFilesOutputDirectory;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected boolean isAppendFilename(){
+        return this.appendFilename;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected boolean isCsvSummary()
+    {
+        return csvSummary;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected String getCsvSummaryFile()
+    {
+        return csvSummaryFile;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected boolean isXmlSummary()
+    {
+        return xmlSummary;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected String getXmlSummaryFile()
+    {
+        return xmlSummaryFile;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected boolean isShasumSummary()
+    {
+        return shasumSummary;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected String getShasumSummaryFile()
+    {
+        return shasumSummaryFile;
+    }
+}
