diff --git a/ui/src/visualizations/File-Evolution/help.js b/ui/src/visualizations/File-Evolution/help.js
new file mode 100644
index 00000000..364520b8
--- /dev/null
+++ b/ui/src/visualizations/File-Evolution/help.js
@@ -0,0 +1,10 @@
+'use strict';
+
+import cx from 'classnames';
+import styles from './styles.scss';
+
+export default () => (
+
+
File Evolution Help
+
+);
diff --git a/ui/src/visualizations/File-Evolution/index.js b/ui/src/visualizations/File-Evolution/index.js
new file mode 100644
index 00000000..d324dc00
--- /dev/null
+++ b/ui/src/visualizations/File-Evolution/index.js
@@ -0,0 +1,17 @@
+'use strict';
+
+import ChartComponent from './chart';
+import ConfigComponent from './config.js';
+import HelpComponent from './help.js';
+import saga from './sagas';
+import reducer from './reducers';
+
+export default {
+ id: 'fileEvolution',
+ label: 'File Evolution',
+ saga,
+ reducer,
+ ChartComponent,
+ ConfigComponent,
+ HelpComponent
+};
diff --git a/ui/src/visualizations/File-Evolution/reducers/config.js b/ui/src/visualizations/File-Evolution/reducers/config.js
new file mode 100644
index 00000000..c0faae26
--- /dev/null
+++ b/ui/src/visualizations/File-Evolution/reducers/config.js
@@ -0,0 +1,27 @@
+'use strict';
+
+import { handleActions } from 'redux-actions';
+import _ from 'lodash';
+
+export default handleActions(
+ {
+ SET_COMMIT_BOX_WIDTH: (state, action) => _.assign({}, state, { commitBoxWidth: action.payload }),
+ SET_COMMIT_BOX_HEIGHT: (state, action) => _.assign({}, state, { commitBoxHeight: action.payload }),
+ SET_COMMIT_BOX_COLOR: (state, action) => _.assign({}, state, { commitBoxColor: action.payload }),
+ SET_SELECTED_AUTHORS: (state, action) => _.assign({}, state, { selectedAuthors: [...action.payload] }),
+ SET_SELECTED_BRANCHES: (state, action) => _.assign({}, state, { selectedBranches: [...action.payload] }),
+ SET_SHOW_COMMIT_DATE: (state, action) => _.assign({}, state, { showCommitDate: action.payload }),
+ SET_SHOW_COMMIT_MESSAGE: (state, action) => _.assign({}, state, { showCommitMessage: action.payload }),
+ SET_SHOW_COMMIT_AUTHOR: (state, action) => _.assign({}, state, { showCommitAuthor: action.payload })
+ },
+ {
+ commitBoxWidth: 100,
+ commitBoxHeight: 100,
+ commitBoxColor: 'author',
+ selectedAuthors: [],
+ selectedBranches: [],
+ showCommitDate: true,
+ showCommitMessage: 'header',
+ showCommitAuthor: false
+ }
+);
diff --git a/ui/src/visualizations/File-Evolution/reducers/data.js b/ui/src/visualizations/File-Evolution/reducers/data.js
new file mode 100644
index 00000000..ea8662b0
--- /dev/null
+++ b/ui/src/visualizations/File-Evolution/reducers/data.js
@@ -0,0 +1,23 @@
+'use strict';
+
+import { handleActions } from 'redux-actions';
+import _ from 'lodash';
+
+export default handleActions(
+ {
+ REQUEST_FILE_EVOLUTION_DATA: state => _.assign({}, state, { isFetching: true }),
+ RECEIVE_FILE_EVOLUTION_DATA: (state, action) => {
+ console.log(action.payload);
+ return _.assign({}, state, {
+ data: action.payload,
+ isFetching: false,
+ receivedAt: action.meta.receivedAt
+ });
+ }
+ },
+ {
+ data: {},
+ lastFetched: null,
+ isFetching: null
+ }
+);
diff --git a/ui/src/visualizations/File-Evolution/reducers/index.js b/ui/src/visualizations/File-Evolution/reducers/index.js
new file mode 100644
index 00000000..ff9fb456
--- /dev/null
+++ b/ui/src/visualizations/File-Evolution/reducers/index.js
@@ -0,0 +1,10 @@
+'use strict';
+
+import config from './config.js';
+import data from './data.js';
+import { combineReducers } from 'redux';
+
+export default combineReducers({
+ data,
+ config
+});