diff --git a/.gitignore b/.gitignore
index 189af35..b75b189 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,4 @@
 .idea/
 asterix.ipr
 asterix.iws
+git.properties
diff --git a/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixAppRuntimeContext.java b/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixAppRuntimeContext.java
index 35afd8b..2a15384 100644
--- a/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixAppRuntimeContext.java
+++ b/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixAppRuntimeContext.java
@@ -27,6 +27,7 @@
 import org.apache.asterix.common.config.AsterixCompilerProperties;
 import org.apache.asterix.common.config.AsterixExternalProperties;
 import org.apache.asterix.common.config.AsterixFeedProperties;
+import org.apache.asterix.common.config.AsterixBuildProperties;
 import org.apache.asterix.common.config.AsterixMetadataProperties;
 import org.apache.asterix.common.config.AsterixPropertiesAccessor;
 import org.apache.asterix.common.config.AsterixStorageProperties;
@@ -95,6 +96,7 @@
     private AsterixStorageProperties storageProperties;
     private AsterixTransactionProperties txnProperties;
     private AsterixFeedProperties feedProperties;
+    private AsterixBuildProperties buildProperties;
 
     private AsterixThreadExecutor threadExecutor;
     private DatasetLifecycleManager indexLifecycleManager;
@@ -118,6 +120,7 @@
         storageProperties = new AsterixStorageProperties(ASTERIX_PROPERTIES_ACCESSOR);
         txnProperties = new AsterixTransactionProperties(ASTERIX_PROPERTIES_ACCESSOR);
         feedProperties = new AsterixFeedProperties(ASTERIX_PROPERTIES_ACCESSOR);
+        buildProperties = new AsterixBuildProperties(ASTERIX_PROPERTIES_ACCESSOR);
     }
 
     public void initialize() throws IOException, ACIDException, AsterixException {
@@ -249,6 +252,11 @@
     }
 
     @Override
+    public AsterixBuildProperties getBuildProperties() {
+        return buildProperties;
+    }
+
+    @Override
     public List<IVirtualBufferCache> getVirtualBufferCaches(int datasetID) {
         return indexLifecycleManager.getVirtualBufferCaches(datasetID);
     }
diff --git a/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/RESTAPIServlet.java b/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/RESTAPIServlet.java
index 7db0c94..e13ac8e 100644
--- a/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/RESTAPIServlet.java
+++ b/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/RESTAPIServlet.java
@@ -53,9 +53,9 @@
 abstract class RESTAPIServlet extends HttpServlet {
     private static final long serialVersionUID = 1L;
 
-    private static final String HYRACKS_CONNECTION_ATTR = "org.apache.asterix.HYRACKS_CONNECTION";
+    public static final String HYRACKS_CONNECTION_ATTR = "org.apache.asterix.HYRACKS_CONNECTION";
 
-    private static final String HYRACKS_DATASET_ATTR = "org.apache.asterix.HYRACKS_DATASET";
+    public static final String HYRACKS_DATASET_ATTR = "org.apache.asterix.HYRACKS_DATASET";
 
     /**
      * Initialize the Content-Type of the response, and construct a
diff --git a/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/VersionAPIServlet.java b/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/VersionAPIServlet.java
new file mode 100644
index 0000000..f98bb06
--- /dev/null
+++ b/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/VersionAPIServlet.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.asterix.api.http.servlet;
+
+import org.apache.asterix.api.common.SessionConfig;
+import org.apache.asterix.common.config.AsterixBuildProperties;
+import org.apache.asterix.common.config.AsterixPropertiesAccessor;
+import org.apache.asterix.hyracks.bootstrap.CCApplicationEntryPoint;
+import org.apache.asterix.om.util.AsterixAppContextInfo;
+import org.apache.hadoop.http.HttpServer;
+import org.json.JSONObject;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+public class VersionAPIServlet extends HttpServlet {
+
+    public static final String ASTERIX_BUILD_PROP_ATTR = "org.apache.asterix.PROPS";
+
+    @Override
+    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        ServletContext context = getServletContext();
+        AsterixAppContextInfo props = (AsterixAppContextInfo) context.getAttribute(ASTERIX_BUILD_PROP_ATTR);
+        Map<String, String> buildProperties = props.getBuildProperties().getAllProps();
+        JSONObject responseObject = new JSONObject(buildProperties);
+        response.setCharacterEncoding("utf-8");
+        PrintWriter responseWriter =  response.getWriter();
+        responseWriter.write(responseObject.toString());
+        response.setStatus(HttpServletResponse.SC_OK);
+        responseWriter.flush();
+    }
+}
diff --git a/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java b/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java
index 1ad34da..11ea546 100644
--- a/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java
+++ b/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java
@@ -36,6 +36,8 @@
 import org.apache.asterix.api.http.servlet.QueryStatusAPIServlet;
 import org.apache.asterix.api.http.servlet.ShutdownAPIServlet;
 import org.apache.asterix.api.http.servlet.UpdateAPIServlet;
+import org.apache.asterix.api.http.servlet.VersionAPIServlet;
+import org.apache.asterix.common.config.AsterixBuildProperties;
 import org.apache.asterix.common.api.AsterixThreadFactory;
 import org.apache.asterix.common.config.AsterixExternalProperties;
 import org.apache.asterix.common.config.AsterixMetadataProperties;
@@ -57,6 +59,7 @@
     private static final Logger LOGGER = Logger.getLogger(CCApplicationEntryPoint.class.getName());
 
     private static final String HYRACKS_CONNECTION_ATTR = "org.apache.asterix.HYRACKS_CONNECTION";
+    private static final String ASTERIX_BUILD_PROP_ATTR = "org.apache.asterix.PROPS";
 
     private Server webServer;
     private Server jsonAPIServer;
@@ -89,7 +92,7 @@
         AsterixExternalProperties externalProperties = AsterixAppContextInfo.getInstance().getExternalProperties();
         setupWebServer(externalProperties);
         webServer.start();
-
+        AsterixBuildProperties buildProperties = AsterixAppContextInfo.getInstance().getBuildProperties();
         setupJSONAPIServer(externalProperties);
         jsonAPIServer.start();
 
@@ -160,6 +163,9 @@
 
         IHyracksClientConnection hcc = getNewHyracksClientConnection();
         context.setAttribute(HYRACKS_CONNECTION_ATTR, hcc);
+        context.setAttribute(ASTERIX_BUILD_PROP_ATTR, AsterixAppContextInfo.getInstance());
+
+
 
         jsonAPIServer.setHandler(context);
         context.addServlet(new ServletHolder(new QueryAPIServlet()), "/query");
@@ -170,6 +176,7 @@
         context.addServlet(new ServletHolder(new AQLAPIServlet()), "/aql");
         context.addServlet(new ServletHolder(new ConnectorAPIServlet()), "/connector");
         context.addServlet(new ServletHolder(new ShutdownAPIServlet()), "/admin/shutdown");
+        context.addServlet(new ServletHolder(new VersionAPIServlet()), "/admin/version");
     }
 
     private void setupFeedServer(AsterixExternalProperties externalProperties) throws Exception {
@@ -186,4 +193,4 @@
 
         // add paths here
     }
-}
\ No newline at end of file
+}
diff --git a/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/VersionAPIServletTest.java b/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/VersionAPIServletTest.java
new file mode 100644
index 0000000..25ba2a6
--- /dev/null
+++ b/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/VersionAPIServletTest.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.asterix.api.http.servlet;
+
+import junit.framework.Assert;
+import org.apache.asterix.common.config.AsterixBuildProperties;
+import org.apache.asterix.om.util.AsterixAppContextInfo;
+import org.apache.asterix.test.runtime.ExecutionTest;
+import org.apache.hyracks.api.client.IHyracksClientConnection;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.junit.Test;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+
+@SuppressWarnings("deprecation")
+public class VersionAPIServletTest {
+
+    @Test
+    public void testGet() throws Exception {
+        // Starts test asterixdb cluster.
+        ExecutionTest.setUp();
+
+        // Configures a test version api servlet.
+        VersionAPIServlet servlet = spy(new VersionAPIServlet());
+        ServletConfig mockServletConfig = mock(ServletConfig.class);
+        servlet.init(mockServletConfig);
+        Map<String, String> propMap = new HashMap<String, String>();
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        PrintWriter outputWriter = new PrintWriter(outputStream);
+
+        // Creates mocks.
+        ServletContext mockContext = mock(ServletContext.class);
+        AsterixAppContextInfo mockCtx = mock(AsterixAppContextInfo.class);
+        HttpServletRequest mockRequest = mock(HttpServletRequest.class);
+        IHyracksClientConnection mockHcc = mock(IHyracksClientConnection.class);
+        HttpServletResponse mockResponse = mock(HttpServletResponse.class);
+        AsterixBuildProperties mockProperties = mock(AsterixBuildProperties.class);
+
+        // Sets up mock returns.
+        when(servlet.getServletContext()).thenReturn(mockContext);
+        when(mockResponse.getWriter()).thenReturn(outputWriter);
+        when(mockContext.getAttribute(RESTAPIServlet.HYRACKS_CONNECTION_ATTR)).thenReturn(mockHcc);
+        when(mockContext.getAttribute(VersionAPIServlet.ASTERIX_BUILD_PROP_ATTR)).thenReturn(mockCtx);
+        when(mockCtx.getBuildProperties()).thenReturn(mockProperties);
+        when(mockProperties.getAllProps()).thenReturn(propMap);
+
+        propMap.put("git.build.user.email","foo@bar.baz");
+        propMap.put("git.build.host","fulliautomatix");
+        propMap.put("git.dirty","true");
+        propMap.put("git.remote.origin.url","git@github.com:apache/incubator-asterixdb.git");
+        propMap.put("git.closest.tag.name","asterix-0.8.7-incubating");
+        propMap.put("git.commit.id.describe-short","asterix-0.8.7-incubating-19-dirty");
+        propMap.put("git.commit.user.email","foo@bar.baz");
+        propMap.put("git.commit.time","21.10.2015 @ 23:36:41 PDT");
+        propMap.put("git.commit.message.full","ASTERIXDB-1045: fix log file reading during recovery\n\nChange-Id: Ic83ee1dd2d7ba88180c25f4ec6c7aa8d0a5a7162\nReviewed-on: https://asterix-gerrit.ics.uci.edu/465\nTested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>");
+        propMap.put("git.build.version","0.8.8-SNAPSHOT");
+        propMap.put("git.commit.message.short","ASTERIXDB-1045: fix log file reading during recovery");
+        propMap.put("git.commit.id.abbrev","e1dad19");
+        propMap.put("git.branch","foo/bar");
+        propMap.put("git.build.user.name","Asterix");
+        propMap.put("git.closest.tag.commit.count","19");
+        propMap.put("git.commit.id.describe","asterix-0.8.7-incubating-19-ge1dad19-dirty");
+        propMap.put("git.commit.id","e1dad1984640517366a7e73e323c9de27b0676f7");
+        propMap.put("git.tags","");
+        propMap.put("git.build.time","22.10.2015 @ 17:11:07 PDT");
+        propMap.put("git.commit.user.name","Obelix");
+
+        // Calls VersionAPIServlet.formResponseObject.
+        servlet.doGet(mockRequest, mockResponse);
+
+        // Constructs the actual response.
+        JSONTokener tokener = new JSONTokener(new InputStreamReader(
+                new ByteArrayInputStream(outputStream.toByteArray())));
+        JSONObject actualResponse = new JSONObject(tokener);
+        JSONObject expectedResponse = new JSONObject(propMap);
+
+        // Checks the response contains all the expected keys.
+        Assert.assertEquals(actualResponse.toString(),expectedResponse.toString());
+
+        // Tears down the asterixdb cluster.
+        ExecutionTest.tearDown();
+    }
+}
diff --git a/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixBuildProperties.java b/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixBuildProperties.java
new file mode 100644
index 0000000..e065bec
--- /dev/null
+++ b/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixBuildProperties.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.asterix.common.config;
+
+import java.util.Map;
+import java.util.Properties;
+
+public class AsterixBuildProperties extends AbstractAsterixProperties {
+
+    public AsterixBuildProperties(AsterixPropertiesAccessor accessor) {
+        super(accessor);
+    }
+
+    public String getUserEmail() {
+        return accessor.getProperty("git.build.user.email", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getBuildHost() {
+        return accessor.getProperty("git.build.host", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getDirty() {
+        return accessor.getProperty("git.dirty", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getRemoteOriginUrl() {
+        return accessor.getProperty("git.remote.origin.url", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getClosestTagName() {
+        return accessor.getProperty("git.closest.tag.name", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getCommitIdDescribeShort() {
+        return accessor.getProperty("git.commit.id.describe-short", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getCommitUserEmail() {
+        return accessor.getProperty("git.commit.user.email", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getCommitTime() {
+        return accessor.getProperty("git.commit.time", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getCommitMessage() {
+        return accessor.getProperty("git.commit.message.full", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getBuildVersion() {
+        return accessor.getProperty("git.build.version", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getCommitMessageShort() {
+        return accessor.getProperty("git.commit.message.short", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getShortCommitId() {
+        return accessor.getProperty("git.commit.id.abbrev", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getBranch() {
+        return accessor.getProperty("git.branch", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getBuildUserName() {
+        return accessor.getProperty("git.build.user.name", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getClosestTagCommitCount() {
+        return accessor.getProperty("git.closest.tag.commit.count", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getCommitIdDescribe() {
+        return accessor.getProperty("git.commit.id.describe", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getCommitId() {
+        return accessor.getProperty("git.commit.id", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getTags() {
+        return accessor.getProperty("git.tags", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getBuildTime() {
+        return accessor.getProperty("git.build.time", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+
+    public String getCommitUserName() {
+        return accessor.getProperty("git.commit.user.name", "", PropertyInterpreters.getStringPropertyInterpreter());
+    }
+    public Map<String, String> getAllProps(){
+        return accessor.getBuildProperties();
+    }
+
+}
diff --git a/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixPropertiesAccessor.java b/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixPropertiesAccessor.java
index 76dfe4f..647b032 100644
--- a/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixPropertiesAccessor.java
+++ b/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixPropertiesAccessor.java
@@ -20,14 +20,16 @@
 
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.io.InputStream;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.Properties;
 
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
@@ -50,6 +52,7 @@
     private final Map<String, String> coredumpConfig;
     private final Map<String, Property> asterixConfigurationParams;
     private final Map<String, String> transactionLogDirs;
+    private final Map<String, String> asterixBuildProperties;
 
     public AsterixPropertiesAccessor() throws AsterixException {
         String fileName = System.getProperty(GlobalConfig.CONFIG_FILE_PROPERTY);
@@ -96,6 +99,13 @@
         for (TransactionLogDir txnLogDir : asterixConfiguration.getTransactionLogDir()) {
             transactionLogDirs.put(txnLogDir.getNcId(), txnLogDir.getTxnLogDirPath());
         }
+        Properties p = new Properties();
+        try {
+            p.load(getClass().getClassLoader().getResourceAsStream("git.properties"));
+            asterixBuildProperties = new HashMap<String, String>((Map)p);
+        } catch(IOException e) {
+            throw new AsterixException(e);
+        }
 
     }
 
@@ -127,6 +137,10 @@
         return coredumpConfig;
     }
 
+    public Map<String, String> getBuildProperties(){
+        return asterixBuildProperties;
+    }
+
     public void putCoredumpPaths(String nodeId, String coredumpPath) {
         if (coredumpConfig.containsKey(nodeId)) {
             throw new IllegalStateException("Cannot override value for coredump path");
diff --git a/asterix-common/src/main/java/org/apache/asterix/common/config/IAsterixPropertiesProvider.java b/asterix-common/src/main/java/org/apache/asterix/common/config/IAsterixPropertiesProvider.java
index d7ff0eb..93c58be 100644
--- a/asterix-common/src/main/java/org/apache/asterix/common/config/IAsterixPropertiesProvider.java
+++ b/asterix-common/src/main/java/org/apache/asterix/common/config/IAsterixPropertiesProvider.java
@@ -30,4 +30,6 @@
     public AsterixExternalProperties getExternalProperties();
     
     public AsterixFeedProperties getFeedProperties();
+
+    AsterixBuildProperties getBuildProperties();
 }
diff --git a/asterix-om/src/main/java/org/apache/asterix/om/util/AsterixAppContextInfo.java b/asterix-om/src/main/java/org/apache/asterix/om/util/AsterixAppContextInfo.java
index 9f076f2..8f9f577 100644
--- a/asterix-om/src/main/java/org/apache/asterix/om/util/AsterixAppContextInfo.java
+++ b/asterix-om/src/main/java/org/apache/asterix/om/util/AsterixAppContextInfo.java
@@ -23,6 +23,7 @@
 import org.apache.asterix.common.config.AsterixCompilerProperties;
 import org.apache.asterix.common.config.AsterixExternalProperties;
 import org.apache.asterix.common.config.AsterixFeedProperties;
+import org.apache.asterix.common.config.AsterixBuildProperties;
 import org.apache.asterix.common.config.AsterixMetadataProperties;
 import org.apache.asterix.common.config.AsterixPropertiesAccessor;
 import org.apache.asterix.common.config.AsterixStorageProperties;
@@ -52,6 +53,7 @@
     private AsterixStorageProperties storageProperties;
     private AsterixTransactionProperties txnProperties;
     private AsterixFeedProperties feedProperties;
+    private AsterixBuildProperties buildProperties;
 
     private IHyracksClientConnection hcc;
 
@@ -67,6 +69,7 @@
         INSTANCE.txnProperties = new AsterixTransactionProperties(propertiesAccessor);
         INSTANCE.feedProperties = new AsterixFeedProperties(propertiesAccessor);
         INSTANCE.hcc = hcc;
+        INSTANCE.buildProperties = new AsterixBuildProperties(propertiesAccessor);
         Logger.getLogger("org.apache").setLevel(INSTANCE.externalProperties.getLogLevel());
     }
 
@@ -113,7 +116,12 @@
     public AsterixFeedProperties getFeedProperties() {
         return feedProperties;
     }
-    
+
+    @Override
+    public AsterixBuildProperties getBuildProperties() {
+        return buildProperties;
+    }
+
     public IHyracksClientConnection getHcc() {
         return hcc;
     }
diff --git a/pom.xml b/pom.xml
index 9f02d63..1923fd0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -179,6 +179,34 @@
                    <compilerArgument>-Xlint:all</compilerArgument>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>pl.project13.maven</groupId>
+                <artifactId>git-commit-id-plugin</artifactId>
+                <version>2.2.0</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>revision</goal>
+                         </goals>
+                    </execution>
+                </executions>
+
+                <configuration>
+                    <!--
+                        If you'd like to tell the plugin where your .git directory is,
+                        use this setting, otherwise we'll perform a search trying to
+                        figure out the right directory. It's better to add it explicite IMHO.
+                    -->
+                    <dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
+                    <!-- this is false by default, forces the plugin to generate the git.properties file -->
+                    <generateGitPropertiesFile>true</generateGitPropertiesFile>
+
+                    <!-- The path for the to be generated properties file, it's relative to ${project.basedir} -->
+                    <generateGitPropertiesFilename>src/main/resources/git.properties</generateGitPropertiesFilename>
+                </configuration>
+
+            </plugin>
+            <!-- END OF GIT COMMIT ID PLUGIN CONFIGURATION -->
         </plugins>
         <pluginManagement>
             <plugins>
