diff --git a/src/core/MemoryUsage.cpp b/src/core/MemoryUsage.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fc784321714f6f50df6fcf00d833fd4b500cbe8c
--- /dev/null
+++ b/src/core/MemoryUsage.cpp
@@ -0,0 +1,56 @@
+//======================================================================================================================
+//
+//  This file is part of waLBerla. waLBerla is free software: you can 
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of 
+//  the License, or (at your option) any later version.
+//  
+//  waLBerla is distributed in the hope that it will be useful, but WITHOUT 
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
+//  for more details.
+//  
+//  You should have received a copy of the GNU General Public License along
+//  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file MemoryUsage.cpp
+//! \author Sebastian Eibl <sebastian.eibl@fau.de>
+//
+//======================================================================================================================
+
+#include "MemoryUsage.h"
+
+#ifdef __linux__
+#include <sys/resource.h>
+#endif
+#include "waLBerlaDefinitions.h"
+#include "core/logging/Logging.h"
+#include "core/math/Sample.h"
+
+namespace walberla {
+
+long getResidentMemorySize()
+{
+#ifdef __linux__
+   struct rusage usage;
+   int gru = getrusage(RUSAGE_SELF, &usage);
+
+   if (gru!=0)
+      WALBERLA_LOG_WARNING("There was an error getting memory statistics!");
+
+   return usage.ru_maxrss;
+#else
+   WALBERLA_LOG_WARNING("Getting memory statistics is currently not supported on non-Linux systems!");
+   return 0;
+#endif
+}
+
+void printResidentMemoryStatistics()
+{
+   math::Sample memory;
+   memory.castToRealAndInsert(getResidentMemorySize());
+   memory.mpiGatherRoot();
+   WALBERLA_LOG_INFO_ON_ROOT("resident memory: " << memory.format());
+}
+
+} // namespace walberla
diff --git a/src/core/MemoryUsage.h b/src/core/MemoryUsage.h
new file mode 100644
index 0000000000000000000000000000000000000000..c1775f6a2c85dfb22363de4124c76bfd76dff260
--- /dev/null
+++ b/src/core/MemoryUsage.h
@@ -0,0 +1,39 @@
+//======================================================================================================================
+//
+//  This file is part of waLBerla. waLBerla is free software: you can 
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of 
+//  the License, or (at your option) any later version.
+//  
+//  waLBerla is distributed in the hope that it will be useful, but WITHOUT 
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
+//  for more details.
+//  
+//  You should have received a copy of the GNU General Public License along
+//  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file MemoryUsage.h
+//! \author Sebastian Eibl <sebastian.eibl@fau.de>
+//
+//======================================================================================================================
+
+#pragma once
+
+#include <string>
+
+namespace walberla {
+
+/**
+ * @return The current resident memory size of the calling process in kilobytes.
+ */
+long getResidentMemorySize();
+
+/**
+ * Determines memory usage on all MPI processes and prints statistics. Output
+ * is in kilobytes.
+ * \attention uses mpi gather operation
+ */
+void printResidentMemoryStatistics();
+
+} // namespace walberla
diff --git a/tests/core/CMakeLists.txt b/tests/core/CMakeLists.txt
index 4d58647b8a563af3a86f01183f226136f835427f..72b8e4537f2c9b7fa1e4c0dfc4bf89db6db682cb 100644
--- a/tests/core/CMakeLists.txt
+++ b/tests/core/CMakeLists.txt
@@ -194,6 +194,9 @@ waLBerla_execute_test( NAME FunctionTraitsTest )
 waLBerla_compile_test( FILES GridGeneratorTest.cpp )
 waLBerla_execute_test( NAME GridGeneratorTest )
 
+waLBerla_compile_test( FILES MemoryUsage.cpp )
+waLBerla_execute_test( NAME MemoryUsage )
+
 waLBerla_compile_test( FILES OpenMPWrapperTest.cpp )
 waLBerla_execute_test( NAME OpenMPWrapperTest )
 
diff --git a/tests/core/MemoryUsage.cpp b/tests/core/MemoryUsage.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..70352d92b30fd4156a05895a51c961b6fd815abe
--- /dev/null
+++ b/tests/core/MemoryUsage.cpp
@@ -0,0 +1,49 @@
+//======================================================================================================================
+//
+//  This file is part of waLBerla. waLBerla is free software: you can 
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of 
+//  the License, or (at your option) any later version.
+//  
+//  waLBerla is distributed in the hope that it will be useful, but WITHOUT 
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
+//  for more details.
+//  
+//  You should have received a copy of the GNU General Public License along
+//  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file MemoryUsage.cpp
+//! \author Sebastian Eibl <sebastian.eibl@fau.de>
+//
+//======================================================================================================================
+
+#include "core/Environment.h"
+#include "core/MemoryUsage.h"
+#include "core/debug/CheckFunctions.h"
+#include "core/debug/TestSubsystem.h"
+#include "core/logging/Logging.h"
+
+#include <vector>
+
+using namespace walberla;
+
+int main( int argc, char** argv )
+{
+   Environment env(argc, argv);
+   WALBERLA_UNUSED(env);
+   debug::enterTestMode();
+
+   std::vector<int> stuff(200*1024*1024/sizeof(int),1);
+
+   auto memSize = getResidentMemorySize();
+#ifdef __linux__
+   WALBERLA_CHECK_GREATER(memSize, 200000);
+   WALBERLA_CHECK_LESS   (memSize, 250000);
+#else
+   WALBERLA_CHECK_EQUAL(memSize, 0);
+#endif
+   printResidentMemoryStatistics();
+   WALBERLA_LOG_DEVEL(stuff[0]); //make sure stuff is not optimized
+   return EXIT_SUCCESS;
+}