diff --git a/src/actions/auth.js b/src/actions/auth.js
index 44a29921b6019ae93f5cc665743933d7f4934196..5b2a5b60b2f2edbee2ed412561779aec224cdbde 100644
--- a/src/actions/auth.js
+++ b/src/actions/auth.js
@@ -1,6 +1,6 @@
 import axios from './session';
 import { GET_USERDATA, PROFILE_CHANGE, GROUP_CHANGE } from './types';
-
+import { showMessage } from './messages';
 
 export const getUserData = () => (
   async (dispatch) => {
@@ -59,7 +59,7 @@ export const groupChange = groups => (
 export const submitRegistration = ({
   nick, groups, signed, motivationAbout, motivationProfession, motivationExercise, id,
 }) => (
-  async () => {
+  async (dispatch) => {
     try {
       const response = await axios.patch(`/api/v1/profiles/${id}/`, {
         nick,
@@ -70,12 +70,12 @@ export const submitRegistration = ({
         motivation_exercise: motivationExercise,
       });
       if (response.data.id === id) {
-        alert('Sikeres mentĂŠs!');
+        dispatch(showMessage('Sikeres mentĂŠs!', 'success'));
       } else {
-        alert('MentĂŠs nem sikerĂźlt!');
+        dispatch(showMessage('A mentĂŠs nem sikerĂźlt!', 'error'));
       }
     } catch (e) {
-      console.log(e);
+      dispatch(showMessage('A mentĂŠs nem sikerĂźlt!', 'error'));
     }
   }
 );
diff --git a/src/actions/messages.js b/src/actions/messages.js
new file mode 100644
index 0000000000000000000000000000000000000000..01dd9c515319ff8b9e747d50dc70f727c22c7ad8
--- /dev/null
+++ b/src/actions/messages.js
@@ -0,0 +1,11 @@
+import { SHOW_MESSAGE, DISMISS_MESSAGE } from '../actions/types';
+
+export const dismissMessage = () => (
+  (dispatch) => {
+    dispatch({ type: DISMISS_MESSAGE });
+  }
+);
+
+export const showMessage = (text, messageType) => (
+  { type: SHOW_MESSAGE, messageType, text }
+);
diff --git a/src/actions/news.js b/src/actions/news.js
index 0a953af5d51335bad8809c32f9eb2ad1c8d709e0..44fa2fddbab402d8192623fd61781cc517225266 100644
--- a/src/actions/news.js
+++ b/src/actions/news.js
@@ -1,6 +1,7 @@
 import axios from './session';
 import { GET_NEWS, WRITE_NEWS, ADD_NEWS, DELETE_NEWS,
-  CLEAR_WRITE, SELECT_NEWS, EDIT_NEWS } from './types';
+  CLEAR_WRITE, SELECT_NEWS, EDIT_NEWS, SHOW_MESSAGE } from './types';
+import { showMessage } from './messages';
 
 export const getNews = () => (
   async (dispatch) => {
@@ -25,16 +26,16 @@ export const postNews = ({ title, author, text }) => (
         text,
       });
       if (response.data.id) {
-        alert('Sikeres mentĂŠs!');
         dispatch({
           type: ADD_NEWS,
           payload: response.data,
         });
+        dispatch(showMessage('HĂ­r hozzĂĄdva!', 'success'));
       } else {
-        alert('MentĂŠs nem sikerĂźlt!');
+        dispatch(showMessage('Nem sikerĂźlt a hĂ­rt hozĂĄadni!', 'error'));
       }
     } catch (e) {
-      console.log(e);
+      dispatch(showMessage('Nem sikerĂźlt a hĂ­rt hozĂĄadni!', 'error'));
     }
   }
 );
@@ -48,17 +49,17 @@ export const editNews = ({ id, title, editedBy, text }) => (
         text,
       });
       if (response.data.id) {
-        alert('Sikeres mentĂŠs!');
+        dispatch(showMessage('HĂ­r mĂłdosĂ­tva!', 'success'));
         dispatch({
           type: EDIT_NEWS,
           payload: response.data,
 
         });
       } else {
-        alert('MentĂŠs nem sikerĂźlt!');
+        dispatch(showMessage('Nem sikerĂźlt a mĂłdosĂ­tĂĄs', 'error'));
       }
     } catch (e) {
-      console.log(e);
+      dispatch(showMessage('Nem sikerĂźlt a mĂłdosĂ­tĂĄs', 'error'));
     }
   }
 );
@@ -68,16 +69,16 @@ export const deleteNews = news => (
     try {
       const response = await axios.delete(`/api/v1/news/${news.id}/`);
       if (!response.data.id) {
-        alert('Sikeres tĂśrlĂŠs!');
+        dispatch(showMessage('Sikeres tĂśrlĂŠs!', 'success'));
         dispatch({
           type: DELETE_NEWS,
           payload: news,
         });
       } else {
-        alert('A tĂśrlĂŠs nem sikerĂźlt!');
+        dispatch(showMessage('A tĂśrlĂŠs nem sikerĂźlt!', 'error'));
       }
     } catch (e) {
-      console.log(e);
+      dispatch(showMessage('A tĂśrlĂŠs nem sikerĂźlt!', 'error'));
     }
   });
 
diff --git a/src/actions/notes.js b/src/actions/notes.js
index 09e353de39a216cae9a1bd9f279f305573f3bac9..e51673fb4b092b325bf3e8865ec7ef407a41da19 100644
--- a/src/actions/notes.js
+++ b/src/actions/notes.js
@@ -8,6 +8,7 @@ import {
   GET_NOTES_BY_PROFILE,
   ADD_PROFILE_NOTE,
 } from './types';
+import { showMessage } from './messages';
 
 export const getNotesByEvent = id => (
   async (dispatch) => {
@@ -50,7 +51,7 @@ export const postNote = ({ eventid, userid, note }) => (
         note,
       });
       if (response.data.id) {
-        alert('Sikeres mentĂŠs!');
+        dispatch(showMessage('A megjegyzĂŠs hozzĂĄadva!', 'success'));
         if (eventid) {
           dispatch({
             type: ADD_EVENT_NOTE,
@@ -65,7 +66,7 @@ export const postNote = ({ eventid, userid, note }) => (
         }
       }
     } catch (e) {
-      console.log(e);
+      dispatch(showMessage('A hozzĂĄadĂĄs nem sikerĂźlt!', 'error'));
     }
   });
 
@@ -80,13 +81,13 @@ export const deleteNote = note => (
     try {
       const response = await axios.delete(`/api/v1/notes/${note.id}/`);
       if (!response.data.id) {
-        alert('Sikeres tĂśrlĂŠs!');
+        dispatch(showMessage('Sikeres tĂśrlĂŠs!', 'success'));
         dispatch({
           type: DELETE_NOTE,
           payload: note,
         });
       } else {
-        alert('A tĂśrlĂŠs nem sikerĂźlt!');
+        dispatch(showMessage('A tĂśrlĂŠs nem sikerĂźlt!', 'error'));
       }
     } catch (e) {
       console.log(e);
diff --git a/src/actions/statistics.js b/src/actions/statistics.js
index 1f92b1e2e54fe6001ef4d8722dc34e18136a9acb..7f53e13aadaced9016dc5dbee4be753605ef8eef 100644
--- a/src/actions/statistics.js
+++ b/src/actions/statistics.js
@@ -16,6 +16,7 @@ import {
   WRITE_EDITED_EVENT,
   SELECT_EVENT_FOR_EDIT,
 } from './types';
+import { showMessage } from './messages';
 
 export const getStaffEvents = () => (
   async (dispatch) => {
@@ -86,17 +87,17 @@ export const visitorChange = ({ id, value }) => {
 };
 
 export const submitVisitors = ({ id, visitors, absent }) => (
-  async () => {
+  async (dispatch) => {
     try {
       const response = await axios.patch(`/api/v1/staff_events/${id}/`, {
         visitors,
         absent,
       });
       if (response.data.id) {
-        alert('Sikeres mentĂŠs!');
+        dispatch(showMessage('Sikeres vĂĄltoztatĂĄs!', 'success'));
       }
     } catch (e) {
-      console.log(e);
+      dispatch(showMessage('Nem sikerĂźlt a vĂĄltoztatĂĄs!', 'error'));
     }
   }
 );
@@ -128,14 +129,14 @@ export const editEvent = ({ id, name, description, date }) => (
         date,
       });
       if (response.data.id) {
-        alert('Sikeres mentĂŠs!');
+        dispatch(showMessage('Az alkalom mĂłdosĂ­tva!', 'success'));
         dispatch({
           type: EDIT_EVENT,
           payload: response.data,
 
         });
       } else {
-        alert('MentĂŠs nem sikerĂźlt!');
+        dispatch(showMessage('A mĂłdosĂ­tĂĄs nem sikerĂźlt!', 'error'));
       }
     } catch (e) {
       console.log(e);
@@ -153,13 +154,13 @@ export const addEvent = ({ name, date, description }) => (
         absent: [],
       });
       if (response.data.id) {
-        alert('Sikeres mentĂŠs!');
+        dispatch(showMessage('Az alkalom hozzĂĄadva!', 'success'));
         dispatch({
           type: ADD_EVENT,
           payload: response.data,
         });
       } else {
-        alert('MentĂŠs nem sikerĂźlt!');
+        dispatch(showMessage('A hozzĂĄadĂĄs nem sikerĂźlt!', 'error'));
       }
     } catch (e) {
       console.log(e);
@@ -172,13 +173,13 @@ export const deleteEvent = event => (
     try {
       const response = await axios.delete(`/api/v1/staff_events/${event.id}/`);
       if (!response.data.id) {
-        alert('Sikeres tĂśrlĂŠs!');
+      dispatch(showMessage('Az alkalom tĂśrĂślve!', 'success'));
         dispatch({
           type: DELETE_EVENT,
           payload: event,
         });
       } else {
-        alert('A tĂśrlĂŠs nem sikerĂźlt!');
+        dispatch(showMessage('A tĂśrlĂŠs nem sikerĂźlt!', 'error'));
       }
     } catch (e) {
       console.log(e);
@@ -206,11 +207,15 @@ export const setStatus = (id, status) => (
         role: status,
       });
       if (response.data.id) {
+        dispatch(showMessage('StĂĄtusz megvĂĄltoztatva!', 'success'));
         dispatch({
           type: SET_STATUS,
           payload: response.data,
         });
       }
+      else {
+        dispatch(showMessage('A vĂĄltoztatĂĄs nem sikerĂźlt!', 'error'));
+      }
     } catch (e) {
       console.log(e);
     }
diff --git a/src/actions/types.js b/src/actions/types.js
index 06fb588e07506d554eaaf0e6bdb872f2a44047ac..988caca73c58db433be777050d353e09136df680 100644
--- a/src/actions/types.js
+++ b/src/actions/types.js
@@ -53,3 +53,6 @@ export const GET_NOTES_BY_PROFILE = 'get_notes_by_profile';
 export const GET_PROFILES = 'get_profiles';
 export const SET_STATUS = 'set_status';
 export const GET_SELECTED_PROFILE = 'get_selected_profile';
+
+export const SHOW_MESSAGE = 'show_message';
+export const DISMISS_MESSAGE = 'dismiss_message';
diff --git a/src/components/AlertMessage.js b/src/components/AlertMessage.js
new file mode 100644
index 0000000000000000000000000000000000000000..7d5073128b6498499dda99b31831c9e0e841751c
--- /dev/null
+++ b/src/components/AlertMessage.js
@@ -0,0 +1,75 @@
+import React, { Component } from 'react';
+import { Message, Container } from 'semantic-ui-react';
+import { connect } from 'react-redux';
+import { dismissMessage } from '../actions/messages';
+
+const messages = [
+  {
+    type: 'success',
+    icon: 'thumbs up',
+    title: 'Sikeres mĹąvelet',
+    success: true,
+    warning: false,
+    error: false,
+  },
+  {
+    type: 'warning',
+    icon: 'warning',
+    title: 'FigyelmeztetĂŠs',
+    success: false,
+    warning: true,
+    error: false,
+  },
+  {
+    type: 'error',
+    icon: 'times circle',
+    title: 'Sikertelen mĹąvelet',
+    success: false,
+    warning: false,
+    error: true,
+  },
+];
+
+class AlertMessage extends Component {
+  constructor (props) {
+    super(props);
+    this.state = {
+      timeout: null,
+    }
+  }
+componentWillReceiveProps() {
+    clearTimeout(this.state.timeout);
+    const time = setTimeout(() => {
+      this.props.dismissMessage();
+    }, 4000);
+    this.setState({ timeout: time });
+  }
+
+  render() {
+    const { visible, messageType, text } = this.props.message;
+    const messageProps = messages.find(item => item.type === messageType);
+    return (
+      <Container style={{ margin: '1.5em', paddingLeft: '1.5em' }}>
+        { messageProps ?
+          <Message
+            icon={messageProps.icon}
+            visible={visible}
+            header={messageProps.title}
+            content={text}
+            positive={messageProps.success}
+            warning={messageProps.warning}
+            negative={messageProps.error}
+          />
+        :
+        null
+        }
+      </Container>
+    );
+  }
+}
+
+const mapStateToProps = ({ message }) => ({
+  message
+});
+
+export default connect(mapStateToProps, { dismissMessage })(AlertMessage)
diff --git a/src/components/App.js b/src/components/App.js
index cdc6a8ad1efca9d19e7fc5b321b2304ea7b07d9e..11d1171015f1b3147d65792d5092ff69bb7daa6f 100644
--- a/src/components/App.js
+++ b/src/components/App.js
@@ -2,11 +2,13 @@ import React from 'react';
 import Header from './Header';
 import Main from './Main';
 import Footer from './Footer';
+import AlertMessage from './AlertMessage';
 
 const App = () => (
   <div style={{ minHeight: '100%', position: 'relative' }}>
     <Header className='header'>
       <main id='main' style={{ minHeight: '100%', position: 'relative' }}>
+        <AlertMessage />
         <Main />
       </main>
     </Header>
diff --git a/src/reducers/MessageReducer.js b/src/reducers/MessageReducer.js
new file mode 100644
index 0000000000000000000000000000000000000000..e0016ce0c7068b0d452e2d57adc966a16e21b0a7
--- /dev/null
+++ b/src/reducers/MessageReducer.js
@@ -0,0 +1,14 @@
+import { SHOW_MESSAGE, DISMISS_MESSAGE } from '../actions/types';
+
+const INITIAL_STATE = {};
+
+export default (state = INITIAL_STATE, action) => {
+  switch (action.type) {
+    case SHOW_MESSAGE:
+      return { text: action.text, messageType: action.messageType, visible: true };
+    case DISMISS_MESSAGE:
+      return { text: '', type: '', visible: false };
+    default:
+      return state;
+  }
+};
diff --git a/src/reducers/index.js b/src/reducers/index.js
index 669501cd37fd79f2d045eb338b24d98244997ed1..d2c02939efd57b15e8cd9f5803f5946c444d98ed 100644
--- a/src/reducers/index.js
+++ b/src/reducers/index.js
@@ -11,6 +11,7 @@ import NoteReducer from './NoteReducer';
 import TraineeReducer from './TraineeReducer';
 import CorrectSolutionReducer from './CorrectSolutionReducer';
 import EditTaskReducer from './EditTaskReducer';
+import MessageReducer from './MessageReducer';
 
 const rootReducer = combineReducers({
   user: UserReducer,
@@ -25,6 +26,7 @@ const rootReducer = combineReducers({
   newTask: AddTaskReducer,
   newSolution: AddSolutionReducer,
   correction: CorrectSolutionReducer,
+  message: MessageReducer,
 });
 
 export default rootReducer;