diff --git a/pom.xml b/pom.xml
index 2b24d1f..8aa8c82 100644
--- a/pom.xml
+++ b/pom.xml
@@ -212,6 +212,11 @@
       <scope>test</scope>
     </dependency>
 
+    <dependency>
+        <groupId>com.google.code.gson</groupId>
+        <artifactId>gson</artifactId>
+        <version>2.8.0</version>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/src/main/java/org/codehaus/mojo/build/CreateMetadataMojo.java b/src/main/java/org/codehaus/mojo/build/CreateMetadataMojo.java
index c180d96..a1a0b08 100644
--- a/src/main/java/org/codehaus/mojo/build/CreateMetadataMojo.java
+++ b/src/main/java/org/codehaus/mojo/build/CreateMetadataMojo.java
@@ -164,6 +164,14 @@ public class CreateMetadataMojo
     @Parameter
     private Map<String, String> properties = new HashMap<String, String>();
 
+    /**
+     * Enable output format detection. (Disabled per default for compatibility.)
+     *
+     * @since 3.0
+     */
+    @Parameter( defaultValue = "false" )
+    private boolean autoDetectOutputFormat;
+
     /**
      * Maven ProjectHelper.
      */
@@ -196,16 +204,7 @@ public void execute()
         for ( File file : outputFiles )
         {
             file.getParentFile().mkdirs();
-            OutputStream os = null;
-            try
-            {
-                os = new FileOutputStream( file );
-                props.store( os, "Created by build system. Do not modify" );
-            }
-            catch ( IOException e )
-            {
-                throw new MojoFailureException( "Unable to store output to " + file, e );
-            }
+            writeToFile(props, file);
         }
 
         if ( attach )
@@ -222,6 +221,34 @@ public void execute()
         }
     }
 
+    private void writeToFile(Properties props, File file) throws MojoFailureException {
+        try
+        {
+            if( this.autoDetectOutputFormat ) {
+                OutputFormat outputFormat = OutputFormat.getOutputFormatFor(file.getName());
+                writeToFile(props, file, outputFormat);
+            }
+            else
+            {
+                writeToFile(props, file, OutputFormat.DEFAULT_FORMAT);
+            }
+        }
+        catch ( IOException e )
+        {
+            throw new MojoFailureException( "Unable to store output to " + file, e );
+        }
+    }
+
+    private void writeToFile(Properties props, File file, OutputFormat outputFormat) throws IOException {
+        OutputStream out = new FileOutputStream(file);
+        try {
+            outputFormat.write(props, out);
+        }
+        finally {
+            out.close();
+        }
+    }
+
     public String getRevision()
         throws MojoExecutionException
     {
diff --git a/src/main/java/org/codehaus/mojo/build/JsonOutputFormat.java b/src/main/java/org/codehaus/mojo/build/JsonOutputFormat.java
new file mode 100644
index 0000000..d4d980e
--- /dev/null
+++ b/src/main/java/org/codehaus/mojo/build/JsonOutputFormat.java
@@ -0,0 +1,27 @@
+package org.codehaus.mojo.build;
+
+import com.google.gson.Gson;
+import com.google.gson.stream.JsonWriter;
+
+import java.io.*;
+import java.util.Properties;
+
+public class JsonOutputFormat extends OutputFormat {
+    @Override
+    public boolean handles(String fileName) {
+        return fileName.endsWith(".json");
+    }
+
+    @Override
+    public void write(Properties props, OutputStream out) throws IOException {
+        Gson gson = new Gson();
+        JsonWriter jsonWriter = gson.newJsonWriter(new OutputStreamWriter( out, "UTF-8" ));
+        jsonWriter.beginObject();
+        for(Object key: props.keySet()) {
+            jsonWriter.name((String)key);
+            jsonWriter.value(props.getProperty((String)key));
+        }
+        jsonWriter.endObject();
+        jsonWriter.flush();
+    }
+}
diff --git a/src/main/java/org/codehaus/mojo/build/OutputFormat.java b/src/main/java/org/codehaus/mojo/build/OutputFormat.java
new file mode 100644
index 0000000..510949d
--- /dev/null
+++ b/src/main/java/org/codehaus/mojo/build/OutputFormat.java
@@ -0,0 +1,29 @@
+package org.codehaus.mojo.build;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Properties;
+
+public abstract class OutputFormat {
+    static final OutputFormat DEFAULT_FORMAT = new PropertiesOutputFormat();
+
+    private static final OutputFormat[] FORMATS = new OutputFormat[] {
+            new JsonOutputFormat(),
+            OutputFormat.DEFAULT_FORMAT
+    };
+
+    public static OutputFormat getOutputFormatFor(String fileName) {
+        for(OutputFormat outputFormat : OutputFormat.FORMATS) {
+            if( outputFormat.handles(fileName) ) {
+                return outputFormat;
+            }
+        }
+
+        return OutputFormat.DEFAULT_FORMAT;
+    }
+
+    public abstract boolean handles(String fileName);
+
+    public abstract void write(Properties props, OutputStream out) throws IOException;
+}
diff --git a/src/main/java/org/codehaus/mojo/build/PropertiesOutputFormat.java b/src/main/java/org/codehaus/mojo/build/PropertiesOutputFormat.java
new file mode 100644
index 0000000..f0962b1
--- /dev/null
+++ b/src/main/java/org/codehaus/mojo/build/PropertiesOutputFormat.java
@@ -0,0 +1,19 @@
+package org.codehaus.mojo.build;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Properties;
+
+public class PropertiesOutputFormat extends OutputFormat {
+    @Override
+    public boolean handles(String fileName) {
+        return fileName.endsWith(".properties");
+    }
+
+    @Override
+    public void write(Properties props, OutputStream out) throws IOException {
+        props.store( out, "Created by build system. Do not modify" );
+    }
+}
diff --git a/src/test/java/org/codehaus/mojo/build/JsonOutputFormatTest.java b/src/test/java/org/codehaus/mojo/build/JsonOutputFormatTest.java
new file mode 100644
index 0000000..6faf87a
--- /dev/null
+++ b/src/test/java/org/codehaus/mojo/build/JsonOutputFormatTest.java
@@ -0,0 +1,57 @@
+package org.codehaus.mojo.build;
+
+import com.google.gson.Gson;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.*;
+
+/**
+ * Created by conni on 11/10/16.
+ */
+public class JsonOutputFormatTest {
+
+    private OutputFormat outputFormat = new JsonOutputFormat();
+
+    private Properties properties = new Properties();
+
+    private Gson gson = new Gson();
+
+    @Before
+    public void before() {
+        properties.put("key0", "value0");
+        properties.put("key1", "value1");
+    }
+
+    @Test
+    public void handlesDotJson() {
+        assertTrue(outputFormat.handles("file.json"));
+    }
+
+    @Test
+    public void doesNotHandleNonJson() {
+        assertFalse(outputFormat.handles("file.other"));
+    }
+
+    @Test
+    public void writesJson() throws IOException {
+        String s = writePropertiesToString();
+
+        Map<String,Object> map = gson.fromJson(s, Map.class);
+        assertThat(map.size(), is(2));
+        assertThat(map.get("key0"), is((Object)"value0"));
+        assertThat(map.get("key1"), is((Object)"value1"));
+    }
+
+    private String writePropertiesToString() throws IOException {
+        ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
+        outputFormat.write(properties, bytesOut);
+        return new String(bytesOut.toByteArray(), "UTF-8");
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/org/codehaus/mojo/build/OutputFormatTest.java b/src/test/java/org/codehaus/mojo/build/OutputFormatTest.java
new file mode 100644
index 0000000..c01ed83
--- /dev/null
+++ b/src/test/java/org/codehaus/mojo/build/OutputFormatTest.java
@@ -0,0 +1,32 @@
+package org.codehaus.mojo.build;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by conni on 11/10/16.
+ */
+public class OutputFormatTest {
+
+    @Test
+    public void defaultIsPropertiesFormat() {
+        OutputFormat outputFormat = OutputFormat.getOutputFormatFor("illegal");
+
+        assertTrue(outputFormat instanceof PropertiesOutputFormat);
+    }
+
+    @Test
+    public void jsonForForDotJson() {
+        OutputFormat outputFormat = OutputFormat.getOutputFormatFor("file.json");
+
+        assertTrue(outputFormat instanceof JsonOutputFormat);
+    }
+
+    @Test
+    public void propertiesForForDotProperties() {
+        OutputFormat outputFormat = OutputFormat.getOutputFormatFor("file.properties");
+
+        assertTrue(outputFormat instanceof PropertiesOutputFormat);
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/org/codehaus/mojo/build/PropertiesOutputFormatTest.java b/src/test/java/org/codehaus/mojo/build/PropertiesOutputFormatTest.java
new file mode 100644
index 0000000..5519acf
--- /dev/null
+++ b/src/test/java/org/codehaus/mojo/build/PropertiesOutputFormatTest.java
@@ -0,0 +1,57 @@
+package org.codehaus.mojo.build;
+
+import com.google.gson.Gson;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.*;
+
+/**
+ * Created by conni on 11/10/16.
+ */
+public class PropertiesOutputFormatTest {
+
+    private OutputFormat outputFormat = new PropertiesOutputFormat();
+
+    private Properties properties = new Properties();
+
+    @Before
+    public void before() {
+        properties.put("key0", "value0");
+        properties.put("key1", "value1");
+    }
+
+    @Test
+    public void handlesDotProperties() {
+        assertTrue(outputFormat.handles("file.properties"));
+    }
+
+    @Test
+    public void doesNotHandleNonProperties() {
+        assertFalse(outputFormat.handles("file.other"));
+    }
+
+    @Test
+    public void writesProperties() throws IOException {
+        byte[] serialized = writeProperties();
+
+        Properties deserializedProperties = new Properties();
+        deserializedProperties.load(new ByteArrayInputStream(serialized));
+
+        assertThat(deserializedProperties, is(properties));
+    }
+
+    private byte[] writeProperties() throws IOException {
+        ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
+        outputFormat.write(properties, bytesOut);
+        return bytesOut.toByteArray();
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/org/codehaus/mojo/build/it/CreateMetadataMojoTest.java b/src/test/java/org/codehaus/mojo/build/it/CreateMetadataMojoTest.java
index 1f874f6..2855a6b 100644
--- a/src/test/java/org/codehaus/mojo/build/it/CreateMetadataMojoTest.java
+++ b/src/test/java/org/codehaus/mojo/build/it/CreateMetadataMojoTest.java
@@ -47,4 +47,23 @@ public void testBasicConfiguration()
         Assert.assertTrue( new File( testDir, "target/classes/build.properties" ).exists() );
 
     }
+
+
+    @Test
+    public void testBasicJsonConfiguration()
+            throws Exception
+    {
+        File projDir = resources.getBasedir( "create-metadata-json-it" );
+
+        MavenExecution mavenExec = maven.forProject( projDir );
+        MavenExecutionResult result = mavenExec.execute( "clean", "test" );
+        result.assertErrorFreeLog();
+
+        File testDir = result.getBasedir();
+        Assert.assertTrue( new File( testDir, "target/file1.json" ).exists() );
+        Assert.assertTrue( new File( testDir, "target/xxx/file1.json" ).exists() );
+        Assert.assertTrue( new File( testDir, "target/generated/build-metadata/build.properties" ).exists() );
+        Assert.assertTrue( new File( testDir, "target/classes/build.properties" ).exists() );
+
+    }
 }
diff --git a/src/test/projects/create-metadata-json-it/pom.xml b/src/test/projects/create-metadata-json-it/pom.xml
new file mode 100644
index 0000000..61af28c
--- /dev/null
+++ b/src/test/projects/create-metadata-json-it/pom.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.codehaus.mojo.it</groupId>
+  <artifactId>build-metadata-it</artifactId>
+  <version>1.0-SNAPSHOT</version>
+
+  <scm>
+    <developerConnection>scm:svn:http://svn.codehaus.org/mojo/trunk/mojo/buildnumber-maven-plugin/src/test/projects/bogus</developerConnection>
+  </scm>
+
+  <build>
+
+    <defaultGoal>package</defaultGoal>
+
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>buildnumber-maven-plugin</artifactId>
+        <version>${it-plugin.version}</version>
+        <executions>
+          <execution>
+            <id>useLastCommittedRevision</id>
+            <goals>
+              <goal>create-metadata</goal>
+            </goals>
+            <configuration>
+              <detectedOutputFormat>true</detectedOutputFormat>
+              <revisionOnScmFailure>UNKNOWN</revisionOnScmFailure>
+              <!-- see outputDirectory + outputName for the default outputFile -->
+              <outputFiles>
+                <outputFile>${project.build.directory}/file1.json</outputFile>
+                <outputFile>${project.build.directory}/xxx/file1.json</outputFile>
+              </outputFiles>
+              <addOutputDirectoryToResources>true</addOutputDirectoryToResources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+
+  </build>
+
+</project>
\ No newline at end of file